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..
This commit is contained in:
Robin Gareus 2018-01-30 18:33:15 +01:00
parent ff36421d8e
commit fe63db8697
2 changed files with 20 additions and 4 deletions

View file

@ -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 ();

View file

@ -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;