X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontrols.cc;h=e3f476c05e35530dc28a473bb133d4cd160987d4;hb=4e841ab275143ecbd8790c39ed332e5e346733f8;hp=7cd31634dd218792998ffccf4bfb594ad279f82c;hpb=c4403784febdbdd42e9c32e67fadb147f11fe566;p=dcpomatic.git diff --git a/src/wx/controls.cc b/src/wx/controls.cc index 7cd31634d..e3f476c05 100644 --- a/src/wx/controls.cc +++ b/src/wx/controls.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington + Copyright (C) 2018-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -59,7 +59,6 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor , _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096)) , _viewer (viewer) , _slider_being_moved (false) - , _was_running_before_slider (false) , _outline_content (0) , _eye (0) , _jump_to_selected (0) @@ -68,6 +67,7 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor , _forward_button (new Button (this, wxT(">"))) , _frame_number (new StaticText (this, wxT(""))) , _timecode (new StaticText (this, wxT(""))) + , _timer (this) { _v_sizer = new wxBoxSizer (wxVERTICAL); SetSizer (_v_sizer); @@ -94,8 +94,8 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor time_sizer->Add (_timecode, 0, wxEXPAND); h_sizer->Add (_rewind_button, 0, wxALL, 2); - h_sizer->Add (_back_button, 0, wxALL, 2); h_sizer->Add (time_sizer, 0, wxEXPAND); + h_sizer->Add (_back_button, 0, wxALL, 2); h_sizer->Add (_forward_button, 0, wxALL, 2); _button_sizer = new wxBoxSizer (wxHORIZONTAL); @@ -120,14 +120,7 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor _slider->Bind (wxEVT_SCROLL_THUMBTRACK, boost::bind(&Controls::slider_moved, this, false)); _slider->Bind (wxEVT_SCROLL_PAGEUP, boost::bind(&Controls::slider_moved, this, true)); _slider->Bind (wxEVT_SCROLL_PAGEDOWN, boost::bind(&Controls::slider_moved, this, true)); - _slider->Bind (wxEVT_SCROLL_CHANGED, boost::bind(&Controls::slider_released, this)); -#ifdef DCPOMATIC_OSX - /* _CHANGED is not received on OS X (at least, not when the - slider is dragged), so use this instead. Perhaps all - platforms could just use _THUMBRELEASE. - */ _slider->Bind (wxEVT_SCROLL_THUMBRELEASE, boost::bind(&Controls::slider_released, this)); -#endif _rewind_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::rewind_clicked, this, _1)); _back_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::back_clicked, this, _1)); _forward_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::forward_clicked, this, _1)); @@ -138,10 +131,12 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor _jump_to_selected->SetValue (Config::instance()->jump_to_selected ()); } - _viewer->PositionChanged.connect (boost::bind(&Controls::position_changed, this)); _viewer->Started.connect (boost::bind(&Controls::started, this)); _viewer->Stopped.connect (boost::bind(&Controls::stopped, this)); + Bind (wxEVT_TIMER, boost::bind(&Controls::update_position, this)); + _timer.Start (80, wxTIMER_CONTINUOUS); + set_film (_viewer->film()); setup_sensitivity (); @@ -173,9 +168,9 @@ Controls::stopped () } void -Controls::position_changed () +Controls::update_position () { - if (!_slider_being_moved) { + if (!_slider_being_moved && !_viewer->pending_idle_get()) { update_position_label (); update_position_slider (); } @@ -203,7 +198,7 @@ Controls::slider_moved (bool page) if (!page && !_slider_being_moved) { /* This is the first event of a drag; stop playback for the duration of the drag */ - _was_running_before_slider = _viewer->stop (); + _viewer->suspend (); _slider_being_moved = true; } @@ -230,10 +225,8 @@ Controls::slider_moved (bool page) void Controls::slider_released () { - if (_was_running_before_slider) { - /* Restart after a drag */ - _viewer->start (); - } + /* Restart after a drag */ + _viewer->resume (); _slider_being_moved = false; } @@ -352,7 +345,7 @@ Controls::setup_sensitivity () void Controls::timecode_clicked () { - PlayheadToTimecodeDialog* dialog = new PlayheadToTimecodeDialog (this, _film->video_frame_rate ()); + PlayheadToTimecodeDialog* dialog = new PlayheadToTimecodeDialog (this, _viewer->position(), _film->video_frame_rate()); if (dialog->ShowModal() == wxID_OK) { _viewer->seek (dialog->get(), true); } @@ -362,7 +355,7 @@ Controls::timecode_clicked () void Controls::frame_number_clicked () { - PlayheadToFrameDialog* dialog = new PlayheadToFrameDialog (this, _film->video_frame_rate ()); + PlayheadToFrameDialog* dialog = new PlayheadToFrameDialog (this, _viewer->position(), _film->video_frame_rate()); if (dialog->ShowModal() == wxID_OK) { _viewer->seek (dialog->get(), true); } @@ -413,3 +406,11 @@ Controls::film_change (ChangeType type, Film::Property p) } } } + +void +Controls::seek (int slider) +{ + _slider->SetValue (slider); + slider_moved (false); + slider_released (); +}