Simplified the layout animation a little

This commit is contained in:
Joel Holdsworth 2009-01-04 21:16:45 +00:00
parent f3339a538b
commit 05b17a7148
2 changed files with 43 additions and 21 deletions

View file

@ -42,7 +42,7 @@ const int TimelineLayoutHelper::AnimationTimeout = 20; // 20ms
TimelineLayoutHelper::TimelineLayoutHelper(TimelineWidget &owner) :
timelineWidget(owner),
totalHeight(0),
animation_state(Track::NoAnimationState)
is_animating(false)
{
}
@ -145,7 +145,7 @@ void
TimelineLayoutHelper::update_layout()
{
// Reset the animation state value, before it gets recalculated
animation_state = Track::NoAnimationState;
is_animating = false;
// Clear previously cached layout
headerBoxes.clear();
@ -160,7 +160,7 @@ TimelineLayoutHelper::update_layout()
timelineWidget.on_layout_changed();
// Begin animating as necessary
if(animation_state != Track::NoAnimationState && !animationTimer)
if(is_animating && !animationTimer)
begin_animation();
}
@ -188,6 +188,8 @@ TimelineLayoutHelper::layout_headers_recursive(
// Is the track animating?
const int track_animation_state =
timeline_track->get_expand_animation_state();
if(track_animation_state != Track::NoAnimationState)
is_animating = true;
// Is the track going to be shown?
if(parent_expanded)
@ -208,11 +210,10 @@ TimelineLayoutHelper::layout_headers_recursive(
// Recurse to children
const bool expand_child =
((animation_state != Track::NoAnimationState) ||
timeline_track->get_expanded())
(is_animating || timeline_track->get_expanded())
&& parent_expanded;
const int branch_height = layout_headers_recursive(
int child_branch_height = layout_headers_recursive(
iterator, branch_offset + child_offset,
header_width, indent_width, depth + 1, expand_child);
@ -226,9 +227,14 @@ TimelineLayoutHelper::layout_headers_recursive(
// shown as expanded
const float a = ((float)track_animation_state /
(float)Track::MaxExpandAnimation);
child_offset += branch_height * a * a;
const int y_limit = branch_offset + child_offset;
g_message("branch_height = %d", child_branch_height);
child_branch_height *= a * a;
const int y_limit =
branch_offset + child_offset + child_branch_height;
g_message("track_animation_state = %d", track_animation_state);
g_message("branch_height = %d", child_branch_height);
g_message("y_limit = %d", y_limit);
// Obscure tracks according to the animation state
TrackTree::pre_order_iterator descendant_iterator(iterator);
descendant_iterator++;
@ -239,20 +245,16 @@ TimelineLayoutHelper::layout_headers_recursive(
descendant_iterator != end;
descendant_iterator++)
{
const Gdk::Rectangle &rect = headerBoxes[
lookup_timeline_track(*descendant_iterator)];
const weak_ptr<timeline::Track> track =
lookup_timeline_track(*descendant_iterator);
const Gdk::Rectangle &rect = headerBoxes[track];
if(rect.get_y() + rect.get_height() > y_limit)
headerBoxes.erase(track);
}
// Make sure the global animation state includes this branch's
// animation state
animation_state = max(
animation_state, track_animation_state);
}
else // If no animation, just append the normal length
child_offset += branch_height;
child_offset += child_branch_height;
}
return child_offset;
@ -282,7 +284,7 @@ bool
TimelineLayoutHelper::on_animation_tick()
{
update_layout();
return animation_state != Track::NoAnimationState;
return is_animating;
}
} // namespace timeline

View file

@ -186,9 +186,15 @@ protected:
**/
boost::shared_ptr<timeline::Track> lookup_timeline_track(
boost::shared_ptr<model::Track> model_track);
/**
* A helper function which kicks off the animation timer.
**/
void begin_animation();
/**
* The animation timer tick callback.
**/
bool on_animation_tick();
protected:
@ -220,12 +226,26 @@ protected:
**/
int totalHeight;
/**
* The connection to the animation timer.
* @see begin_animation()
* @see on_animation_tick()
**/
sigc::connection animationTimer;
int animation_state;
/**
* This value is true if the layout animation should continue.
* @remarks This value is recalculated by update_layout()
* @see update_layout()
* @see on_animation_tick()
**/
bool is_animating;
protected:
/**
* The frequencey of animation timer ticks in milliseconds.
**/
static const int AnimationTimeout;
};