add icons for cut mouse mode button and cut cursor (both need improving)
[ardour.git] / gtk2_ardour / ardour_button.cc
index bc105304171b2378400f58bbaae84bdf4e1e2456..2525d57c07cf9d8613afd468eb183f5d23f2c437 100644 (file)
@@ -86,8 +86,10 @@ ArdourButton::ArdourButton (Element e)
        , _fixed_diameter (true)
        , _distinct_led_click (false)
        , _hovering (false)
+       , _focused (false)
+       , _fixed_colors_set (false)
 {
-       ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
+       ARDOUR_UI_UTILS::ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
 }
 
 ArdourButton::ArdourButton (const std::string& str, Element e)
@@ -122,6 +124,8 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
        , _fixed_diameter (true)
        , _distinct_led_click (false)
        , _hovering (false)
+       , _focused (false)
+       , _fixed_colors_set (false)
 {
        set_text (str);
 }
@@ -267,7 +271,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                }
        }
 
-       if ( ((_elements & FlatFace)==FlatFace) && (active_state() != Gtkmm2ext::ExplicitActive) ) {
+       if ( ((_elements & Inset)==Inset) && (active_state() != Gtkmm2ext::ExplicitActive) ) {
 
                if ( !_flat_buttons ) {
                        float rheight = get_height()*0.5-REFLECTION_HEIGHT;
@@ -324,7 +328,10 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                cairo_new_path (cr);    
                cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a);
 
-               if (_elements & Indicator) {
+               if ( (_elements & Menu) == Menu) {
+                       cairo_move_to (cr, text_margin, get_height()/2.0 - _text_height/2.0);
+                       pango_cairo_show_layout (cr, _layout->gobj());
+               } else if ( (_elements & Indicator)  == Indicator) {
                        if (_led_left) {
                                cairo_move_to (cr, text_margin + _diameter + 4, get_height()/2.0 - _text_height/2.0);
                        } else {
@@ -363,6 +370,23 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                cairo_restore (cr);
        } 
 
+       if (((_elements & Menu)==Menu)) {
+       
+               cairo_save (cr);
+
+               cairo_translate (cr, 0,0 );
+               
+               //white arrow
+               cairo_set_source_rgba (cr, 1, 1, 1, 0.4);
+               cairo_move_to(cr, get_width() - ((_diameter/2.0) + 6.0), get_height()/2.0 +_diameter/4);
+               cairo_rel_line_to(cr, -_diameter/2, -_diameter/2);
+               cairo_rel_line_to(cr, _diameter, 0);
+               cairo_close_path(cr);
+               cairo_fill(cr);
+                       
+               cairo_restore (cr);
+       }
+       
        if (((_elements & Indicator)==Indicator)) {
 
                /* move to the center of the indicator/led */
@@ -427,6 +451,16 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                        cairo_fill (cr);
                }
        }
+       if (_focused) {
+               rounded_function (cr, 1.5, 1.5, get_width() - 3, get_height() - 3, _corner_radius);
+               cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.8);
+               double dashes = 1;
+               cairo_set_dash (cr, &dashes, 1, 0);
+               cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+               cairo_set_line_width (cr, 1.0);
+               cairo_stroke (cr);
+               cairo_set_dash (cr, 0, 0, 0);
+       }
 }
 
 void
@@ -500,6 +534,9 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
 void
 ArdourButton::set_colors ()
 {
+       if (_fixed_colors_set) {
+               return;
+       }
        std::string name = get_name();
 
        border_color = ARDOUR_UI::config()->color_by_name ("button border");
@@ -523,9 +560,7 @@ ArdourButton::set_colors ()
  */
 void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t color_inactive)
 {
-       set_name (""); /* this will trigger a "style-changed" message and then
-                         set_colors()
-                      */
+       _fixed_colors_set = true;
 
        fill_start_active_color = fill_end_active_color = color_active;
 
@@ -550,6 +585,7 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
        /* XXX what about led colors ? */
 
        build_patterns ();
+       set_name (""); /* this will trigger a "style-changed" message and then set_colors() */
 }
 
 void
@@ -901,6 +937,37 @@ ArdourButton::set_visual_state (Gtkmm2ext::VisualState s)
        }
 }
        
+
+bool
+ArdourButton::on_focus_in_event (GdkEventFocus* ev)
+{
+       _focused = true;
+       queue_draw ();
+       return CairoWidget::on_focus_in_event (ev);
+}
+
+bool
+ArdourButton::on_focus_out_event (GdkEventFocus* ev)
+{
+       _focused = false;
+       queue_draw ();
+       return CairoWidget::on_focus_out_event (ev);
+}
+
+bool
+ArdourButton::on_key_release_event (GdkEventKey *ev) {
+       if (_focused &&
+                       (ev->keyval == GDK_KEY_space || ev->keyval == GDK_Return))
+       {
+               signal_clicked();
+               if (_action) {
+                       _action->activate ();
+               }
+               return true;
+       }
+       return CairoWidget::on_key_release_event (ev);
+}
+
 bool
 ArdourButton::on_enter_notify_event (GdkEventCrossing* ev)
 {