blob: dfe7df1c68b6ec54f901bdc4587513a820c3dd36 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_SLIDESHOW_SETACTIVITY_HXX
#define INCLUDED_SLIDESHOW_SETACTIVITY_HXX
// must be first
#include <canvas/debug.hxx>
#include <tools/diagnose_ex.h>
#include <canvas/verbosetrace.hxx>
#include "animationactivity.hxx"
#include "animation.hxx"
#include "animatableshape.hxx"
#include "shapeattributelayer.hxx"
#include "activitiesfactory.hxx"
namespace slideshow {
namespace internal {
/** Templated setter for animation values
This template class implements the AnimationActivity
interface, but only the perform() and
setAttributeLayer() methods are functional. To be used for set animations.
@see AnimationSetNode.
*/
template <class AnimationT>
class SetActivity : public AnimationActivity
{
public:
typedef ::boost::shared_ptr< AnimationT > AnimationSharedPtrT;
typedef typename AnimationT::ValueType ValueT;
SetActivity( const ActivitiesFactory::CommonParameters& rParms,
const AnimationSharedPtrT& rAnimation,
const ValueT& rToValue )
: mpAnimation( rAnimation ),
mpShape(),
mpAttributeLayer(),
mpEndEvent( rParms.mpEndEvent ),
mrEventQueue( rParms.mrEventQueue ),
maToValue( rToValue ),
mbIsActive(true)
{
ENSURE_OR_THROW( mpAnimation, "Invalid animation" );
}
virtual void dispose()
{
mbIsActive = false;
mpAnimation.reset();
mpShape.reset();
mpAttributeLayer.reset();
// discharge end event:
if (mpEndEvent && mpEndEvent->isCharged())
mpEndEvent->dispose();
mpEndEvent.reset();
}
virtual double calcTimeLag() const
{
return 0.0;
}
virtual bool perform()
{
if (! isActive())
return false;
// we're going inactive immediately:
mbIsActive = false;
if (mpAnimation && mpAttributeLayer && mpShape) {
mpAnimation->start( mpShape, mpAttributeLayer );
(*mpAnimation)(maToValue);
mpAnimation->end();
}
// fire end event, if any
if (mpEndEvent)
mrEventQueue.addEvent( mpEndEvent );
return false; // don't reinsert
}
virtual bool isActive() const
{
return mbIsActive;
}
virtual void dequeued()
{
}
virtual void end()
{
perform();
}
virtual void setTargets( const AnimatableShapeSharedPtr& rShape,
const ShapeAttributeLayerSharedPtr& rAttrLayer )
{
ENSURE_OR_THROW( rShape, "Invalid shape" );
ENSURE_OR_THROW( rAttrLayer, "Invalid attribute layer" );
mpShape = rShape;
mpAttributeLayer = rAttrLayer;
}
private:
AnimationSharedPtrT mpAnimation;
AnimatableShapeSharedPtr mpShape;
ShapeAttributeLayerSharedPtr mpAttributeLayer;
EventSharedPtr mpEndEvent;
EventQueue& mrEventQueue;
ValueT maToValue;
bool mbIsActive;
};
template <class AnimationT> AnimationActivitySharedPtr makeSetActivity(
const ActivitiesFactory::CommonParameters& rParms,
const ::boost::shared_ptr< AnimationT >& rAnimation,
const typename AnimationT::ValueType& rToValue )
{
return AnimationActivitySharedPtr(
new SetActivity<AnimationT>(rParms,rAnimation,rToValue) );
}
} // namespace internal
} // namespace presentation
#endif /* INCLUDED_SLIDESHOW_SETACTIVITY_HXX */