#include "timeline.h"
#include "timeline_time_axis_view.h"
#include "timeline_reels_view.h"
+#include "timeline_labels_view.h"
#include "timeline_video_content_view.h"
#include "timeline_audio_content_view.h"
#include "timeline_subtitle_content_view.h"
, _film (film)
, _time_axis_view (new TimelineTimeAxisView (*this, 64))
, _reels_view (new TimelineReelsView (*this, 32))
+ , _labels_view (new TimelineLabelsView (*this))
, _tracks (0)
, _left_down (false)
, _down_view_position (0)
SetMinSize (wxSize (640, tracks() * track_height() + 96));
+ _tracks_position = Position<int> (_labels_view->bbox().width, 8);
+
_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, _3));
}
return;
}
- for (TimelineViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
- (*i)->paint (gc);
+ gc->SetAntialiasMode (wxANTIALIAS_DEFAULT);
+
+ BOOST_FOREACH (shared_ptr<TimelineView> i, _views) {
+
+ shared_ptr<TimelineContentView> ic = dynamic_pointer_cast<TimelineContentView> (i);
+
+ /* Find areas of overlap */
+ list<dcpomatic::Rect<int> > overlaps;
+ BOOST_FOREACH (shared_ptr<TimelineView> j, _views) {
+ shared_ptr<TimelineContentView> jc = dynamic_pointer_cast<TimelineContentView> (j);
+ /* No overlap with non-content views, views no different tracks, audio views or non-active views */
+ if (!ic || !jc || i == j || ic->track() != jc->track() || ic->track().get_value_or(2) >= 2 || !ic->active() || !jc->active()) {
+ continue;
+ }
+
+ optional<dcpomatic::Rect<int> > r = j->bbox().intersection (i->bbox());
+ if (r) {
+ overlaps.push_back (r.get ());
+ }
+ }
+
+ i->paint (gc, overlaps);
}
delete gc;
_views.clear ();
_views.push_back (_time_axis_view);
_views.push_back (_reels_view);
+ _views.push_back (_labels_view);
BOOST_FOREACH (shared_ptr<Content> i, film->content ()) {
if (dynamic_pointer_cast<VideoContent> (i)) {
continue;
}
- 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);
+ if (dynamic_pointer_cast<TimelineVideoContentView> (*i)) {
+ /* Video on tracks 0 and 1 (left and right eye) */
+ shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (cv->content ());
+ cv->set_track (vc->video_frame_type() == VIDEO_FRAME_TYPE_3D_RIGHT ? 1 : 0);
_tracks = max (_tracks, 2);
continue;
+ } else if (dynamic_pointer_cast<TimelineSubtitleContentView> (*i)) {
+ /* Subtitles on track 2 */
+ cv->set_track (2);
+ _tracks = max (_tracks, 3);
+ continue;
}
- /* Audio on tracks 2 and up */
- int t = 2;
+ /* Audio on tracks 3 and up */
+ int t = 3;
+ shared_ptr<Content> content = cv->content();
DCPTimePeriod content_period (content->position(), content->end());
while (true) {
return;
}
- _pixels_per_second = static_cast<double>(width() - x_offset() * 2) / film->length().seconds ();
+ _pixels_per_second = static_cast<double>(width() - tracks_position().x * 2) / film->length().seconds ();
}
shared_ptr<TimelineView>