diff options
author | Robin Gareus <robin@gareus.org> | 2018-01-30 18:33:15 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-01-30 19:52:27 +0100 |
commit | fe63db8697de4e928d738e975325656cb9c15690 (patch) | |
tree | 6fea6478e3c54d8ac37f1f9675ec52828eecb738 /libs/widgets | |
parent | ff36421d8e153d6bcb5e9df0a37718deac526c5a (diff) |
Ardour Button Toggle explosion
Add option to use ArduorButton as standalone Toggle/Checkbox.
Usually ArdourButton relegates this to Actions or is backed by Config.
This allows to use the Button as standalone Toggle, get_active()
It should maybe be a derived Class, but ArdourButton is already beyond
that..
Diffstat (limited to 'libs/widgets')
-rw-r--r-- | libs/widgets/ardour_button.cc | 19 | ||||
-rw-r--r-- | libs/widgets/widgets/ardour_button.h | 5 |
2 files changed, 20 insertions, 4 deletions
diff --git a/libs/widgets/ardour_button.cc b/libs/widgets/ardour_button.cc index 7f16c242dd..145d46d94c 100644 --- a/libs/widgets/ardour_button.cc +++ b/libs/widgets/ardour_button.cc @@ -55,7 +55,7 @@ ArdourButton::Element ArdourButton::default_elements = ArdourButton::Element (Ar ArdourButton::Element ArdourButton::led_default_elements = ArdourButton::Element (ArdourButton::default_elements|ArdourButton::Indicator); ArdourButton::Element ArdourButton::just_led_default_elements = ArdourButton::Element (ArdourButton::Edge|ArdourButton::Body|ArdourButton::Indicator); -ArdourButton::ArdourButton (Element e) +ArdourButton::ArdourButton (Element e, bool toggle) : _sizing_text("") , _markup (false) , _elements (e) @@ -87,6 +87,7 @@ ArdourButton::ArdourButton (Element e) , led_inset_pattern (0) , _led_rect (0) , _act_on_release (true) + , _auto_toggle (toggle) , _led_left (false) , _distinct_led_click (false) , _hovering (false) @@ -103,7 +104,7 @@ ArdourButton::ArdourButton (Element e) signal_grab_broken_event().connect (sigc::mem_fun (*this, &ArdourButton::on_grab_broken_event)); } -ArdourButton::ArdourButton (const std::string& str, Element e) +ArdourButton::ArdourButton (const std::string& str, Element e, bool toggle) : _sizing_text("") , _markup (false) , _elements (e) @@ -133,6 +134,7 @@ ArdourButton::ArdourButton (const std::string& str, Element e) , led_inset_pattern (0) , _led_rect (0) , _act_on_release (true) + , _auto_toggle (toggle) , _led_left (false) , _distinct_led_click (false) , _hovering (false) @@ -880,6 +882,10 @@ ArdourButton::on_button_press_event (GdkEventButton *ev) if (_action) { _action->activate (); return true; + } else if (_auto_toggle) { + set_active (!get_active ()); + signal_clicked (); + return true; } } @@ -904,6 +910,9 @@ ArdourButton::on_button_release_event (GdkEventButton *ev) CairoWidget::set_dirty (); if (ev->button == 1 && _hovering) { + if (_act_on_release && _auto_toggle && !_action) { + set_active (!get_active ()); + } signal_clicked (); if (_act_on_release) { if (_action) { @@ -1111,6 +1120,9 @@ ArdourButton::on_key_release_event (GdkEventKey *ev) { if (_act_on_release && _focused && (ev->keyval == GDK_space || ev->keyval == GDK_Return)) { + if (_auto_toggle && !_action) { + set_active (!get_active ()); + } signal_clicked(); if (_action) { _action->activate (); @@ -1125,6 +1137,9 @@ ArdourButton::on_key_press_event (GdkEventKey *ev) { if (!_act_on_release && _focused && (ev->keyval == GDK_space || ev->keyval == GDK_Return)) { + if (_auto_toggle && !_action) { + set_active (!get_active ()); + } signal_clicked(); if (_action) { _action->activate (); diff --git a/libs/widgets/widgets/ardour_button.h b/libs/widgets/widgets/ardour_button.h index 6630c19450..b530e8b399 100644 --- a/libs/widgets/widgets/ardour_button.h +++ b/libs/widgets/widgets/ardour_button.h @@ -55,8 +55,8 @@ class LIBWIDGETS_API ArdourButton : public CairoWidget , public Gtkmm2ext::Activ static Element led_default_elements; static Element just_led_default_elements; - ArdourButton (Element e = default_elements); - ArdourButton (const std::string&, Element e = default_elements); + ArdourButton (Element e = default_elements, bool toggle = false); + ArdourButton (const std::string&, Element e = default_elements, bool toggle = false); virtual ~ArdourButton (); enum Tweaks { @@ -193,6 +193,7 @@ class LIBWIDGETS_API ArdourButton : public CairoWidget , public Gtkmm2ext::Activ cairo_rectangle_t* _led_rect; bool _act_on_release; + bool _auto_toggle; bool _led_left; bool _distinct_led_click; bool _hovering; |