merge from 2.0-ongoing by hand, minus key binding editor
[ardour.git] / gtk2_ardour / editor_rulers.cc
index 96d6e635ba0300dc88bb2c40f6af3accebda0371..88ff3a0c1e9452b7c991e3da4ffe5248352a388e 100644 (file)
@@ -57,8 +57,9 @@ Editor::initialize_rulers ()
        
        _ruler_separator = new Gtk::HSeparator();
        _ruler_separator->set_size_request(-1, 2);
+       _ruler_separator->set_name("TimebarPadding");
        _ruler_separator->show();
-
+       
        _smpte_ruler = gtk_custom_hruler_new ();
        smpte_ruler = Glib::wrap (_smpte_ruler);
        smpte_ruler->set_name ("SMPTERuler");
@@ -151,14 +152,15 @@ Editor::ruler_button_press (GdkEventButton* ev)
 
        switch (ev->button) {
        case 1:
-               // Since we are about to move the playhead, cancel any running
+               // Since we will locate the playhead on button release, cancel any running
                // auditions.
                if (session->is_auditioning()) {
                        session->cancel_audition ();
                }
-               /* transport playhead */
+               /* playhead cursor */
                snap_to (where);
-               session->request_locate (where);
+               playhead_cursor->set_position (where);
+               _dragging_playhead = true;
                break;
 
        case 2:
@@ -192,7 +194,6 @@ Editor::ruler_button_release (GdkEventButton* ev)
                return FALSE;
        }
 
-       hide_verbose_canvas_cursor();
        stop_canvas_autoscroll();
        
        nframes_t where = leftmost_frame + pixel_to_frame (x);
@@ -200,6 +201,7 @@ Editor::ruler_button_release (GdkEventButton* ev)
        switch (ev->button) {
        case 1:
                /* transport playhead */
+               _dragging_playhead = false;
                snap_to (where);
                session->request_locate (where);
                break;
@@ -251,7 +253,7 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev)
                return FALSE;
        }
 
-       double wcx=0,wcy=0;
+               double wcx=0,wcy=0;
        double cx=0,cy=0;
 
        gint x,y;
@@ -260,16 +262,14 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev)
        /* need to use the correct x,y, the event lies */
        time_canvas_event_box.get_window()->get_pointer (x, y, state);
 
-       time_canvas.c2w (x, y, wcx, wcy);
-       time_canvas.w2c (wcx, wcy, cx, cy);
 
-       wcx = x;
-       nframes_t where = event_frame ((GdkEvent*) ev, &wcx, (double *) 0);
-       cx = wcx;
+       track_canvas.c2w (x, y, wcx, wcy);
+       track_canvas.w2c (wcx, wcy, cx, cy);
+       
+       nframes_t where = leftmost_frame + pixel_to_frame (x);
 
        /// ripped from maybe_autoscroll, and adapted to work here
-       nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit);
-       nframes_t rightmost_frame = leftmost_frame + one_page;
+       nframes_t rightmost_frame = leftmost_frame + current_page_frames ();
 
        jack_nframes_t frame = pixel_to_frame (cx);
 
@@ -314,9 +314,9 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev)
                
                if (cursor == edit_cursor) {
                        edit_cursor_clock.set (where);
+               } else if (cursor == playhead_cursor) {
+                       UpdateAllTransportClocks (cursor->current_frame);
                }
-               
-               show_verbose_time_cursor (where, 10, cx, 0);
        }
        
        return TRUE;
@@ -609,9 +609,9 @@ Editor::update_ruler_visibility ()
        bbt_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion));
        frames_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion));
        minsec_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion));
-
-       ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
        
+       ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
+
        if (ruler_shown[ruler_metric_minsec]) {
                lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
                ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
@@ -730,12 +730,7 @@ Editor::update_just_smpte ()
                return;
        }
 
-       /* XXX Note the potential loss of accuracy here as we convert from
-          an uint32_t (or larger) to a float ... what to do ?
-       */
-
-       nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
-       nframes_t rightmost_frame = leftmost_frame + page;
+       nframes_t rightmost_frame = leftmost_frame + current_page_frames();
 
        if (ruler_shown[ruler_metric_smpte]) {
                gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_smpte_ruler), leftmost_frame, rightmost_frame,
@@ -752,17 +747,11 @@ Editor::update_fixed_rulers ()
                return;
        }
 
-       /* XXX Note the potential loss of accuracy here as we convert from
-          an uint32_t (or larger) to a float ... what to do ?
-       */
-
-       nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
-
        ruler_metrics[ruler_metric_smpte].units_per_pixel = frames_per_unit;
        ruler_metrics[ruler_metric_frames].units_per_pixel = frames_per_unit;
        ruler_metrics[ruler_metric_minsec].units_per_pixel = frames_per_unit;
 
-       rightmost_frame = leftmost_frame + page;
+       rightmost_frame = leftmost_frame + current_page_frames ();
 
        /* these force a redraw, which in turn will force execution of the metric callbacks
           to compute the relevant ticks to display.
@@ -791,15 +780,10 @@ Editor::update_tempo_based_rulers ()
                return;
        }
 
-       /* XXX Note the potential loss of accuracy here as we convert from
-          an uint32_t (or larger) to a float ... what to do ?
-       */
-
-       nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
        ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit;
 
        if (ruler_shown[ruler_metric_bbt]) {
-               gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_bbt_ruler), leftmost_frame, leftmost_frame+page, 
+               gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_bbt_ruler), leftmost_frame, leftmost_frame+current_page_frames(),
                                            leftmost_frame, session->current_end_frame());
        }
 }