move assignments out of assert() in editor_drag (thanks lincoln); change mouse mode...
[ardour.git] / gtk2_ardour / editor_rulers.cc
index 5dfbb2a039774903814be5f93ac5f16151f0ff90..c37d7d68d1cfffe804f2de14dd20c05c3177f1c6 100644 (file)
@@ -34,6 +34,7 @@
 #include "gtk-custom-hruler.h"
 #include "gui_thread.h"
 #include "time_axis_view.h"
+#include "editor_drag.h"
 
 #include "i18n.h"
 
@@ -159,7 +160,6 @@ Editor::initialize_rulers ()
        minsec_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll));
 
        visible_timebars = 0; /*this will be changed below */
-       ruler_pressed_button = 0;
        canvas_timebars_vsize = 0;
 }
 
@@ -217,50 +217,37 @@ Editor::ruler_button_press (GdkEventButton* ev)
                return FALSE;
        }
 
-       ruler_pressed_button = ev->button;
-
        // jlc: grab ev->window ?
        //Gtk::Main::grab_add (*minsec_ruler);
        Widget * grab_widget = 0;
 
-       if (smpte_ruler->is_realized() && ev->window == smpte_ruler->get_window()->gobj()) grab_widget = smpte_ruler;
-       else if (bbt_ruler->is_realized() && ev->window == bbt_ruler->get_window()->gobj()) grab_widget = bbt_ruler;
-       else if (frames_ruler->is_realized() && ev->window == frames_ruler->get_window()->gobj()) grab_widget = frames_ruler;
-       else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) grab_widget = minsec_ruler;
+       if (smpte_ruler->is_realized() && ev->window == smpte_ruler->get_window()->gobj()) {
+               grab_widget = smpte_ruler;
+       } else if (bbt_ruler->is_realized() && ev->window == bbt_ruler->get_window()->gobj()) {
+               grab_widget = bbt_ruler;
+       } else if (frames_ruler->is_realized() && ev->window == frames_ruler->get_window()->gobj()) {
+               grab_widget = frames_ruler;
+       } else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) {
+               grab_widget = minsec_ruler;
+       }
 
        if (grab_widget) {
                grab_widget->add_modal_grab ();
                ruler_grabbed_widget = grab_widget;
        }
 
