2013-10-15 Carl Hetherington <cth@carlh.net>
+ * Restore up/down buttons for simple content time
+ movements.
+
* Include film title in KDM filenames.
* Allow no-stretch scaling like in DVD-o-matic.
_playlist->remove (c);
}
+void
+Film::move_content_earlier (shared_ptr<Content> c)
+{
+ _playlist->move_earlier (c);
+}
+
+void
+Film::move_content_later (shared_ptr<Content> c)
+{
+ _playlist->move_later (c);
+}
+
Time
Film::length () const
{
return kdms;
}
-
void examine_and_add_content (boost::shared_ptr<Content>);
void add_content (boost::shared_ptr<Content>);
void remove_content (boost::shared_ptr<Content>);
+ void move_content_earlier (boost::shared_ptr<Content>);
+ void move_content_later (boost::shared_ptr<Content>);
void set_dcp_content_type (DCPContentType const *);
void set_container (Ratio const *);
void set_resolution (Resolution);
_sequencing_video = true;
ContentList cl = _content;
- sort (cl.begin(), cl.end(), ContentSorter ());
Time last = 0;
- for (ContentList::iterator i = cl.begin(); i != cl.end(); ++i) {
+ for (ContentList::iterator i = _content.begin(); i != _content.end(); ++i) {
if (!dynamic_pointer_cast<VideoContent> (*i)) {
continue;
}
(*i)->set_position (last);
last = (*i)->end ();
}
+
+ /* This won't change order, so it does not need a sort */
_sequencing_video = false;
}
_content.push_back (content_factory (film, *i));
}
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
reconnect ();
}
Playlist::add (shared_ptr<Content> c)
{
_content.push_back (c);
+ sort (_content.begin(), _content.end(), ContentSorter ());
reconnect ();
Changed ();
}
_content.erase (i);
Changed ();
}
+
+ /* This won't change order, so it does not need a sort */
}
void
}
}
+ /* This won't change order, so it does not need a sort */
+
Changed ();
}
pos += range.second - range.first;
}
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
reconnect ();
Changed ();
}
+
+void
+Playlist::move_earlier (shared_ptr<Content> c)
+{
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
+ ContentList::iterator previous = _content.end ();
+ ContentList::iterator i = _content.begin();
+ while (i != _content.end() && *i != c) {
+ previous = i;
+ ++i;
+ }
+
+ assert (i != _content.end ());
+ if (previous == _content.end ()) {
+ return;
+ }
+
+ Time const p = (*previous)->position ();
+ (*previous)->set_position (p + c->length_after_trim ());
+ c->set_position (p);
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
+ Changed ();
+}
+
+void
+Playlist::move_later (shared_ptr<Content> c)
+{
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
+ ContentList::iterator i = _content.begin();
+ while (i != _content.end() && *i != c) {
+ ++i;
+ }
+
+ assert (i != _content.end ());
+
+ ContentList::iterator next = i;
+ ++next;
+
+ if (next == _content.end ()) {
+ return;
+ }
+
+ Time const p = (*next)->position ();
+ (*next)->set_position (c->position ());
+ c->set_position (p + c->length_after_trim ());
+ sort (_content.begin(), _content.end(), ContentSorter ());
+
+ Changed ();
+}
void add (boost::shared_ptr<Content>);
void remove (boost::shared_ptr<Content>);
void remove (ContentList);
+ void move_earlier (boost::shared_ptr<Content>);
+ void move_later (boost::shared_ptr<Content>);
bool has_subtitles () const;
void content_changed (boost::weak_ptr<Content>, int, bool);
void reconnect ();
+ /** List of content. Kept sorted in position order. */
ContentList _content;
bool _sequence_video;
bool _sequencing_video;
#include "lib/dcp_content_type.h"
#include "lib/sound_processor.h"
#include "lib/scaler.h"
+#include "lib/playlist.h"
#include "timecode.h"
#include "wx_util.h"
#include "film_editor.h"
_content_add_file->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_add_file_clicked, this));
_content_add_folder->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_add_folder_clicked, this));
_content_remove->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_remove_clicked, this));
+ _content_earlier->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_earlier_clicked, this));
+ _content_later->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_later_clicked, this));
_content_timeline->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmEditor::content_timeline_clicked, this));
_scaler->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&FilmEditor::scaler_changed, this));
_dcp_content_type->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&FilmEditor::dcp_content_type_changed, this));
b->Add (_content_add_folder, 1, wxEXPAND | wxLEFT | wxRIGHT);
_content_remove = new wxButton (_content_panel, wxID_ANY, _("Remove"));
b->Add (_content_remove, 1, wxEXPAND | wxLEFT | wxRIGHT);
+ _content_earlier = new wxButton (_content_panel, wxID_UP);
+ b->Add (_content_earlier, 1, wxEXPAND);
+ _content_later = new wxButton (_content_panel, wxID_DOWN);
+ b->Add (_content_later, 1, wxEXPAND);
_content_timeline = new wxButton (_content_panel, wxID_ANY, _("Timeline..."));
b->Add (_content_timeline, 1, wxEXPAND | wxLEFT | wxRIGHT);
_content_add_file->Enable (s);
_content_add_folder->Enable (s);
_content_remove->Enable (s);
+ _content_earlier->Enable (s);
+ _content_later->Enable (s);
_content_timeline->Enable (s);
_dcp_content_type->Enable (s);
_encrypted->Enable (s);
shared_ptr<Content> selection = selected_content ();
_content_remove->Enable (selection && _generally_sensitive);
+ _content_earlier->Enable (selection && _generally_sensitive);
+ _content_later->Enable (selection && _generally_sensitive);
_content_timeline->Enable (_generally_sensitive);
_video_panel->Enable (selection && dynamic_pointer_cast<VideoContent> (selection) && _generally_sensitive);
_film->set_three_d (_three_d->GetValue ());
}
+
+void
+FilmEditor::content_earlier_clicked ()
+{
+ _film->move_content_earlier (selected_content ());
+ content_selection_changed ();
+}
+
+void
+FilmEditor::content_later_clicked ()
+{
+ _film->move_content_later (selected_content ());
+ content_selection_changed ();
+}
void content_add_file_clicked ();
void content_add_folder_clicked ();
void content_remove_clicked ();
+ void content_earlier_clicked ();
+ void content_later_clicked ();
void container_changed ();
void dcp_content_type_changed ();
void scaler_changed ();