sfdb paths are saved and restored.
[ardour.git] / gtk2_ardour / ardour_ui2.cc
index 7655931904a94e44260abe9cd964e640569d153d..f92201e36c543e75bb5dc42238237b7d6bc0987c 100644 (file)
@@ -29,7 +29,6 @@
 #include <pbd/error.h>
 #include <pbd/basename.h>
 #include <pbd/fastlog.h>
-#include <gtkmm2ext/pix.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/tearoff.h>
@@ -48,6 +47,7 @@
 
 using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace Glib;
@@ -307,11 +307,12 @@ ARDOUR_UI::setup_transport ()
        ARDOUR_UI::instance()->tooltips().set_tip (speed_display_box, _("Current transport speed"));
        
        shuttle_box.set_flags (CAN_FOCUS);
-       shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK);
+       shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
        shuttle_box.set_size_request (100, 15);
 
        shuttle_box.signal_button_press_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_press));
        shuttle_box.signal_button_release_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_release));
+       shuttle_box.signal_scroll_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_scroll));
        shuttle_box.signal_motion_notify_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_motion));
        shuttle_box.signal_expose_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_expose));
 
@@ -652,8 +653,15 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
                shuttle_grabbed = false;
                shuttle_box.remove_modal_grab ();
                if (shuttle_behaviour == Sprung) {
-                       shuttle_fract = SHUTTLE_FRACT_SPEED1;
-                       session->request_transport_speed (1.0);
+                       if (session->get_auto_play() || roll_button.get_state()) {
+                               shuttle_fract = SHUTTLE_FRACT_SPEED1;                           
+                               session->request_transport_speed (1.0);
+                               stop_button.set_active (false);
+                               roll_button.set_active (true);
+                       } else {
+                               shuttle_fract = 0;
+                               session->request_transport_speed (0.0);
+                       }
                        shuttle_box.queue_draw ();
                }
                return true;
@@ -662,6 +670,8 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
                if (session->transport_rolling()) {
                        shuttle_fract = SHUTTLE_FRACT_SPEED1;
                        session->request_transport_speed (1.0);
+                       stop_button.set_active (false);
+                       roll_button.set_active (true);
                } else {
                        shuttle_fract = 0;
                }
@@ -684,6 +694,31 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
        return true;
 }
 
+gint
+ARDOUR_UI::shuttle_box_scroll (GdkEventScroll* ev)
+{
+       if (!session) {
+               return true;
+       }
+       
+       switch (ev->direction) {
+               
+       case GDK_SCROLL_UP:
+               shuttle_fract += 0.005;
+               break;
+       case GDK_SCROLL_DOWN:
+               shuttle_fract -= 0.005;
+               break;
+       default:
+               /* scroll left/right */
+               return false;
+       }
+
+       use_shuttle_fract (true);
+
+       return true;
+}
+
 gint
 ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
 {
@@ -782,10 +817,10 @@ ARDOUR_UI::set_shuttle_units (ShuttleUnits u)
 {
        switch ((shuttle_units = u)) {
        case Percentage:
-               static_cast<Label*>(shuttle_units_button.get_child())->set_text ("% ");
+               shuttle_units_button.set_label("% ");
                break;
        case Semitones:
-               static_cast<Label*>(shuttle_units_button.get_child())->set_text (_("st"));
+               shuttle_units_button.set_label(_("st"));
                break;
        }
 }