From 47296381a834561e526738be3bee78aeabb92d51 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sat, 17 Jan 2009 15:05:19 +0000 Subject: [PATCH] WIP: Added keep-above code --- .../timeline/timeline-header-container.cpp | 64 ++++++++++++++++++- .../timeline/timeline-header-container.hpp | 10 +++ .../timeline/timeline-layout-helper.cpp | 32 ++++++---- .../timeline/timeline-layout-helper.hpp | 13 +++- 4 files changed, 104 insertions(+), 15 deletions(-) diff --git a/src/gui/widgets/timeline/timeline-header-container.cpp b/src/gui/widgets/timeline/timeline-header-container.cpp index 1c552182b..4041ab554 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()) - layout.end_dragging_track(); + end_drag(); return Container::on_button_release_event(event); } @@ -208,7 +208,7 @@ bool TimelineHeaderContainer::on_motion_notify_event ( if((event->state & GDK_BUTTON1_MASK) && hoveringTrack && !layout.get_dragging_track()) { - layout.begin_dragging_track(mousePoint); + begin_drag(); return result; } @@ -400,6 +400,66 @@ TimelineHeaderContainer::lookup_timeline_track( return timeline_track; } +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 + + const TimelineLayoutHelper::TrackTree::pre_order_iterator node = + layout.iterator_from_track(dragging_track->get_model_track()); + set_keep_above_recursive(node, true); +} + +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) +{ + TimelineLayoutHelper::TrackTree::pre_order_iterator iter; + + const TimelineLayoutHelper::TrackTree &layout_tree = + timelineWidget.layoutHelper.get_layout_tree(); + + shared_ptr timeline_track = + lookup_timeline_track(*node); + REQUIRE(timeline_track); + + Glib::RefPtr window = + timeline_track->get_header_widget().get_window(); + ENSURE(window); // Something strange has happened if there was no + // window + window->set_keep_above(keep_above); + + for(iter = layout_tree.begin(node); + iter != layout_tree.end(node); + iter++) + { + set_keep_above_recursive(iter, keep_above); + } +} + void TimelineHeaderContainer::begin_scroll_slide(int scroll_slide_rate) { diff --git a/src/gui/widgets/timeline/timeline-header-container.hpp b/src/gui/widgets/timeline/timeline-header-container.hpp index 9caefecee..4b2883d47 100644 --- a/src/gui/widgets/timeline/timeline-header-container.hpp +++ b/src/gui/widgets/timeline/timeline-header-container.hpp @@ -29,6 +29,7 @@ #define HEADER_CONTAINER_HPP #include "../../gtk-lumiera.hpp" +#include "timeline-layout-helper.hpp" namespace gui { @@ -182,6 +183,15 @@ private: boost::shared_ptr lookup_timeline_track( 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); + /** * Begins, or continues a scroll slide at a given rate * @param scroll_slide_rate The distance to slide every timer event diff --git a/src/gui/widgets/timeline/timeline-layout-helper.cpp b/src/gui/widgets/timeline/timeline-layout-helper.cpp index a47097854..dccd9d143 100644 --- a/src/gui/widgets/timeline/timeline-layout-helper.cpp +++ b/src/gui/widgets/timeline/timeline-layout-helper.cpp @@ -128,13 +128,13 @@ TimelineLayoutHelper::track_from_y(int y) return shared_ptr(); } -bool +shared_ptr TimelineLayoutHelper::begin_dragging_track( const Gdk::Point &mouse_point) { draggingTrack = header_from_point(mouse_point); if(!draggingTrack) - return false; + return shared_ptr(); const Gdk::Rectangle &rect = headerBoxes[draggingTrack]; dragStartOffset = Gdk::Point( @@ -142,19 +142,11 @@ TimelineLayoutHelper::begin_dragging_track( mouse_point.get_y() - rect.get_y() + timelineWidget.get_y_scroll_offset()); - // Find the track in the tree const shared_ptr model_track = draggingTrack->get_model_track(); - REQUIRE(model_track); - for(draggingTrackIter = layoutTree.begin(); - draggingTrackIter != layoutTree.end(); - draggingTrackIter++) - { - if(*draggingTrackIter == model_track) - break; - } + draggingTrackIter = iterator_from_track(model_track); - return true; + return draggingTrack; } void @@ -212,6 +204,22 @@ TimelineLayoutHelper::is_animating() const return animating; } +TimelineLayoutHelper::TrackTree::pre_order_iterator +TimelineLayoutHelper::iterator_from_track( + boost::shared_ptr model_track) +{ + REQUIRE(model_track); + + TrackTree::pre_order_iterator iter; + for(iter = layoutTree.begin(); iter != layoutTree.end(); iter++) + { + if(*iter == model_track) + break; + } + + return iter; +} + void TimelineLayoutHelper::update_layout() { diff --git a/src/gui/widgets/timeline/timeline-layout-helper.hpp b/src/gui/widgets/timeline/timeline-layout-helper.hpp index a93f88fa4..68f44939a 100644 --- a/src/gui/widgets/timeline/timeline-layout-helper.hpp +++ b/src/gui/widgets/timeline/timeline-layout-helper.hpp @@ -127,7 +127,8 @@ public: **/ boost::shared_ptr track_from_y(int y); - bool begin_dragging_track(const Gdk::Point &mouse_point); + boost::shared_ptr + begin_dragging_track(const Gdk::Point &mouse_point); void end_dragging_track(); @@ -144,6 +145,16 @@ public: int get_total_height() const; bool is_animating() const; + + /** + * A utility function which finds the iterator of a track in the + * layout tree. + * @param model_track The model track to look for. + * @return Returns the model iterator of layoutTree.end() if no + * iterator was found. + **/ + TrackTree::pre_order_iterator iterator_from_track( + boost::shared_ptr model_track); protected: