WIP: Added keep-above code
This commit is contained in:
parent
7a939e5d87
commit
47296381a8
4 changed files with 104 additions and 15 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue