+void
+Timeline::assign_tracks ()
+{
+ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
+ shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
+ if (!cv) {
+ continue;
+ }
+
+ shared_ptr<Content> content = cv->content();
+
+ int t = 0;
+ while (true) {
+ ViewList::iterator j = _views.begin();
+ while (j != _views.end()) {
+ shared_ptr<ContentView> test = dynamic_pointer_cast<ContentView> (*j);
+ if (!test) {
+ ++j;
+ continue;
+ }
+
+ shared_ptr<Content> test_content = test->content();
+
+ if (test && test->track() && test->track().get() == t) {
+ bool const no_overlap =
+ (content->position() < test_content->position() && content->end() < test_content->position()) ||
+ (content->position() > test_content->end() && content->end() > test_content->end());
+
+ if (!no_overlap) {
+ /* we have an overlap on track `t' */
+ ++t;
+ break;
+ }
+ }
+
+ ++j;
+ }
+
+ if (j == _views.end ()) {
+ /* no overlap on `t' */
+ break;
+ }
+ }
+
+ cv->set_track (t);
+ _tracks = max (_tracks, t + 1);
+ }
+
+ _time_axis_view->set_y (tracks() * track_height() + 32);
+}
+