X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=32a4c9ac9f30768477263995aa677f5908eaf609;hb=5799460dc38bafa1da1ce9f7bf43621d3fadf442;hp=a80a5fc82e1dffda4a3a0019e5ddf02d186d68fc;hpb=266e3f1b80d1263ff3cc8b3afaecd6ca1f88983b;p=dcpomatic.git diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index a80a5fc82..32a4c9ac9 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -43,6 +43,7 @@ #include "lib/image_content.h" #include "lib/job_manager.h" #include "lib/playlist.h" +#include "lib/scope_guard.h" #include "lib/video_content.h" #include #include @@ -86,7 +87,7 @@ enum { }; -ContentMenu::ContentMenu (wxWindow* p, weak_ptr viewer) +ContentMenu::ContentMenu(wxWindow* p, FilmViewer& viewer) : _menu (new wxMenu) , _parent (p) , _pop_up_open (false) @@ -461,9 +462,33 @@ ContentMenu::properties () void ContentMenu::advanced () { - auto d = new ContentAdvancedDialog (_parent, _content.front()); - d->ShowModal (); - d->Destroy (); + DCPOMATIC_ASSERT(!_content.empty()); + + auto content = _content.front(); + auto dialog = new ContentAdvancedDialog(_parent, content); + ScopeGuard sg = [dialog]() { dialog->Destroy(); }; + + if (dialog->ShowModal() == wxID_CANCEL) { + return; + } + + if (content->video) { + content->video->set_use(!dialog->ignore_video()); + content->video->set_burnt_subtitle_language(dialog->burnt_subtitle_language()); + } + + auto ffmpeg = dynamic_pointer_cast(content); + if (ffmpeg) { + ffmpeg->set_filters(dialog->filters()); + } + + if (dialog->video_frame_rate()) { + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + content->set_video_frame_rate(film, *dialog->video_frame_rate()); + } else { + content->unset_video_frame_rate(); + } } @@ -501,17 +526,13 @@ ContentMenu::auto_crop () auto film = _film.lock (); DCPOMATIC_ASSERT (film); - auto viewer = _viewer.lock (); - DCPOMATIC_ASSERT (viewer); auto update_viewer = [this](Crop crop) { auto film = _film.lock(); DCPOMATIC_ASSERT (film); - auto viewer = _viewer.lock (); - DCPOMATIC_ASSERT (viewer); auto const content = _content.front(); auto const current_crop = content->video->actual_crop(); - viewer->set_crop_guess ( + _viewer.set_crop_guess( dcpomatic::Rect( static_cast(std::max(0, crop.left - current_crop.left)) / content->video->size().width, static_cast(std::max(0, crop.top - current_crop.top)) / content->video->size().height, @@ -520,8 +541,8 @@ ContentMenu::auto_crop () )); }; - auto guess_crop_for_content = [this, film, viewer]() { - auto position = viewer->position_in_content(_content.front()).get_value_or( + auto guess_crop_for_content = [this, film]() { + auto position = _viewer.position_in_content(_content.front()).get_value_or( ContentTime::from_frames(_content.front()->video->length(), _content.front()->video_frame_rate().get_value_or(24)) ); return guess_crop(film, _content.front(), Config::instance()->auto_crop_threshold(), position); @@ -551,21 +572,21 @@ ContentMenu::auto_crop () }); /* Also update the dialog and view when we're looking at a different frame */ - _auto_crop_viewer_connection = viewer->ImageChanged.connect([this, guess_crop_for_content, update_viewer](shared_ptr) { + _auto_crop_viewer_connection = _viewer.ImageChanged.connect([this, guess_crop_for_content, update_viewer](shared_ptr) { auto const crop = guess_crop_for_content(); _auto_crop_dialog->set(crop); update_viewer(crop); }); /* Handle the user closing the dialog (with OK or cancel) */ - _auto_crop_dialog->Bind (wxEVT_BUTTON, [this, viewer](wxCommandEvent& ev) { + _auto_crop_dialog->Bind(wxEVT_BUTTON, [this](wxCommandEvent& ev) { _auto_crop_config_connection.disconnect (); _auto_crop_viewer_connection.disconnect (); if (ev.GetId() == wxID_OK) { _content.front()->video->set_crop(_auto_crop_dialog->get()); } _auto_crop_dialog->Show (false); - viewer->unset_crop_guess (); + _viewer.unset_crop_guess (); }); /* Update the view when something in the dialog is changed */