summaryrefslogtreecommitdiff
path: root/libs/widgets/widgets/ardour_fader.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/widgets/widgets/ardour_fader.h')
-rw-r--r--libs/widgets/widgets/ardour_fader.h158
1 files changed, 158 insertions, 0 deletions
diff --git a/libs/widgets/widgets/ardour_fader.h b/libs/widgets/widgets/ardour_fader.h
new file mode 100644
index 0000000000..b9270cae51
--- /dev/null
+++ b/libs/widgets/widgets/ardour_fader.h
@@ -0,0 +1,158 @@
+/*
+ Copyright (C) 2006 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef _WIDGETS_ARDOUR_FADER_H_
+#define _WIDGETS_ARDOUR_FADER_H_
+
+#include <cmath>
+#include <stdint.h>
+
+#include <gdkmm.h>
+#include <gtkmm/adjustment.h>
+
+#include "gtkmm2ext/cairo_widget.h"
+#include "widgets/visibility.h"
+
+namespace ArdourWidgets {
+
+class LIBWIDGETS_API ArdourFader : public CairoWidget
+{
+public:
+ ArdourFader (Gtk::Adjustment& adjustment, int orientation, int span, int girth);
+ virtual ~ArdourFader ();
+ static void flush_pattern_cache();
+
+ sigc::signal<void> StartGesture;
+ sigc::signal<void> StopGesture;
+ sigc::signal<void> OnExpose;
+
+ void set_default_value (float);
+ void set_text (const std::string&, bool centered = true, bool expose = true);
+
+ enum Tweaks {
+ NoShowUnityLine = 0x1,
+ NoButtonForward = 0x2,
+ NoVerticalScroll = 0x4,
+ };
+
+ Tweaks tweaks() const { return _tweaks; }
+ void set_tweaks (Tweaks);
+
+protected:
+ void on_size_request (GtkRequisition*);
+ void on_size_allocate (Gtk::Allocation& alloc);
+
+ void render (Cairo::RefPtr<Cairo::Context> const&, cairo_rectangle_t*);
+ bool on_grab_broken_event (GdkEventGrabBroken*);
+ bool on_button_press_event (GdkEventButton*);
+ bool on_button_release_event (GdkEventButton*);
+ bool on_motion_notify_event (GdkEventMotion*);
+ bool on_scroll_event (GdkEventScroll* ev);
+ bool on_enter_notify_event (GdkEventCrossing* ev);
+ bool on_leave_notify_event (GdkEventCrossing* ev);
+
+ void on_state_changed (Gtk::StateType);
+ void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
+
+ enum Orientation {
+ VERT,
+ HORIZ,
+ };
+
+private:
+ Glib::RefPtr<Pango::Layout> _layout;
+ std::string _text;
+ Tweaks _tweaks;
+ Gtk::Adjustment& _adjustment;
+ int _text_width;
+ int _text_height;
+
+ int _span, _girth;
+ int _min_span, _min_girth;
+ int _orien;
+ cairo_pattern_t* _pattern;
+ bool _hovering;
+ GdkWindow* _grab_window;
+ double _grab_loc;
+ double _grab_start;
+ bool _dragging;
+ float _default_value;
+ int _unity_loc;
+ bool _centered_text;
+
+ sigc::connection _parent_style_change;
+ Widget * _current_parent;
+ Gdk::Color get_parent_bg ();
+
+ void create_patterns();
+ void adjustment_changed ();
+ void set_adjustment_from_event (GdkEventButton *);
+ void update_unity_position ();
+ int display_span ();
+
+ struct FaderImage {
+ cairo_pattern_t* pattern;
+ double fr;
+ double fg;
+ double fb;
+ double br;
+ double bg;
+ double bb;
+ int width;
+ int height;
+
+ FaderImage (cairo_pattern_t* p,
+ double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h)
+ : pattern (p)
+ , fr (afr)
+ , fg (afg)
+ , fb (afb)
+ , br (abr)
+ , bg (abg)
+ , bb (abb)
+ , width (w)
+ , height (h)
+ {}
+
+ bool matches (double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h) {
+ return width == w &&
+ height == h &&
+ afr == fr &&
+ afg == fg &&
+ afb == fb &&
+ abr == br &&
+ abg == bg &&
+ abb == bb;
+ }
+ };
+
+ static std::list<FaderImage*> _patterns;
+ static cairo_pattern_t* find_pattern (double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h);
+
+};
+
+} /* namespace */
+
+#endif /* __gtkmm2ext_pixfader_h__ */