-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().seconds() * _timeline.pixels_per_second() + 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;
- }
-
- 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;
- }
-
- DCPTime const position = cont->position ();
- DCPTime const len = cont->length_after_trim ();
-
- wxColour selected (colour().Red() / 2, colour().Green() / 2, colour().Blue() / 2);
+#ifndef __WXOSX__
+ _labels_canvas->SetDoubleBuffered (true);
+ _main_canvas->SetDoubleBuffered (true);
+#endif
+
+ auto 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 (ChangeType::DONE, Film::Property::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));
+
+ Bind (wxEVT_TIMER, boost::bind(&Timeline::update_playhead, this));
+ _timer.Start (200, wxTIMER_CONTINUOUS);
+
+ setup_scrollbars ();
+ _labels_canvas->ShowScrollbars (wxSHOW_SB_NEVER, wxSHOW_SB_NEVER);
+}