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

Plasma

  • sources
  • kde-4.12
  • kdelibs
  • 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 
42 namespace Plasma
43 {
44 
45 QScriptValue constructEasingCurveClass(QScriptEngine *engine);
46 
47 namespace AnimationScriptEngine
48 {
49 
50 QScriptEngine* inst = 0;
51 QHash<QString, QScriptValue> s_animFuncs;
52 QSet<QString> s_animFailures;
53 QString s_prefix;
54 
55 QScriptValue animation(const QString &anim)
56 {
57  return s_animFuncs.value(anim);
58 }
59 
60 bool isAnimationRegistered(const QString &anim)
61 {
62  return s_animFuncs.contains(anim);
63 }
64 
65 void addToLoadFailures(const QString &anim)
66 {
67  s_animFailures.insert(anim);
68 }
69 
70 bool animationFailedToLoad(const QString &anim)
71 {
72  return s_animFailures.contains(anim);
73 }
74 
75 void clearAnimations()
76 {
77  s_animFuncs.clear();
78  s_animFailures.clear();
79  delete inst;
80  inst = 0;
81 }
82 
83 QScriptValue 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 
99 QObject *extractParent(QScriptContext *context, QScriptEngine *engine)
100 {
101  Q_UNUSED(engine)
102  return context->thisObject().property("__plasma_javascriptanimation").toQObject();
103 }
104 
105 QScriptValue 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 
116 QScriptValue 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 
127 void 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 
141 QScriptValue 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 
172 QScriptEngine *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 
187 bool 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 
Plasma::AnimationScriptEngine::s_prefix
QString s_prefix
Definition: animationscriptengine.cpp:53
Plasma::AnimationScriptEngine::extractParent
QObject * extractParent(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:99
Plasma::AnimationScriptEngine::globalEngine
QScriptEngine * globalEngine()
Definition: animationscriptengine.cpp:172
Plasma::AnimationScriptEngine::loadScript
bool loadScript(const QString &path, const QString &prefix)
Definition: animationscriptengine.cpp:187
QObject
Plasma::AnimationScriptEngine::addToLoadFailures
void addToLoadFailures(const QString &anim)
Definition: animationscriptengine.cpp:65
Plasma::AnimationScriptEngine::animation
QScriptValue animation(const QString &anim)
Definition: animationscriptengine.cpp:55
Plasma::AnimationScriptEngine::inst
QScriptEngine * inst
Definition: animationscriptengine.cpp:50
Plasma::AnimationScriptEngine::parallelAnimationGroup
QScriptValue parallelAnimationGroup(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:116
Plasma::AnimationScriptEngine::clearAnimations
void clearAnimations()
Definition: animationscriptengine.cpp:75
QAbstractAnimation
Plasma::AnimationScriptEngine::animationFailedToLoad
bool animationFailedToLoad(const QString &anim)
Definition: animationscriptengine.cpp:70
Plasma::AnimationScriptEngine::registerAnimation
QScriptValue registerAnimation(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:83
Plasma::AnimationScriptEngine::animationGroup
QScriptValue animationGroup(QScriptContext *context, QScriptEngine *engine)
Definition: animationscriptengine.cpp:105
Plasma::Animator::create
static Plasma::Animation * create(Animator::Animation type, QObject *parent=0)
Factory to build new animation objects.
Definition: animator.cpp:61
Plasma::AnimationScriptEngine::registerEnums
void registerEnums(QScriptValue &scriptValue, const QMetaObject &meta)
Definition: animationscriptengine.cpp:127
Plasma::AnimationScriptEngine::isAnimationRegistered
bool isAnimationRegistered(const QString &anim)
Definition: animationscriptengine.cpp:60
animator.h
Plasma::AnimationScriptEngine::s_animFuncs
QHash< QString, QScriptValue > s_animFuncs
Definition: animationscriptengine.cpp:51
Plasma::constructEasingCurveClass
QScriptValue constructEasingCurveClass(QScriptEngine *engine)
Definition: easingcurve.cpp:97
Plasma::AnimationScriptEngine::s_animFailures
QSet< QString > s_animFailures
Definition: animationscriptengine.cpp:52
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:48:32 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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