Merge branch 'cairocanvas'
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / pixfader.h
1 /*
2     Copyright (C) 2006 Paul Davis
3
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.
8
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.
13
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.
17
18 */
19
20 #ifndef __gtkmm2ext_pixfader_h__
21 #define __gtkmm2ext_pixfader_h__
22
23 #include <cmath>
24 #include <stdint.h>
25
26 #include <gtkmm/drawingarea.h>
27 #include <gtkmm/adjustment.h>
28 #include <gdkmm.h>
29
30 #include "gtkmm2ext/visibility.h"
31
32 namespace Gtkmm2ext {
33
34 class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea
35 {
36         public:
37         PixFader (Gtk::Adjustment& adjustment, int orientation, int span, int girth);
38         virtual ~PixFader ();
39
40         sigc::signal<void> StartGesture;
41         sigc::signal<void> StopGesture;
42         sigc::signal<void> OnExpose;
43
44         void set_default_value (float);
45         void set_text (const std::string&, bool centered = true, bool expose = true);
46
47         enum Tweaks {
48                 NoShowUnityLine = 0x1,
49                 NoButtonForward = 0x2,
50                 NoVerticalScroll = 0x4,
51         };
52
53         Tweaks tweaks() const { return _tweaks; }
54         void set_tweaks (Tweaks);
55
56         protected:
57         void on_size_request (GtkRequisition*);
58         void on_size_allocate (Gtk::Allocation& alloc);
59
60         bool on_expose_event (GdkEventExpose*);
61         bool on_button_press_event (GdkEventButton*);
62         bool on_button_release_event (GdkEventButton*);
63         bool on_motion_notify_event (GdkEventMotion*);
64         bool on_scroll_event (GdkEventScroll* ev);
65         bool on_enter_notify_event (GdkEventCrossing* ev);
66         bool on_leave_notify_event (GdkEventCrossing* ev);
67
68         void on_state_changed (Gtk::StateType);
69         void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
70
71         enum Orientation {
72                 VERT,
73                 HORIZ,
74         };
75
76         private:
77
78         Glib::RefPtr<Pango::Layout> _layout;
79         std::string                 _text;
80         Tweaks                      _tweaks;
81         Gtk::Adjustment&            _adjustment;
82         int _text_width;
83         int _text_height;
84
85         int _span, _girth;
86         int _min_span, _min_girth;
87         int _orien;
88         cairo_pattern_t* _pattern;
89         bool _hovering;
90         GdkWindow* _grab_window;
91         double _grab_loc;
92         double _grab_start;
93         int _last_drawn;
94         bool _dragging;
95         float _default_value;
96         int _unity_loc;
97         bool _centered_text;
98
99         sigc::connection _parent_style_change;
100         Widget * _current_parent;
101         Gdk::Color get_parent_bg ();
102
103         void create_patterns();
104         void adjustment_changed ();
105         void set_adjustment_from_event (GdkEventButton *);
106         void update_unity_position ();
107         int  display_span ();
108
109         struct FaderImage {
110                 cairo_pattern_t* pattern;
111                 double fr;
112                 double fg;
113                 double fb;
114                 double br;
115                 double bg;
116                 double bb;
117                 int width;
118                 int height;
119
120                 FaderImage (cairo_pattern_t* p,
121                                 double afr, double afg, double afb,
122                                 double abr, double abg, double abb,
123                                 int w, int h)
124                         : pattern (p)
125                                 , fr (afr)
126                                  , fg (afg)
127                                  , fb (afb)
128                                  , br (abr)
129                                  , bg (abg)
130                                  , bb (abb)
131                                  , width (w)
132                                  , height (h)
133                 {}
134
135                 bool matches (double afr, double afg, double afb,
136                                 double abr, double abg, double abb,
137                                 int w, int h) {
138                         return width == w &&
139                                 height == h &&
140                                 afr == fr &&
141                                 afg == fg &&
142                                 afb == fb &&
143                                 abr == br &&
144                                 abg == bg &&
145                                 abb == bb;
146                 }
147         };
148
149         static std::list<FaderImage*> _patterns;
150         static cairo_pattern_t* find_pattern (double afr, double afg, double afb,
151                         double abr, double abg, double abb,
152                         int w, int h);
153
154 };
155
156
157 } /* namespace */
158
159 #endif /* __gtkmm2ext_pixfader_h__ */