_main_canvas->Bind (wxEVT_RIGHT_DOWN, boost::bind (&Timeline::right_down, this, _1));
_main_canvas->Bind (wxEVT_MOTION, boost::bind (&Timeline::mouse_moved, this, _1));
_main_canvas->Bind (wxEVT_SIZE, boost::bind (&Timeline::resized, this));
- _main_canvas->Bind (wxEVT_SCROLLWIN_THUMBTRACK, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_TOP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_BOTTOM, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_LINEUP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_LINEDOWN, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_PAGEUP, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_PAGEDOWN, boost::bind (&Timeline::scrolled, this, _1));
+ _main_canvas->Bind (wxEVT_SCROLLWIN_THUMBTRACK, boost::bind (&Timeline::scrolled, this, _1));
film_changed (Film::CONTENT);
return tracks - base;
}
+/** Compare the mapped output channels of two TimelineViews, so we can into
+ * order of first mapped DCP channel.
+ */
+struct AudioMappingComparator {
+ bool operator()(shared_ptr<TimelineView> a, shared_ptr<TimelineView> b) {
+ int la = -1;
+ shared_ptr<TimelineAudioContentView> cva = dynamic_pointer_cast<TimelineAudioContentView>(a);
+ if (cva) {
+ list<int> oc = cva->content()->audio->mapping().mapped_output_channels();
+ la = *min_element(begin(oc), end(oc));
+ }
+ int lb = -1;
+ shared_ptr<TimelineAudioContentView> cvb = dynamic_pointer_cast<TimelineAudioContentView>(b);
+ if (cvb) {
+ list<int> oc = cvb->content()->audio->mapping().mapped_output_channels();
+ lb = *min_element(begin(oc), end(oc));
+ }
+ return la < lb;
+ }
+};
+
void
Timeline::assign_tracks ()
{
++_tracks;
}
- /* Audio */
+ /* Audio. We're sorting the views so that we get the audio views in order of increasing
+ DCP channel index.
+ */
- place<TimelineAudioContentView> (_views, _tracks);
+ TimelineViewList views = _views;
+ sort(views.begin(), views.end(), AudioMappingComparator());
+ int const audio_tracks = place<TimelineAudioContentView> (views, _tracks);
_labels_view->set_3d (have_3d);
+ _labels_view->set_audio_tracks (audio_tracks);
_labels_view->set_subtitle_tracks (subtitle_tracks);
_labels_view->set_atmos (have_atmos);
if (!film || !_pixels_per_second) {
return;
}
- _labels_canvas->SetVirtualSize (_labels_view->bbox().width, tracks() * pixels_per_track() + 96);
+
+ int const h = tracks() * pixels_per_track() + tracks_y_offset() + _time_axis_view->bbox().height;
+
+ _labels_canvas->SetVirtualSize (_labels_view->bbox().width, h);
_labels_canvas->SetScrollRate (_x_scroll_rate, _y_scroll_rate);
- _main_canvas->SetVirtualSize (*_pixels_per_second * film->length().seconds(), tracks() * pixels_per_track() + tracks_y_offset() + _time_axis_view->bbox().height);
+ _main_canvas->SetVirtualSize (*_pixels_per_second * film->length().seconds(), h);
_main_canvas->SetScrollRate (_x_scroll_rate, _y_scroll_rate);
}
break;
case ZOOM:
case ZOOM_ALL:
+ case SNAP:
+ case SEQUENCE:
/* Nothing to do */
break;
}
left_up_zoom (ev);
break;
case ZOOM_ALL:
+ case SNAP:
+ case SEQUENCE:
break;
}
}
DCPTime const time_right = DCPTime::from_seconds((bottom_right.x + vsx) / *_pixels_per_second);
set_pixels_per_second (double(GetSize().GetWidth()) / (time_right.seconds() - time_left.seconds()));
- double const tracks_top = double(top_left.y) / _pixels_per_track;
- double const tracks_bottom = double(bottom_right.y) / _pixels_per_track;
+ double const tracks_top = double(top_left.y - tracks_y_offset()) / _pixels_per_track;
+ double const tracks_bottom = double(bottom_right.y - tracks_y_offset()) / _pixels_per_track;
set_pixels_per_track (lrint(GetSize().GetHeight() / (tracks_bottom - tracks_top)));
setup_scrollbars ();
- _main_canvas->Scroll (time_left.seconds() * *_pixels_per_second / _x_scroll_rate, tracks_top * _pixels_per_track / _y_scroll_rate);
- _labels_canvas->Scroll (0, tracks_top * _pixels_per_track / _y_scroll_rate);
+ int const y = (tracks_top * _pixels_per_track + tracks_y_offset()) / _y_scroll_rate;
+ _main_canvas->Scroll (time_left.seconds() * *_pixels_per_second / _x_scroll_rate, y);
+ _labels_canvas->Scroll (0, y);
_zoom_point = optional<wxPoint> ();
Refresh ();
mouse_moved_zoom (ev);
break;
case ZOOM_ALL:
+ case SNAP:
+ case SEQUENCE:
break;
}
}
Refresh ();
break;
case ZOOM_ALL:
+ case SNAP:
+ case SEQUENCE:
break;
}
}
Timeline::scrolled (wxScrollWinEvent& ev)
{
if (ev.GetOrientation() == wxVERTICAL) {
- _labels_canvas->Scroll (0, ev.GetPosition ());
+ int x, y;
+ _main_canvas->GetViewStart (&x, &y);
+ _labels_canvas->Scroll (0, y);
}
ev.Skip ();
}
case ZOOM_ALL:
zoom_all ();
break;
+ case SNAP:
+ case SEQUENCE:
+ break;
}
}