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)
, led_inset_pattern (0)
, _led_rect (0)
, _act_on_release (true)
+ , _auto_toggle (toggle)
, _led_left (false)
, _distinct_led_click (false)
, _hovering (false)
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)
, led_inset_pattern (0)
, _led_rect (0)
, _act_on_release (true)
+ , _auto_toggle (toggle)
, _led_left (false)
, _distinct_led_click (false)
, _hovering (false)
return;
}
_sizing_text = str;
- if (!is_realized()) {
- return;
- }
- ensure_layout ();
- if (_layout) {
- queue_resize ();
- }
+ queue_resize ();
}
void
* of text.
*/
+ } else if (_layout_ellipsize_width > 0 && _sizing_text.empty()) {
+
+ req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
+ req->width += _layout_ellipsize_width / PANGO_SCALE;
+
} else /*if (!_text.empty() || !_sizing_text.empty()) */ {
req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
{
focus_handler (this);
+ if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) {
+ return _fallthrough_to_parent ? false : true;
+ }
+
if (ev->button == 1 && (_elements & Indicator) && _led_rect && _distinct_led_click) {
if (ev->x >= _led_rect->x && ev->x < _led_rect->x + _led_rect->width &&
ev->y >= _led_rect->y && ev->y < _led_rect->y + _led_rect->height) {
if (_action) {
_action->activate ();
return true;
+ } else if (_auto_toggle) {
+ set_active (!get_active ());
+ signal_clicked ();
+ return true;
}
}
- if (_fallthrough_to_parent)
- return false;
-
- return true;
+ return _fallthrough_to_parent ? false : true;
}
bool
ArdourButton::on_button_release_event (GdkEventButton *ev)
{
+ if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS) {
+ return _fallthrough_to_parent ? false : true;
+ }
if (ev->button == 1 && _hovering && (_elements & Indicator) && _led_rect && _distinct_led_click) {
if (ev->x >= _led_rect->x && ev->x < _led_rect->x + _led_rect->width &&
ev->y >= _led_rect->y && ev->y < _led_rect->y + _led_rect->height) {
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) {
}
}
- if (_fallthrough_to_parent)
- return false;
-
- return true;
+ return _fallthrough_to_parent ? false : true;
}
void
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 ();
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 ();