summaryrefslogtreecommitdiff
path: root/libs/widgets
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-01-30 18:33:15 +0100
committerRobin Gareus <robin@gareus.org>2018-01-30 19:52:27 +0100
commitfe63db8697de4e928d738e975325656cb9c15690 (patch)
tree6fea6478e3c54d8ac37f1f9675ec52828eecb738 /libs/widgets
parentff36421d8e153d6bcb5e9df0a37718deac526c5a (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.cc19
-rw-r--r--libs/widgets/widgets/ardour_button.h5
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;