fix spelling error
[ardour.git] / gtk2_ardour / ardour_button.cc
index 77cac188a238f99e4c2cf0de544891c3664ef0da..03c9f562366697fa3fe59669344ae867ad613677 100644 (file)
@@ -77,6 +77,8 @@ ArdourButton::ArdourButton (Element e)
        , text_inactive_color(0)
        , led_active_color(0)
        , led_inactive_color(0)
+       , led_custom_color (0)
+       , use_custom_led_color (false)
        , convex_pattern (0)
        , concave_pattern (0)
        , led_inset_pattern (0)
@@ -113,6 +115,8 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
        , text_inactive_color(0)
        , led_active_color(0)
        , led_inactive_color(0)
+       , led_custom_color (0)
+       , use_custom_led_color (false)
        , convex_pattern (0)
        , concave_pattern (0)
        , led_inset_pattern (0)
@@ -209,6 +213,10 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                led_color = led_inactive_color;
        }
 
+       if (use_custom_led_color) {
+               led_color = led_custom_color;
+       }
+
        void (*rounded_function)(cairo_t*, double, double, double, double, double);
 
        switch (_corner_mask) {
@@ -264,7 +272,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
 
        //show the "convex" or "concave" gradient
        if (!_flat_buttons) {
-               if ( active_state() == Gtkmm2ext::ExplicitActive && !((_elements & Indicator)==Indicator) ) {
+               if ( active_state() == Gtkmm2ext::ExplicitActive && ( !((_elements & Indicator)==Indicator) || use_custom_led_color) ) {
                        //concave
                        cairo_set_source (cr, concave_pattern);
                        Gtkmm2ext::rounded_rectangle (cr, 1, 1, get_width() - 2, get_height() - 2, _corner_radius);
@@ -520,7 +528,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
        }
 
        // if requested, show hovering
-       if (ARDOUR::Config->get_widget_prelight()
+       if (ARDOUR_UI::config()->get_widget_prelight()
                        && !((visual_state() & Gtkmm2ext::Insensitive))) {
                if (_hovering) {
                        rounded_function (cr, 1, 1, get_width() - 2, get_height() - 2, _corner_radius);
@@ -587,7 +595,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
        CairoWidget::on_size_request (req);
 
        if (_diameter == 0) {
-               const float newdia = rint (ARDOUR::Config->get_font_scale () / 1024. / 7.5); // 11px with 80% font-scaling
+               const float newdia = rint (ARDOUR_UI::config()->get_font_scale () / 9600.0); // 11px with 100% font-scaling
                if (_diameter != newdia) {
                        _pattern_height = 0;
                        _diameter = newdia;
@@ -785,7 +793,7 @@ ArdourButton::on_button_press_event (GdkEventButton *ev)
 {
        focus_handler ();
 
-       if ((_elements & Indicator) && _led_rect && _distinct_led_click) {
+       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) {
                        return true;
@@ -799,7 +807,7 @@ ArdourButton::on_button_press_event (GdkEventButton *ev)
        _grabbed = true;
        CairoWidget::set_dirty ();
 
-       if (!_act_on_release) {
+       if (ev->button == 1 && !_act_on_release) {
                if (_action) {
                        _action->activate ();
                        return true;
@@ -815,7 +823,7 @@ ArdourButton::on_button_press_event (GdkEventButton *ev)
 bool
 ArdourButton::on_button_release_event (GdkEventButton *ev)
 {
-       if (_hovering && (_elements & Indicator) && _led_rect && _distinct_led_click) {
+       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) {
                        signal_led_clicked(); /* EMIT SIGNAL */
@@ -826,7 +834,7 @@ ArdourButton::on_button_release_event (GdkEventButton *ev)
        _grabbed = false;
        CairoWidget::set_dirty ();
 
-       if (_hovering) {
+       if (ev->button == 1 && _hovering) {
                signal_clicked ();
                if (_act_on_release) {
                        if (_action) {
@@ -1044,7 +1052,7 @@ ArdourButton::on_enter_notify_event (GdkEventCrossing* ev)
 {
        _hovering = (_elements & Inactive) ? false : true;
 
-       if (ARDOUR::Config->get_widget_prelight()) {
+       if (ARDOUR_UI::config()->get_widget_prelight()) {
                CairoWidget::set_dirty ();
        }
 
@@ -1056,7 +1064,7 @@ ArdourButton::on_leave_notify_event (GdkEventCrossing* ev)
 {
        _hovering = false;
 
-       if (ARDOUR::Config->get_widget_prelight()) {
+       if (ARDOUR_UI::config()->get_widget_prelight()) {
                CairoWidget::set_dirty ();
        }
 
@@ -1085,7 +1093,7 @@ ArdourButton::action_sensitivity_changed ()
 }
 
 void
-ArdourButton::set_layout_ellisize_width (int w)
+ArdourButton::set_layout_ellipsize_width (int w)
 {
        if (_layout_ellipsize_width == w) {
                return;
@@ -1094,8 +1102,11 @@ ArdourButton::set_layout_ellisize_width (int w)
        if (!_layout) {
                return;
        }
-       if (_layout_ellipsize_width > 0) {
-       _layout->set_width (_layout_ellipsize_width);
+       if (_layout_ellipsize_width > 3 * PANGO_SCALE) {
+               _layout->set_width (_layout_ellipsize_width - 3 * PANGO_SCALE);
+       }
+       if (is_realized ()) {
+               queue_resize ();
        }
 }
 
@@ -1110,8 +1121,8 @@ ArdourButton::set_text_ellipsize (Pango::EllipsizeMode e)
                return;
        }
        _layout->set_ellipsize(_ellipsis);
-       if (_layout_ellipsize_width > 0) {
-               _layout->set_width (_layout_ellipsize_width);
+       if (_layout_ellipsize_width > 3 * PANGO_SCALE) {
+               _layout->set_width (_layout_ellipsize_width - 3 * PANGO_SCALE);
        }
        if (is_realized ()) {
                queue_resize ();
@@ -1125,8 +1136,8 @@ ArdourButton::ensure_layout ()
                ensure_style ();
                _layout = Pango::Layout::create (get_pango_context());
                _layout->set_ellipsize(_ellipsis);
-               if (_layout_ellipsize_width > 0) {
-                       _layout->set_width (_layout_ellipsize_width);
+               if (_layout_ellipsize_width > 3 * PANGO_SCALE) {
+                       _layout->set_width (_layout_ellipsize_width - 3* PANGO_SCALE);
                }
        }
 }
@@ -1183,3 +1194,15 @@ ArdourButton::add_elements (Element e)
        _elements = (ArdourButton::Element) (_elements | e);
        CairoWidget::set_dirty ();
 }
+
+void
+ArdourButton::set_custom_led_color (uint32_t c, bool useit)
+{
+       if (led_custom_color == c && use_custom_led_color == useit) {
+               return;
+       }
+
+       led_custom_color = c;
+       use_custom_led_color = useit;
+       CairoWidget::set_dirty ();
+}