• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

Plasma

  • plasma
  • animations
animationscriptengine.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2010 Aaron Seigo <aseigo@kde.org>
3 * Copyright 2010 Adenilson Cavalcanti <cavalcantii@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Library General Public License as
7 * published by the Free Software Foundation; either version 2, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details
14 *
15 * You should have received a copy of the GNU Library General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20
21/* TODO:
22 *
23 * - cleanup debug messages
24 */
25
26#include "animationscriptengine_p.h"
27
28#include <QFile>
29#include <QMetaEnum>
30#include <QParallelAnimationGroup>
31#include <QPauseAnimation>
32#include <QSequentialAnimationGroup>
33#include <QTextStream>
34
35#include <kdebug.h>
36#include <klocale.h>
37
38#include "animator.h"
39#include "javascriptanimation_p.h"
40#include "bindings/animationgroup_p.h"
41
42namespace Plasma
43{
44
45QScriptValue constructEasingCurveClass(QScriptEngine *engine);
46
47namespace AnimationScriptEngine
48{
49
50QScriptEngine* inst = 0;
51QHash<QString, QScriptValue> s_animFuncs;
52QSet<QString> s_animFailures;
53QString s_prefix;
54
55QScriptValue animation(const QString &anim)
56{
57 return s_animFuncs.value(anim);
58}
59
60bool isAnimationRegistered(const QString &anim)
61{
62 return s_animFuncs.contains(anim);
63}
64
65void addToLoadFailures(const QString &anim)
66{
67 s_animFailures.insert(anim);
68}
69
70bool animationFailedToLoad(const QString &anim)
71{
72 return s_animFailures.contains(anim);
73}
74
75void clearAnimations()
76{
77 s_animFuncs.clear();
78 s_animFailures.clear();
79 delete inst;
80 inst = 0;
81}
82
83QScriptValue registerAnimation(QScriptContext *context, QScriptEngine *engine)
84{
85 if (context->argumentCount() > 1) {
86 const QString name = s_prefix + context->argument(0).toString();
87
88 if (!s_animFuncs.contains(name)) {
89 const QScriptValue func = context->argument(1);
90 if (func.isFunction()) {
91 s_animFuncs.insert(name, func);
92 }
93 }
94 }
95
96 return engine->undefinedValue();
97}
98
99QObject *extractParent(QScriptContext *context, QScriptEngine *engine)
100{
101 Q_UNUSED(engine)
102 return context->thisObject().property("__plasma_javascriptanimation").toQObject();
103}
104
105QScriptValue animationGroup(QScriptContext *context, QScriptEngine *engine)
106{
107 QObject *parent = extractParent(context, engine);
108 if (!parent) {
109 return engine->undefinedValue();
110 }
111
112 QSequentialAnimationGroup *group = new SequentialAnimationGroup(parent);
113 return engine->newQObject(group);
114}
115
116QScriptValue parallelAnimationGroup(QScriptContext *context, QScriptEngine *engine)
117{
118 QObject *parent = extractParent(context, engine);
119 if (!parent) {
120 return engine->undefinedValue();
121 }
122
123 ParallelAnimationGroup *group = new ParallelAnimationGroup(parent);
124 return engine->newQObject(group);
125}
126
127void registerEnums(QScriptValue &scriptValue, const QMetaObject &meta)
128{
129 //manually create enum values. ugh
130 QScriptEngine *engine = scriptValue.engine();
131 for (int i = 0; i < meta.enumeratorCount(); ++i) {
132 QMetaEnum e = meta.enumerator(i);
133 //kDebug() << e.name();
134 for (int i=0; i < e.keyCount(); ++i) {
135 //kDebug() << e.key(i) << e.value(i);
136 scriptValue.setProperty(e.key(i), QScriptValue(engine, e.value(i)));
137 }
138 }
139}
140
141QScriptValue animation(QScriptContext *context, QScriptEngine *engine)
142{
143 if (context->argumentCount() != 1) {
144 return context->throwError(i18n("animation() takes one argument"));
145 }
146
147 QObject *parent = extractParent(context, engine);
148 QAbstractAnimation *anim = 0;
149 if (context->argument(0).isString()) {
150 const QString animName = context->argument(0).toString();
151 anim = Plasma::Animator::create(animName, parent);
152 } else {
153 int animId = context->argument(0).toInt32();
154 if (animId == JavascriptAnimation::PauseAnimation) {
155 anim = new QPauseAnimation(parent);
156 } else if (animId == JavascriptAnimation::PropertyAnimation) {
157 anim = new QPropertyAnimation(parent);
158 } else {
159 anim = Plasma::Animator::create(static_cast<Animator::Animation>(animId), parent);
160 }
161 }
162
163 if (anim) {
164 QScriptValue value = engine->newQObject(anim);
165 registerEnums(value, *anim->metaObject());
166 return value;
167 }
168
169 return context->throwError(i18n("%1 is not a known animation type", context->argument(0).isString()));
170}
171
172QScriptEngine *globalEngine()
173{
174 if (!inst) {
175 inst = new QScriptEngine;
176 QScriptValue global = inst->globalObject();
177 global.setProperty("registerAnimation", inst->newFunction(AnimationScriptEngine::registerAnimation));
178 global.setProperty("AnimationGroup", inst->newFunction(AnimationScriptEngine::animationGroup));
179 global.setProperty("ParallelAnimationGroup", inst->newFunction(AnimationScriptEngine::parallelAnimationGroup));
180 global.setProperty("QEasingCurve", constructEasingCurveClass(inst));
181 kDebug() << "........... first js animation, creating the engine!";
182 }
183
184 return inst;
185}
186
187bool loadScript(const QString &path, const QString &prefix)
188{
189 QFile file(path);
190 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
191 kError() << "failed to open script file" << path;
192 return false;
193 }
194
195 QTextStream buffer(&file);
196 QString tmp(buffer.readAll());
197
198 QScriptEngine *engine = AnimationScriptEngine::globalEngine();
199 engine->pushContext();
200 s_prefix = prefix;
201 QScriptValue def(engine->evaluate(tmp, path));
202 s_prefix.clear();
203 engine->popContext();
204 if (engine->hasUncaughtException()) {
205 const QScriptValue error = engine->uncaughtException();
206 QString file = error.property("fileName").toString();
207 const QString failureMsg = QString("Error in %1 on line %2.\n%3")
208 .arg(file)
209 .arg(error.property("lineNumber").toString())
210 .arg(error.toString());
211 kError() << failureMsg;
212 return false;
213 }
214
215 return true;
216}
217
218} // namespace AnimationEngine
219} // namespace Plasma
220
animator.h
Plasma::Animator::create
static Plasma::Animation * create(Animator::Animation type, QObject *parent=0)
Factory to build new animation objects.
Definition: animator.cpp:61
Plasma::Animator::Animation
Animation
Definition: animator.h:55
QAbstractAnimation
QObject
Plasma::AnimationScriptEngine::loadScript
bool loadScript(const QString &path, const QString &prefix)
Definition: animationscriptengine.cpp:187
Plasma::AnimationScriptEngine::registerEnums
void registerEnums(QScriptValue &scriptValue, const QMetaObject &meta)
Definition: animationscriptengine.cpp:127
Plasma::AnimationScriptEngine::animationGroup
QScriptValue animationGroup(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:105
Plasma::AnimationScriptEngine::parallelAnimationGroup
QScriptValue parallelAnimationGroup(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:116
Plasma::AnimationScriptEngine::clearAnimations
void clearAnimations()
Definition: animationscriptengine.cpp:75
Plasma::AnimationScriptEngine::s_animFailures
QSet< QString > s_animFailures
Definition: animationscriptengine.cpp:52
Plasma::AnimationScriptEngine::animation
QScriptValue animation(const QString &anim)
Definition: animationscriptengine.cpp:55
Plasma::AnimationScriptEngine::extractParent
QObject * extractParent(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:99
Plasma::AnimationScriptEngine::inst
QScriptEngine * inst
Definition: animationscriptengine.cpp:50
Plasma::AnimationScriptEngine::animationFailedToLoad
bool animationFailedToLoad(const QString &anim)
Definition: animationscriptengine.cpp:70
Plasma::AnimationScriptEngine::isAnimationRegistered
bool isAnimationRegistered(const QString &anim)
Definition: animationscriptengine.cpp:60
Plasma::AnimationScriptEngine::s_prefix
QString s_prefix
Definition: animationscriptengine.cpp:53
Plasma::AnimationScriptEngine::globalEngine
QScriptEngine * globalEngine()
Definition: animationscriptengine.cpp:172
Plasma::AnimationScriptEngine::addToLoadFailures
void addToLoadFailures(const QString &anim)
Definition: animationscriptengine.cpp:65
Plasma::AnimationScriptEngine::registerAnimation
QScriptValue registerAnimation(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:83
Plasma::AnimationScriptEngine::s_animFuncs
QHash< QString, QScriptValue > s_animFuncs
Definition: animationscriptengine.cpp:51
Plasma
Namespace for everything in libplasma.
Definition: abstractdialogmanager.cpp:25
Plasma::constructEasingCurveClass
QScriptValue constructEasingCurveClass(QScriptEngine *engine)
Definition: easingcurve.cpp:97
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Plasma

Skip menu "Plasma"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal