summaryrefslogtreecommitdiffstats
path: root/src/declarative/util/qfxview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/util/qfxview.cpp')
-rw-r--r--src/declarative/util/qfxview.cpp310
1 files changed, 310 insertions, 0 deletions
diff --git a/src/declarative/util/qfxview.cpp b/src/declarative/util/qfxview.cpp
new file mode 100644
index 0000000..3fb30e9
--- /dev/null
+++ b/src/declarative/util/qfxview.cpp
@@ -0,0 +1,310 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptvalueiterator.h"
+#include "qdebug.h"
+#include "qtimer.h"
+#include "qevent.h"
+#include "qdir.h"
+#include "qcoreapplication.h"
+#include "qfontdatabase.h"
+#include "qicon.h"
+#include "qurl.h"
+#include "qboxlayout.h"
+
+#include "qmlbindablevalue.h"
+#include "qml.h"
+#include "qfxitem.h"
+#include "qperformancelog.h"
+#include "qfxperf.h"
+
+#include "qfxview.h"
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcontext.h>
+
+
+QT_BEGIN_NAMESPACE
+DEFINE_BOOL_CONFIG_OPTION(itemTreeDump, ITEMTREE_DUMP);
+
+static QVariant stringToPixmap(const QString &str)
+{
+ //XXX need to use correct paths
+ return QVariant(QPixmap(str));
+}
+
+static QVariant stringToIcon(const QString &str)
+{
+ //XXX need to use correct paths
+ return QVariant(QIcon(str));
+}
+
+static QVariant stringToKeySequence(const QString &str)
+{
+ return QVariant::fromValue(QKeySequence(str));
+}
+
+static QVariant stringToUrl(const QString &str)
+{
+ return QVariant(QUrl(str));
+}
+
+class QFxViewPrivate
+{
+public:
+ QFxViewPrivate(QFxView *w)
+ : q(w), root(0), component(0) {}
+
+ QFxView *q;
+ QFxItem *root;
+
+ QUrl source;
+ QString xml;
+
+ QmlEngine engine;
+ QmlComponent *component;
+ void init();
+};
+
+/*!
+ \class QFxView
+ \brief The QFxView class provides a widget for displaying a Qt Declarative user interface.
+
+ QFxView currently provides a minimal interface for displaying Qml files, and
+ connecting between QML and C++ Qt objects.
+
+ Typcial usage looks something like this:
+ \code
+ ...
+ QFxView *view = new QFxView(this);
+ vbox->addWidget(view);
+
+ QFile file(fileName);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ view->setXml(xml, fileName);
+
+ QFileInfo fi(file);
+ view->setPath(fi.path());
+
+ view->execute();
+ ...
+ \endcode
+*/
+
+QFxView::QFxView(QWidget *parent)
+: QSimpleCanvas(parent), d(new QFxViewPrivate(this))
+{
+ d->init();
+}
+
+QFxView::QFxView(QSimpleCanvas::CanvasMode mode, QWidget *parent)
+: QSimpleCanvas(mode, parent), d(new QFxViewPrivate(this))
+{
+ d->init();
+}
+
+void QFxViewPrivate::init()
+{
+ // XXX: These need to be put in a central location for this kind of thing
+ qRegisterMetaType<QFxAnchorLine>("QFxAnchorLine");
+
+ QmlMetaType::registerCustomStringConverter(QVariant::Pixmap, &stringToPixmap);
+ QmlMetaType::registerCustomStringConverter(QVariant::Icon, &stringToIcon);
+ QmlMetaType::registerCustomStringConverter(QVariant::KeySequence, &stringToKeySequence);
+ QmlMetaType::registerCustomStringConverter(QVariant::Url, &stringToUrl);
+
+#ifdef Q_ENABLE_PERFORMANCE_LOG
+ QFxPerfTimer<QFxPerf::FontDatabase> perf;
+#endif
+ QFontDatabase database;
+}
+
+QFxView::~QFxView()
+{
+ clearItems();
+ delete d; d = 0;
+}
+
+void QFxView::setUrl(const QUrl& url)
+{
+ d->source = url;
+ d->xml = QString();
+}
+
+void QFxView::setXml(const QString &xml, const QString &filename)
+{
+ d->source = QUrl::fromLocalFile(filename);
+ d->xml = xml;
+}
+
+QString QFxView::xml() const
+{
+ return d->xml;
+}
+
+QmlEngine* QFxView::engine()
+{
+ return &d->engine;
+}
+
+QmlContext* QFxView::rootContext()
+{
+ return d->engine.rootContext();
+}
+
+void QFxView::execute()
+{
+ rootContext()->activate();
+
+ if (d->xml.isEmpty()) {
+ d->component = new QmlComponent(&d->engine, d->source, this);
+ } else {
+ d->component = new QmlComponent(&d->engine, d->xml.toUtf8(), d->source);
+ }
+
+ if(d->component->isReady()) {
+ continueExecute();
+ } else {
+ connect(d->component, SIGNAL(readyChanged()), this, SLOT(continueExecute()));
+ }
+}
+
+void QFxView::continueExecute()
+{
+ disconnect(d->component, SIGNAL(readyChanged()), this, SLOT(continueExecute()));
+
+ if(!d->component){
+ qWarning() << "Error in loading" << d->source;
+ return;
+ }
+
+ QObject *obj = d->component->create();
+ rootContext()->deactivate();
+ if(obj) {
+ if(QFxItem *item = qobject_cast<QFxItem *>(obj)) {
+ item->QSimpleCanvasItem::setParent(QSimpleCanvas::root());
+
+ if(itemTreeDump())
+ item->dump();
+
+ QPerformanceLog::displayData();
+ QPerformanceLog::clear();
+ d->root = item;
+ emit sceneResized(QSize(item->width(), item->height()));
+ } else if(QWidget *wid = qobject_cast<QWidget *>(obj)) {
+ window()->setAttribute(Qt::WA_OpaquePaintEvent, false);
+ window()->setAttribute(Qt::WA_NoSystemBackground, false);
+ if (!layout()) {
+ setLayout(new QVBoxLayout);
+ } else if (layout()->count()) {
+ // Hide the QGraphicsView in GV mode.
+ QLayoutItem *item = layout()->itemAt(0);
+ if (item->widget())
+ item->widget()->hide();
+ }
+ layout()->addWidget(wid);
+ emit sceneResized(wid->size());
+ }
+ }
+}
+
+QFxItem* QFxView::addItem(const QString &xml, QFxItem* parent)
+{
+ if(!d->root)
+ return 0;
+
+ QmlComponent component(&d->engine, xml.toUtf8(), QUrl());
+ QObject *obj = component.create();
+ if(obj){
+ QFxItem *item = static_cast<QFxItem *>(obj);
+ if(!parent)
+ parent = d->root;
+
+ item->setItemParent(parent);
+ return item;
+ }
+ return 0;
+}
+
+void QFxView::reset()
+{
+ clearItems();
+ d->engine.clearComponentCache();
+}
+
+void QFxView::clearItems()
+{
+ if(!d->root)
+ return;
+ delete d->root;
+ d->root = 0;
+}
+
+QFxItem *QFxView::root() const
+{
+ return d->root;
+}
+
+void QFxView::resizeEvent(QResizeEvent *e)
+{
+ if(d->root) {
+ d->root->setWidth(width());
+ d->root->setHeight(height());
+ }
+ QSimpleCanvas::resizeEvent(e);
+}
+
+void QFxView::focusInEvent(QFocusEvent *)
+{
+ // Do nothing (do not call QWidget::update())
+}
+
+void QFxView::focusOutEvent(QFocusEvent *)
+{
+ // Do nothing (do not call QWidget::update())
+}
+
+
+void QFxView::dumpRoot()
+{
+ root()->dump();
+}
+QT_END_NAMESPACE