X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fshuttle_control.cc;h=d879ce50ff25d786fa4d541a82098f4b6e75d302;hb=446baca43b4fbf9208dddf87547fa663fa578b75;hp=7096cd31bb53a3983a5796a51494b973bec91c7e;hpb=5adcb61f6059bb5554ee6da7a7dba6c65b6100f0;p=ardour.git diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc index 7096cd31bb..d879ce50ff 100644 --- a/gtk2_ardour/shuttle_control.cc +++ b/gtk2_ardour/shuttle_control.cc @@ -18,7 +18,7 @@ #include -#include +#include #include "ardour/ardour.h" #include "ardour/audioengine.h" @@ -31,6 +31,7 @@ #include "gtkmm2ext/utils.h" #include "gtkmm2ext/rgb_macros.h" +#include "actions.h" #include "ardour_ui.h" #include "rgb_macros.h" #include "shuttle_control.h" @@ -112,7 +113,7 @@ ShuttleControl::on_size_allocate (Gtk::Allocation& alloc) //background pattern = cairo_pattern_create_linear (0, 0, 0, alloc.get_height()); - uint32_t col = ARDOUR_UI::config()->canvasvar_Shuttle.get(); + uint32_t col = ARDOUR_UI::config()->color ("shuttle"); int r,b,g,a; UINT_TO_RGBA(col, &r, &g, &b, &a); cairo_pattern_add_color_stop_rgb (pattern, 0.0, r/400.0, g/400.0, b/400.0); @@ -131,6 +132,15 @@ ShuttleControl::map_transport_state () { float speed = _session->transport_speed (); + if ( (fabsf( speed - last_speed_displayed) < 0.005f) // dead-zone + && !( speed == 1.f && last_speed_displayed != 1.f) + && !( speed == 0.f && last_speed_displayed != 0.f) + ) + { + return; // nothing to see here, move along. + } + + // Q: is there a good reason why we re-calculate this every time? if (fabs(speed) <= (2*DBL_EPSILON)) { shuttle_fract = 0; } else { @@ -231,6 +241,7 @@ void ShuttleControl::set_shuttle_max_speed (float speed) { shuttle_max_speed = speed; + last_speed_displayed = -99999999; } bool @@ -511,15 +522,13 @@ ShuttleControl::use_shuttle_fract (bool force, bool zero_ok) } void -ShuttleControl::render (cairo_t* cr) +ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*) { cairo_text_extents_t extents; //black border cairo_set_source_rgb (cr, 0, 0.0, 0.0); rounded_rectangle (cr, 0, 0, get_width(), get_height(), 4); -// cairo_fill_preserve (cr); -// cairo_stroke (cr); cairo_fill (cr); float speed = 0.0; @@ -529,23 +538,22 @@ ShuttleControl::render (cairo_t* cr) } /* Marker */ - float visual_fraction = std::min (1.0f, speed/shuttle_max_speed); - float marker_size = get_height()-4; - float avail_width = get_width() - marker_size; - float x = get_width()*0.5 + visual_fraction * avail_width*0.5; - float offset = x - marker_size*0.5; + float visual_fraction = std::min (1.0f, speed / shuttle_max_speed); + float marker_size = get_height() - 5.0; + float avail_width = get_width() - marker_size - 4; + float x = get_width() * 0.5 + visual_fraction * avail_width * 0.5; // cairo_set_source_rgb (cr, 0, 1, 0.0); cairo_set_source (cr, pattern); if (speed == 1.0) { - cairo_move_to( cr, offset-4, 2); - cairo_line_to( cr, offset+4, 2+marker_size*0.5); - cairo_line_to( cr, offset-4, 2+marker_size); - cairo_line_to( cr, offset-4, 2); + cairo_move_to( cr, x, 2.5); + cairo_line_to( cr, x + marker_size * .577, 2.5 + marker_size * 0.5); + cairo_line_to( cr, x, 2.5 + marker_size); + cairo_close_path(cr); } else if ( speed ==0.0 ) - rounded_rectangle (cr, offset, 4, marker_size-2, marker_size-2, 1); + rounded_rectangle (cr, x, 2.5, marker_size, marker_size, 1); else - cairo_arc (cr, offset + marker_size*0.5, 2 + marker_size*0.5, marker_size*0.5, 0, 360); - cairo_set_line_width (cr, 2); + cairo_arc (cr, x, 2.5 + marker_size * .5, marker_size * 0.47, 0, 2.0 * M_PI); + cairo_set_line_width (cr, 1.75); cairo_stroke (cr); /* speed text */ @@ -560,9 +568,9 @@ ShuttleControl::render (cairo_t* cr) snprintf (buf, sizeof (buf), "%s", _("Playing")); } else { if (speed < 0.0) { - snprintf (buf, sizeof (buf), "<<< %d%%", (int) round (-speed * 100)); + snprintf (buf, sizeof (buf), "<<< %.1f%%", -speed * 100.f); } else { - snprintf (buf, sizeof (buf), ">>> %d%%", (int) round (speed * 100)); + snprintf (buf, sizeof (buf), ">>> %.1f%%", speed * 100.f); } } @@ -584,10 +592,13 @@ ShuttleControl::render (cairo_t* cr) last_speed_displayed = speed; + // TODO use a proper pango layout, scale font cairo_set_source_rgb (cr, 0.6, 0.6, 0.6); - cairo_text_extents (cr, buf, &extents); - cairo_move_to (cr, 10, extents.height + 4); cairo_set_font_size (cr, 13.0); + cairo_text_extents (cr, "0|", &extents); // note the descender + const float text_ypos = (get_height() + extents.height - 1.) * .5; + + cairo_move_to (cr, 10, text_ypos); cairo_show_text (cr, buf); /* style text */ @@ -603,20 +614,12 @@ ShuttleControl::render (cairo_t* cr) } cairo_text_extents (cr, buf, &extents); - cairo_move_to (cr, get_width() - (fabs(extents.x_advance) + 5), extents.height + 4); + cairo_move_to (cr, get_width() - (fabs(extents.x_advance) + 5), text_ypos); cairo_show_text (cr, buf); - float _corner_radius = 4.0; - -/* //reflection - float rheight = 10.0; - Gtkmm2ext::rounded_rectangle (cr, 2, 1, get_width()-4, rheight, _corner_radius); - cairo_set_source (cr, shine_pattern); - cairo_fill (cr); -*/ - if (ARDOUR::Config->get_widget_prelight()) { + if (ARDOUR_UI::config()->get_widget_prelight()) { if (_hovering) { - rounded_rectangle (cr, 1, 1, get_width()-2, get_height()-2, _corner_radius); + rounded_rectangle (cr, 1, 1, get_width()-2, get_height()-2, 4.0); cairo_set_source_rgba (cr, 1, 1, 1, 0.2); cairo_fill (cr); } @@ -644,14 +647,6 @@ ShuttleControl::set_shuttle_units (ShuttleUnits s) Config->set_shuttle_units (s); } -void -ShuttleControl::update_speed_display () -{ - if (_session->transport_speed() != last_speed_displayed) { - queue_draw (); - } -} - ShuttleControl::ShuttleControllable::ShuttleControllable (ShuttleControl& s) : PBD::Controllable (X_("Shuttle")) , sc (s) @@ -711,7 +706,7 @@ ShuttleControl::on_enter_notify_event (GdkEventCrossing* ev) { _hovering = true; - if (ARDOUR::Config->get_widget_prelight()) { + if (ARDOUR_UI::config()->get_widget_prelight()) { queue_draw (); } @@ -723,7 +718,7 @@ ShuttleControl::on_leave_notify_event (GdkEventCrossing* ev) { _hovering = false; - if (ARDOUR::Config->get_widget_prelight()) { + if (ARDOUR_UI::config()->get_widget_prelight()) { queue_draw (); }