Add playhead line to timeline (#1563).
authorCarl Hetherington <cth@carlh.net>
Fri, 31 May 2019 21:26:42 +0000 (22:26 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 31 May 2019 21:26:42 +0000 (22:26 +0100)
src/wx/content_panel.cc
src/wx/timeline.cc
src/wx/timeline.h
src/wx/timeline_dialog.cc
src/wx/timeline_dialog.h

index 72ef0e9ebde3c3cb81e2808a9ec17325ca50fca7..41a18f4b4a6bfaa3fec493d0fa3fdbb526884750 100644 (file)
@@ -558,7 +558,7 @@ ContentPanel::timeline_clicked ()
                _timeline_dialog = 0;
        }
 
-       _timeline_dialog = new TimelineDialog (this, _film);
+       _timeline_dialog = new TimelineDialog (this, _film, _film_viewer);
        _timeline_dialog->set_selection (selected());
        _timeline_dialog->Show ();
 }
index 2c510efb5bc2ebe08760e494c2cb8c057d0dd744..cac9318cca2eac486aee8ce30cb40c87f08a872f 100644 (file)
@@ -29,6 +29,7 @@
 #include "timeline_atmos_content_view.h"
 #include "content_panel.h"
 #include "wx_util.h"
+#include "film_viewer.h"
 #include "lib/film.h"
 #include "lib/playlist.h"
 #include "lib/image_content.h"
@@ -60,12 +61,13 @@ using namespace dcpomatic;
 double const Timeline::_minimum_pixels_per_second = 640.0 / (60 * 60 * 3);
 int const Timeline::_minimum_pixels_per_track = 16;
 
-Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film)
+Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film, weak_ptr<FilmViewer> viewer)
        : wxPanel (parent, wxID_ANY)
        , _labels_canvas (new wxScrolledCanvas (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE))
        , _main_canvas (new wxScrolledCanvas (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE))
        , _content_panel (cp)
        , _film (film)
+       , _viewer (viewer)
        , _time_axis_view (new TimelineTimeAxisView (*this, 64))
        , _reels_view (new TimelineReelsView (*this, 32))
        , _labels_view (new TimelineLabelsView (*this))
@@ -114,10 +116,20 @@ Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film)
        _film_changed_connection = film->Change.connect (bind (&Timeline::film_change, this, _1, _2));
        _film_content_change_connection = film->ContentChange.connect (bind (&Timeline::film_content_change, this, _1, _3, _4));
 
+       shared_ptr<FilmViewer> vp = viewer.lock ();
+       DCPOMATIC_ASSERT (vp);
+       _viewer_position_change_connection = vp->PositionChanged.connect (bind(&Timeline::position_change, this));
+
        setup_scrollbars ();
        _labels_canvas->ShowScrollbars (wxSHOW_SB_NEVER, wxSHOW_SB_NEVER);
 }
 
+void
+Timeline::position_change ()
+{
+       Refresh ();
+}
+
 void
 Timeline::set_pixels_per_second (double pps)
 {
@@ -195,6 +207,18 @@ Timeline::paint_main ()
                        );
        }
 
+       /* Playhead */
+
+       shared_ptr<FilmViewer> vp = _viewer.lock ();
+       DCPOMATIC_ASSERT (vp);
+
+       gc->SetPen (*wxRED_PEN);
+       wxGraphicsPath path = gc->CreatePath ();
+       double const ph = vp->position().seconds() * pixels_per_second().get_value_or(0);
+       path.MoveToPoint (ph, 0);
+       path.AddLineToPoint (ph, pixels_per_track() * _tracks + 32);
+       gc->StrokePath (path);
+
        delete gc;
 }
 
index 84cb870f24209f6d055d84a490ac9848d2c5b096..ef887dab8242878563dde77e08dd4a53d32d4caf 100644 (file)
@@ -34,11 +34,12 @@ class TimelineView;
 class TimelineTimeAxisView;
 class TimelineReelsView;
 class TimelineLabelsView;
+class FilmViewer;
 
 class Timeline : public wxPanel
 {
 public:
-       Timeline (wxWindow *, ContentPanel *, boost::shared_ptr<Film>);
+       Timeline (wxWindow *, ContentPanel *, boost::shared_ptr<Film>, boost::weak_ptr<FilmViewer> viewer);
 
        boost::shared_ptr<const Film> film () const;
 
@@ -103,6 +104,7 @@ private:
        void set_pixels_per_second (double pps);
        void set_pixels_per_track (int h);
        void zoom_all ();
+       void position_change ();
 
        boost::shared_ptr<TimelineView> event_to_view (wxMouseEvent &);
        TimelineContentViewList selected_views () const;
@@ -113,6 +115,7 @@ private:
        wxScrolledCanvas* _main_canvas;
        ContentPanel* _content_panel;
        boost::weak_ptr<Film> _film;
+       boost::weak_ptr<FilmViewer> _viewer;
        TimelineViewList _views;
        boost::shared_ptr<TimelineTimeAxisView> _time_axis_view;
        boost::shared_ptr<TimelineReelsView> _reels_view;
@@ -140,4 +143,5 @@ private:
 
        boost::signals2::scoped_connection _film_changed_connection;
        boost::signals2::scoped_connection _film_content_change_connection;
+       boost::signals2::scoped_connection _viewer_position_change_connection;
 };
index 3af86b707753768aa77a0dc6c453d87c3a9a2aef..80686dc1749b552431d038a19866f9880574b56a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -33,8 +33,9 @@ using std::list;
 using std::cout;
 using std::string;
 using boost::shared_ptr;
+using boost::weak_ptr;
 
-TimelineDialog::TimelineDialog (ContentPanel* cp, shared_ptr<Film> film)
+TimelineDialog::TimelineDialog (ContentPanel* cp, shared_ptr<Film> film, weak_ptr<FilmViewer> viewer)
        : wxDialog (
                cp->window(),
                wxID_ANY,
@@ -51,7 +52,7 @@ TimelineDialog::TimelineDialog (ContentPanel* cp, shared_ptr<Film> film)
 #endif
                )
        , _film (film)
-       , _timeline (this, cp, film)
+       , _timeline (this, cp, film, viewer)
 {
        wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL);
 
index 1aff36c8ccb629395cee4c46c2e20d41022fda4d..62649a5f2a06f7ff1dee71900d09bcc7622857b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -28,7 +28,7 @@ class Playlist;
 class TimelineDialog : public wxDialog
 {
 public:
-       TimelineDialog (ContentPanel *, boost::shared_ptr<Film>);
+       TimelineDialog (ContentPanel *, boost::shared_ptr<Film>, boost::weak_ptr<FilmViewer> viewer);
 
        void set_selection (ContentList selection);