add VelocityDisplayOption enum; indent TrackAutoNamingRule decl. correctly
[ardour.git] / libs / widgets / widgets / ardour_fader.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 _WIDGETS_ARDOUR_FADER_H_
21 #define _WIDGETS_ARDOUR_FADER_H_
22
23 #include <cmath>
24 #include <stdint.h>
25
26 #include <gdkmm.h>
27 #include <gtkmm/adjustment.h>
28
29 #include "gtkmm2ext/cairo_widget.h"
30 #include "widgets/visibility.h"
31
32 namespace ArdourWidgets {
33
34 class LIBWIDGETS_API ArdourFader : public CairoWidget
35 {
36 public:
37         ArdourFader (Gtk::Adjustment& adjustment, int orientation, int span, int girth);
38         virtual ~ArdourFader ();
39         static void flush_pattern_cache();
40
41         sigc::signal<void> StartGesture;
42         sigc::signal<void> StopGesture;
43         sigc::signal<void> OnExpose;
44
45         void set_default_value (float);
46         void set_text (const std::string&, bool centered = true, bool expose = true);
47
48         enum Tweaks {
49                 NoShowUnityLine = 0x1,
50                 NoButtonForward = 0x2,
51                 NoVerticalScroll = 0x4,
52         };
53
54         Tweaks tweaks() const { return _tweaks; }
55         void set_tweaks (Tweaks);
56
57 protected:
58         void on_size_request (GtkRequisition*);
59         void on_size_allocate (Gtk::Allocation& alloc);
60
61         void render (Cairo::RefPtr<Cairo::Context> const&, cairo_rectangle_t*);
62         bool on_grab_broken_event (GdkEventGrabBroken*);
63         bool on_button_press_event (GdkEventButton*);
64         bool on_button_release_event (GdkEventButton*);
65         bool on_motion_notify_event (GdkEventMotion*);
66         bool on_scroll_event (GdkEventScroll* ev);
67         bool on_enter_notify_event (GdkEventCrossing* ev);
68         bool on_leave_notify_event (GdkEventCrossing* ev);
69
70         void on_state_changed (Gtk::StateType);
71         void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
72
73         enum Orientation {
74                 VERT,
75                 HORIZ,
76         };
77
78 private:
79         Glib::RefPtr<Pango::Layout> _layout;
80         std::string                 _text;
81         Tweaks                      _tweaks;
82         Gtk::Adjustment&            _adjustment;
83         int _text_width;
84         int _text_height;
85
86         int _span, _girth;
87         int _min_span, _min_girth;
88         int _orien;
89         cairo_pattern_t* _pattern;
90         bool _hovering;
91         GdkWindow* _grab_window;
92         double _grab_loc;
93         double _grab_start;
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 } /* namespace */
157
158 #endif /* __gtkmm2ext_pixfader_h__ */