Add a playhead marker to the summary.
authorCarl Hetherington <carl@carlh.net>
Wed, 17 Jun 2009 00:29:56 +0000 (00:29 +0000)
committerCarl Hetherington <carl@carlh.net>
Wed, 17 Jun 2009 00:29:56 +0000 (00:29 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5206 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_canvas.cc
gtk2_ardour/editor_cursors.cc
gtk2_ardour/editor_summary.cc
gtk2_ardour/editor_summary.h

index 3908da49eaf9c03174ecfd9d3ade31a399e6c0bb..5a5ef1341e09f12960e843c00baa58f6a84bf9f8 100644 (file)
@@ -4720,7 +4720,7 @@ Editor::post_zoom ()
                playhead_cursor->set_position (playhead_cursor->current_frame);
        }
 
-       _summary->set_bounds_dirty ();
+       _summary->set_overlays_dirty ();
 
        instant_save ();
 }
@@ -4828,7 +4828,7 @@ Editor::idle_visual_changer ()
                redisplay_tempo (true);
        }
 
-       _summary->set_bounds_dirty ();
+       _summary->set_overlays_dirty ();
        
        //cerr << "Editor::idle_visual_changer () called ha v:l:u:ps:fpu = " << horizontal_adjustment.get_value() << ":" << horizontal_adjustment.get_lower() << ":" << horizontal_adjustment.get_upper() << ":" << horizontal_adjustment.get_page_size() << ":" << frames_per_unit << endl;//DEBUG
        pending_visual_change.idle_handler_id = -1;
index c53f674eb1a2003253608aeb406f5caebb4ff194..37f66e71ab5e112f475ba416627a4dab99ba4981 100644 (file)
@@ -138,6 +138,8 @@ struct EditorCursor {
        void set_position (nframes64_t);
        void set_length (double units);
        void set_y_axis (double position);
+
+       sigc::signal<void, nframes64_t> PositionChanged;
 };
 
 class Editor : public PublicEditor
index 8ef127f0f930d5790400be757586353245015ec6..35639a87877066cf7081e9458c514dde1d621c0c 100644 (file)
@@ -362,7 +362,7 @@ Editor::track_canvas_size_allocated ()
        reset_hscrollbar_stepping ();
        update_fixed_rulers();
        redisplay_tempo (false);
-       _summary->set_bounds_dirty ();
+       _summary->set_overlays_dirty ();
 
        Resized (); /* EMIT_SIGNAL */
 
@@ -773,7 +773,7 @@ Editor::tie_vertical_scrolling ()
        controls_layout.get_vadjustment()->set_value (vertical_adjustment.get_value());
 
        if (pending_visual_change.idle_handler_id < 0) {
-               _summary->set_bounds_dirty ();
+               _summary->set_overlays_dirty ();
        }
 }
 
@@ -797,7 +797,7 @@ Editor::scroll_canvas_horizontally ()
        redisplay_tempo (true);
 
        if (pending_visual_change.idle_handler_id < 0) {
-               _summary->set_bounds_dirty ();
+               _summary->set_overlays_dirty ();
        }
 
 #ifndef GTKOSX
index 0725ad0d12dd94253217594110793beed4454aa9..bedff567011139ddb742a7f1ece4b53074fa258a 100644 (file)
@@ -59,6 +59,8 @@ EditorCursor::~EditorCursor ()
 void
 EditorCursor::set_position (nframes64_t frame)
 {
+       PositionChanged (frame);
+       
        double new_pos =  editor.frame_to_unit (frame);
 
        if (new_pos != points.front().get_x()) {
index 1b6441a092569f445674ac87b2fdf97f776e27bb..02941456d3f59b3122677f2a6e53cafcc9cbc565 100644 (file)
@@ -43,6 +43,7 @@ EditorSummary::EditorSummary (Editor* e)
          _height (64),
          _x_scale (1),
          _y_scale (1),
+         _last_playhead (-1),
          _move_dragging (false),
          _moved (false),
          _zoom_dragging (false)
@@ -64,6 +65,7 @@ EditorSummary::set_session (Session* s)
        _session->RegionRemoved.connect (sigc::hide (mem_fun (*this, &EditorSummary::set_dirty)));
        _session->EndTimeChanged.connect (mem_fun (*this, &EditorSummary::set_dirty));
        _session->StartTimeChanged.connect (mem_fun (*this, &EditorSummary::set_dirty));
+       _editor->playhead_cursor->PositionChanged.connect (mem_fun (*this, &EditorSummary::playhead_position_changed));
 
        set_dirty ();
 }
@@ -110,14 +112,14 @@ EditorSummary::on_expose_event (GdkEventExpose* event)
                        );
        }
 
