int const Timeline::_minimum_pixels_per_track = 16;
-Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film, weak_ptr<FilmViewer> viewer)
+Timeline::Timeline(wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film, 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))
, _left_down (false)
, _down_view_position (0)
, _first_move (false)
- , _menu (this)
+ , _menu (this, viewer)
, _snap (true)
, _tool (SELECT)
, _x_scroll_rate (16)
_labels_canvas->GetViewStart (&vsx, &vsy);
gc->Translate (-vsx * _x_scroll_rate, -vsy * _y_scroll_rate + tracks_y_offset());
- _labels_view->paint (gc, list<dcpomatic::Rect<int> >());
+ _labels_view->paint (gc, {});
delete gc;
}
if (_zoom_point) {
/* Translate back as _down_point and _zoom_point do not take scroll into account */
gc->Translate (vsx * _x_scroll_rate, vsy * _y_scroll_rate);
- gc->SetPen (*wxBLACK_PEN);
+ gc->SetPen(gui_is_dark() ? *wxWHITE_PEN : *wxBLACK_PEN);
gc->SetBrush (*wxTRANSPARENT_BRUSH);
gc->DrawRectangle (
min (_down_point.x, _zoom_point->x),
/* Playhead */
- auto vp = _viewer.lock ();
- DCPOMATIC_ASSERT (vp);
-
gc->SetPen (*wxRED_PEN);
auto path = gc->CreatePath ();
- double const ph = vp->position().seconds() * pixels_per_second().get_value_or(0);
+ double const ph = _viewer.position().seconds() * pixels_per_second().get_value_or(0);
path.MoveToPoint (ph, 0);
path.AddLineToPoint (ph, pixels_per_track() * _tracks + 32);
gc->StrokePath (path);
Position<int> const p (ev.GetX() + vsx * _x_scroll_rate, ev.GetY() + vsy * _y_scroll_rate);
while (i != _views.rend() && !(*i)->bbox().contains (p)) {
- auto cv = dynamic_pointer_cast<TimelineContentView>(*i);
++i;
}
_down_view_position = content_view->content()->position ();
}
+ if (dynamic_pointer_cast<TimelineTimeAxisView>(view)) {
+ int vsx, vsy;
+ _main_canvas->GetViewStart(&vsx, &vsy);
+ _viewer.seek(DCPTime::from_seconds((ev.GetPosition().x + vsx * _x_scroll_rate) / _pixels_per_second.get_value_or(1)), true);
+ }
+
for (auto i: _views) {
auto cv = dynamic_pointer_cast<TimelineContentView>(i);
if (!cv) {