1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-18 00:54:19 +00:00
JUCE/src/gui/components/layout/juce_ComponentAnimator.h

138 lines
6.3 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#ifndef __JUCE_COMPONENTANIMATOR_JUCEHEADER__
#define __JUCE_COMPONENTANIMATOR_JUCEHEADER__
#include "../juce_Component.h"
#include "../../../events/juce_ChangeBroadcaster.h"
#include "../../../events/juce_Timer.h"
//==============================================================================
/**
Animates a set of components, moving it to a new position.
To use this, create a ComponentAnimator, and use its animateComponent() method
to tell it to move components to destination positions. Any number of
components can be animated by one ComponentAnimator object (if you've got a
lot of components to move, it's much more efficient to share a single animator
than to have many animators running at once).
You'll need to make sure the animator object isn't deleted before it finishes
moving the components.
The class is a ChangeBroadcaster and sends a notification when any components
start or finish being animated.
*/
class JUCE_API ComponentAnimator : public ChangeBroadcaster,
private Timer
{
public:
//==============================================================================
/** Creates a ComponentAnimator. */
ComponentAnimator();
/** Destructor. */
~ComponentAnimator();
//==============================================================================
/** Starts a component moving from its current position to a specified position.
If the component is already in the middle of an animation, that will be abandoned,
and a new animation will begin, moving the component from its current location.
The start and end speed parameters let you apply some acceleration to the component's
movement.
@param component the component to move
@param finalPosition the destination position and size to move it to
@param millisecondsToSpendMoving how long, in milliseconds, it should take
to arrive at its destination
@param startSpeed a value to indicate the relative start speed of the
animation. If this is 0, the component will start
by accelerating from rest; higher values mean that it
will have an initial speed greater than zero. If the
value if greater than 1, it will decelerate towards the
middle of its journey. To move the component at a constant
rate for its entire animation, set both the start and
end speeds to 1.0
@param endSpeed a relative speed at which the component should be moving
when the animation finishes. If this is 0, the component
will decelerate to a standstill at its final position; higher
values mean the component will still be moving when it stops.
To move the component at a constant rate for its entire
animation, set both the start and end speeds to 1.0
*/
void animateComponent (Component* const component,
const Rectangle<int>& finalPosition,
const int millisecondsToSpendMoving,
const double startSpeed = 1.0,
const double endSpeed = 1.0);
/** Stops a component if it's currently being animated.
If moveComponentToItsFinalPosition is true, then the component will
be immediately moved to its destination position and size. If false, it will be
left in whatever location it currently occupies.
*/
void cancelAnimation (Component* const component,
const bool moveComponentToItsFinalPosition);
/** Clears all of the active animations.
If moveComponentsToTheirFinalPositions is true, all the components will
be immediately set to their final positions. If false, they will be
left in whatever locations they currently occupy.
*/
void cancelAllAnimations (const bool moveComponentsToTheirFinalPositions);
/** Returns the destination position for a component.
If the component is being animated, this will return the target position that
was specified when animateComponent() was called.
If the specified component isn't currently being animated, this method will just
return its current position.
*/
const Rectangle<int> getComponentDestination (Component* const component);
/** Returns true if the specified component is currently being animated.
*/
bool isAnimating (Component* component) const;
//==============================================================================
juce_UseDebuggingNewOperator
private:
VoidArray tasks;
uint32 lastTime;
void* findTaskFor (Component* const component) const;
void timerCallback();
};
#endif // __JUCE_COMPONENTANIMATOR_JUCEHEADER__