From 977cbf9e64b2b22d18a8ceadef7d2badfa299b80 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Mon, 19 Jan 2009 18:14:52 +0000 Subject: [PATCH] Fixed track drag raise behaviour --- .../timeline/timeline-header-container.cpp | 40 +++++-------------- .../timeline/timeline-header-container.hpp | 16 ++++---- .../timeline/timeline-layout-helper.cpp | 6 +++ .../timeline/timeline-layout-helper.hpp | 2 + 4 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/gui/widgets/timeline/timeline-header-container.cpp b/src/gui/widgets/timeline/timeline-header-container.cpp index 4041ab554..97df83cb6 100644 --- a/src/gui/widgets/timeline/timeline-header-container.cpp +++ b/src/gui/widgets/timeline/timeline-header-container.cpp @@ -183,7 +183,7 @@ bool TimelineHeaderContainer::on_button_release_event ( // Has the user been dragging? if(layout.get_dragging_track()) - end_drag(); + layout.end_dragging_track(); return Container::on_button_release_event(event); } @@ -404,38 +404,16 @@ void TimelineHeaderContainer::begin_drag() { TimelineLayoutHelper &layout = timelineWidget.layoutHelper; - - shared_ptr dragging_track = - layout.begin_dragging_track(mousePoint); - ENSURE(dragging_track); // Something strange has happened if we - // were somehow not hovering on a track + layout.begin_dragging_track(mousePoint); - const TimelineLayoutHelper::TrackTree::pre_order_iterator node = - layout.iterator_from_track(dragging_track->get_model_track()); - set_keep_above_recursive(node, true); + // Raise all the header widgets so they float above the widgets not + // being dragged + raise_recursive(layout.get_dragging_track_iter()); } void -TimelineHeaderContainer::end_drag() -{ - TimelineLayoutHelper &layout = timelineWidget.layoutHelper; - - shared_ptr dragging_track = - layout.get_dragging_track(); - ENSURE(dragging_track); // Something strange has happened if we - // were somehow not dragging on a track - - const TimelineLayoutHelper::TrackTree::pre_order_iterator node = - layout.iterator_from_track(dragging_track->get_model_track()); - set_keep_above_recursive(node, false); - - layout.end_dragging_track(); -} - -void -TimelineHeaderContainer::set_keep_above_recursive( - TimelineLayoutHelper::TrackTree::iterator_base node, - const bool keep_above) +TimelineHeaderContainer::raise_recursive( + TimelineLayoutHelper::TrackTree::iterator_base node) { TimelineLayoutHelper::TrackTree::pre_order_iterator iter; @@ -450,13 +428,13 @@ TimelineHeaderContainer::set_keep_above_recursive( timeline_track->get_header_widget().get_window(); ENSURE(window); // Something strange has happened if there was no // window - window->set_keep_above(keep_above); + window->raise(); for(iter = layout_tree.begin(node); iter != layout_tree.end(node); iter++) { - set_keep_above_recursive(iter, keep_above); + raise_recursive(iter); } } diff --git a/src/gui/widgets/timeline/timeline-header-container.hpp b/src/gui/widgets/timeline/timeline-header-container.hpp index 4b2883d47..be2250bab 100644 --- a/src/gui/widgets/timeline/timeline-header-container.hpp +++ b/src/gui/widgets/timeline/timeline-header-container.hpp @@ -184,13 +184,15 @@ private: boost::shared_ptr model_track); void begin_drag(); - - - void end_drag(); - - void set_keep_above_recursive( - TimelineLayoutHelper::TrackTree::iterator_base node, - const bool keep_above); + + /** + * Recusively raises all the header widget windows in a branch to the + * top of the Z-order. + * @param node The window of node's track header will be raised, as + * well as all it's descendant nodes. + **/ + void raise_recursive( + TimelineLayoutHelper::TrackTree::iterator_base node); /** * Begins, or continues a scroll slide at a given rate diff --git a/src/gui/widgets/timeline/timeline-layout-helper.cpp b/src/gui/widgets/timeline/timeline-layout-helper.cpp index dccd9d143..f90633e97 100644 --- a/src/gui/widgets/timeline/timeline-layout-helper.cpp +++ b/src/gui/widgets/timeline/timeline-layout-helper.cpp @@ -163,6 +163,12 @@ TimelineLayoutHelper::get_dragging_track() const return draggingTrack; } +TimelineLayoutHelper::TrackTree::pre_order_iterator +TimelineLayoutHelper::get_dragging_track_iter() const +{ + return draggingTrackIter; +} + void TimelineLayoutHelper::drag_to_point(const Gdk::Point &point) { diff --git a/src/gui/widgets/timeline/timeline-layout-helper.hpp b/src/gui/widgets/timeline/timeline-layout-helper.hpp index 68f44939a..560ffc2c8 100644 --- a/src/gui/widgets/timeline/timeline-layout-helper.hpp +++ b/src/gui/widgets/timeline/timeline-layout-helper.hpp @@ -134,6 +134,8 @@ public: boost::shared_ptr get_dragging_track() const; + TrackTree::pre_order_iterator get_dragging_track_iter() const; + void drag_to_point(const Gdk::Point &point); /**