* respect animation mappings
* allow loading of javascript anims svn path=/trunk/KDE/kdelibs/; revision=1120242
This commit is contained in:
parent
efd1c16c3e
commit
34a0cf1719
91
animator.cpp
91
animator.cpp
@ -18,9 +18,13 @@
|
|||||||
#include "animator.h"
|
#include "animator.h"
|
||||||
#include "private/animator_p.h"
|
#include "private/animator_p.h"
|
||||||
|
|
||||||
#include <kdebug.h>
|
#include <QFile>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include <KDebug>
|
||||||
|
|
||||||
#include "animations/animation.h"
|
#include "animations/animation.h"
|
||||||
|
#include "animations/animationscriptengine_p.h"
|
||||||
#include "animations/fade_p.h"
|
#include "animations/fade_p.h"
|
||||||
#include "animations/grow_p.h"
|
#include "animations/grow_p.h"
|
||||||
#include "animations/pulser_p.h"
|
#include "animations/pulser_p.h"
|
||||||
@ -33,21 +37,45 @@
|
|||||||
#include "animations/water_p.h"
|
#include "animations/water_p.h"
|
||||||
#include "animations/pendulumcurve_p.h"
|
#include "animations/pendulumcurve_p.h"
|
||||||
#include "animations/javascriptanimation_p.h"
|
#include "animations/javascriptanimation_p.h"
|
||||||
#include "animations/animationscriptengine_p.h"
|
#include "theme.h"
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QTextStream>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
static QSet<QString> s_paths;
|
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
|
|
||||||
|
QHash<Animator::Animation, Animator::Animation> AnimatorPrivate::s_stockAnimMappings;
|
||||||
|
QHash<Animator::Animation, QString> AnimatorPrivate::s_loadableAnimMappings;
|
||||||
|
|
||||||
|
void AnimatorPrivate::mapAnimation(Animator::Animation from, Animator::Animation to)
|
||||||
|
{
|
||||||
|
if (from == to) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
s_loadableAnimMappings.remove(from);
|
||||||
|
s_stockAnimMappings.insert(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AnimatorPrivate::mapAnimation(Animator::Animation from, const QString &to)
|
||||||
|
{
|
||||||
|
s_stockAnimMappings.remove(from);
|
||||||
|
s_loadableAnimMappings.insert(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
Plasma::Animation* Animator::create(Animator::Animation type, QObject *parent)
|
Plasma::Animation* Animator::create(Animator::Animation type, QObject *parent)
|
||||||
{
|
{
|
||||||
Plasma::Animation *result = 0;
|
Plasma::Animation *result = 0;
|
||||||
|
|
||||||
|
if (AnimatorPrivate::s_stockAnimMappings.contains(type)) {
|
||||||
|
return create(AnimatorPrivate::s_stockAnimMappings.value(type));
|
||||||
|
} else if (AnimatorPrivate::s_loadableAnimMappings.contains(type)) {
|
||||||
|
const QString anim = AnimatorPrivate::s_loadableAnimMappings.value(type);
|
||||||
|
if (AnimationScriptEngine::isAnimationRegistered(anim)) {
|
||||||
|
result = new JavascriptAnimation(anim, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case FadeAnimation:
|
case FadeAnimation:
|
||||||
result = new Plasma::FadeAnimation(parent);
|
result = new Plasma::FadeAnimation(parent);
|
||||||
@ -129,49 +157,42 @@ QEasingCurve Animator::create(Animator::CurveShape type)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Plasma::Animation *create(QString &path, QObject *parent = 0)
|
Plasma::Animation *Animator::create(QString &anim, QObject *parent)
|
||||||
{
|
{
|
||||||
Plasma::Animation *result = 0;
|
if (!AnimationScriptEngine::isAnimationRegistered(anim)) {
|
||||||
/* Here this will be executed in the Animator::factory() and
|
const QString path = Theme::defaultTheme()->animationPath(anim);
|
||||||
* the path is retrieved from the Theme class
|
if (path.isEmpty()) {
|
||||||
*/
|
kError() << "failed to find script file for animation" << anim;
|
||||||
//qDebug() << path;
|
return 0;
|
||||||
|
}
|
||||||
/**
|
|
||||||
* FIXME: in future, the path and the animation name will not match 1:1
|
|
||||||
* so we need a way to map animations to path names. trivial would be to map
|
|
||||||
* "Zoom" to "zoom.js" (e.g. anim.toLower() + 'js') but that's also a bit lame.
|
|
||||||
* I think we may need a mapping, much as we use KService to do for applet
|
|
||||||
* names to libraries. Maybe we should, in fact, use KSycoca for this?
|
|
||||||
* In any case, the method used below even allows for all anims to be defined in
|
|
||||||
* one file!
|
|
||||||
*/
|
|
||||||
if (!s_paths.contains(path)) {
|
|
||||||
QFile file(path);
|
QFile file(path);
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
kError() << "failed to open js......";
|
kError() << "failed to open script file" << path;
|
||||||
return result;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextStream buffer(&file);
|
QTextStream buffer(&file);
|
||||||
QString tmp(buffer.readAll());
|
QString tmp(buffer.readAll());
|
||||||
s_paths.insert(path);
|
|
||||||
|
|
||||||
QScriptEngine *engine = AnimationScriptEngine::globalEngine();
|
QScriptEngine *engine = AnimationScriptEngine::globalEngine();
|
||||||
QScriptValue def(engine->evaluate(tmp, path));
|
QScriptValue def(engine->evaluate(tmp, path));
|
||||||
if (engine->hasUncaughtException()) {
|
if (engine->hasUncaughtException()) {
|
||||||
const QScriptValue error = engine->uncaughtException();
|
const QScriptValue error = engine->uncaughtException();
|
||||||
QString file = error.property("fileName").toString();
|
QString file = error.property("fileName").toString();
|
||||||
const QString failureMsg = QString("Error in %1 on line %2.<br><br>%3").arg(
|
const QString failureMsg = QString("Error in %1 on line %2.\n%3")
|
||||||
file).arg(error.property("lineNumber").toString()).arg(error.toString());
|
.arg(file)
|
||||||
kError() << "fail!" << failureMsg;
|
.arg(error.property("lineNumber").toString())
|
||||||
|
.arg(error.toString());
|
||||||
|
kError() << failureMsg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AnimationScriptEngine::isAnimationRegistered(anim)) {
|
||||||
|
kError() << "successfully loaded script file" << path << ", but did not get animation object for" << anim;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = new Plasma::JavascriptAnimation(path);
|
return new Plasma::JavascriptAnimation(anim, parent);
|
||||||
result->setParent(parent);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Plasma
|
} // namespace Plasma
|
||||||
|
11
animator.h
11
animator.h
@ -53,12 +53,10 @@ class PLASMA_EXPORT Animator : public QObject
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
enum Animation {
|
enum Animation {
|
||||||
/* TODO: should we map older animations to new ones? */
|
|
||||||
AppearAnimation = 0, /*<< Animate the appearance of an element */
|
AppearAnimation = 0, /*<< Animate the appearance of an element */
|
||||||
DisappearAnimation, /*<< Animate the disappearance of an element */
|
DisappearAnimation, /*<< Animate the disappearance of an element */
|
||||||
ActivateAnimation, /*<< When something is activated or launched,
|
ActivateAnimation, /*<< When something is activated or launched,
|
||||||
such as an app icon being clicked */
|
such as an app icon being clicked */
|
||||||
/* TODO: change the names of animation classes */
|
|
||||||
FadeAnimation, /*<< Can be used for both fade in and out */
|
FadeAnimation, /*<< Can be used for both fade in and out */
|
||||||
GrowAnimation, /*<< Grow animated object geometry */
|
GrowAnimation, /*<< Grow animated object geometry */
|
||||||
PulseAnimation, /*<< Pulse animated object (opacity/geometry/scale) */
|
PulseAnimation, /*<< Pulse animated object (opacity/geometry/scale) */
|
||||||
@ -94,13 +92,20 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Factory to build new animation objects. To control their behavior,
|
* Factory to build new animation objects. To control their behavior,
|
||||||
* check \ref AbstractAnimation properties.
|
* check \ref AbstractAnimation properties.
|
||||||
|
* @since 4.4
|
||||||
**/
|
**/
|
||||||
static Plasma::Animation *create(Animator::Animation type, QObject *parent = 0);
|
static Plasma::Animation *create(Animator::Animation type, QObject *parent = 0);
|
||||||
|
|
||||||
static Plasma::Animation *create(QString &path, QObject *parent = 0);
|
/**
|
||||||
|
* Factory to build new animation objects from Javascript files. To control their behavior,
|
||||||
|
* check \ref AbstractAnimation properties.
|
||||||
|
* @since 4.5
|
||||||
|
**/
|
||||||
|
static Plasma::Animation *create(QString &animationName, QObject *parent = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory to build new custom easing curves.
|
* Factory to build new custom easing curves.
|
||||||
|
* @since 4.5
|
||||||
*/
|
*/
|
||||||
static QEasingCurve create(Animator::CurveShape type);
|
static QEasingCurve create(Animator::CurveShape type);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user