#include "gtkmm2ext/gui_thread.h"
#include "ardour_ui.h"
+#include "rgb_macros.h"
#include "shuttle_control.h"
#include "i18n.h"
set_size_request (100, 15);
set_name (X_("ShuttleControl"));
- Config->ParameterChanged.connect (parameter_connection, MISSING_INVALIDATOR, ui_bind (&ShuttleControl::parameter_changed, this, _1), gui_context());
+ Config->ParameterChanged.connect (parameter_connection, MISSING_INVALIDATOR, boost::bind (&ShuttleControl::parameter_changed, this, _1), gui_context());
/* gtkmm 2.4: the C++ wrapper doesn't work */
g_signal_connect ((GObject*) gobj(), "query-tooltip", G_CALLBACK (qt), NULL);
}
pattern = cairo_pattern_create_linear (0, 0, alloc.get_width(), alloc.get_height());
-
+
/* add 3 color stops */
+ uint32_t col = ARDOUR_UI::config()->canvasvar_Shuttle.get();
+
+ int r,b,g,a;
+ UINT_TO_RGBA(col, &r, &g, &b, &a);
+
cairo_pattern_add_color_stop_rgb (pattern, 0.0, 0, 0, 0);
- cairo_pattern_add_color_stop_rgb (pattern, 0.5, 0.0, 0.0, 1.0);
+ cairo_pattern_add_color_stop_rgb (pattern, 0.5, r/255.0, g/255.0, b/255.0);
cairo_pattern_add_color_stop_rgb (pattern, 1.0, 0, 0, 0);
DrawingArea::on_size_allocate (alloc);
Menu* units_menu = manage (new Menu);
MenuList& units_items = units_menu->items();
RadioMenuItem::Group units_group;
-
+
units_items.push_back (RadioMenuElem (units_group, _("Percent"), sigc::bind (sigc::mem_fun (*this, &ShuttleControl::set_shuttle_units), Percentage)));
if (Config->get_shuttle_units() == Percentage) {
static_cast<RadioMenuItem*>(&units_items.back())->set_active();
static_cast<RadioMenuItem*>(&units_items.back())->set_active();
}
items.push_back (MenuElem (_("Units"), *units_menu));
-
+
Menu* style_menu = manage (new Menu);
MenuList& style_items = style_menu->items();
RadioMenuItem::Group style_group;
if (Config->get_shuttle_behaviour() == Wheel) {
static_cast<RadioMenuItem*>(&style_items.back())->set_active();
}
-
+
items.push_back (MenuElem (_("Mode"), *style_menu));
RadioMenuItem::Group speed_group;
}
items.push_back (MenuElem (_("Maximum speed"), *speed_menu));
-
+
}
void
case 2:
if (_session->transport_rolling()) {
_session->request_transport_speed (1.0);
- }
+ }
return true;
case 3:
return true;
}
+ bool semis = (Config->get_shuttle_units() == Semitones);
+
switch (ev->direction) {
case GDK_SCROLL_UP:
case GDK_SCROLL_RIGHT:
- shuttle_fract += 0.005;
+ if (semis) {
+ if (shuttle_fract == 0) {
+ shuttle_fract = semitones_as_fract (1, false);
+ } else {
+ bool rev;
+ int st = fract_as_semitones (shuttle_fract, rev);
+ shuttle_fract = semitones_as_fract (st + 1, rev);
+ }
+ } else {
+ shuttle_fract += 0.00125;
+ }
break;
case GDK_SCROLL_DOWN:
case GDK_SCROLL_LEFT:
- shuttle_fract -= 0.005;
+ if (semis) {
+ if (shuttle_fract == 0) {
+ shuttle_fract = semitones_as_fract (1, true);
+ } else {
+ bool rev;
+ int st = fract_as_semitones (shuttle_fract, rev);
+ shuttle_fract = semitones_as_fract (st - 1, rev);
+ }
+ } else {
+ shuttle_fract -= 0.00125;
+ }
break;
default:
return false;
}
-
- if (Config->get_shuttle_units() == Semitones) {
+
+ if (semis) {
float lower_side_of_dead_zone = semitones_as_fract (-24, true);
float upper_side_of_dead_zone = semitones_as_fract (-24, false);
}
/* compute shuttle fract as expressing how far between the center
- and the edge we are. positive values indicate we are right of
+ and the edge we are. positive values indicate we are right of
center, negative values indicate left of center
*/
reverse = false;
return (int) round (12.0 * fast_log2 (speed));
}
-}
+}
float
ShuttleControl::semitones_as_speed (int semi, bool reverse)
}
bool
-ShuttleControl::on_expose_event (GdkEventExpose* event)
+ShuttleControl::on_expose_event (GdkEventExpose*)
{
cairo_text_extents_t extents;
Glib::RefPtr<Gdk::Window> win (get_window());
Glib::RefPtr<Gtk::Style> style (get_style());
- cairo_t* cr = gdk_cairo_create (win->gobj());
+ cairo_t* cr = gdk_cairo_create (win->gobj());
cairo_set_source (cr, pattern);
cairo_rectangle (cr, 0.0, 0.0, get_width(), get_height());
if (Config->get_shuttle_units() == Percentage) {
if (speed == 1.0) {
- snprintf (buf, sizeof (buf), _("Playing"));
+ snprintf (buf, sizeof (buf), "%s", _("Playing"));
} else {
if (speed < 0.0) {
snprintf (buf, sizeof (buf), "<<< %d%%", (int) round (-speed * 100));
}
} else {
- snprintf (buf, sizeof (buf), _("Stopped"));
+ snprintf (buf, sizeof (buf), "%s", _("Stopped"));
}
last_speed_displayed = speed;
switch (Config->get_shuttle_behaviour()) {
case Sprung:
- snprintf (buf, sizeof (buf), _("Sprung"));
+ snprintf (buf, sizeof (buf), "%s", _("Sprung"));
break;
case Wheel:
- snprintf (buf, sizeof (buf), _("Wheel"));
+ snprintf (buf, sizeof (buf), "%s", _("Wheel"));
break;
}
queue_draw ();
}
}
-
+
ShuttleControl::ShuttleControllable::ShuttleControllable (ShuttleControl& s)
- : PBD::Controllable (X_("Shuttle"))
+ : PBD::Controllable (X_("Shuttle"))
, sc (s)
{
}
-void
-ShuttleControl::ShuttleControllable::set_id (const std::string& str)
-{
- _id = str;
-}
-
void
ShuttleControl::ShuttleControllable::set_value (double val)
{
double fract;
-
+
if (val == 0.5) {
fract = 0.0;
} else {
sc.set_shuttle_fract (fract);
}
-double
+double
ShuttleControl::ShuttleControllable::get_value () const
{
return sc.get_shuttle_fract ();
queue_draw ();
break;
}
-
+
} else if (p == "shuttle-units") {
queue_draw ();
}