Fixed track drag raise behaviour

This commit is contained in:
Joel Holdsworth 2009-01-19 18:14:52 +00:00
parent 1be33426e4
commit 977cbf9e64
4 changed files with 26 additions and 38 deletions

View file

@ -183,7 +183,7 @@ bool TimelineHeaderContainer::on_button_release_event (
// Has the user been dragging? // Has the user been dragging?
if(layout.get_dragging_track()) if(layout.get_dragging_track())
end_drag(); layout.end_dragging_track();
return Container::on_button_release_event(event); return Container::on_button_release_event(event);
} }
@ -404,38 +404,16 @@ void
TimelineHeaderContainer::begin_drag() TimelineHeaderContainer::begin_drag()
{ {
TimelineLayoutHelper &layout = timelineWidget.layoutHelper; TimelineLayoutHelper &layout = timelineWidget.layoutHelper;
layout.begin_dragging_track(mousePoint);
shared_ptr<timeline::Track> 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 = // Raise all the header widgets so they float above the widgets not
layout.iterator_from_track(dragging_track->get_model_track()); // being dragged
set_keep_above_recursive(node, true); raise_recursive(layout.get_dragging_track_iter());
} }
void void
TimelineHeaderContainer::end_drag() TimelineHeaderContainer::raise_recursive(
{ TimelineLayoutHelper::TrackTree::iterator_base node)
TimelineLayoutHelper &layout = timelineWidget.layoutHelper;
shared_ptr<timeline::Track> 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; TimelineLayoutHelper::TrackTree::pre_order_iterator iter;
@ -450,13 +428,13 @@ TimelineHeaderContainer::set_keep_above_recursive(
timeline_track->get_header_widget().get_window(); timeline_track->get_header_widget().get_window();
ENSURE(window); // Something strange has happened if there was no ENSURE(window); // Something strange has happened if there was no
// window // window
window->set_keep_above(keep_above); window->raise();
for(iter = layout_tree.begin(node); for(iter = layout_tree.begin(node);
iter != layout_tree.end(node); iter != layout_tree.end(node);
iter++) iter++)
{ {
set_keep_above_recursive(iter, keep_above); raise_recursive(iter);
} }
} }

View file

@ -184,13 +184,15 @@ private:
boost::shared_ptr<model::Track> model_track); boost::shared_ptr<model::Track> model_track);
void begin_drag(); void begin_drag();
/**
void end_drag(); * Recusively raises all the header widget windows in a branch to the
* top of the Z-order.
void set_keep_above_recursive( * @param node The window of node's track header will be raised, as
TimelineLayoutHelper::TrackTree::iterator_base node, * well as all it's descendant nodes.
const bool keep_above); **/
void raise_recursive(
TimelineLayoutHelper::TrackTree::iterator_base node);
/** /**
* Begins, or continues a scroll slide at a given rate * Begins, or continues a scroll slide at a given rate

View file

@ -163,6 +163,12 @@ TimelineLayoutHelper::get_dragging_track() const
return draggingTrack; return draggingTrack;
} }
TimelineLayoutHelper::TrackTree::pre_order_iterator
TimelineLayoutHelper::get_dragging_track_iter() const
{
return draggingTrackIter;
}
void void
TimelineLayoutHelper::drag_to_point(const Gdk::Point &point) TimelineLayoutHelper::drag_to_point(const Gdk::Point &point)
{ {

View file

@ -134,6 +134,8 @@ public:
boost::shared_ptr<timeline::Track> get_dragging_track() const; boost::shared_ptr<timeline::Track> get_dragging_track() const;
TrackTree::pre_order_iterator get_dragging_track_iter() const;
void drag_to_point(const Gdk::Point &point); void drag_to_point(const Gdk::Point &point);
/** /**