2 Copyright (C) 2009 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __gtk2_ardour_cairo_widget_h__
21 #define __gtk2_ardour_cairo_widget_h__
23 #include <cairomm/surface.h>
24 #include <gtkmm/eventbox.h>
26 #include "gtkmm2ext/visibility.h"
27 #include "gtkmm2ext/widget_state.h"
29 /** A parent class for widgets that are rendered using Cairo.
32 class LIBGTKMM2EXT_API CairoWidget : public Gtk::EventBox
36 virtual ~CairoWidget ();
40 Gtkmm2ext::ActiveState active_state() const { return _active_state; }
41 Gtkmm2ext::VisualState visual_state() const { return _visual_state; }
43 /* derived widgets can override these two to catch
44 changes in active & visual state
47 virtual void set_active_state (Gtkmm2ext::ActiveState);
48 virtual void set_visual_state (Gtkmm2ext::VisualState);
50 void unset_active_state () { set_active_state (Gtkmm2ext::Off); }
51 void unset_visual_state () { set_visual_state (Gtkmm2ext::NoVisualState); }
53 /* this is an API simplification for widgets
54 that only use the Active and Normal active states.
56 void set_active (bool);
57 bool get_active () { return active_state() != Gtkmm2ext::Off; }
59 /* widgets can be told to only draw their "foreground, and thus leave
60 in place whatever background is drawn by their parent. the default
61 is that the widget will fill its event window with the background
62 color of the parent container.
65 void set_draw_background (bool yn);
67 sigc::signal<void> StateChanged;
69 static void provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg);
71 virtual void render (cairo_t *, cairo_rectangle_t*) = 0;
73 static void set_flat_buttons (bool yn);
74 static bool flat_buttons() { return _flat_buttons; }
76 static void set_source_rgb_a( cairo_t* cr, Gdk::Color, float a=1.0 );
78 /* set_focus_handler() will cause all button-press events on any
79 CairoWidget to invoke this slot/functor/function/method/callback.
81 We do this because in general, CairoWidgets do not grab
82 keyboard focus, but a button press on them should
83 clear focus from any active text entry.
85 This is global to all CairoWidgets and derived types.
87 However, derived types can override the behaviour by defining their
88 own on_button_press_event() handler which returns true under all
89 conditions (which will block this handler from being called). If
90 they wish to invoke any existing focus handler from their own
91 button press handler, they can just use: focus_handler();
93 static void set_focus_handler (sigc::slot<void>);
96 /** Render the widget to the given Cairo context */
97 virtual bool on_expose_event (GdkEventExpose *);
98 void on_size_allocate (Gtk::Allocation &);
99 void on_state_changed (Gtk::StateType);
100 void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
101 bool on_button_press_event (GdkEventButton*);
102 Gdk::Color get_parent_bg ();
104 /* this is an additional virtual "on_..." method. Glibmm does not
105 provide a direct signal for name changes, so this acts as a proxy.
108 virtual void on_name_changed () {};
110 Gtkmm2ext::ActiveState _active_state;
111 Gtkmm2ext::VisualState _visual_state;
114 static bool _flat_buttons;
117 static sigc::slot<void> focus_handler;
120 Cairo::RefPtr<Cairo::Surface> image_surface;
121 Glib::SignalProxyProperty _name_proxy;
122 sigc::connection _parent_style_change;
123 Widget * _current_parent;