Draw reels in the timeline.
authorCarl Hetherington <cth@carlh.net>
Mon, 19 Oct 2015 21:30:55 +0000 (22:30 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 19 Oct 2015 21:30:55 +0000 (22:30 +0100)
ChangeLog
src/wx/timeline.cc
src/wx/timeline.h
src/wx/timeline_reels_view.cc [new file with mode: 0644]
src/wx/timeline_reels_view.h [new file with mode: 0644]
src/wx/timeline_view.cc
src/wx/wscript

index 9c36429f880576f3ef43bba0eaa3d7c570ecf2a8..316f4befaf305bda6a562ed5b18ad2c907211812 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2015-10-19  Carl Hetherington  <cth@carlh.net>
 
+       * Draw reels in the timeline.
+
        * Fix by-video-content reel split when there is stuff
        after the last piece of video content.
 
index f91d2937f44ed51ac23aa94cff8a0bbe5674914f..e2cc1a249e2be71754ea693db4383edd4e409ee9 100644 (file)
@@ -20,6 +20,7 @@
 #include "film_editor.h"
 #include "timeline.h"
 #include "timeline_time_axis_view.h"
+#include "timeline_reels_view.h"
 #include "timeline_video_content_view.h"
 #include "timeline_audio_content_view.h"
 #include "timeline_subtitle_content_view.h"
@@ -49,7 +50,8 @@ Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film)
        : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
        , _content_panel (cp)
        , _film (film)
-       , _time_axis_view (new TimelineTimeAxisView (*this, 32))
+       , _time_axis_view (new TimelineTimeAxisView (*this, 64))
+       , _reels_view (new TimelineReelsView (*this, 32))
        , _tracks (0)
        , _left_down (false)
        , _down_view_position (0)
@@ -112,6 +114,7 @@ Timeline::recreate_views ()
 
        _views.clear ();
        _views.push_back (_time_axis_view);
+       _views.push_back (_reels_view);
 
        BOOST_FOREACH (shared_ptr<Content> i, film->content ()) {
                if (dynamic_pointer_cast<VideoContent> (i)) {
@@ -203,7 +206,8 @@ Timeline::assign_tracks ()
                _tracks = max (_tracks, t + 1);
        }
 
-       _time_axis_view->set_y (tracks() * track_height() + 32);
+       _time_axis_view->set_y (tracks() * track_height() + 64);
+       _reels_view->set_y (tracks() * track_height() + 32);
 }
 
 int
index 2afd0d1945e7fb167510572d21f2e613bbbce117..e8becf906e4ee61c6a26298cc49fd34965a44c9a 100644 (file)
@@ -31,6 +31,7 @@ class Film;
 class ContentPanel;
 class TimelineView;
 class TimelineTimeAxisView;
+class TimelineReelsView;
 
 class Timeline : public wxPanel
 {
@@ -96,6 +97,7 @@ private:
        boost::weak_ptr<Film> _film;
        TimelineViewList _views;
        boost::shared_ptr<TimelineTimeAxisView> _time_axis_view;
+       boost::shared_ptr<TimelineReelsView> _reels_view;
        int _tracks;
        boost::optional<double> _pixels_per_second;
        bool _left_down;
diff --git a/src/wx/timeline_reels_view.cc b/src/wx/timeline_reels_view.cc
new file mode 100644 (file)
index 0000000..6013c60
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+    Copyright (C) 2015 Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "timeline_reels_view.h"
+#include "timeline.h"
+#include <wx/wx.h>
+#include <wx/graphics.h>
+#include <boost/foreach.hpp>
+
+using std::min;
+
+TimelineReelsView::TimelineReelsView (Timeline& tl, int y)
+       : TimelineView (tl)
+       , _y (y)
+{
+
+}
+
+dcpomatic::Rect<int>
+TimelineReelsView::bbox () const
+{
+       return dcpomatic::Rect<int> (0, _y - 4, _timeline.width(), 24);
+}
+
+void
+TimelineReelsView::set_y (int y)
+{
+       _y = y;
+       force_redraw ();
+}
+
+void
+TimelineReelsView::do_paint (wxGraphicsContext* gc)
+{
+       if (!_timeline.pixels_per_second()) {
+               return;
+       }
+
+       double const pps = _timeline.pixels_per_second().get ();
+
+       gc->SetPen (*wxThePenList->FindOrCreatePen (wxColour (0, 0, 255), 1, wxPENSTYLE_SOLID));
+
+       wxGraphicsPath path = gc->CreatePath ();
+       path.MoveToPoint (time_x (DCPTime (0)), _y);
+       path.AddLineToPoint (time_x (_timeline.film()->length()), _y);
+       gc->StrokePath (path);
+
+       gc->SetFont (gc->CreateFont (*wxNORMAL_FONT, wxColour (0, 0, 255)));
+
+       int reel = 1;
+       BOOST_FOREACH (DCPTimePeriod i, _timeline.film()->reels()) {
+               int const size = min (8.0, i.duration().seconds() * pps / 2);
+
+               wxGraphicsPath path = gc->CreatePath ();
+               path.MoveToPoint (time_x (i.from) + size, _y + size / 2);
+               path.AddLineToPoint (time_x (i.from), _y);
+               path.AddLineToPoint (time_x (i.from) + size, _y - size / 2);
+               gc->StrokePath (path);
+
+               path = gc->CreatePath ();
+               path.MoveToPoint (time_x (i.to) - size, _y + size / 2);
+               path.AddLineToPoint (time_x (i.to), _y);
+               path.AddLineToPoint (time_x (i.to) - size, _y - size / 2);
+               gc->StrokePath (path);
+
+               wxString str = wxString::Format (_("Reel %d"), reel++);
+               wxDouble str_width;
+               wxDouble str_height;
+               wxDouble str_descent;
+               wxDouble str_leading;
+               gc->GetTextExtent (str, &str_width, &str_height, &str_descent, &str_leading);
+
+               int const tx = time_x (DCPTime((i.from.get() + i.to.get()) / 2));
+               gc->DrawText (str, tx - str_width / 2, _y + 4);
+       }
+}
diff --git a/src/wx/timeline_reels_view.h b/src/wx/timeline_reels_view.h
new file mode 100644 (file)
index 0000000..b357be2
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2015 Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "timeline_view.h"
+
+class TimelineReelsView : public TimelineView
+{
+public:
+       TimelineReelsView (Timeline& tl, int y);
+
+       dcpomatic::Rect<int> bbox () const;
+       void set_y (int y);
+
+private:
+       void do_paint (wxGraphicsContext* gc);
+
+private:
+       int _y;
+};
index 0d2fca381f9c078af348eb88a54afca561ac7d32..a1c5fb7ec75d429f6db99e59395f6cc4caef6624 100644 (file)
@@ -46,6 +46,5 @@ TimelineView::force_redraw ()
 int
 TimelineView::time_x (DCPTime t) const
 {
-               return _timeline.tracks_position().x + t.seconds() * _timeline.pixels_per_second().get_value_or (0);
+       return _timeline.tracks_position().x + t.seconds() * _timeline.pixels_per_second().get_value_or (0);
 }
-
index 3657f5287520ce274b9ba4c48cfae4e8db90225d..346d292c667d16029365c2d84160d4eb6a301e64 100644 (file)
@@ -79,6 +79,7 @@ sources = """
           timeline_dialog.cc
           timeline_audio_content_view.cc
           timeline_subtitle_content_view.cc
+          timeline_reels_view.cc
           timeline_time_axis_view.cc
           timeline_video_content_view.cc
           timeline_view.cc