diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-02-28 12:31:40 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-02-29 21:44:48 +0100 |
| commit | 5e7f9bc19280faa3506fd8cdd319ccd6001de1de (patch) | |
| tree | 7f08d62a44f7e66bfbe6db327ba4219cfe0a8441 /src | |
| parent | 605bc8c1952ee1cba6d9f8ff098b5930ab6a9912 (diff) | |
Fix incorrect results when applying some timing operations to
more than one piece of content at once (e.g. trim start).
Back-ported from 746aa7337ac2d51a4fa09039c1d5d7717cc880fa in v2.15.x.
Diffstat (limited to 'src')
| -rw-r--r-- | src/wx/suspender.cc | 77 | ||||
| -rw-r--r-- | src/wx/suspender.h | 51 | ||||
| -rw-r--r-- | src/wx/timing_panel.cc | 10 | ||||
| -rw-r--r-- | src/wx/timing_panel.h | 5 | ||||
| -rw-r--r-- | src/wx/wscript | 1 |
5 files changed, 142 insertions, 2 deletions
diff --git a/src/wx/suspender.cc b/src/wx/suspender.cc new file mode 100644 index 000000000..9b1b64c85 --- /dev/null +++ b/src/wx/suspender.cc @@ -0,0 +1,77 @@ +/* + Copyright (C) 2020 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "suspender.h" +#include <boost/foreach.hpp> + +Suspender::Suspender(boost::function<void (int)> handler) + : _handler (handler) + , _count (0) +{ + +} + +Suspender::Block::Block (Suspender* s) + : _suspender (s) +{ + _suspender->increment (); +} + +Suspender::Block::~Block () +{ + _suspender->decrement (); +} + +Suspender::Block +Suspender::block () +{ + return Block (this); +} + +void +Suspender::increment () +{ + ++_count; +} + +void +Suspender::decrement () +{ + --_count; + if (_count == 0) { + BOOST_FOREACH (int i, _pending) { + _handler (i); + } + _pending.clear (); + } +} + +bool +Suspender::check (int property) +{ + if (_count == 0) { + return false; + } + + _pending.insert (property); + return true; +} + + diff --git a/src/wx/suspender.h b/src/wx/suspender.h new file mode 100644 index 000000000..3538951a8 --- /dev/null +++ b/src/wx/suspender.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2020 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include <boost/function.hpp> +#include <set> + +class Suspender +{ +public: + Suspender (boost::function<void (int)> handler); + + bool check (int property); + + class Block + { + public: + Block (Suspender* s); + ~Block (); + private: + Suspender* _suspender; + }; + + Block block (); + +private: + friend class Block; + + void increment (); + void decrement (); + + boost::function<void (int)> _handler; + int _count; + std::set<int> _pending; +}; diff --git a/src/wx/timing_panel.cc b/src/wx/timing_panel.cc index 2c9b88e83..9ba2b186c 100644 --- a/src/wx/timing_panel.cc +++ b/src/wx/timing_panel.cc @@ -54,6 +54,7 @@ TimingPanel::TimingPanel (ContentPanel* p, weak_ptr<FilmViewer> viewer) /// TRANSLATORS: translate the word "Timing" here; do not include the "Timing|" prefix : ContentSubPanel (p, S_("Timing|Timing")) , _viewer (viewer) + , _film_content_changed_suspender (boost::bind(&TimingPanel::film_content_changed, this, _1)) { wxSize size = TimecodeBase::size (this); @@ -255,6 +256,10 @@ TimingPanel::update_play_length () void TimingPanel::film_content_changed (int property) { + if (_film_content_changed_suspender.check(property)) { + return; + } + int const film_video_frame_rate = _parent->film()->video_frame_rate (); /* Here we check to see if we have exactly one different value of various @@ -404,7 +409,7 @@ TimingPanel::trim_start_changed () optional<FrameRateChange> ref_frc; optional<DCPTime> ref_ph; - + Suspender::Block bl = _film_content_changed_suspender.block (); BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) { if (i->position() <= ph && ph < i->end(_parent->film())) { /* The playhead is in i. Use it as a reference to work out @@ -437,6 +442,7 @@ TimingPanel::trim_end_changed () fv->set_coalesce_player_changes (true); + Suspender::Block bl = _film_content_changed_suspender.block (); BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) { ContentTime const trim = _trim_end->get (i->video_frame_rate().get_value_or(_parent->film()->video_frame_rate())); i->set_trim_end (trim); @@ -454,6 +460,7 @@ void TimingPanel::play_length_changed () { DCPTime const play_length = _play_length->get (_parent->film()->video_frame_rate()); + Suspender::Block bl = _film_content_changed_suspender.block (); BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) { FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ()); i->set_trim_end ( @@ -490,6 +497,7 @@ TimingPanel::set_video_frame_rate () if (_video_frame_rate->GetValue() != wxT("")) { fr = locale_convert<double> (wx_to_std (_video_frame_rate->GetValue ())); } + Suspender::Block bl = _film_content_changed_suspender.block (); BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) { if (fr) { i->set_video_frame_rate (*fr); diff --git a/src/wx/timing_panel.h b/src/wx/timing_panel.h index 65d8aabc9..551c671f4 100644 --- a/src/wx/timing_panel.h +++ b/src/wx/timing_panel.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -20,6 +20,7 @@ #include "content_sub_panel.h" #include "timecode.h" +#include "suspender.h" class FilmViewer; @@ -72,4 +73,6 @@ private: wxStaticText* _video_frame_rate_label; wxTextCtrl* _video_frame_rate; wxButton* _set_video_frame_rate; + + Suspender _film_content_changed_suspender; }; diff --git a/src/wx/wscript b/src/wx/wscript index 538e7da0e..99720c109 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -113,6 +113,7 @@ sources = """ standard_controls.cc static_text.cc subtitle_appearance_dialog.cc + suspender.cc system_font_dialog.cc table_dialog.cc templates_dialog.cc |
