X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_button.cc;h=2525d57c07cf9d8613afd468eb183f5d23f2c437;hb=c028d223dff472bcadce3cbe9d000f20053de763;hp=bc105304171b2378400f58bbaae84bdf4e1e2456;hpb=ab44e41dfd8b8247ed5f57a8f3fcbbf4f8457827;p=ardour.git diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index bc10530417..2525d57c07 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -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) {