X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_panel.cc;h=d1315ac34a08265f543b49feff1c42ac970a4eb4;hb=696ff1c534d59483bed3db06705b554f615a7b85;hp=ee9ed2bf87c96f8e57ffa28eee9e819ebd3b3dcd;hpb=1668af230bde86ebc7ca5e2ff113bd8ad122a9bc;p=dcpomatic.git diff --git a/src/wx/content_panel.cc b/src/wx/content_panel.cc index ee9ed2bf8..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" @@ -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 ("All files|*.*|Subtitle files|*.srt;*.xml|Audio files|*.wav;*.w64;*.flac;*.aif;*.aiff"), 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) { @@ -301,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 (); @@ -338,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); @@ -414,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 (); } @@ -427,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.