X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_panel.cc;h=e72ca28a18a11b0f667b7dfe545fc0a6d1ea3457;hb=8ae2dcecc765df1a98a5dc686473ac46f5e08c3e;hp=bc3966f6c6fdff6c77930c79165211fee9ec793b;hpb=0bd80b641875632b9b2b17530d00e4546bba8088;p=dcpomatic.git diff --git a/src/wx/content_panel.cc b/src/wx/content_panel.cc index bc3966f6c..e72ca28a1 100644 --- a/src/wx/content_panel.cc +++ b/src/wx/content_panel.cc @@ -27,6 +27,7 @@ #include "timeline_dialog.h" #include "image_sequence_dialog.h" #include "film_viewer.h" +#include "dcpomatic_button.h" #include "lib/audio_content.h" #include "lib/text_content.h" #include "lib/video_content.h" @@ -41,6 +42,7 @@ #include "lib/compose.hpp" #include "lib/string_text_file_content.h" #include "lib/string_text_file.h" +#include "lib/dcpomatic_log.h" #include #include #include @@ -59,9 +61,7 @@ using boost::weak_ptr; using boost::dynamic_pointer_cast; using boost::optional; -#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); - -ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmViewer* viewer) +ContentPanel::ContentPanel (wxNotebook* n, shared_ptr film, weak_ptr viewer) : _video_panel (0) , _audio_panel (0) , _timeline_dialog (0) @@ -70,6 +70,7 @@ ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmVie , _film (film) , _film_viewer (viewer) , _generally_sensitive (true) + , _ignore_deselect (false) { for (int i = 0; i < TEXT_COUNT; ++i) { _text_panel[i] = 0; @@ -93,31 +94,31 @@ ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmVie wxBoxSizer* b = new wxBoxSizer (wxVERTICAL); - _add_file = new wxButton (_panel, wxID_ANY, _("Add file(s)...")); + _add_file = new Button (_panel, _("Add file(s)...")); _add_file->SetToolTip (_("Add video, image, sound or subtitle files to the film.")); b->Add (_add_file, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _add_folder = new wxButton (_panel, wxID_ANY, _("Add folder...")); + _add_folder = new Button (_panel, _("Add folder...")); _add_folder->SetToolTip (_("Add a folder of image files (which will be used as a moving image sequence) or a folder of sound files.")); b->Add (_add_folder, 1, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _add_dcp = new wxButton (_panel, wxID_ANY, _("Add DCP...")); + _add_dcp = new Button (_panel, _("Add DCP...")); _add_dcp->SetToolTip (_("Add a DCP.")); b->Add (_add_dcp, 1, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _remove = new wxButton (_panel, wxID_ANY, _("Remove")); + _remove = new Button (_panel, _("Remove")); _remove->SetToolTip (_("Remove the selected piece of content from the film.")); b->Add (_remove, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _earlier = new wxButton (_panel, wxID_ANY, _("Earlier")); + _earlier = new Button (_panel, _("Earlier")); _earlier->SetToolTip (_("Move the selected piece of content earlier in the film.")); b->Add (_earlier, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _later = new wxButton (_panel, wxID_ANY, _("Later")); + _later = new Button (_panel, _("Later")); _later->SetToolTip (_("Move the selected piece of content later in the film.")); b->Add (_later, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _timeline = new wxButton (_panel, wxID_ANY, _("Timeline...")); + _timeline = new Button (_panel, _("Timeline...")); _timeline->SetToolTip (_("Open the timeline for the film.")); b->Add (_timeline, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); @@ -132,8 +133,8 @@ ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmVie _timing_panel = new TimingPanel (this, _film_viewer); _notebook->AddPage (_timing_panel, _("Timing"), false); - _content->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind (&ContentPanel::selection_changed, this)); - _content->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind (&ContentPanel::selection_changed, this)); + _content->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind (&ContentPanel::item_selected, this)); + _content->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind (&ContentPanel::item_deselected, this)); _content->Bind (wxEVT_LIST_ITEM_RIGHT_CLICK, boost::bind (&ContentPanel::right_click, this, _1)); _content->Bind (wxEVT_DROP_FILES, boost::bind (&ContentPanel::files_dropped, this, _1)); _add_file->Bind (wxEVT_BUTTON, boost::bind (&ContentPanel::add_file_clicked, this)); @@ -240,7 +241,32 @@ ContentPanel::film_changed (Film::Property p) } void -ContentPanel::selection_changed () +ContentPanel::item_deselected () +{ + /* Maybe this is just a re-click on the same item; if not, _ignore_deselect will stay + false and item_deselected_foo will handle the deselection. + */ + _ignore_deselect = false; + signal_manager->when_idle (boost::bind (&ContentPanel::item_deselected_idle, this)); +} + +void +ContentPanel::item_deselected_idle () +{ + if (!_ignore_deselect) { + check_selection (); + } +} + +void +ContentPanel::item_selected () +{ + _ignore_deselect = true; + check_selection (); +} + +void +ContentPanel::check_selection () { if (_last_selected == selected()) { /* This was triggered by a re-build of the view but the selection @@ -276,7 +302,9 @@ ContentPanel::selection_changed () } if (go_to && Config::instance()->jump_to_selected() && signal_manager) { - signal_manager->when_idle(boost::bind(&FilmViewer::set_position, _film_viewer, go_to.get().ceil(_film->video_frame_rate()))); + shared_ptr fv = _film_viewer.lock (); + DCPOMATIC_ASSERT (fv); + signal_manager->when_idle(boost::bind(&FilmViewer::seek, fv.get(), go_to.get().ceil(_film->video_frame_rate()), true)); } if (_timeline_dialog) { @@ -326,7 +354,6 @@ ContentPanel::selection_changed () if (have_audio && !_audio_panel) { _audio_panel = new AudioPanel (this); - _audio_panel->set_film (_film); _notebook->InsertPage (off, _audio_panel, _audio_panel->name()); } else if (!have_audio && _audio_panel) { _notebook->DeletePage (off); @@ -423,7 +450,7 @@ ContentPanel::add_folder_clicked () list > content; try { - content = content_factory (_film, path); + content = content_factory (path); } catch (exception& e) { error_dialog (_parent, e.what()); return; @@ -466,7 +493,7 @@ ContentPanel::add_dcp_clicked () } try { - _film->examine_and_add_content (shared_ptr (new DCPContent (_film, path))); + _film->examine_and_add_content (shared_ptr (new DCPContent (path))); } catch (exception& e) { error_dialog (_parent, e.what()); } @@ -487,7 +514,7 @@ ContentPanel::remove_clicked (bool hotkey) _film->remove_content (i); } - selection_changed (); + check_selection (); return false; } @@ -542,7 +569,7 @@ ContentPanel::setup_sensitivity () _text_panel[i]->Enable (_generally_sensitive && selection.size() == 1 && !selection.front()->text.empty()); } } - _timing_panel->Enable (_generally_sensitive); + _timing_panel->Enable (_generally_sensitive); } void @@ -556,7 +583,7 @@ ContentPanel::set_film (shared_ptr film) film_changed (Film::CONTENT); film_changed (Film::AUDIO_CHANNELS); - selection_changed (); + check_selection (); setup_sensitivity (); } @@ -573,7 +600,7 @@ ContentPanel::earlier_clicked () ContentList sel = selected (); if (sel.size() == 1) { _film->move_content_earlier (sel.front ()); - selection_changed (); + check_selection (); } } @@ -583,7 +610,7 @@ ContentPanel::later_clicked () ContentList sel = selected (); if (sel.size() == 1) { _film->move_content_later (sel.front ()); - selection_changed (); + check_selection (); } } @@ -728,7 +755,7 @@ ContentPanel::add_files (list paths) try { BOOST_FOREACH (boost::filesystem::path i, paths) { - BOOST_FOREACH (shared_ptr j, content_factory (_film, i)) { + BOOST_FOREACH (shared_ptr j, content_factory(i)) { _film->examine_and_add_content (j); } }