-public:
- ContentView (Timeline& tl, shared_ptr<Content> c)
- : View (tl)
- , _content (c)
- , _selected (false)
- {
- _content_connection = c->Changed.connect (bind (&ContentView::content_changed, this, _2, _3));
- }
-
- dcpomatic::Rect<int> bbox () const
- {
- assert (_track);
-
- shared_ptr<const Film> film = _timeline.film ();
- shared_ptr<const Content> content = _content.lock ();
- if (!film || !content) {
- return dcpomatic::Rect<int> ();
- }
-
- return dcpomatic::Rect<int> (
- time_x (content->position ()) - 8,
- y_pos (_track.get()) - 8,
- content->length_after_trim () * _timeline.pixels_per_time_unit().get_value_or(0) + 16,
- _timeline.track_height() + 16
- );
- }
-
- void set_selected (bool s) {
- _selected = s;
- force_redraw ();
- }
-
- bool selected () const {
- return _selected;
- }
-
- shared_ptr<Content> content () const {
- return _content.lock ();
- }
-
- void set_track (int t) {
- _track = t;
- }
-
- void unset_track () {
- _track = boost::optional<int> ();
- }
-
- optional<int> track () const {
- return _track;
- }
-
- virtual wxString type () const = 0;
- virtual wxColour colour () const = 0;
-
-private:
-
- void do_paint (wxGraphicsContext* gc)
- {
- assert (_track);
-
- shared_ptr<const Film> film = _timeline.film ();
- shared_ptr<const Content> cont = content ();
- if (!film || !cont) {
- return;
- }
-
- Time const position = cont->position ();
- Time const len = cont->length_after_trim ();
+#ifndef __WXOSX__
+ _labels_canvas->SetDoubleBuffered (true);
+ _main_canvas->SetDoubleBuffered (true);
+#endif
+
+ wxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
+ sizer->Add (_labels_canvas, 0, wxEXPAND);
+ _labels_canvas->SetMinSize (wxSize (_labels_view->bbox().width, -1));
+ sizer->Add (_main_canvas, 1, wxEXPAND);
+ SetSizer (sizer);
+
+ _labels_canvas->Bind (wxEVT_PAINT, boost::bind (&Timeline::paint_labels, this));
+ _main_canvas->Bind (wxEVT_PAINT, boost::bind (&Timeline::paint_main, this));
+ _main_canvas->Bind (wxEVT_LEFT_DOWN, boost::bind (&Timeline::left_down, this, _1));
+ _main_canvas->Bind (wxEVT_LEFT_UP, boost::bind (&Timeline::left_up, this, _1));
+ _main_canvas->Bind (wxEVT_RIGHT_DOWN, boost::bind (&Timeline::right_down, this, _1));
+ _main_canvas->Bind (wxEVT_MOTION, boost::bind (&Timeline::mouse_moved, this, _1));
+ _main_canvas->Bind (wxEVT_SIZE, boost::bind (&Timeline::resized, this));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_TOP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_BOTTOM, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_LINEUP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_LINEDOWN, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_PAGEUP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_PAGEDOWN, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_THUMBTRACK, boost::bind (&Timeline::scrolled, this, _1));
+
+ film_change (CHANGE_TYPE_DONE, Film::CONTENT);
+
+ SetMinSize (wxSize (640, 4 * pixels_per_track() + 96));
+
+ _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);
+}