X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftimeline.cc;h=38e9de4ee46318ca73bfff98a29023c64bac5047;hb=HEAD;hp=dbc9f4ee0648a0012c4fd987e5eddf4235612a14;hpb=8c57c9613b6d67ce4ae6f301ec0667d94cb7b0c5;p=dcpomatic.git diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index dbc9f4ee0..2789d2a54 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -35,10 +35,10 @@ #include "lib/film.h" #include "lib/image_content.h" #include "lib/playlist.h" -#include "lib/scope_guard.h" #include "lib/text_content.h" #include "lib/timer.h" #include "lib/video_content.h" +#include #include LIBDCP_DISABLE_WARNINGS #include @@ -109,6 +109,7 @@ Timeline::Timeline(wxWindow* parent, ContentPanel* cp, shared_ptr film, Fi _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_MOUSEWHEEL, boost::bind(&Timeline::mouse_wheel_turned, this, _1)); _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)); @@ -132,6 +133,50 @@ Timeline::Timeline(wxWindow* parent, ContentPanel* cp, shared_ptr film, Fi } +void +Timeline::mouse_wheel_turned(wxMouseEvent& event) +{ + auto const rotation = event.GetWheelRotation(); + + if (event.ControlDown()) { + /* On my mouse one click of the scroll wheel is 120, and it's -ve when + * scrolling the wheel towards me. + */ + auto const scale = rotation > 0 ? + (1.0 / (rotation / 90.0)) : + (-rotation / 90.0); + + int before_start_x; + int before_start_y; + _main_canvas->GetViewStart(&before_start_x, &before_start_y); + + auto const before_pps = _pixels_per_second.get_value_or(1); + auto const before_pos = _last_mouse_wheel_x && *_last_mouse_wheel_x == event.GetX() ? + *_last_mouse_wheel_time : + (before_start_x * _x_scroll_rate + event.GetX()) / before_pps; + + set_pixels_per_second(before_pps * scale); + setup_scrollbars(); + + auto after_left = std::max(0.0, before_pos * _pixels_per_second.get_value_or(1) - event.GetX()); + _main_canvas->Scroll(after_left / _x_scroll_rate, before_start_y); + _labels_canvas->Scroll(0, before_start_y); + Refresh(); + + if (!_last_mouse_wheel_x || *_last_mouse_wheel_x != event.GetX()) { + _last_mouse_wheel_x = event.GetX(); + _last_mouse_wheel_time = before_pos; + } + } else if (event.ShiftDown()) { + int before_start_x; + int before_start_y; + _main_canvas->GetViewStart(&before_start_x, &before_start_y); + auto const width = _main_canvas->GetSize().GetWidth(); + _main_canvas->Scroll(std::max(0.0, before_start_x - rotation * 100.0 / width), before_start_y); + } +} + + void Timeline::update_playhead () { @@ -161,7 +206,7 @@ Timeline::paint_labels () return; } - ScopeGuard sg = [gc]() { delete gc; }; + dcp::ScopeGuard sg = [gc]() { delete gc; }; int vsx, vsy; _labels_canvas->GetViewStart (&vsx, &vsy); @@ -189,7 +234,7 @@ Timeline::paint_main () return; } - ScopeGuard sg = [gc]() { delete gc; }; + dcp::ScopeGuard sg = [gc]() { delete gc; }; gc->SetAntialiasMode (wxANTIALIAS_DEFAULT); @@ -270,7 +315,7 @@ Timeline::recreate_views () _views.push_back (make_shared(*this, i)); } - if (i->audio && !i->audio->mapping().mapped_output_channels().empty ()) { + if (i->has_mapped_audio()) { _views.push_back (make_shared(*this, i)); } @@ -321,6 +366,7 @@ place (shared_ptr film, TimelineViewList& views, int& tracks) } auto cv = dynamic_pointer_cast (i); + DCPOMATIC_ASSERT(cv); int t = base;