-       gint x,y;
-       Gdk::ModifierType state;
-
-       /* need to use the correct x,y, the event lies */
-       time_canvas_event_box.get_window()->get_pointer (x, y, state);
-
-       nframes64_t where = leftmost_frame + pixel_to_frame (x);
-
-       switch (ev->button) {
-       case 1:
+       if (ev->button == 1) {
                // Since we will locate the playhead on button release, cancel any running
                // auditions.
                if (session->is_auditioning()) {
                        session->cancel_audition ();
                }
+               
                /* playhead cursor */
-               snap_to (where);
-               playhead_cursor->set_position (where);
+               assert (_drag == 0);
+               _drag = new CursorDrag (this, &playhead_cursor->canvas_item, false);
+               _drag->start_grab (reinterpret_cast<GdkEvent *> (ev));
                _dragging_playhead = true;
-               break;
-
-       case 2:
-               /* edit point */
-               snap_to (where);
-               break;
-
-       default:
-               break;
        }
 
        return TRUE;
@@ -269,46 +256,31 @@ Editor::ruler_button_press (GdkEventButton* ev)
 gint
 Editor::ruler_button_release (GdkEventButton* ev)
 {
-       gint x,y;
-       Gdk::ModifierType state;
-
-       /* need to use the correct x,y, the event lies */
-       time_canvas_event_box.get_window()->get_pointer (x, y, state);
-
-       ruler_pressed_button = 0;
-       
        if (session == 0) {
                return FALSE;
        }
-
-       stop_canvas_autoscroll();
        
-       nframes64_t where = leftmost_frame + pixel_to_frame (x);
+       gint x,y;
+       Gdk::ModifierType state;
 
-       switch (ev->button) {
-       case 1:
-               /* transport playhead */
+       if (_drag) {
+               _drag->end_grab (reinterpret_cast<GdkEvent*> (ev));
+               delete _drag;
+               _drag = 0;
                _dragging_playhead = false;
-               snap_to (where);
-               session->request_locate (where);
-               break;
+       }
 
-       case 2:
-               /* edit point */
-               snap_to (where);
-               break;
+       if (ev->button == 3) {
+               /* need to use the correct x,y, the event lies */
+               time_canvas_event_box.get_window()->get_pointer (x, y, state);
 
-       case 3:
-               /* popup menu */
+               stop_canvas_autoscroll();
+       
+               nframes64_t where = leftmost_frame + pixel_to_frame (x);
                snap_to (where);
                popup_ruler_menu (where);
-               
-               break;
-       default:
-               break;
        }
 
-
        if (ruler_grabbed_widget) {
                ruler_grabbed_widget->remove_modal_grab();
                ruler_grabbed_widget = 0;
@@ -334,74 +306,14 @@ Editor::ruler_label_button_release (GdkEventButton* ev)
 gint
 Editor::ruler_mouse_motion (GdkEventMotion* ev)
 {
-       if (session == 0 || !ruler_pressed_button) {
+       if (session == 0) {
                return FALSE;
        }
 
-               double wcx=0,wcy=0;
-       double cx=0,cy=0;
-
-       gint x,y;
-       Gdk::ModifierType state;
-
-       /* need to use the correct x,y, the event lies */
-       time_canvas_event_box.get_window()->get_pointer (x, y, state);
-
-
-       track_canvas->c2w (x, y, wcx, wcy);
-       track_canvas->w2c (wcx, wcy, cx, cy);
-       
-       nframes64_t where = leftmost_frame + pixel_to_frame (x);
-
-       /// ripped from maybe_autoscroll, and adapted to work here
-       nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
-
-       jack_nframes_t frame = pixel_to_frame (cx);
-
-       if (autoscroll_timeout_tag < 0) {
-               if (frame > rightmost_frame) {
-                       if (rightmost_frame < max_frames) {
-                               start_canvas_autoscroll (1, 0);
-                       }
-               } else if (frame < leftmost_frame) {
-                       if (leftmost_frame > 0) {
-                               start_canvas_autoscroll (-1, 0);
-                       }
-               } 
-       } else {
-               if (frame >= leftmost_frame && frame < rightmost_frame) {
-                       stop_canvas_autoscroll ();
-               }
-       }
-       //////  
-       
-       snap_to (where);
-
-       EditorCursor* cursor = 0;
-       
-       switch (ruler_pressed_button) {
-       case 1:
-               /* transport playhead */
-               cursor = playhead_cursor;
-               break;
-
-       case 2:
-               /* edit point */
-               // EDIT CURSOR XXX do something useful
-               break;
-
-       default:
-               break;
+       if (_drag) {
+               _drag->motion_handler (reinterpret_cast<GdkEvent*> (ev), false);
        }
 
-       if (cursor) {
-               cursor->set_position (where);
-               
-               if (cursor == playhead_cursor) {
-                       UpdateAllTransportClocks (cursor->current_frame);
-               }
-       }
-       
        return TRUE;
 }
 
@@ -1065,7 +977,7 @@ Editor::set_smpte_ruler_scale (gdouble lower, gdouble upper)
 }
 
 gint
-Editor::metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
+Editor::metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upper*/, gint /*maxchars*/)
 {
        nframes_t pos;
        nframes64_t spacer;
@@ -1308,7 +1220,7 @@ Editor::compute_bbt_ruler_scale (nframes64_t lower, nframes64_t upper)
 }
 
 gint
-Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
+Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upper*/, gint /*maxchars*/)
 {
         if (session == 0) {
                 return 0;
@@ -1780,7 +1692,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
 }
 
 gint
-Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
+Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint /*maxchars*/)
 {
        nframes64_t mark_interval;
        nframes64_t pos;
@@ -1944,7 +1856,7 @@ Editor::set_minsec_ruler_scale (gdouble lower, gdouble upper)
 }
 
 gint
-Editor::metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
+Editor::metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upper*/, gint /*maxchars*/)
 {
        nframes64_t pos;
        nframes64_t spacer;