From 220518a7bf41bfd9e9da852b4d5ac1461fdd0e1a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 2 Jul 2018 16:39:06 +0100 Subject: [PATCH] Hacks to stop scrolling track names. --- src/wx/timeline.cc | 67 ++++++++++++++++++++----------- src/wx/timeline.h | 12 +++--- src/wx/timeline_content_view.cc | 2 +- src/wx/timeline_labels_view.cc | 8 ++-- src/wx/timeline_time_axis_view.cc | 6 +-- src/wx/timeline_view.cc | 2 +- 6 files changed, 57 insertions(+), 40 deletions(-) diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index 42fb9187f..2e4de2274 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -54,7 +54,9 @@ using boost::bind; using boost::optional; Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr film) - : wxScrolledCanvas (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) + : wxPanel (parent, wxID_ANY) + , _labels_panel (new wxPanel (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) , _time_axis_view (new TimelineTimeAxisView (*this, 64)) @@ -71,36 +73,56 @@ Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr film) , _y_scroll_rate (16) { #ifndef __WXOSX__ - SetDoubleBuffered (true); + _labels_panel->SetDoubleBuffered (true); + _main_canvas->SetDoubleBuffered (true); #endif - Bind (wxEVT_PAINT, boost::bind (&Timeline::paint, this)); - Bind (wxEVT_LEFT_DOWN, boost::bind (&Timeline::left_down, this, _1)); - Bind (wxEVT_LEFT_UP, boost::bind (&Timeline::left_up, this, _1)); - Bind (wxEVT_RIGHT_DOWN, boost::bind (&Timeline::right_down, this, _1)); - Bind (wxEVT_MOTION, boost::bind (&Timeline::mouse_moved, this, _1)); - Bind (wxEVT_SIZE, boost::bind (&Timeline::resized, this)); + wxSizer* sizer = new wxBoxSizer (wxHORIZONTAL); + sizer->Add (_labels_panel, 0, wxEXPAND); + sizer->Add (_main_canvas, 1, wxEXPAND); + SetSizer (sizer); + + _labels_panel->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)); film_changed (Film::CONTENT); SetMinSize (wxSize (640, 4 * track_height() + 96)); - _tracks_position = Position (_labels_view->bbox().width, 32); - _film_changed_connection = film->Changed.connect (bind (&Timeline::film_changed, this, _1)); _film_content_changed_connection = film->ContentChanged.connect (bind (&Timeline::film_content_changed, this, _2, _3)); - _pixels_per_second = max (0.01, static_cast(640 - tracks_position().x * 2) / film->length().seconds ()); + _pixels_per_second = max (0.01, static_cast(640) / film->length().seconds ()); setup_scrollbars (); - EnableScrolling (true, true); + _main_canvas->EnableScrolling (true, true); +} + +void +Timeline::paint_labels () +{ + wxPaintDC dc (this); + + wxGraphicsContext* gc = wxGraphicsContext::Create (dc); + if (!gc) { + return; + } + + _labels_view->paint (gc, list >()); + + delete gc; } void -Timeline::paint () +Timeline::paint_main () { wxPaintDC dc (this); - DoPrepareDC (dc); + _main_canvas->DoPrepareDC (dc); wxGraphicsContext* gc = wxGraphicsContext::Create (dc); if (!gc) { @@ -108,7 +130,7 @@ Timeline::paint () } int vsx, vsy; - GetViewStart (&vsx, &vsy); + _main_canvas->GetViewStart (&vsx, &vsy); gc->Translate (-vsx * _x_scroll_rate, -vsy * _y_scroll_rate); gc->SetAntialiasMode (wxANTIALIAS_DEFAULT); @@ -173,7 +195,6 @@ Timeline::recreate_views () _views.clear (); _views.push_back (_time_axis_view); _views.push_back (_reels_view); - _views.push_back (_labels_view); BOOST_FOREACH (shared_ptr i, film->content ()) { if (i->video) { @@ -355,8 +376,8 @@ Timeline::setup_scrollbars () if (!film || !_pixels_per_second) { return; } - SetVirtualSize (*_pixels_per_second * film->length().seconds(), tracks() * track_height() + 96); - SetScrollRate (_x_scroll_rate, _y_scroll_rate); + _main_canvas->SetVirtualSize (*_pixels_per_second * film->length().seconds(), tracks() * track_height() + 96); + _main_canvas->SetScrollRate (_x_scroll_rate, _y_scroll_rate); } shared_ptr @@ -486,18 +507,16 @@ Timeline::left_up_zoom (wxMouseEvent& ev) _zoom_point = ev.GetPosition (); int vsx, vsy; - GetViewStart (&vsx, &vsy); + _main_canvas->GetViewStart (&vsx, &vsy); wxPoint top_left(min(_down_point.x, _zoom_point->x), min(_down_point.y, _zoom_point->y)); wxPoint bottom_right(max(_down_point.x, _zoom_point->x), max(_down_point.y, _zoom_point->y)); - DCPTime time_left = DCPTime::from_seconds((top_left.x + vsx - _tracks_position.x) / *_pixels_per_second); - DCPTime time_right = DCPTime::from_seconds((bottom_right.x + vsx - _tracks_position.x) / *_pixels_per_second); + DCPTime time_left = DCPTime::from_seconds((top_left.x + vsx) / *_pixels_per_second); + DCPTime time_right = DCPTime::from_seconds((bottom_right.x + vsx) / *_pixels_per_second); _pixels_per_second = GetSize().GetWidth() / (time_right.seconds() - time_left.seconds()); - cout << "Zoom range " << to_string(time_left) << " " << to_string(time_right) << " " << *_pixels_per_second << "\n"; setup_scrollbars (); - Scroll (time_left.seconds() * *_pixels_per_second / _x_scroll_rate, wxDefaultCoord); - cout << "Offset " << (time_left.seconds() * *_pixels_per_second / _x_scroll_rate) << "\n"; + _main_canvas->Scroll (time_left.seconds() * *_pixels_per_second / _x_scroll_rate, wxDefaultCoord); _zoom_point = optional (); Refresh (); diff --git a/src/wx/timeline.h b/src/wx/timeline.h index 375a837a8..3175d028c 100644 --- a/src/wx/timeline.h +++ b/src/wx/timeline.h @@ -35,7 +35,7 @@ class TimelineTimeAxisView; class TimelineReelsView; class TimelineLabelsView; -class Timeline : public wxScrolledCanvas +class Timeline : public wxPanel { public: Timeline (wxWindow *, ContentPanel *, boost::shared_ptr); @@ -56,10 +56,6 @@ public: return _pixels_per_second; } - Position tracks_position () const { - return _tracks_position; - } - int tracks () const; void set_snap (bool s) { @@ -82,7 +78,8 @@ public: } private: - void paint (); + void paint_labels (); + void paint_main (); void left_down (wxMouseEvent &); void left_down_select (wxMouseEvent &); void left_up (wxMouseEvent &); @@ -107,6 +104,8 @@ private: ContentList selected_content () const; void maybe_snap (DCPTime a, DCPTime b, boost::optional& nearest_distance) const; + wxPanel* _labels_panel; + wxScrolledCanvas* _main_canvas; ContentPanel* _content_panel; boost::weak_ptr _film; TimelineViewList _views; @@ -125,7 +124,6 @@ private: bool _snap; std::list _start_snaps; std::list _end_snaps; - Position _tracks_position; Tool _tool; int _x_scroll_rate; int _y_scroll_rate; diff --git a/src/wx/timeline_content_view.cc b/src/wx/timeline_content_view.cc index 5877aacbd..eacfbfd4a 100644 --- a/src/wx/timeline_content_view.cc +++ b/src/wx/timeline_content_view.cc @@ -156,7 +156,7 @@ TimelineContentView::do_paint (wxGraphicsContext* gc, list int TimelineContentView::y_pos (int t) const { - return _timeline.tracks_position().y + t * _timeline.track_height(); + return t * _timeline.track_height(); } void diff --git a/src/wx/timeline_labels_view.cc b/src/wx/timeline_labels_view.cc index ee1b19489..3fe315aaf 100644 --- a/src/wx/timeline_labels_view.cc +++ b/src/wx/timeline_labels_view.cc @@ -66,23 +66,23 @@ TimelineLabelsView::do_paint (wxGraphicsContext* gc, list > int fy = 0; int ty = _threed ? 2 * h : h; - gc->DrawText (_("Video"), 0, _timeline.tracks_position().y + (ty + fy) / 2 - 8); + gc->DrawText (_("Video"), 0, (ty + fy) / 2 - 8); fy = ty; if (_subtitle_tracks) { ty = fy + _subtitle_tracks * h; - gc->DrawText (_("Subtitles"), 0, _timeline.tracks_position().y + (ty + fy) / 2 - 8); + gc->DrawText (_("Subtitles"), 0, (ty + fy) / 2 - 8); fy = ty; } if (_atmos) { ty = fy + h; - gc->DrawText (_("Atmos"), 0, _timeline.tracks_position().y + (ty + fy) / 2 - 8); + gc->DrawText (_("Atmos"), 0, (ty + fy) / 2 - 8); fy = ty; } ty = _timeline.tracks() * h; - gc->DrawText (_("Audio"), 0, _timeline.tracks_position().y + (ty + fy) / 2 - 8); + gc->DrawText (_("Audio"), 0, (ty + fy) / 2 - 8); } void diff --git a/src/wx/timeline_time_axis_view.cc b/src/wx/timeline_time_axis_view.cc index 1947faa0b..c8808a62f 100644 --- a/src/wx/timeline_time_axis_view.cc +++ b/src/wx/timeline_time_axis_view.cc @@ -36,7 +36,7 @@ TimelineTimeAxisView::TimelineTimeAxisView (Timeline& tl, int y) dcpomatic::Rect TimelineTimeAxisView::bbox () const { - return dcpomatic::Rect (_timeline.tracks_position().x, _y - 4, _timeline.width(), 24); + return dcpomatic::Rect (0, _y - 4, _timeline.width(), 24); } void @@ -60,7 +60,7 @@ TimelineTimeAxisView::do_paint (wxGraphicsContext* gc, list double const mark_interval = calculate_mark_interval (rint (128 / pps)); wxGraphicsPath path = gc->CreatePath (); - path.MoveToPoint (_timeline.tracks_position().x, _y); + path.MoveToPoint (0, _y); path.AddLineToPoint (_timeline.width(), _y); gc->StrokePath (path); @@ -88,7 +88,7 @@ TimelineTimeAxisView::do_paint (wxGraphicsContext* gc, list wxDouble str_leading; gc->GetTextExtent (str, &str_width, &str_height, &str_descent, &str_leading); - int const tx = _timeline.tracks_position().x + t.seconds() * pps; + int const tx = t.seconds() * pps; if ((tx + str_width) < _timeline.width()) { gc->DrawText (str, time_x (t), _y + 16); } diff --git a/src/wx/timeline_view.cc b/src/wx/timeline_view.cc index e8b3856ad..bb6ab6034 100644 --- a/src/wx/timeline_view.cc +++ b/src/wx/timeline_view.cc @@ -49,5 +49,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 t.seconds() * _timeline.pixels_per_second().get_value_or (0); } -- 2.30.2