WIP: Added keep-above code

This commit is contained in:
Joel Holdsworth 2009-01-17 15:05:19 +00:00
parent 7a939e5d87
commit 47296381a8
4 changed files with 104 additions and 15 deletions

View file

@ -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<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 =
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<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;
const TimelineLayoutHelper::TrackTree &layout_tree =
timelineWidget.layoutHelper.get_layout_tree();
shared_ptr<timeline::Track> timeline_track =
lookup_timeline_track(*node);
REQUIRE(timeline_track);
Glib::RefPtr<Gdk::Window> 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)
{

View file

@ -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<timeline::Track> lookup_timeline_track(
boost::shared_ptr<model::Track> 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

View file

@ -128,13 +128,13 @@ TimelineLayoutHelper::track_from_y(int y)
return shared_ptr<timeline::Track>();
}
bool
shared_ptr<timeline::Track>
TimelineLayoutHelper::begin_dragging_track(
const Gdk::Point &mouse_point)
{
draggingTrack = header_from_point(mouse_point);
if(!draggingTrack)
return false;
return shared_ptr<timeline::Track>();
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> 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> 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()
{

View file

@ -127,7 +127,8 @@ public:
**/
boost::shared_ptr<timeline::Track> track_from_y(int y);
bool begin_dragging_track(const Gdk::Point &mouse_point);
boost::shared_ptr<timeline::Track>
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> model_track);
protected: