X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_panel.cc;h=d1315ac34a08265f543b49feff1c42ac970a4eb4;hb=696ff1c534d59483bed3db06705b554f615a7b85;hp=066c3e93cadba2a126868391f0213daa7ec73e87;hpb=4704d088ae03ab2b5f73ceed577fd84935ad0640;p=dcpomatic.git diff --git a/src/wx/content_panel.cc b/src/wx/content_panel.cc index 066c3e93c..d1315ac34 100644 --- a/src/wx/content_panel.cc +++ b/src/wx/content_panel.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #include "timing_panel.h" #include "timeline_dialog.h" #include "image_sequence_dialog.h" +#include "film_viewer.h" #include "lib/audio_content.h" #include "lib/subtitle_content.h" #include "lib/video_content.h" @@ -32,14 +33,14 @@ #include "lib/content_factory.h" #include "lib/image_content.h" #include "lib/dcp_content.h" +#include "lib/case_insensitive_sorter.h" #include "lib/playlist.h" #include #include #include #include #include - -#include "lib/image_filename_sorter.cc" +#include using std::list; using std::string; @@ -48,11 +49,13 @@ using std::vector; using boost::shared_ptr; using boost::weak_ptr; using boost::dynamic_pointer_cast; +using boost::optional; ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmViewer* viewer) : _timeline_dialog (0) , _parent (n) , _film (film) + , _film_viewer (viewer) , _generally_sensitive (true) { _panel = new wxPanel (n); @@ -111,7 +114,7 @@ ContentPanel::ContentPanel (wxNotebook* n, boost::shared_ptr film, FilmVie _panels.push_back (_audio_panel); _subtitle_panel = new SubtitlePanel (this); _panels.push_back (_subtitle_panel); - _timing_panel = new TimingPanel (this, viewer); + _timing_panel = new TimingPanel (this, _film_viewer); _panels.push_back (_timing_panel); _content->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&ContentPanel::selection_changed, this)); @@ -210,6 +213,7 @@ ContentPanel::film_changed (Film::Property p) { switch (p) { case Film::CONTENT: + case Film::CONTENT_ORDER: setup (); break; default: @@ -229,6 +233,21 @@ ContentPanel::selection_changed () BOOST_FOREACH (ContentSubPanel* i, _panels) { i->content_selection_changed (); } + + optional go_to; + BOOST_FOREACH (shared_ptr i, selected ()) { + if (!go_to || i->position() < go_to.get()) { + go_to = i->position (); + } + } + + if (go_to) { + _film_viewer->set_position (go_to.get ()); + } + + if (_timeline_dialog) { + _timeline_dialog->set_selection (selected ()); + } } void @@ -244,7 +263,15 @@ ContentPanel::add_file_clicked () /* The wxFD_CHANGE_DIR here prevents a `could not set working directory' error 123 on Windows when using non-Latin filenames or paths. */ - wxFileDialog* d = new wxFileDialog (_panel, _("Choose a file or files"), wxT (""), wxT (""), wxT ("*.*"), wxFD_MULTIPLE | wxFD_CHANGE_DIR); + wxFileDialog* d = new wxFileDialog ( + _panel, + _("Choose a file or files"), + wxT (""), + wxT (""), + wxT ("All files|*.*|Subtitle files|*.srt;*.xml|Audio files|*.wav;*.w64;*.flac;*.aif;*.aiff"), + wxFD_MULTIPLE | wxFD_CHANGE_DIR + ); + int const r = d->ShowModal (); if (r != wxID_OK) { @@ -276,6 +303,10 @@ ContentPanel::add_folder_clicked () } shared_ptr content = content_factory (_film, path); + if (!content) { + error_dialog (_parent, _("No content found in this folder.")); + return; + } shared_ptr ic = dynamic_pointer_cast (content); if (ic) { @@ -297,9 +328,15 @@ ContentPanel::add_folder_clicked () void ContentPanel::remove_clicked () { - ContentList c = selected (); - if (c.size() == 1) { - _film->remove_content (c.front ()); + /* This method is also called when Delete is pressed, so check that our notebook page + is visible. + */ + if (_parent->GetCurrentPage() != _panel) { + return; + } + + BOOST_FOREACH (shared_ptr i, selected ()) { + _film->remove_content (i); } selection_changed (); @@ -334,7 +371,7 @@ ContentPanel::setup_sensitivity () VideoContentList video_selection = selected_video (); AudioContentList audio_selection = selected_audio (); - _remove->Enable (selection.size() == 1 && _generally_sensitive); + _remove->Enable (!selection.empty() && _generally_sensitive); _earlier->Enable (selection.size() == 1 && _generally_sensitive); _later->Enable (selection.size() == 1 && _generally_sensitive); _timeline->Enable (!_film->content().empty() && _generally_sensitive); @@ -410,7 +447,7 @@ ContentPanel::set_selection (weak_ptr wc) void ContentPanel::film_content_changed (int property) { - if (property == ContentProperty::PATH || property == ContentProperty::POSITION || property == DCPContentProperty::CAN_BE_PLAYED) { + if (property == ContentProperty::PATH || property == DCPContentProperty::CAN_BE_PLAYED) { setup (); } @@ -423,7 +460,6 @@ void ContentPanel::setup () { ContentList content = _film->content (); - sort (content.begin(), content.end(), ContentSorter ()); /* First, check to see if anything has changed and bail if not; this avoids flickering on OS X. @@ -513,19 +549,15 @@ void ContentPanel::add_files (list paths) { /* It has been reported that the paths returned from e.g. wxFileDialog are not always sorted; - I can't reproduce that, but sort them anyway. + I can't reproduce that, but sort them anyway. Don't use ImageFilenameSorter as a normal + alphabetical sort is expected here. */ - paths.sort (ImageFilenameSorter ()); + paths.sort (CaseInsensitiveSorter ()); /* XXX: check for lots of files here and do something */ for (list::const_iterator i = paths.begin(); i != paths.end(); ++i) { - shared_ptr c = content_factory (_film, *i); - shared_ptr ic = dynamic_pointer_cast (c); - if (ic) { - ic->set_video_frame_rate (24); - } - _film->examine_and_add_content (c); + _film->examine_and_add_content (content_factory (_film, *i)); } }