{
_dirty = true;
+ Change (CHANGE_TYPE_PENDING, p);
+ bool changed = false;
+
switch (p) {
case Film::CONTENT:
set_video_frame_rate (_playlist->best_video_frame_rate ());
+ changed = true;
break;
case Film::VIDEO_FRAME_RATE:
case Film::SEQUENCE:
_playlist->maybe_sequence ();
+ changed = true;
break;
default:
break;
}
- emit (boost::bind (boost::ref (Changed), p));
+ if (changed) {
+ emit (boost::bind (boost::ref (Change), CHANGE_TYPE_DONE, p));
+ } else {
+ Change (CHANGE_TYPE_CANCELLED, p);
+ }
}
void
void set_reel_length (int64_t);
void set_upload_after_make_dcp (bool);
- /** Emitted when some property has of the Film has changed */
- mutable boost::signals2::signal<void (Property)> Changed;
+ /** Emitted when some property has of the Film is about to change or has changed */
+ mutable boost::signals2::signal<void (ChangeType, Property)> Change;
/** Emitted when some property of our content has changed */
mutable boost::signals2::signal<void (ChangeType, boost::weak_ptr<Content>, int, bool)> ContentChange;
, _audio_merger (_film->audio_frame_rate())
, _shuffler (0)
{
- _film_changed_connection = _film->Changed.connect (bind (&Player::film_changed, this, _1));
+ _film_changed_connection = _film->Change.connect (bind (&Player::film_change, this, _1, _2));
_playlist_change_connection = _playlist->Change.connect (bind (&Player::playlist_change, this, _1));
_playlist_content_change_connection = _playlist->ContentChange.connect (bind(&Player::playlist_content_change, this, _1, _3, _4));
set_video_container_size (_film->frame_size ());
- film_changed (Film::AUDIO_PROCESSOR);
+ film_change (CHANGE_TYPE_DONE, Film::AUDIO_PROCESSOR);
setup_pieces ();
seek (DCPTime (), true);
}
void
-Player::film_changed (Film::Property p)
+Player::film_change (ChangeType type, Film::Property p)
{
/* Here we should notice Film properties that affect our output, and
alert listeners that our output now would be different to how it was
*/
if (p == Film::CONTAINER) {
- Change (CHANGE_TYPE_PENDING, PlayerProperty::FILM_CONTAINER, false);
+ Change (type, PlayerProperty::FILM_CONTAINER, false);
} else if (p == Film::VIDEO_FRAME_RATE) {
/* Pieces contain a FrameRateChange which contains the DCP frame rate,
so we need new pieces here.
*/
- /* XXX: missing PENDING! */
- setup_pieces ();
- Change (CHANGE_TYPE_DONE, PlayerProperty::FILM_VIDEO_FRAME_RATE, false);
+ if (type == CHANGE_TYPE_DONE) {
+ setup_pieces ();
+ }
+ Change (type, PlayerProperty::FILM_VIDEO_FRAME_RATE, false);
} else if (p == Film::AUDIO_PROCESSOR) {
- if (_film->audio_processor ()) {
+ if (type == CHANGE_TYPE_DONE && _film->audio_processor ()) {
boost::mutex::scoped_lock lm (_mutex);
_audio_processor = _film->audio_processor()->clone (_film->audio_frame_rate ());
}
} else if (p == Film::AUDIO_CHANNELS) {
- boost::mutex::scoped_lock lm (_mutex);
- _audio_merger.clear ();
+ if (type == CHANGE_TYPE_DONE) {
+ boost::mutex::scoped_lock lm (_mutex);
+ _audio_merger.clear ();
+ }
}
}
void setup_pieces ();
void setup_pieces_unlocked ();
void flush ();
- void film_changed (Film::Property);
+ void film_change (ChangeType, Film::Property);
void playlist_change (ChangeType);
void playlist_content_change (ChangeType, int, bool);
std::list<PositionImage> transform_bitmap_texts (std::list<BitmapText>) const;
if (_film->directory()) {
Config::instance()->add_to_history (_film->directory().get());
}
- _film->Changed.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this));
+ _film->Change.connect (boost::bind (&DOMFrame::film_change, this, _1));
}
shared_ptr<Film> film () const {
private:
+ void film_change (ChangeType type)
+ {
+ if (type == CHANGE_TYPE_DONE) {
+ set_menu_sensitivity ();
+ }
+ }
+
void file_changed (boost::filesystem::path f)
{
string s = wx_to_std (_("DCP-o-matic"));
* @param p Property of the Film that has changed.
*/
void
-FilmEditor::film_changed (Film::Property p)
+FilmEditor::film_change (ChangeType type, Film::Property p)
{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
ensure_ui_thread ();
if (!_film) {
_dcp_panel->set_film (_film);
if (_film) {
- _film->Changed.connect (bind (&FilmEditor::film_changed, this, _1));
+ _film->Change.connect (bind (&FilmEditor::film_change, this, _1, _2));
_film->ContentChange.connect (bind (&FilmEditor::film_content_change, this, _1, _3));
}
}
/* Handle changes to the model */
- void film_changed (Film::Property);
+ void film_change (ChangeType, Film::Property);
void film_content_change (ChangeType type, int);
void set_general_sensitivity (bool);
_player->set_always_burn_open_subtitles ();
_player->set_play_referenced ();
- _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
+ _film->Change.connect (boost::bind (&FilmViewer::film_change, this, _1, _2));
_player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3));
/* Keep about 1 second's worth of history samples */
}
void
-FilmViewer::film_changed (Film::Property p)
+FilmViewer::film_change (ChangeType type, Film::Property p)
{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
if (p == Film::CONTENT || p == Film::THREE_D) {
setup_sensitivity ();
} else if (p == Film::AUDIO_CHANNELS) {
void seek (DCPTime t, bool accurate);
void refresh_panel ();
void setup_sensitivity ();
- void film_changed (Film::Property);
+ void film_change (ChangeType, Film::Property);
DCPTime nudge_amount (wxKeyboardState &);
void timecode_clicked ();
void frame_number_clicked ();
boost::shared_ptr<Film> locked_film = _film.lock ();
if (locked_film) {
- _film_changed_connection = locked_film->Changed.connect (boost::bind (&HintsDialog::film_changed, this));
- _film_content_changed_connection = locked_film->ContentChange.connect (boost::bind (&HintsDialog::film_content_change, this, _1));
+ _film_change_connection = locked_film->Change.connect (boost::bind (&HintsDialog::film_change, this, _1));
+ _film_content_change_connection = locked_film->ContentChange.connect (boost::bind (&HintsDialog::film_content_change, this, _1));
}
_hints->Hint.connect (bind (&HintsDialog::hint, this, _1));
_hints->Pulse.connect (bind (&HintsDialog::pulse, this));
_hints->Finished.connect (bind (&HintsDialog::finished, this));
- film_changed ();
+ film_change (CHANGE_TYPE_DONE);
}
void
-HintsDialog::film_changed ()
+HintsDialog::film_change (ChangeType type)
{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
_text->Clear ();
_current.clear ();
void
HintsDialog::film_content_change (ChangeType type)
{
- if (type == CHANGE_TYPE_DONE) {
- film_changed ();
- }
+ film_change (type);
}
void
HintsDialog (wxWindow* parent, boost::weak_ptr<Film>, bool ok);
private:
- void film_changed ();
+ void film_change (ChangeType);
void film_content_change (ChangeType type);
void shut_up (wxCommandEvent& ev);
void update ();
boost::shared_ptr<Hints> _hints;
std::list<std::string> _current;
- boost::signals2::scoped_connection _film_changed_connection;
- boost::signals2::scoped_connection _film_content_changed_connection;
+ boost::signals2::scoped_connection _film_change_connection;
+ boost::signals2::scoped_connection _film_content_change_connection;
};
_main_canvas->Bind (wxEVT_SCROLLWIN_PAGEDOWN, boost::bind (&Timeline::scrolled, this, _1));
_main_canvas->Bind (wxEVT_SCROLLWIN_THUMBTRACK, boost::bind (&Timeline::scrolled, this, _1));
- film_changed (Film::CONTENT);
+ film_change (CHANGE_TYPE_DONE, Film::CONTENT);
SetMinSize (wxSize (640, 4 * pixels_per_track() + 96));
- _film_changed_connection = film->Changed.connect (bind (&Timeline::film_changed, this, _1));
+ _film_changed_connection = film->Change.connect (bind (&Timeline::film_change, this, _1, _2));
_film_content_change_connection = film->ContentChange.connect (bind (&Timeline::film_content_change, this, _1, _3, _4));
setup_scrollbars ();
}
void
-Timeline::film_changed (Film::Property p)
+Timeline::film_change (ChangeType type, Film::Property p)
{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
if (p == Film::CONTENT || p == Film::REEL_TYPE || p == Film::REEL_LENGTH) {
ensure_ui_thread ();
recreate_views ();
void mouse_moved (wxMouseEvent &);
void mouse_moved_select (wxMouseEvent &);
void mouse_moved_zoom (wxMouseEvent &);
- void film_changed (Film::Property);
+ void film_change (ChangeType type, Film::Property);
void film_content_change (ChangeType type, int, bool frequent);
void resized ();
void assign_tracks ();
sizer->SetSizeHints (this);
_toolbar->ToggleTool ((int) Timeline::SNAP, _timeline.snap ());
- film_changed (Film::SEQUENCE);
+ film_change (CHANGE_TYPE_DONE, Film::SEQUENCE);
- _film_changed_connection = film->Changed.connect (bind (&TimelineDialog::film_changed, this, _1));
+ _film_changed_connection = film->Change.connect (bind (&TimelineDialog::film_change, this, _1, _2));
}
wxString
}
void
-TimelineDialog::film_changed (Film::Property p)
+TimelineDialog::film_change (ChangeType type, Film::Property p)
{
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
shared_ptr<Film> film = _film.lock ();
if (!film) {
return;
void set_selection (ContentList selection);
private:
- void film_changed (Film::Property);
+ void film_change (ChangeType type, Film::Property);
void tool_clicked (wxCommandEvent& id);
wxString bitmap_path (std::string name);