diff options
author | Robin Gareus <robin@gareus.org> | 2014-09-05 02:24:19 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-09-05 02:24:19 +0200 |
commit | 48a851011b6134794ce0f64a4866c2e9fc97b058 (patch) | |
tree | c5486c4cdb064961a70220f47f98be267977fae6 /libs/gtkmm2ext | |
parent | 4c12a01b62d04084fcb50f72bd30f83daaf69461 (diff) |
add pixfader tweaks API:
* change API to hide unity/default value line
* allow to override vertical scroll [1]
* allow changing button event forwarding [2]
[1] override scrolling in track-headers
[2] dbl-click is needed for BarControllers -> switch to SpinBtn
but a plain Slider on a track-header should not forward
these events to the TAV (they may trigger name-edit)
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r-- | libs/gtkmm2ext/barcontroller.cc | 2 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/pixfader.h | 24 | ||||
-rw-r--r-- | libs/gtkmm2ext/pixfader.cc | 107 |
3 files changed, 72 insertions, 61 deletions
diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc index 28d2bf8293..f427b50389 100644 --- a/libs/gtkmm2ext/barcontroller.cc +++ b/libs/gtkmm2ext/barcontroller.cc @@ -49,7 +49,7 @@ BarController::BarController (Gtk::Adjustment& adj, set (.5, .5, 1.0, 1.0); set_border_width (0); _slider.set_controllable (mc); - _slider.show_unity_line (false); + _slider.set_tweaks (PixFader::NoShowUnityLine); _slider.StartGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_start)); _slider.StopGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_stop)); diff --git a/libs/gtkmm2ext/gtkmm2ext/pixfader.h b/libs/gtkmm2ext/gtkmm2ext/pixfader.h index 0ec46a1c74..6cf966f1b3 100644 --- a/libs/gtkmm2ext/gtkmm2ext/pixfader.h +++ b/libs/gtkmm2ext/gtkmm2ext/pixfader.h @@ -43,16 +43,17 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea void set_default_value (float); void set_text (const std::string&, bool centered = true, bool expose = true); - void show_unity_line (bool yn); - protected: - Glib::RefPtr<Pango::Layout> _layout; - std::string _text; - int _text_width; - int _text_height; + enum Tweaks { + NoShowUnityLine = 0x1, + NoButtonForward = 0x2, + NoVerticalScroll = 0x4, + }; - Gtk::Adjustment& adjustment; + Tweaks tweaks() const { return _tweaks; } + void set_tweaks (Tweaks); + protected: void on_size_request (GtkRequisition*); void on_size_allocate (Gtk::Allocation& alloc); @@ -73,6 +74,14 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea }; 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; @@ -86,7 +95,6 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea float _default_value; int _unity_loc; bool _centered_text; - bool _display_unity_line; sigc::connection _parent_style_change; Widget * _current_parent; diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc index c7cc85193e..98ef46a983 100644 --- a/libs/gtkmm2ext/pixfader.cc +++ b/libs/gtkmm2ext/pixfader.cc @@ -41,7 +41,11 @@ using namespace std; std::list<PixFader::FaderImage*> PixFader::_patterns; PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int fader_girth) - : adjustment (adj) + : _layout (0) + , _tweaks (Tweaks(0)) + , _adjustment (adj) + , _text_width (0) + , _text_height (0) , _span (fader_length) , _girth (fader_girth) , _min_span (fader_length) @@ -52,10 +56,9 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int , _last_drawn (-1) , _dragging (false) , _centered_text (true) - , _display_unity_line (true) , _current_parent (0) { - _default_value = adjustment.get_value(); + _default_value = _adjustment.get_value(); update_unity_position (); add_events ( @@ -67,8 +70,8 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int | Gdk::LEAVE_NOTIFY_MASK ); - adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); - adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); + _adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); + _adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); if (_orien == VERT) { DrawingArea::set_size_request(_girth, _span); @@ -290,7 +293,7 @@ PixFader::on_expose_event (GdkEventExpose* ev) } /* draw the unity-position line if it's not at either end*/ - if (_display_unity_line && _unity_loc > CORNER_RADIUS) { + if (!(_tweaks & NoShowUnityLine) && _unity_loc > CORNER_RADIUS) { context->set_line_width (1); context->set_line_cap (Cairo::LINE_CAP_ROUND); Gdk::Color c = get_style()->get_fg (Gtk::STATE_ACTIVE); @@ -384,7 +387,7 @@ PixFader::on_button_press_event (GdkEventButton* ev) gdk_pointer_ungrab (GDK_CURRENT_TIME); StopGesture (); } - return false; + return (_tweaks & NoButtonForward) ? true : false; } if (ev->button != 1 && ev->button != 2) { @@ -405,7 +408,7 @@ PixFader::on_button_press_event (GdkEventButton* ev) set_adjustment_from_event (ev); } - return true; + return (_tweaks & NoButtonForward) ? true : false; } bool @@ -432,16 +435,16 @@ PixFader::on_button_release_event (GdkEventButton* ev) ev_pos = rint(ev_pos); if (ev->state & Keyboard::TertiaryModifier) { - adjustment.set_value (_default_value); + _adjustment.set_value (_default_value); } else if (ev->state & Keyboard::GainFineScaleModifier) { - adjustment.set_value (adjustment.get_lower()); + _adjustment.set_value (_adjustment.get_lower()); } else if (ev_pos == slider_pos) { ; // click on current position, no move. } else if ((_orien == VERT && ev_pos < slider_pos) || (_orien == HORIZ && ev_pos > slider_pos)) { /* above the current display height, remember X Window coords */ - adjustment.set_value (adjustment.get_value() + adjustment.get_step_increment()); + _adjustment.set_value (_adjustment.get_value() + _adjustment.get_step_increment()); } else { - adjustment.set_value (adjustment.get_value() - adjustment.get_step_increment()); + _adjustment.set_value (_adjustment.get_value() - _adjustment.get_step_increment()); } } return true; @@ -482,42 +485,37 @@ PixFader::on_scroll_event (GdkEventScroll* ev) } if (_orien == VERT) { - - /* should left/right scroll affect vertical faders ? */ - switch (ev->direction) { - - case GDK_SCROLL_UP: - adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale)); - ret = true; - break; - case GDK_SCROLL_DOWN: - adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale)); - ret = true; - break; - default: - break; + case GDK_SCROLL_UP: + _adjustment.set_value (_adjustment.get_value() + (_adjustment.get_page_increment() * scale)); + ret = true; + break; + case GDK_SCROLL_DOWN: + _adjustment.set_value (_adjustment.get_value() - (_adjustment.get_page_increment() * scale)); + ret = true; + break; + default: + break; } } else { + int dir = ev->direction; - /* up/down scrolls should definitely affect horizontal faders - because they are so much easier to use - */ - - switch (ev->direction) { + if (ev->state & Keyboard::ScrollHorizontalModifier || !(_tweaks & NoVerticalScroll)) { + if (ev->direction == GDK_SCROLL_UP) dir = GDK_SCROLL_RIGHT; + if (ev->direction == GDK_SCROLL_DOWN) dir = GDK_SCROLL_LEFT; + } - case GDK_SCROLL_RIGHT: - case GDK_SCROLL_UP: - adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale)); - ret = true; - break; - case GDK_SCROLL_LEFT: - case GDK_SCROLL_DOWN: - adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale)); - ret = true; - break; - default: - break; + switch (dir) { + case GDK_SCROLL_RIGHT: + _adjustment.set_value (_adjustment.get_value() + (_adjustment.get_page_increment() * scale)); + ret = true; + break; + case GDK_SCROLL_LEFT: + _adjustment.set_value (_adjustment.get_value() - (_adjustment.get_page_increment() * scale)); + ret = true; + break; + default: + break; } } return ret; @@ -558,7 +556,7 @@ PixFader::on_motion_notify_event (GdkEventMotion* ev) fract = -fract; } - adjustment.set_value (adjustment.get_value() + scale * fract * (adjustment.get_upper() - adjustment.get_lower())); + _adjustment.set_value (_adjustment.get_value() + scale * fract * (_adjustment.get_upper() - _adjustment.get_lower())); } return true; @@ -576,7 +574,7 @@ PixFader::adjustment_changed () int PixFader::display_span () { - float fract = (adjustment.get_value () - adjustment.get_lower()) / ((adjustment.get_upper() - adjustment.get_lower())); + float fract = (_adjustment.get_value () - _adjustment.get_lower()) / ((_adjustment.get_upper() - _adjustment.get_lower())); int ds; if (_orien == VERT) { ds = (int)rint (_span * (1.0 - fract)); @@ -591,9 +589,9 @@ void PixFader::update_unity_position () { if (_orien == VERT) { - _unity_loc = (int) rint (_span * (1 - ((_default_value - adjustment.get_lower()) / (adjustment.get_upper() - adjustment.get_lower())))) - 1; + _unity_loc = (int) rint (_span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1; } else { - _unity_loc = (int) rint ((_default_value - adjustment.get_lower()) * _span / (adjustment.get_upper() - adjustment.get_lower())); + _unity_loc = (int) rint ((_default_value - _adjustment.get_lower()) * _span / (_adjustment.get_upper() - _adjustment.get_lower())); } queue_draw (); @@ -627,7 +625,7 @@ PixFader::set_adjustment_from_event (GdkEventButton* ev) fract = min (1.0, fract); fract = max (0.0, fract); - adjustment.set_value (fract * (adjustment.get_upper () - adjustment.get_lower ())); + _adjustment.set_value (fract * (_adjustment.get_upper () - _adjustment.get_lower ())); } void @@ -638,11 +636,16 @@ PixFader::set_default_value (float d) } void -PixFader::show_unity_line (bool yn ) +PixFader::set_tweaks (Tweaks t) { - if (yn == _display_unity_line) return; - _display_unity_line = yn; - queue_draw(); + bool need_redraw = false; + if ((_tweaks & NoShowUnityLine) ^ (t & NoShowUnityLine)) { + need_redraw = true; + } + _tweaks = t; + if (need_redraw) { + queue_draw(); + } } void |