/*
Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ DCP-o-matic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
using std::string;
using std::cout;
using std::vector;
+using std::exception;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
_content->Bind (wxEVT_DROP_FILES, boost::bind (&ContentPanel::files_dropped, this, _1));
_add_file->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::add_file_clicked, this));
_add_folder->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::add_folder_clicked, this));
- _remove->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::remove_clicked, this));
+ _remove->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::remove_clicked, this, false));
_earlier->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::earlier_clicked, this));
_later->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::later_clicked, this));
_timeline->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentPanel::timeline_clicked, this));
return sel;
}
-VideoContentList
+ContentList
ContentPanel::selected_video ()
{
- VideoContentList vc;
+ ContentList vc;
BOOST_FOREACH (shared_ptr<Content> i, selected ()) {
- shared_ptr<VideoContent> t = dynamic_pointer_cast<VideoContent> (i);
- if (t) {
- vc.push_back (t);
+ if (i->video) {
+ vc.push_back (i);
}
}
return vc;
}
-AudioContentList
+ContentList
ContentPanel::selected_audio ()
{
- AudioContentList ac;
+ ContentList ac;
BOOST_FOREACH (shared_ptr<Content> i, selected ()) {
- shared_ptr<AudioContent> t = dynamic_pointer_cast<AudioContent> (i);
- if (t) {
- ac.push_back (t);
+ if (i->audio) {
+ ac.push_back (i);
}
}
return ac;
}
-SubtitleContentList
+ContentList
ContentPanel::selected_subtitle ()
{
- SubtitleContentList sc;
+ ContentList sc;
BOOST_FOREACH (shared_ptr<Content> i, selected ()) {
- shared_ptr<SubtitleContent> t = dynamic_pointer_cast<SubtitleContent> (i);
- if (t) {
- sc.push_back (t);
+ if (i->subtitle) {
+ sc.push_back (i);
}
}
void
ContentPanel::selection_changed ()
{
+ if (_last_selected == selected()) {
+ /* This was triggered by a re-build of the view but the selection
+ did not really change.
+ */
+ return;
+ }
+
+ _last_selected = selected ();
+
setup_sensitivity ();
BOOST_FOREACH (ContentSubPanel* i, _panels) {
return;
}
- shared_ptr<Content> content = content_factory (_film, path);
+ shared_ptr<Content> content;
+
+ try {
+ content = content_factory (_film, path);
+ } catch (exception& e) {
+ error_dialog (_parent, e.what());
+ return;
+ }
+
if (!content) {
error_dialog (_parent, _("No content found in this folder."));
return;
_film->examine_and_add_content (content);
}
-void
-ContentPanel::remove_clicked ()
+/** @return true if this remove "click" should be ignored */
+bool
+ContentPanel::remove_clicked (bool hotkey)
{
- /* This method is also called when Delete is pressed, so check that our notebook page
- is visible.
+ /* If the method was called because Delete was pressed check that our notebook page
+ is visible and that the content list is focussed.
*/
- if (_parent->GetCurrentPage() != _panel) {
- return;
+ if (hotkey && (_parent->GetCurrentPage() != _panel || !_content->HasFocus())) {
+ return true;
}
BOOST_FOREACH (shared_ptr<Content> i, selected ()) {
}
selection_changed ();
+ return false;
}
void
_add_folder->Enable (_generally_sensitive);
ContentList selection = selected ();
- VideoContentList video_selection = selected_video ();
- AudioContentList audio_selection = selected_audio ();
+ ContentList video_selection = selected_video ();
+ ContentList audio_selection = selected_audio ();
_remove->Enable (!selection.empty() && _generally_sensitive);
_earlier->Enable (selection.size() == 1 && _generally_sensitive);
_video_panel->Enable (video_selection.size() > 0 && _generally_sensitive);
_audio_panel->Enable (audio_selection.size() > 0 && _generally_sensitive);
- _subtitle_panel->Enable (selection.size() == 1 && dynamic_pointer_cast<SubtitleContent> (selection.front()) && _generally_sensitive);
+ _subtitle_panel->Enable (selection.size() == 1 && selection.front()->subtitle && _generally_sensitive);
_timing_panel->Enable (selection.size() == 1 && _generally_sensitive);
}
void
ContentPanel::set_film (shared_ptr<Film> film)
{
+ _audio_panel->set_film (film);
+
_film = film;
film_changed (Film::CONTENT);