23 #include <QtDeclarative/QDeclarativeComponent>
24 #include <QtDeclarative/QDeclarativeItem>
25 #include <QtDeclarative/QDeclarativeEngine>
26 #include <QtDeclarative/QDeclarativeContext>
27 #include <QScriptEngine>
28 #include <QGraphicsLinearLayout>
29 #include <QGraphicsScene>
33 #include <kdeclarative.h>
35 #include <kstandarddirs.h>
37 #include "private/declarative/declarativenetworkaccessmanagerfactory_p.h"
38 #include "private/dataenginebindings_p.h"
43 class DeclarativeWidgetPrivate
46 DeclarativeWidgetPrivate(DeclarativeWidget *parent)
55 ~DeclarativeWidgetPrivate()
60 void execute(
const QString &fileName);
62 void scheduleExecutionEnd();
63 void minimumWidthChanged();
64 void minimumHeightChanged();
70 QDeclarativeEngine* engine;
71 QScriptEngine *scriptEngine;
72 QDeclarativeComponent* component;
77 void DeclarativeWidgetPrivate::errorPrint()
79 QString errorStr =
"Error loading QML file.\n";
80 if(component->isError()){
81 QList<QDeclarativeError> errors = component->errors();
82 foreach (
const QDeclarativeError &error, errors) {
83 errorStr += (error.line()>0?QString(QString::number(error.line()) + QLatin1String(
": ")):QLatin1String(
""))
84 + error.description() +
'\n';
87 kWarning() << component->url().toString() +
'\n' + errorStr;
90 void DeclarativeWidgetPrivate::execute(
const QString &fileName)
92 if (fileName.isEmpty()) {
93 kDebug() <<
"File name empty!";
97 KDeclarative kdeclarative;
98 kdeclarative.setDeclarativeEngine(engine);
99 kdeclarative.initialize();
101 kdeclarative.setupBindings();
103 component->loadUrl(fileName);
105 scriptEngine = kdeclarative.scriptEngine();
106 registerDataEngineMetaTypes(scriptEngine);
109 QTimer::singleShot(0, q, SLOT(scheduleExecutionEnd()));
111 scheduleExecutionEnd();
115 void DeclarativeWidgetPrivate::scheduleExecutionEnd()
117 if (component->isReady() || component->isError()) {
120 QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), q, SLOT(finishExecute()));
124 void DeclarativeWidgetPrivate::finishExecute()
126 if (component->isError()) {
130 root = component->create();
136 kDebug() <<
"Execution of QML done!";
138 QGraphicsObject *
object =
dynamic_cast<QGraphicsObject *
>(root);
142 static_cast<QGraphicsItem *
>(object)->setParentItem(q);
144 q->scene()->addItem(
object);
149 q->setPreferredSize(-1,-1);
150 QGraphicsLinearLayout *lay =
static_cast<QGraphicsLinearLayout *
>(q->layout());
152 lay =
new QGraphicsLinearLayout(q);
153 lay->setContentsMargins(0, 0, 0, 0);
155 lay->addItem(widget);
158 qreal minimumWidth = 0;
159 qreal minimumHeight = 0;
161 minimumWidth =
object->property(
"minimumWidth").toReal();
162 minimumHeight =
object->property(
"minimumHeight").toReal();
163 object->setProperty(
"width", q->size().width());
164 object->setProperty(
"height", q->size().height());
165 QObject::connect(
object, SIGNAL(minimumWidthChanged()), q, SLOT(minimumWidthChanged()));
166 QObject::connect(
object, SIGNAL(minimumHeightChanged()), q, SLOT(minimumHeightChanged()));
169 if (minimumWidth > 0 && minimumHeight > 0) {
170 q->setMinimumSize(minimumWidth, minimumHeight);
172 q->setMinimumSize(-1, -1);
178 void DeclarativeWidgetPrivate::minimumWidthChanged()
180 qreal minimumWidth = root->property(
"minimumWidth").toReal();
181 q->setMinimumWidth(minimumWidth);
184 void DeclarativeWidgetPrivate::minimumHeightChanged()
186 qreal minimumHeight = root->property(
"minimumHeight").toReal();
187 q->setMinimumHeight(minimumHeight);
192 d(new DeclarativeWidgetPrivate(this))
194 setFlag(QGraphicsItem::ItemHasNoContents);
196 d->engine =
new QDeclarativeEngine(
this);
197 d->engine->setNetworkAccessManagerFactory(
new DeclarativeNetworkAccessManagerFactory);
199 d->component =
new QDeclarativeComponent(d->engine,
this);
204 QDeclarativeNetworkAccessManagerFactory *factory = d->engine->networkAccessManagerFactory();
205 d->engine->setNetworkAccessManagerFactory(0);
238 return d->scriptEngine;
256 d->root->setProperty(
"width", size().width());
257 d->root->setProperty(
"height", size().height());
264 #include <declarativewidget.moc>