Reorganized attempt_drop_* functions

This commit is contained in:
Joel Holdsworth 2009-01-24 10:15:58 +00:00
parent 69253909e3
commit e15adf1afb
2 changed files with 55 additions and 74 deletions

View file

@ -182,7 +182,7 @@ TimelineLayoutHelper::get_dragging_track_iter() const
void void
TimelineLayoutHelper::drag_to_point(const Gdk::Point &point) TimelineLayoutHelper::drag_to_point(const Gdk::Point &point)
{ {
optional<Drop> drop; Drop drop;
// Apply the scroll offset // Apply the scroll offset
const Gdk::Point last_point(dragPoint); const Gdk::Point last_point(dragPoint);
@ -209,13 +209,32 @@ TimelineLayoutHelper::drag_to_point(const Gdk::Point &point)
{ {
// Skip the dragging branch // Skip the dragging branch
if(iterator == draggingTrackIter) if(iterator == draggingTrackIter)
{
iterator.skip_children(); iterator.skip_children();
continue; else
{
// Do hit test
drop = attempt_drop(iterator, test_point);
if(drop.relation != None)
break;
}
} }
// Did we get a drop point?
if(drop.relation != None)
{
apply_drop_to_layout_tree(drop);
draggingDrop = drop;
}
update_layout();
}
TimelineLayoutHelper::Drop
TimelineLayoutHelper::attempt_drop(TrackTree::pre_order_iterator target,
const Gdk::Point &point)
{
// Lookup the tracks // Lookup the tracks
const shared_ptr<model::Track> model_track(*iterator); const shared_ptr<model::Track> model_track(*target);
REQUIRE(model_track); REQUIRE(model_track);
const weak_ptr<timeline::Track> timeline_track = const weak_ptr<timeline::Track> timeline_track =
lookup_timeline_track(model_track); lookup_timeline_track(model_track);
@ -228,56 +247,20 @@ TimelineLayoutHelper::drag_to_point(const Gdk::Point &point)
const int full_width = rect.get_x() + rect.get_width(); const int full_width = rect.get_x() + rect.get_width();
const int x_mid = rect.get_x() + rect.get_width() / 2; const int x_mid = rect.get_x() + rect.get_width() / 2;
// Do hit test // Initialize the drop
drop = attempt_drop_upper(iterator, test_point, y, // By specifying relation = None, the default return value will signal
full_width, half_height); // no drop-point was foind at point
if(drop) break;
drop = attempt_drop_lower(iterator, test_point,
x_mid, full_width, y_mid, half_height);
if(drop) break;
}
// Did we get a drop point?
if(drop)
{
apply_drop_to_layout_tree(*drop);
draggingDrop = *drop;
}
update_layout();
}
optional<TimelineLayoutHelper::Drop>
TimelineLayoutHelper::attempt_drop_upper(
TrackTree::pre_order_iterator target, const Gdk::Point &point,
const int y, const int full_width, const int half_height)
{
if(pt_in_rect(point, Gdk::Rectangle(0, y, full_width, half_height)))
{
Drop drop;
drop.target = target;
drop.relation = Before;
return drop;
}
return optional<Drop>();
}
optional<TimelineLayoutHelper::Drop>
TimelineLayoutHelper::attempt_drop_lower(
TrackTree::pre_order_iterator target, const Gdk::Point &point,
const int x_mid, const int full_width, const int y_mid,
const int half_height)
{
const shared_ptr<model::Track> model_track(*target);
REQUIRE(model_track);
if(!pt_in_rect(point, Gdk::Rectangle(0, y_mid,
full_width, half_height)))
return optional<Drop>();
Drop drop = {target, None}; Drop drop = {target, None};
if(pt_in_rect(point, Gdk::Rectangle(0, y, full_width, half_height)))
{
// We're hovering over the upper half of the header
drop.relation = Before;
}
else if(pt_in_rect(point, Gdk::Rectangle(0, y_mid,
full_width, half_height)))
{
// We're hovering over the lower half of the header
if(model_track->can_host_children()) if(model_track->can_host_children())
{ {
if(model_track->get_child_tracks().empty()) if(model_track->get_child_tracks().empty())
@ -297,6 +280,7 @@ TimelineLayoutHelper::attempt_drop_lower(
// simply dropped after // simply dropped after
drop.relation = After; drop.relation = After;
} }
}
return drop; return drop;
} }

View file

@ -238,12 +238,9 @@ protected:
**/ **/
bool on_animation_tick(); bool on_animation_tick();
boost::optional<TimelineLayoutHelper::Drop> TimelineLayoutHelper::Drop
attempt_drop_upper(TrackTree::pre_order_iterator target, const Gdk::Point &point, const int y, const int full_width, const int half_height); attempt_drop(TrackTree::pre_order_iterator target,
const Gdk::Point &point);
boost::optional<TimelineLayoutHelper::Drop>
attempt_drop_lower(TrackTree::pre_order_iterator target, const Gdk::Point &point, const int x_mid, const int full_width, const int y_mid, const int half_height);
void apply_drop_to_layout_tree(const Drop &drop); void apply_drop_to_layout_tree(const Drop &drop);