+       cairo_t* cr = gdk_cairo_create (get_window()->gobj());
+
        /* Render the view rectangle */
        
        pair<double, double> x;
        pair<double, double> y;
        get_editor (&x, &y);
        
-       cairo_t* cr = gdk_cairo_create (get_window()->gobj());
-
        cairo_move_to (cr, x.first, y.first);
        cairo_line_to (cr, x.second, y.first);
        cairo_line_to (cr, x.second, y.second);
@@ -129,6 +131,18 @@ EditorSummary::on_expose_event (GdkEventExpose* event)
        cairo_set_source_rgba (cr, 1, 1, 1, 0.5);
        cairo_stroke (cr);
 
+       /* Playhead */
+
+       cairo_set_line_width (cr, 1);
+       /* XXX: colour should be set from configuration file */
+       cairo_set_source_rgba (cr, 1, 0, 0, 1);
+
+       double const p = _editor->playhead_cursor->current_frame * _x_scale;
+       cairo_move_to (cr, p, 0);
+       cairo_line_to (cr, p, _height);
+       cairo_stroke (cr);
+       _last_playhead = p;
+
        cairo_destroy (cr);
        
        return true;
@@ -243,11 +257,11 @@ EditorSummary::set_dirty ()
        queue_draw ();
 }
 
-/** Set the summary so that just the view boundary markers will be re-rendered */
+/** Set the summary so that just the overlays (viewbox, playhead etc.) will be re-rendered */
 void
-EditorSummary::set_bounds_dirty ()
+EditorSummary::set_overlays_dirty ()
 {
-       ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_bounds_dirty));
+       ENSURE_GUI_THREAD (mem_fun (*this, &EditorSummary::set_overlays_dirty));
        queue_draw ();
 }
 
@@ -454,6 +468,7 @@ EditorSummary::on_scroll_event (GdkEventScroll* ev)
                        yr.first -= amount;
                        yr.second -= amount;
                }
+               
        }
        
        set_editor (xr, yr);
@@ -489,3 +504,13 @@ EditorSummary::set_editor (pair<double,double> const & x, pair<double, double> c
                }
        }
 }
+
+void
+EditorSummary::playhead_position_changed (nframes64_t p)
+{
+       if (int (p * _x_scale) != int (_last_playhead)) {
+               set_overlays_dirty ();
+       }
+}
+
+       
index bbff050117a821390763551d8b26c5349b58c5c0..1da6a3985fed96c13178a447059e71eccfc5a80b 100644 (file)
@@ -39,7 +39,7 @@ public:
 
        void set_session (ARDOUR::Session *);
        void set_dirty ();
-       void set_bounds_dirty ();
+       void set_overlays_dirty ();
 
 private:
        void centre_on_click (GdkEventButton *);
@@ -56,6 +56,7 @@ private:
        void render_region (RegionView*, cairo_t*, nframes_t, double) const;
        void get_editor (std::pair<double, double> *, std::pair<double, double> *) const;
        void set_editor (std::pair<double, double> const &, std::pair<double, double> const &);
+       void playhead_position_changed (nframes64_t);
 
        Editor* _editor; ///< our editor
        ARDOUR::Session* _session; ///< our session
@@ -65,6 +66,7 @@ private:
        int _height; ///< pixmap height
        double _x_scale; ///< pixels per frame for the x axis of the pixmap
        double _y_scale;
+       double _last_playhead;
 
        std::pair<double, double> _start_editor_x;
        std::pair<double, double> _start_editor_y;