globally remove all trailing whitespace from ardour code base.
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / cairo_widget.h
index e3ef7bafad9a930bf75246f67f1d578d2d393c7d..436dc0382d8b7ed6ae9552efe60ba9816a422270 100644 (file)
 #ifndef __gtk2_ardour_cairo_widget_h__
 #define __gtk2_ardour_cairo_widget_h__
 
+#include <cairomm/surface.h>
 #include <gtkmm/eventbox.h>
+
+#include "gtkmm2ext/visibility.h"
 #include "gtkmm2ext/widget_state.h"
 
 /** A parent class for widgets that are rendered using Cairo.
  */
 
-class CairoWidget : public Gtk::EventBox
+class LIBGTKMM2EXT_API CairoWidget : public Gtk::EventBox
 {
 public:
        CairoWidget ();
@@ -37,21 +40,21 @@ public:
        Gtkmm2ext::ActiveState active_state() const { return _active_state; }
        Gtkmm2ext::VisualState visual_state() const { return _visual_state; }
        
-       /* derived widgets can override these two to catch 
+       /* derived widgets can override these two to catch
           changes in active & visual state
        */
        
        virtual void set_active_state (Gtkmm2ext::ActiveState);
        virtual void set_visual_state (Gtkmm2ext::VisualState);
 
-       void unset_active_state () { set_active_state (Gtkmm2ext::ActiveState (0)); }
-       void unset_visual_state () { set_visual_state (Gtkmm2ext::VisualState (0)); }
+       void unset_active_state () { set_active_state (Gtkmm2ext::Off); }
+       void unset_visual_state () { set_visual_state (Gtkmm2ext::NoVisualState); }
 
        /* this is an API simplification for widgets
           that only use the Active and Normal active states.
        */
        void set_active (bool);
-       bool get_active () { return active_state() != Gtkmm2ext::ActiveState (0); }
+       bool get_active () { return active_state() != Gtkmm2ext::Off; }
 
        /* widgets can be told to only draw their "foreground, and thus leave
           in place whatever background is drawn by their parent. the default
@@ -65,17 +68,64 @@ public:
 
        static void provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg);
 
+       virtual void render (cairo_t *, cairo_rectangle_t*) = 0;
+
+       static void set_flat_buttons (bool yn);
+       static bool flat_buttons() { return _flat_buttons; }
+
+       static void set_widget_prelight (bool yn);
+       static bool widget_prelight() { return _widget_prelight; }
+
+       static void set_source_rgb_a( cairo_t* cr, Gdk::Color, float a=1.0 );
+
+       /* set_focus_handler() will cause all button-press events on any
+          CairoWidget to invoke this slot/functor/function/method/callback.
+       
+          We do this because in general, CairoWidgets do not grab
+          keyboard focus, but a button press on them should
+          clear focus from any active text entry.
+
+          This is global to all CairoWidgets and derived types.
+
+          However, derived types can override the behaviour by defining their
+          own on_button_press_event() handler which returns true under all
+          conditions (which will block this handler from being called). If
+          they wish to invoke any existing focus handler from their own
+          button press handler, they can just use: focus_handler();
+       */
+       static void set_focus_handler (sigc::slot<void>);
+
 protected:
        /** Render the widget to the given Cairo context */
-       virtual void render (cairo_t *) = 0;
        virtual bool on_expose_event (GdkEventExpose *);
        void on_size_allocate (Gtk::Allocation &);
        void on_state_changed (Gtk::StateType);
+       void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
+       bool on_button_press_event (GdkEventButton*);
        Gdk::Color get_parent_bg ();
+       
+       /* this is an additional virtual "on_..." method. Glibmm does not
+          provide a direct signal for name changes, so this acts as a proxy.
+       */
+
+       virtual void on_name_changed () {};
 
        Gtkmm2ext::ActiveState _active_state;
        Gtkmm2ext::VisualState _visual_state;
        bool                   _need_bg;
+
+       static bool     _flat_buttons;
+       static bool     _widget_prelight;
+       bool            _grabbed;
+
+       static sigc::slot<void> focus_handler;
+
+  private:
+       Cairo::RefPtr<Cairo::Surface> image_surface;
+       Glib::SignalProxyProperty _name_proxy;
+       sigc::connection _parent_style_change;
+       Widget * _current_parent;
+       
 };
 
 #endif