/*
- Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
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
SetMinSize (wxSize (640, tracks() * track_height() + 96));
_film_changed_connection = film->Changed.connect (bind (&Timeline::film_changed, this, _1));
- _film_content_changed_connection = film->ContentChanged.connect (bind (&Timeline::film_content_changed, this, _2));
+ _film_content_changed_connection = film->ContentChanged.connect (bind (&Timeline::film_content_changed, this, _2, _3));
}
void
ensure_ui_thread ();
recreate_views ();
} else if (p == Film::CONTENT_ORDER) {
- assign_tracks ();
- if (!_left_down) {
- /* Only do this if we are not dragging, as it's confusing otherwise */
- setup_pixels_per_second ();
- }
Refresh ();
}
}
}
void
-Timeline::film_content_changed (int property)
+Timeline::film_content_changed (int property, bool frequent)
{
ensure_ui_thread ();
if (property == AudioContentProperty::AUDIO_STREAMS) {
recreate_views ();
+ } else if (!frequent) {
+ setup_pixels_per_second ();
+ Refresh ();
}
}
}
shared_ptr<Content> content = cv->content();
+
+ if (dynamic_pointer_cast<VideoContent> (content)) {
+ /* Video on track 0 */
+ cv->set_track (0);
+ _tracks = max (_tracks, 1);
+ continue;
+ } else if (dynamic_pointer_cast<SubtitleContent> (content)) {
+ /* Subtitles on track 1 */
+ cv->set_track (1);
+ _tracks = max (_tracks, 2);
+ continue;
+ }
+
+ /* Audio on tracks 2 and up */
+ int t = 2;
+
DCPTimePeriod content_period (content->position(), content->end());
- int t = 0;
while (true) {
TimelineViewList::iterator j = _views.begin();
while (j != _views.end()) {
- shared_ptr<TimelineContentView> test = dynamic_pointer_cast<TimelineContentView> (*j);
+ shared_ptr<TimelineAudioContentView> test = dynamic_pointer_cast<TimelineAudioContentView> (*j);
if (!test) {
++j;
continue;
shared_ptr<TimelineView>
Timeline::event_to_view (wxMouseEvent& ev)
{
- TimelineViewList::iterator i = _views.begin();
+ /* Search backwards through views so that we find the uppermost one first */
+ TimelineViewList::reverse_iterator i = _views.rbegin();
Position<int> const p (ev.GetX(), ev.GetY());
- while (i != _views.end() && !(*i)->bbox().contains (p)) {
+ while (i != _views.rend() && !(*i)->bbox().contains (p)) {
+ shared_ptr<TimelineContentView> cv = dynamic_pointer_cast<TimelineContentView> (*i);
++i;
}
- if (i == _views.end ()) {
+ if (i == _views.rend ()) {
return shared_ptr<TimelineView> ();
}
set_position_from_event (ev);
- /* We don't do this during drag, and set_position_from_event above
- might not have changed the position, so do it now.
- */
+ /* Clear up up the stuff we don't do during drag */
+ assign_tracks ();
setup_pixels_per_second ();
Refresh ();
shared_ptr<Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
- film->set_sequence_video (false);
+ film->set_sequence (false);
}
void