Merge branch 'master' into qtquick2
Conflicts: src/declarative/graphicsitems/qdeclarativetextinput.cpp src/declarative/qml/qdeclarativeengine.cpp
|
@ -119,6 +119,8 @@ translations/*.qm
|
|||
translations/*_untranslated.ts
|
||||
qrc_*.cpp
|
||||
|
||||
src/declarative/qtdeclarativeversion.h
|
||||
|
||||
# Test generated files
|
||||
QObject.log
|
||||
tst_*
|
||||
|
|
|
@ -8,7 +8,10 @@ SOURCES += \
|
|||
$$PWD/qdeclarativedebug.cpp \
|
||||
$$PWD/qdeclarativedebugtrace.cpp \
|
||||
$$PWD/qdeclarativedebughelper.cpp \
|
||||
$$PWD/qdeclarativedebugserver.cpp
|
||||
$$PWD/qdeclarativedebugserver.cpp \
|
||||
$$PWD/qdeclarativeobserverservice.cpp \
|
||||
$$PWD/qjsdebuggeragent.cpp \
|
||||
$$PWD/qjsdebugservice.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/qdeclarativedebuggerstatus_p.h \
|
||||
|
@ -20,4 +23,8 @@ HEADERS += \
|
|||
$$PWD/qdeclarativedebugtrace_p.h \
|
||||
$$PWD/qdeclarativedebughelper_p.h \
|
||||
$$PWD/qdeclarativedebugserver_p.h \
|
||||
debugger/qdeclarativedebugserverconnection_p.h
|
||||
$$PWD/qdeclarativedebugserverconnection_p.h \
|
||||
$$PWD/qdeclarativeobserverservice_p.h \
|
||||
$$PWD/qdeclarativeobserverinterface_p.h \
|
||||
$$PWD/qjsdebuggeragent_p.h \
|
||||
$$PWD/qjsdebugservice_p.h
|
||||
|
|
|
@ -188,7 +188,7 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
|
|||
int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
|
||||
port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
|
||||
pluginName = QLatin1String("qmldbg_tcp");
|
||||
} else if (appD->qmljsDebugArgumentsString().contains("ost")) {
|
||||
} else if (appD->qmljsDebugArgumentsString().contains(QLatin1String("ost"))) {
|
||||
pluginName = QLatin1String("qmldbg_ost");
|
||||
ok = true;
|
||||
}
|
||||
|
@ -253,6 +253,17 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
|
|||
int version;
|
||||
in >> version >> d->clientPlugins;
|
||||
|
||||
// Send the hello answer immediately, since it needs to arrive before
|
||||
// the plugins below start sending messages.
|
||||
QByteArray helloAnswer;
|
||||
{
|
||||
QDataStream out(&helloAnswer, QIODevice::WriteOnly);
|
||||
out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
|
||||
}
|
||||
d->connection->send(helloAnswer);
|
||||
|
||||
d->gotHello = true;
|
||||
|
||||
QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
|
||||
for (; iter != d->plugins.end(); ++iter) {
|
||||
QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
|
||||
|
@ -262,14 +273,6 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
|
|||
iter.value()->statusChanged(newStatus);
|
||||
}
|
||||
|
||||
QByteArray helloAnswer;
|
||||
{
|
||||
QDataStream out(&helloAnswer, QIODevice::WriteOnly);
|
||||
out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
|
||||
}
|
||||
d->connection->send(helloAnswer);
|
||||
|
||||
d->gotHello = true;
|
||||
qWarning("QDeclarativeDebugServer: Connection established");
|
||||
} else {
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEOBSERVERINTERFACE_H
|
||||
#define QDECLARATIVEOBSERVERINTERFACE_H
|
||||
|
||||
#include <QtDeclarative/private/qdeclarativeglobal_p.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class Q_DECLARATIVE_EXPORT QDeclarativeObserverInterface
|
||||
{
|
||||
public:
|
||||
QDeclarativeObserverInterface() {}
|
||||
virtual ~QDeclarativeObserverInterface() {}
|
||||
|
||||
virtual void activate() = 0;
|
||||
virtual void deactivate() = 0;
|
||||
};
|
||||
|
||||
Q_DECLARE_INTERFACE(QDeclarativeObserverInterface, "com.trolltech.Qt.QDeclarativeObserverInterface/1.0")
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QDECLARATIVEOBSERVERINTERFACE_H
|
|
@ -0,0 +1,137 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "private/qdeclarativeobserverservice_p.h"
|
||||
#include "private/qdeclarativeobserverinterface_p.h"
|
||||
|
||||
#include <QtCore/QCoreApplication>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QPluginLoader>
|
||||
|
||||
#include <QtDeclarative/QDeclarativeView>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
Q_GLOBAL_STATIC(QDeclarativeObserverService, serviceInstance)
|
||||
|
||||
QDeclarativeObserverService::QDeclarativeObserverService()
|
||||
: QDeclarativeDebugService(QLatin1String("QDeclarativeObserverMode"))
|
||||
, m_observer(0)
|
||||
{
|
||||
}
|
||||
|
||||
QDeclarativeObserverService *QDeclarativeObserverService::instance()
|
||||
{
|
||||
return serviceInstance();
|
||||
}
|
||||
|
||||
void QDeclarativeObserverService::addView(QDeclarativeView *view)
|
||||
{
|
||||
m_views.append(view);
|
||||
}
|
||||
|
||||
void QDeclarativeObserverService::removeView(QDeclarativeView *view)
|
||||
{
|
||||
m_views.removeAll(view);
|
||||
}
|
||||
|
||||
void QDeclarativeObserverService::sendMessage(const QByteArray &message)
|
||||
{
|
||||
if (status() != Enabled)
|
||||
return;
|
||||
|
||||
QDeclarativeDebugService::sendMessage(message);
|
||||
}
|
||||
|
||||
void QDeclarativeObserverService::statusChanged(Status status)
|
||||
{
|
||||
if (m_views.isEmpty())
|
||||
return;
|
||||
|
||||
if (status == Enabled) {
|
||||
if (!m_observer)
|
||||
m_observer = loadObserverPlugin();
|
||||
|
||||
if (!m_observer) {
|
||||
qWarning() << "Error while loading observer plugin";
|
||||
return;
|
||||
}
|
||||
|
||||
m_observer->activate();
|
||||
} else {
|
||||
if (m_observer)
|
||||
m_observer->deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
void QDeclarativeObserverService::messageReceived(const QByteArray &message)
|
||||
{
|
||||
emit gotMessage(message);
|
||||
}
|
||||
|
||||
QDeclarativeObserverInterface *QDeclarativeObserverService::loadObserverPlugin()
|
||||
{
|
||||
QStringList pluginCandidates;
|
||||
const QStringList paths = QCoreApplication::libraryPaths();
|
||||
foreach (const QString &libPath, paths) {
|
||||
const QDir dir(libPath + QLatin1String("/qmltooling"));
|
||||
if (dir.exists())
|
||||
foreach (const QString &pluginPath, dir.entryList(QDir::Files))
|
||||
pluginCandidates << dir.absoluteFilePath(pluginPath);
|
||||
}
|
||||
|
||||
foreach (const QString &pluginPath, pluginCandidates) {
|
||||
QPluginLoader loader(pluginPath);
|
||||
if (!loader.load())
|
||||
continue;
|
||||
|
||||
QDeclarativeObserverInterface *observer =
|
||||
qobject_cast<QDeclarativeObserverInterface*>(loader.instance());
|
||||
|
||||
if (observer)
|
||||
return observer;
|
||||
loader.unload();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,91 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEOBSERVERSERVICE_H
|
||||
#define QDECLARATIVEOBSERVERSERVICE_H
|
||||
|
||||
#include "private/qdeclarativedebugservice_p.h"
|
||||
#include <private/qdeclarativeglobal_p.h>
|
||||
|
||||
#include <QtCore/QList>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeView;
|
||||
class QDeclarativeObserverInterface;
|
||||
|
||||
class Q_DECLARATIVE_EXPORT QDeclarativeObserverService : public QDeclarativeDebugService
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QDeclarativeObserverService();
|
||||
static QDeclarativeObserverService *instance();
|
||||
|
||||
void addView(QDeclarativeView *);
|
||||
void removeView(QDeclarativeView *);
|
||||
QList<QDeclarativeView*> views() const { return m_views; }
|
||||
|
||||
void sendMessage(const QByteArray &message);
|
||||
|
||||
Q_SIGNALS:
|
||||
void gotMessage(const QByteArray &message);
|
||||
|
||||
protected:
|
||||
virtual void statusChanged(Status status);
|
||||
virtual void messageReceived(const QByteArray &);
|
||||
|
||||
private:
|
||||
static QDeclarativeObserverInterface *loadObserverPlugin();
|
||||
|
||||
QList<QDeclarativeView*> m_views;
|
||||
QDeclarativeObserverInterface *m_observer;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QDECLARATIVEOBSERVERSERVICE_H
|
|
@ -0,0 +1,576 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "private/qjsdebuggeragent_p.h"
|
||||
#include "private/qdeclarativedebughelper_p.h"
|
||||
|
||||
#include <QtCore/qdatetime.h>
|
||||
#include <QtCore/qcoreapplication.h>
|
||||
#include <QtCore/qset.h>
|
||||
#include <QtCore/qurl.h>
|
||||
#include <QtScript/qscriptcontextinfo.h>
|
||||
#include <QtScript/qscriptengine.h>
|
||||
#include <QtScript/qscriptvalueiterator.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QJSDebuggerAgentPrivate
|
||||
{
|
||||
public:
|
||||
QJSDebuggerAgentPrivate(QJSDebuggerAgent *q)
|
||||
: q(q), state(NoState)
|
||||
{}
|
||||
|
||||
void continueExec();
|
||||
void recordKnownObjects(const QList<JSAgentWatchData> &);
|
||||
QList<JSAgentWatchData> getLocals(QScriptContext *);
|
||||
void positionChange(qint64 scriptId, int lineNumber, int columnNumber);
|
||||
QScriptEngine *engine() { return q->engine(); }
|
||||
void stopped();
|
||||
|
||||
public:
|
||||
QJSDebuggerAgent *q;
|
||||
JSDebuggerState state;
|
||||
int stepDepth;
|
||||
int stepCount;
|
||||
|
||||
QEventLoop loop;
|
||||
QHash<qint64, QString> filenames;
|
||||
JSAgentBreakpoints breakpoints;
|
||||
// breakpoints by filename (without path)
|
||||
QHash<QString, JSAgentBreakpointData> fileNameToBreakpoints;
|
||||
QStringList watchExpressions;
|
||||
QSet<qint64> knownObjectIds;
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
class SetupExecEnv
|
||||
{
|
||||
public:
|
||||
SetupExecEnv(QJSDebuggerAgentPrivate *a)
|
||||
: agent(a),
|
||||
previousState(a->state),
|
||||
hadException(a->engine()->hasUncaughtException())
|
||||
{
|
||||
agent->state = StoppedState;
|
||||
}
|
||||
|
||||
~SetupExecEnv()
|
||||
{
|
||||
if (!hadException && agent->engine()->hasUncaughtException())
|
||||
agent->engine()->clearExceptions();
|
||||
agent->state = previousState;
|
||||
}
|
||||
|
||||
private:
|
||||
QJSDebuggerAgentPrivate *agent;
|
||||
JSDebuggerState previousState;
|
||||
bool hadException;
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
static JSAgentWatchData fromScriptValue(const QString &expression,
|
||||
const QScriptValue &value)
|
||||
{
|
||||
static const QString arrayStr = QCoreApplication::translate
|
||||
("Debugger::JSAgentWatchData", "[Array of length %1]");
|
||||
static const QString undefinedStr = QCoreApplication::translate
|
||||
("Debugger::JSAgentWatchData", "<undefined>");
|
||||
|
||||
JSAgentWatchData data;
|
||||
data.exp = expression.toUtf8();
|
||||
data.name = data.exp;
|
||||
data.hasChildren = false;
|
||||
data.value = value.toString().toUtf8();
|
||||
data.objectId = value.objectId();
|
||||
if (value.isArray()) {
|
||||
data.type = "Array";
|
||||
data.value = arrayStr.arg(value.property(QLatin1String("length")).toString()).toUtf8();
|
||||
data.hasChildren = true;
|
||||
} else if (value.isBool()) {
|
||||
data.type = "Bool";
|
||||
// data.value = value.toBool() ? "true" : "false";
|
||||
} else if (value.isDate()) {
|
||||
data.type = "Date";
|
||||
data.value = value.toDateTime().toString().toUtf8();
|
||||
} else if (value.isError()) {
|
||||
data.type = "Error";
|
||||
} else if (value.isFunction()) {
|
||||
data.type = "Function";
|
||||
} else if (value.isUndefined()) {
|
||||
data.type = undefinedStr.toUtf8();
|
||||
} else if (value.isNumber()) {
|
||||
data.type = "Number";
|
||||
} else if (value.isRegExp()) {
|
||||
data.type = "RegExp";
|
||||
} else if (value.isString()) {
|
||||
data.type = "String";
|
||||
} else if (value.isVariant()) {
|
||||
data.type = "Variant";
|
||||
} else if (value.isQObject()) {
|
||||
const QObject *obj = value.toQObject();
|
||||
data.type = "Object";
|
||||
data.value += '[';
|
||||
data.value += obj->metaObject()->className();
|
||||
data.value += ']';
|
||||
data.hasChildren = true;
|
||||
} else if (value.isObject()) {
|
||||
data.type = "Object";
|
||||
data.hasChildren = true;
|
||||
data.value = "[Object]";
|
||||
} else if (value.isNull()) {
|
||||
data.type = "<null>";
|
||||
} else {
|
||||
data.type = "<unknown>";
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
static QList<JSAgentWatchData> expandObject(const QScriptValue &object)
|
||||
{
|
||||
QList<JSAgentWatchData> result;
|
||||
QScriptValueIterator it(object);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
if (it.flags() & QScriptValue::SkipInEnumeration)
|
||||
continue;
|
||||
if (/*object.isQObject() &&*/ it.value().isFunction()) {
|
||||
// Cosmetics: skip all functions and slot, there are too many of them,
|
||||
// and it is not useful information in the debugger.
|
||||
continue;
|
||||
}
|
||||
JSAgentWatchData data = fromScriptValue(it.name(), it.value());
|
||||
result.append(data);
|
||||
}
|
||||
if (result.isEmpty()) {
|
||||
JSAgentWatchData data;
|
||||
data.name = "<no initialized data>";
|
||||
data.hasChildren = false;
|
||||
data.value = " ";
|
||||
data.objectId = 0;
|
||||
result.append(data);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static QString fileName(const QString &fileUrl)
|
||||
{
|
||||
int lastDelimiterPos = fileUrl.lastIndexOf(QLatin1Char('/'));
|
||||
return fileUrl.mid(lastDelimiterPos, fileUrl.size() - lastDelimiterPos);
|
||||
}
|
||||
|
||||
void QJSDebuggerAgentPrivate::recordKnownObjects(const QList<JSAgentWatchData>& list)
|
||||
{
|
||||
foreach (const JSAgentWatchData &data, list)
|
||||
knownObjectIds << data.objectId;
|
||||
}
|
||||
|
||||
QList<JSAgentWatchData> QJSDebuggerAgentPrivate::getLocals(QScriptContext *ctx)
|
||||
{
|
||||
QList<JSAgentWatchData> locals;
|
||||
if (ctx) {
|
||||
QScriptValue activationObject = ctx->activationObject();
|
||||
QScriptValue thisObject = ctx->thisObject();
|
||||
locals = expandObject(activationObject);
|
||||
if (thisObject.isObject()
|
||||
&& thisObject.objectId() != engine()->globalObject().objectId()
|
||||
&& QScriptValueIterator(thisObject).hasNext())
|
||||
locals.prepend(fromScriptValue(QLatin1String("this"), thisObject));
|
||||
recordKnownObjects(locals);
|
||||
knownObjectIds << activationObject.objectId();
|
||||
}
|
||||
return locals;
|
||||
}
|
||||
|
||||
/*!
|
||||
Constructs a new agent for the given \a engine. The agent will
|
||||
report debugging-related events (e.g. step completion) to the given
|
||||
\a backend.
|
||||
*/
|
||||
QJSDebuggerAgent::QJSDebuggerAgent(QScriptEngine *engine, QObject *parent)
|
||||
: QObject(parent)
|
||||
, QScriptEngineAgent(engine)
|
||||
, d(new QJSDebuggerAgentPrivate(this))
|
||||
{
|
||||
QJSDebuggerAgent::engine()->setAgent(this);
|
||||
}
|
||||
|
||||
QJSDebuggerAgent::QJSDebuggerAgent(QDeclarativeEngine *engine, QObject *parent)
|
||||
: QObject(parent)
|
||||
, QScriptEngineAgent(QDeclarativeDebugHelper::getScriptEngine(engine))
|
||||
, d(new QJSDebuggerAgentPrivate(this))
|
||||
{
|
||||
QJSDebuggerAgent::engine()->setAgent(this);
|
||||
}
|
||||
|
||||
/*!
|
||||
Destroys this QJSDebuggerAgent.
|
||||
*/
|
||||
QJSDebuggerAgent::~QJSDebuggerAgent()
|
||||
{
|
||||
engine()->setAgent(0);
|
||||
delete d;
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::setBreakpoints(const JSAgentBreakpoints &breakpoints)
|
||||
{
|
||||
d->breakpoints = breakpoints;
|
||||
|
||||
d->fileNameToBreakpoints.clear();
|
||||
foreach (const JSAgentBreakpointData &bp, breakpoints)
|
||||
d->fileNameToBreakpoints.insertMulti(fileName(QString::fromUtf8(bp.fileUrl)), bp);
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::setWatchExpressions(const QStringList &watchExpressions)
|
||||
{
|
||||
d->watchExpressions = watchExpressions;
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::stepOver()
|
||||
{
|
||||
d->stepDepth = 0;
|
||||
d->state = SteppingOverState;
|
||||
d->continueExec();
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::stepInto()
|
||||
{
|
||||
d->stepDepth = 0;
|
||||
d->state = SteppingIntoState;
|
||||
d->continueExec();
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::stepOut()
|
||||
{
|
||||
d->stepDepth = 0;
|
||||
d->state = SteppingOutState;
|
||||
d->continueExec();
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::continueExecution()
|
||||
{
|
||||
d->state = NoState;
|
||||
d->continueExec();
|
||||
}
|
||||
|
||||
JSAgentWatchData QJSDebuggerAgent::executeExpression(const QString &expr)
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
JSAgentWatchData data = fromScriptValue(expr, engine()->evaluate(expr));
|
||||
d->knownObjectIds << data.objectId;
|
||||
return data;
|
||||
}
|
||||
|
||||
QList<JSAgentWatchData> QJSDebuggerAgent::expandObjectById(quint64 objectId)
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
QScriptValue v;
|
||||
if (d->knownObjectIds.contains(objectId))
|
||||
v = engine()->objectById(objectId);
|
||||
|
||||
QList<JSAgentWatchData> result = expandObject(v);
|
||||
d->recordKnownObjects(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
QList<JSAgentWatchData> QJSDebuggerAgent::locals()
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
return d->getLocals(engine()->currentContext());
|
||||
}
|
||||
|
||||
QList<JSAgentWatchData> QJSDebuggerAgent::localsAtFrame(int frameId)
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
int deep = 0;
|
||||
QScriptContext *ctx = engine()->currentContext();
|
||||
while (ctx && deep < frameId) {
|
||||
ctx = ctx->parentContext();
|
||||
deep++;
|
||||
}
|
||||
|
||||
return d->getLocals(ctx);
|
||||
}
|
||||
|
||||
QList<JSAgentStackData> QJSDebuggerAgent::backtrace()
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
QList<JSAgentStackData> backtrace;
|
||||
|
||||
for (QScriptContext *ctx = engine()->currentContext(); ctx; ctx = ctx->parentContext()) {
|
||||
QScriptContextInfo info(ctx);
|
||||
|
||||
JSAgentStackData frame;
|
||||
frame.functionName = info.functionName().toUtf8();
|
||||
if (frame.functionName.isEmpty()) {
|
||||
if (ctx->parentContext()) {
|
||||
switch (info.functionType()) {
|
||||
case QScriptContextInfo::ScriptFunction:
|
||||
frame.functionName = "<anonymous>";
|
||||
break;
|
||||
case QScriptContextInfo::NativeFunction:
|
||||
frame.functionName = "<native>";
|
||||
break;
|
||||
case QScriptContextInfo::QtFunction:
|
||||
case QScriptContextInfo::QtPropertyFunction:
|
||||
frame.functionName = "<native slot>";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
frame.functionName = "<global>";
|
||||
}
|
||||
}
|
||||
frame.lineNumber = info.lineNumber();
|
||||
// if the line number is unknown, fallback to the function line number
|
||||
if (frame.lineNumber == -1)
|
||||
frame.lineNumber = info.functionStartLineNumber();
|
||||
|
||||
frame.fileUrl = info.fileName().toUtf8();
|
||||
backtrace.append(frame);
|
||||
}
|
||||
|
||||
return backtrace;
|
||||
}
|
||||
|
||||
QList<JSAgentWatchData> QJSDebuggerAgent::watches()
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
QList<JSAgentWatchData> watches;
|
||||
foreach (const QString &expr, d->watchExpressions)
|
||||
watches << fromScriptValue(expr, engine()->evaluate(expr));
|
||||
d->recordKnownObjects(watches);
|
||||
return watches;
|
||||
}
|
||||
|
||||
void QJSDebuggerAgent::setProperty(qint64 objectId,
|
||||
const QString &property,
|
||||
const QString &value)
|
||||
{
|
||||
SetupExecEnv execEnv(d);
|
||||
|
||||
if (d->knownObjectIds.contains(objectId)) {
|
||||
QScriptValue object = engine()->objectById(objectId);
|
||||
if (object.isObject()) {
|
||||
QScriptValue result = engine()->evaluate(value);
|
||||
object.setProperty(property, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::scriptLoad(qint64 id, const QString &program,
|
||||
const QString &fileName, int)
|
||||
{
|
||||
Q_UNUSED(program);
|
||||
d->filenames.insert(id, fileName);
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::scriptUnload(qint64 id)
|
||||
{
|
||||
d->filenames.remove(id);
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::contextPush()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::contextPop()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::functionEntry(qint64 scriptId)
|
||||
{
|
||||
Q_UNUSED(scriptId);
|
||||
d->stepDepth++;
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::functionExit(qint64 scriptId, const QScriptValue &returnValue)
|
||||
{
|
||||
Q_UNUSED(scriptId);
|
||||
Q_UNUSED(returnValue);
|
||||
d->stepDepth--;
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::positionChange(qint64 scriptId, int lineNumber, int columnNumber)
|
||||
{
|
||||
d->positionChange(scriptId, lineNumber, columnNumber);
|
||||
}
|
||||
|
||||
void QJSDebuggerAgentPrivate::positionChange(qint64 scriptId, int lineNumber, int columnNumber)
|
||||
{
|
||||
Q_UNUSED(columnNumber);
|
||||
|
||||
if (state == StoppedState)
|
||||
return; //no re-entrency
|
||||
|
||||
// check breakpoints
|
||||
if (!breakpoints.isEmpty()) {
|
||||
QHash<qint64, QString>::const_iterator it = filenames.constFind(scriptId);
|
||||
QScriptContext *ctx = engine()->currentContext();
|
||||
QScriptContextInfo info(ctx);
|
||||
if (it == filenames.constEnd()) {
|
||||
// It is possible that the scripts are loaded before the agent is attached
|
||||
QString filename = info.fileName();
|
||||
|
||||
JSAgentStackData frame;
|
||||
frame.functionName = info.functionName().toUtf8();
|
||||
|
||||
QPair<QString, qint32> key = qMakePair(filename, lineNumber);
|
||||
it = filenames.insert(scriptId, filename);
|
||||
}
|
||||
|
||||
const QString filePath = it.value();
|
||||
JSAgentBreakpoints bps = fileNameToBreakpoints.values(fileName(filePath)).toSet();
|
||||
|
||||
foreach (const JSAgentBreakpointData &bp, bps) {
|
||||
if (bp.lineNumber == lineNumber) {
|
||||
stopped();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case NoState:
|
||||
case StoppedState:
|
||||
// Do nothing
|
||||
break;
|
||||
case SteppingOutState:
|
||||
if (stepDepth >= 0)
|
||||
break;
|
||||
//fallthough
|
||||
case SteppingOverState:
|
||||
if (stepDepth > 0)
|
||||
break;
|
||||
//fallthough
|
||||
case SteppingIntoState:
|
||||
stopped();
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::exceptionThrow(qint64 scriptId,
|
||||
const QScriptValue &exception,
|
||||
bool hasHandler)
|
||||
{
|
||||
Q_UNUSED(scriptId);
|
||||
Q_UNUSED(exception);
|
||||
Q_UNUSED(hasHandler);
|
||||
// qDebug() << Q_FUNC_INFO << exception.toString() << hasHandler;
|
||||
#if 0 //sometimes, we get exceptions that we should just ignore.
|
||||
if (!hasHandler && state != StoppedState)
|
||||
stopped(true, exception);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QJSDebuggerAgent::exceptionCatch(qint64 scriptId, const QScriptValue &exception)
|
||||
{
|
||||
Q_UNUSED(scriptId);
|
||||
Q_UNUSED(exception);
|
||||
}
|
||||
|
||||
bool QJSDebuggerAgent::supportsExtension(Extension extension) const
|
||||
{
|
||||
return extension == QScriptEngineAgent::DebuggerInvocationRequest;
|
||||
}
|
||||
|
||||
QVariant QJSDebuggerAgent::extension(Extension extension, const QVariant &argument)
|
||||
{
|
||||
if (extension == QScriptEngineAgent::DebuggerInvocationRequest) {
|
||||
d->stopped();
|
||||
return QVariant();
|
||||
}
|
||||
return QScriptEngineAgent::extension(extension, argument);
|
||||
}
|
||||
|
||||
void QJSDebuggerAgentPrivate::stopped()
|
||||
{
|
||||
bool becauseOfException = false;
|
||||
const QScriptValue &exception = QScriptValue();
|
||||
|
||||
knownObjectIds.clear();
|
||||
state = StoppedState;
|
||||
|
||||
emit q->stopped(becauseOfException, exception.toString());
|
||||
|
||||
loop.exec(QEventLoop::ExcludeUserInputEvents);
|
||||
}
|
||||
|
||||
void QJSDebuggerAgentPrivate::continueExec()
|
||||
{
|
||||
loop.quit();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,204 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSDEBUGGERAGENT_P_H
|
||||
#define QJSDEBUGGERAGENT_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include <QtScript/qscriptengineagent.h>
|
||||
#include <QtCore/qset.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QScriptValue;
|
||||
class QDeclarativeEngine;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QJSDebuggerAgentPrivate;
|
||||
|
||||
enum JSDebuggerState
|
||||
{
|
||||
NoState,
|
||||
SteppingIntoState,
|
||||
SteppingOverState,
|
||||
SteppingOutState,
|
||||
StoppedState
|
||||
};
|
||||
|
||||
struct JSAgentWatchData
|
||||
{
|
||||
QByteArray exp;
|
||||
QByteArray name;
|
||||
QByteArray value;
|
||||
QByteArray type;
|
||||
bool hasChildren;
|
||||
quint64 objectId;
|
||||
};
|
||||
|
||||
inline QDataStream &operator<<(QDataStream &s, const JSAgentWatchData &data)
|
||||
{
|
||||
return s << data.exp << data.name << data.value
|
||||
<< data.type << data.hasChildren << data.objectId;
|
||||
}
|
||||
|
||||
struct JSAgentStackData
|
||||
{
|
||||
QByteArray functionName;
|
||||
QByteArray fileUrl;
|
||||
qint32 lineNumber;
|
||||
};
|
||||
|
||||
inline QDataStream &operator<<(QDataStream &s, const JSAgentStackData &data)
|
||||
{
|
||||
return s << data.functionName << data.fileUrl << data.lineNumber;
|
||||
}
|
||||
|
||||
struct JSAgentBreakpointData
|
||||
{
|
||||
QByteArray functionName;
|
||||
QByteArray fileUrl;
|
||||
qint32 lineNumber;
|
||||
};
|
||||
|
||||
typedef QSet<JSAgentBreakpointData> JSAgentBreakpoints;
|
||||
|
||||
inline QDataStream &operator<<(QDataStream &s, const JSAgentBreakpointData &data)
|
||||
{
|
||||
return s << data.functionName << data.fileUrl << data.lineNumber;
|
||||
}
|
||||
|
||||
inline QDataStream &operator>>(QDataStream &s, JSAgentBreakpointData &data)
|
||||
{
|
||||
return s >> data.functionName >> data.fileUrl >> data.lineNumber;
|
||||
}
|
||||
|
||||
inline bool operator==(const JSAgentBreakpointData &b1, const JSAgentBreakpointData &b2)
|
||||
{
|
||||
return b1.lineNumber == b2.lineNumber && b1.fileUrl == b2.fileUrl;
|
||||
}
|
||||
|
||||
inline uint qHash(const JSAgentBreakpointData &b)
|
||||
{
|
||||
return b.lineNumber ^ qHash(b.fileUrl);
|
||||
}
|
||||
|
||||
|
||||
class QJSDebuggerAgent : public QObject, public QScriptEngineAgent
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QJSDebuggerAgent(QScriptEngine *engine, QObject *parent = 0);
|
||||
QJSDebuggerAgent(QDeclarativeEngine *engine, QObject *parent = 0);
|
||||
~QJSDebuggerAgent();
|
||||
|
||||
void setBreakpoints(const JSAgentBreakpoints &);
|
||||
void setWatchExpressions(const QStringList &);
|
||||
|
||||
void stepOver();
|
||||
void stepInto();
|
||||
void stepOut();
|
||||
void continueExecution();
|
||||
|
||||
JSAgentWatchData executeExpression(const QString &expr);
|
||||
QList<JSAgentWatchData> expandObjectById(quint64 objectId);
|
||||
QList<JSAgentWatchData> locals();
|
||||
QList<JSAgentWatchData> localsAtFrame(int frameId);
|
||||
QList<JSAgentStackData> backtrace();
|
||||
QList<JSAgentWatchData> watches();
|
||||
void setProperty(qint64 objectId,
|
||||
const QString &property,
|
||||
const QString &value);
|
||||
|
||||
// reimplemented
|
||||
void scriptLoad(qint64 id, const QString &program,
|
||||
const QString &fileName, int baseLineNumber);
|
||||
void scriptUnload(qint64 id);
|
||||
|
||||
void contextPush();
|
||||
void contextPop();
|
||||
|
||||
void functionEntry(qint64 scriptId);
|
||||
void functionExit(qint64 scriptId,
|
||||
const QScriptValue &returnValue);
|
||||
|
||||
void positionChange(qint64 scriptId,
|
||||
int lineNumber, int columnNumber);
|
||||
|
||||
void exceptionThrow(qint64 scriptId,
|
||||
const QScriptValue &exception,
|
||||
bool hasHandler);
|
||||
void exceptionCatch(qint64 scriptId,
|
||||
const QScriptValue &exception);
|
||||
|
||||
bool supportsExtension(Extension extension) const;
|
||||
QVariant extension(Extension extension,
|
||||
const QVariant &argument = QVariant());
|
||||
|
||||
Q_SIGNALS:
|
||||
void stopped(bool becauseOfException,
|
||||
const QString &exception);
|
||||
|
||||
private:
|
||||
friend class QJSDebuggerAgentPrivate;
|
||||
QJSDebuggerAgentPrivate *d;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSDEBUGGERAGENT_P_H
|
|
@ -0,0 +1,198 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "private/qjsdebugservice_p.h"
|
||||
#include "private/qjsdebuggeragent_p.h"
|
||||
|
||||
#include <QtCore/qdatastream.h>
|
||||
#include <QtCore/qdebug.h>
|
||||
#include <QtCore/qstringlist.h>
|
||||
#include <QtDeclarative/qdeclarativeengine.h>
|
||||
|
||||
Q_GLOBAL_STATIC(QJSDebugService, serviceInstance)
|
||||
|
||||
QJSDebugService::QJSDebugService(QObject *parent)
|
||||
: QDeclarativeDebugService(QLatin1String("JSDebugger"), parent)
|
||||
, m_agent(0)
|
||||
{
|
||||
}
|
||||
|
||||
QJSDebugService::~QJSDebugService()
|
||||
{
|
||||
delete m_agent;
|
||||
}
|
||||
|
||||
QJSDebugService *QJSDebugService::instance()
|
||||
{
|
||||
return serviceInstance();
|
||||
}
|
||||
|
||||
void QJSDebugService::addEngine(QDeclarativeEngine *engine)
|
||||
{
|
||||
Q_ASSERT(engine);
|
||||
Q_ASSERT(!m_engines.contains(engine));
|
||||
|
||||
m_engines.append(engine);
|
||||
}
|
||||
|
||||
void QJSDebugService::removeEngine(QDeclarativeEngine *engine)
|
||||
{
|
||||
Q_ASSERT(engine);
|
||||
Q_ASSERT(m_engines.contains(engine));
|
||||
|
||||
m_engines.removeAll(engine);
|
||||
}
|
||||
|
||||
void QJSDebugService::statusChanged(Status status)
|
||||
{
|
||||
if (status == Enabled && !m_engines.isEmpty() && !m_agent) {
|
||||
// Multiple engines are currently unsupported
|
||||
QDeclarativeEngine *engine = m_engines.first();
|
||||
m_agent = new QJSDebuggerAgent(engine, engine);
|
||||
|
||||
connect(m_agent, SIGNAL(stopped(bool,QString)),
|
||||
this, SLOT(executionStopped(bool,QString)));
|
||||
|
||||
} else if (status != Enabled && m_agent) {
|
||||
delete m_agent;
|
||||
m_agent = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void QJSDebugService::messageReceived(const QByteArray &message)
|
||||
{
|
||||
if (!m_agent) {
|
||||
qWarning() << "QJSDebugService::messageReceived: No QJSDebuggerAgent available";
|
||||
return;
|
||||
}
|
||||
|
||||
QDataStream ds(message);
|
||||
QByteArray command;
|
||||
ds >> command;
|
||||
if (command == "BREAKPOINTS") {
|
||||
JSAgentBreakpoints breakpoints;
|
||||
ds >> breakpoints;
|
||||
m_agent->setBreakpoints(breakpoints);
|
||||
|
||||
//qDebug() << "BREAKPOINTS";
|
||||
//foreach (const JSAgentBreakpointData &bp, breakpoints)
|
||||
// qDebug() << "BREAKPOINT: " << bp.fileUrl << bp.lineNumber;
|
||||
} else if (command == "WATCH_EXPRESSIONS") {
|
||||
QStringList watchExpressions;
|
||||
ds >> watchExpressions;
|
||||
m_agent->setWatchExpressions(watchExpressions);
|
||||
} else if (command == "STEPOVER") {
|
||||
m_agent->stepOver();
|
||||
} else if (command == "STEPINTO" || command == "INTERRUPT") {
|
||||
m_agent->stepInto();
|
||||
} else if (command == "STEPOUT") {
|
||||
m_agent->stepOut();
|
||||
} else if (command == "CONTINUE") {
|
||||
m_agent->continueExecution();
|
||||
} else if (command == "EXEC") {
|
||||
QByteArray id;
|
||||
QString expr;
|
||||
ds >> id >> expr;
|
||||
|
||||
JSAgentWatchData data = m_agent->executeExpression(expr);
|
||||
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
rs << QByteArray("RESULT") << id << data;
|
||||
sendMessage(reply);
|
||||
} else if (command == "EXPAND") {
|
||||
QByteArray requestId;
|
||||
quint64 objectId;
|
||||
ds >> requestId >> objectId;
|
||||
|
||||
QList<JSAgentWatchData> result = m_agent->expandObjectById(objectId);
|
||||
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
rs << QByteArray("EXPANDED") << requestId << result;
|
||||
sendMessage(reply);
|
||||
} else if (command == "ACTIVATE_FRAME") {
|
||||
int frameId;
|
||||
ds >> frameId;
|
||||
|
||||
QList<JSAgentWatchData> locals = m_agent->localsAtFrame(frameId);
|
||||
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
rs << QByteArray("LOCALS") << frameId << locals;
|
||||
sendMessage(reply);
|
||||
} else if (command == "SET_PROPERTY") {
|
||||
QByteArray id;
|
||||
qint64 objectId;
|
||||
QString property;
|
||||
QString value;
|
||||
ds >> id >> objectId >> property >> value;
|
||||
|
||||
m_agent->setProperty(objectId, property, value);
|
||||
|
||||
//TODO: feedback
|
||||
} else if (command == "PING") {
|
||||
int ping;
|
||||
ds >> ping;
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
rs << QByteArray("PONG") << ping;
|
||||
sendMessage(reply);
|
||||
} else {
|
||||
qDebug() << Q_FUNC_INFO << "Unknown command" << command;
|
||||
}
|
||||
|
||||
QDeclarativeDebugService::messageReceived(message);
|
||||
}
|
||||
|
||||
void QJSDebugService::executionStopped(bool becauseOfException,
|
||||
const QString &exception)
|
||||
{
|
||||
const QList<JSAgentStackData> backtrace = m_agent->backtrace();
|
||||
const QList<JSAgentWatchData> watches = m_agent->watches();
|
||||
const QList<JSAgentWatchData> locals = m_agent->locals();
|
||||
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
rs << QByteArray("STOPPED") << backtrace << watches << locals
|
||||
<< becauseOfException << exception;
|
||||
sendMessage(reply);
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSDEBUGSERVICE_P_H
|
||||
#define QJSDEBUGSERVICE_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include <QtCore/QPointer>
|
||||
|
||||
#include "private/qdeclarativedebugservice_p.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeEngine;
|
||||
class QJSDebuggerAgent;
|
||||
|
||||
class QJSDebugService : public QDeclarativeDebugService
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QJSDebugService(QObject *parent = 0);
|
||||
~QJSDebugService();
|
||||
|
||||
static QJSDebugService *instance();
|
||||
|
||||
void addEngine(QDeclarativeEngine *);
|
||||
void removeEngine(QDeclarativeEngine *);
|
||||
|
||||
protected:
|
||||
void statusChanged(Status status);
|
||||
void messageReceived(const QByteArray &);
|
||||
|
||||
private Q_SLOTS:
|
||||
void executionStopped(bool becauseOfException,
|
||||
const QString &exception);
|
||||
|
||||
private:
|
||||
QList<QDeclarativeEngine *> m_engines;
|
||||
QPointer<QJSDebuggerAgent> m_agent;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSDEBUGSERVICE_P_H
|
|
@ -21,6 +21,8 @@ exists("qdeclarative_enable_gcov") {
|
|||
|
||||
include($$QT_SOURCE_TREE/src/qbase.pri)
|
||||
|
||||
HEADERS += qtdeclarativeversion.h
|
||||
|
||||
#INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$TARGET
|
||||
#DESTDIR=.
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextInputPrivate : public QDeclarativeImplic
|
|||
{
|
||||
Q_DECLARE_PUBLIC(QDeclarativeTextInput)
|
||||
public:
|
||||
QDeclarativeTextInputPrivate() : control(new QLineControl(QString())),
|
||||
QDeclarativeTextInputPrivate() : control(new QLineControl),
|
||||
color((QRgb)0), style(QDeclarativeText::Normal),
|
||||
styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
|
||||
mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone),
|
||||
|
|
|
@ -72,6 +72,7 @@
|
|||
#include "private/qdeclarativenotifier_p.h"
|
||||
#include "private/qdeclarativedebugtrace_p.h"
|
||||
#include "private/qdeclarativeapplication_p.h"
|
||||
#include "private/qjsdebugservice_p.h"
|
||||
|
||||
#include <QtCore/qmetaobject.h>
|
||||
#include <QScriptClass>
|
||||
|
@ -126,7 +127,7 @@ QT_BEGIN_NAMESPACE
|
|||
\brief The QtObject element is the most basic element in QML.
|
||||
|
||||
The QtObject element is a non-visual element which contains only the
|
||||
objectName property.
|
||||
objectName property.
|
||||
|
||||
It can be useful to create a QtObject if you need an extremely
|
||||
lightweight element to enclose a set of custom properties:
|
||||
|
@ -141,7 +142,7 @@ QT_BEGIN_NAMESPACE
|
|||
This property holds the QObject::objectName for this specific object instance.
|
||||
|
||||
This allows a C++ application to locate an item within a QML component
|
||||
using the QObject::findChild() method. For example, the following C++
|
||||
using the QObject::findChild() method. For example, the following C++
|
||||
application locates the child \l Rectangle item and dynamically changes its
|
||||
\c color value:
|
||||
|
||||
|
@ -155,7 +156,7 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "red"
|
||||
color: "red"
|
||||
objectName: "myRect"
|
||||
}
|
||||
}
|
||||
|
@ -169,7 +170,7 @@ QT_BEGIN_NAMESPACE
|
|||
view.show();
|
||||
|
||||
QDeclarativeItem *item = view.rootObject()->findChild<QDeclarativeItem*>("myRect");
|
||||
if (item)
|
||||
if (item)
|
||||
item->setProperty("color", QColor(Qt::yellow));
|
||||
\endcode
|
||||
*/
|
||||
|
@ -205,7 +206,7 @@ void QDeclarativeEnginePrivate::defineModule()
|
|||
|
||||
\keyword QmlGlobalQtObject
|
||||
|
||||
\brief The \c Qt object provides useful enums and functions from Qt, for use in all QML files.
|
||||
\brief The \c Qt object provides useful enums and functions from Qt, for use in all QML files.
|
||||
|
||||
The \c Qt object is a global object with utility functions, properties and enums.
|
||||
|
||||
|
@ -594,6 +595,7 @@ void QDeclarativeEnginePrivate::init()
|
|||
QDeclarativeEngineDebugServer::isDebuggingEnabled()) {
|
||||
isDebugging = true;
|
||||
QDeclarativeEngineDebugServer::instance()->addEngine(q);
|
||||
QJSDebugService::instance()->addEngine(q);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -656,8 +658,9 @@ QDeclarativeEngine::QDeclarativeEngine(QObject *parent)
|
|||
QDeclarativeEngine::~QDeclarativeEngine()
|
||||
{
|
||||
Q_D(QDeclarativeEngine);
|
||||
if (d->isDebugging)
|
||||
if (d->isDebugging) {
|
||||
QDeclarativeEngineDebugServer::instance()->remEngine(this);
|
||||
}
|
||||
|
||||
// if we are the parent of any of the qobject module api instances,
|
||||
// we need to remove them from our internal list, in order to prevent
|
||||
|
@ -784,7 +787,7 @@ QNetworkAccessManager *QDeclarativeEngine::networkAccessManager() const
|
|||
/*!
|
||||
|
||||
Sets the \a provider to use for images requested via the \e
|
||||
image: url scheme, with host \a providerId. The QDeclarativeEngine
|
||||
image: url scheme, with host \a providerId. The QDeclarativeEngine
|
||||
takes ownership of \a provider.
|
||||
|
||||
Image providers enable support for pixmap and threaded image
|
||||
|
@ -1105,7 +1108,7 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre
|
|||
|
||||
rv = pf(const_cast<QObject *>(object));
|
||||
|
||||
if (rv)
|
||||
if (rv)
|
||||
data->attachedProperties()->insert(id, rv);
|
||||
|
||||
return rv;
|
||||
|
@ -1297,7 +1300,7 @@ Returns a \l Component object created using the QML file at the specified \a url
|
|||
or \c null if an empty string was given.
|
||||
|
||||
The returned component's \l Component::status property indicates whether the
|
||||
component was successfully created. If the status is \c Component.Error,
|
||||
component was successfully created. If the status is \c Component.Error,
|
||||
see \l Component::errorString() for an error description.
|
||||
|
||||
Call \l {Component::createObject()}{Component.createObject()} on the returned
|
||||
|
@ -1659,7 +1662,7 @@ QScriptValue QDeclarativeEnginePrivate::formatDateTime(QScriptContext*ctxt, QScr
|
|||
return engine->newVariant(QVariant::fromValue(date.toString(format)));
|
||||
} else if (formatArg.isNumber()) {
|
||||
enumFormat = Qt::DateFormat(formatArg.toUInt32());
|
||||
} else {
|
||||
} else {
|
||||
return ctxt->throwError(QLatin1String("Qt.formatDateTime(): Invalid datetime format"));
|
||||
}
|
||||
}
|
||||
|
@ -1724,7 +1727,7 @@ QScriptValue QDeclarativeEnginePrivate::hsla(QScriptContext *ctxt, QScriptEngine
|
|||
}
|
||||
|
||||
/*!
|
||||
\qmlmethod rect Qt::rect(int x, int y, int width, int height)
|
||||
\qmlmethod rect Qt::rect(int x, int y, int width, int height)
|
||||
|
||||
Returns a \c rect with the top-left corner at \c x, \c y and the specified \c width and \c height.
|
||||
|
||||
|
@ -1893,7 +1896,7 @@ Binary to ASCII - this function returns a base64 encoding of \c data.
|
|||
*/
|
||||
QScriptValue QDeclarativeEnginePrivate::btoa(QScriptContext *ctxt, QScriptEngine *)
|
||||
{
|
||||
if (ctxt->argumentCount() != 1)
|
||||
if (ctxt->argumentCount() != 1)
|
||||
return ctxt->throwError(QLatin1String("Qt.btoa(): Invalid arguments"));
|
||||
|
||||
QByteArray data = ctxt->argument(0).toString().toUtf8();
|
||||
|
@ -1908,7 +1911,7 @@ ASCII to binary - this function returns a base64 decoding of \c data.
|
|||
|
||||
QScriptValue QDeclarativeEnginePrivate::atob(QScriptContext *ctxt, QScriptEngine *)
|
||||
{
|
||||
if (ctxt->argumentCount() != 1)
|
||||
if (ctxt->argumentCount() != 1)
|
||||
return ctxt->throwError(QLatin1String("Qt.atob(): Invalid arguments"));
|
||||
|
||||
QByteArray data = ctxt->argument(0).toString().toUtf8();
|
||||
|
@ -2412,7 +2415,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(const QMetaObj
|
|||
}
|
||||
}
|
||||
|
||||
QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeType *type, int minorVersion,
|
||||
QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeType *type, int minorVersion,
|
||||
QDeclarativeError &error)
|
||||
{
|
||||
QList<QDeclarativeType *> types;
|
||||
|
@ -2421,7 +2424,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
|||
|
||||
const QMetaObject *metaObject = type->metaObject();
|
||||
while (metaObject) {
|
||||
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
|
||||
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
|
||||
type->majorVersion(), minorVersion);
|
||||
if (t) {
|
||||
maxMinorVersion = qMax(maxMinorVersion, t->minorVersion());
|
||||
|
@ -2465,7 +2468,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
|||
|
||||
// Signals override:
|
||||
// * other signals and methods of the same name.
|
||||
// * properties named on<Signal Name>
|
||||
// * properties named on<Signal Name>
|
||||
// * automatic <property name>Changed notify signals
|
||||
|
||||
// Methods override:
|
||||
|
@ -2490,7 +2493,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
|||
QDeclarativePropertyCache::Data *current = d;
|
||||
while (!overloadError && current) {
|
||||
current = d->overrideData(current);
|
||||
if (current && raw->isAllowedInRevision(current))
|
||||
if (current && raw->isAllowedInRevision(current))
|
||||
overloadError = true;
|
||||
}
|
||||
}
|
||||
|
@ -2498,7 +2501,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
|||
|
||||
if (overloadError) {
|
||||
if (hasCopied) raw->release();
|
||||
|
||||
|
||||
error.setDescription(QLatin1String("Type ") + QString::fromUtf8(type->qmlTypeName()) + QLatin1String(" ") + QString::number(type->majorVersion()) + QLatin1String(".") + QString::number(minorVersion) + QLatin1String(" contains an illegal property \"") + overloadName + QLatin1String("\". This is an error in the type's implementation."));
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -98,7 +98,6 @@ class QDeclarativeScarceResourceScriptClass;
|
|||
class ScarceResourceData;
|
||||
class QDeclarativeTypeNameScriptClass;
|
||||
class QDeclarativeValueTypeScriptClass;
|
||||
class QScriptEngineDebugger;
|
||||
class QNetworkReply;
|
||||
class QNetworkAccessManager;
|
||||
class QDeclarativeNetworkAccessManagerFactory;
|
||||
|
@ -353,14 +352,14 @@ public:
|
|||
/*!
|
||||
Returns a QDeclarativePropertyCache for \a obj if one is available.
|
||||
|
||||
If \a obj is null, being deleted or contains a dynamic meta object 0
|
||||
If \a obj is null, being deleted or contains a dynamic meta object 0
|
||||
is returned.
|
||||
|
||||
The returned cache is not referenced, so if it is to be stored, call addref().
|
||||
*/
|
||||
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
|
||||
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
|
||||
{
|
||||
if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
|
||||
if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
|
||||
return 0;
|
||||
|
||||
const QMetaObject *mo = obj->metaObject();
|
||||
|
@ -370,10 +369,10 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
|
|||
}
|
||||
|
||||
/*!
|
||||
Returns a QDeclarativePropertyCache for \a metaObject.
|
||||
Returns a QDeclarativePropertyCache for \a metaObject.
|
||||
|
||||
As the cache is persisted for the life of the engine, \a metaObject must be
|
||||
a static "compile time" meta-object, or a meta-object that is otherwise known to
|
||||
a static "compile time" meta-object, or a meta-object that is otherwise known to
|
||||
exist for the lifetime of the QDeclarativeEngine.
|
||||
|
||||
The returned cache is not referenced, so if it is to be stored, call addref().
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
#include <qdeclarativeguard_p.h>
|
||||
|
||||
#include <private/qdeclarativedebugtrace_p.h>
|
||||
#include <private/qdeclarativeobserverservice_p.h>
|
||||
|
||||
#include <qscriptvalueiterator.h>
|
||||
#include <qdebug.h>
|
||||
|
@ -299,6 +300,8 @@ void QDeclarativeViewPrivate::init()
|
|||
q->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
q->viewport()->setAttribute(Qt::WA_NoSystemBackground);
|
||||
#endif
|
||||
|
||||
QDeclarativeObserverService::instance()->addView(q);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -306,6 +309,7 @@ void QDeclarativeViewPrivate::init()
|
|||
*/
|
||||
QDeclarativeView::~QDeclarativeView()
|
||||
{
|
||||
QDeclarativeObserverService::instance()->removeView(this);
|
||||
}
|
||||
|
||||
/*! \property QDeclarativeView::source
|
||||
|
@ -558,7 +562,6 @@ void QDeclarativeView::continueExecute()
|
|||
emit statusChanged(status());
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
load(qt_module)
|
||||
|
||||
TARGET = declarativeobserver
|
||||
QT += declarative-private
|
||||
|
||||
include($$QT_SOURCE_TREE/src/plugins/qpluginbase.pri)
|
||||
|
||||
DESTDIR = $$QT.declarative.plugins/qmltooling
|
||||
QTDIR_build:REQUIRES += "contains(QT_CONFIG, declarative)"
|
||||
|
||||
SOURCES += \
|
||||
qdeclarativeobserverplugin.cpp \
|
||||
qdeclarativeviewobserver.cpp \
|
||||
editor/abstractliveedittool.cpp \
|
||||
editor/liveselectiontool.cpp \
|
||||
editor/livelayeritem.cpp \
|
||||
editor/livesingleselectionmanipulator.cpp \
|
||||
editor/liverubberbandselectionmanipulator.cpp \
|
||||
editor/liveselectionrectangle.cpp \
|
||||
editor/liveselectionindicator.cpp \
|
||||
editor/boundingrecthighlighter.cpp \
|
||||
editor/subcomponenteditortool.cpp \
|
||||
editor/subcomponentmasklayeritem.cpp \
|
||||
editor/zoomtool.cpp \
|
||||
editor/colorpickertool.cpp \
|
||||
editor/qmltoolbar.cpp \
|
||||
editor/toolbarcolorbox.cpp
|
||||
|
||||
HEADERS += \
|
||||
qdeclarativeobserverplugin.h \
|
||||
qdeclarativeobserverprotocol.h \
|
||||
qdeclarativeviewobserver_p.h \
|
||||
qdeclarativeviewobserver_p_p.h \
|
||||
qmlobserverconstants_p.h \
|
||||
editor/abstractliveedittool_p.h \
|
||||
editor/liveselectiontool_p.h \
|
||||
editor/livelayeritem_p.h \
|
||||
editor/livesingleselectionmanipulator_p.h \
|
||||
editor/liverubberbandselectionmanipulator_p.h \
|
||||
editor/liveselectionrectangle_p.h \
|
||||
editor/liveselectionindicator_p.h \
|
||||
editor/boundingrecthighlighter_p.h \
|
||||
editor/subcomponenteditortool_p.h \
|
||||
editor/subcomponentmasklayeritem_p.h \
|
||||
editor/zoomtool_p.h \
|
||||
editor/colorpickertool_p.h \
|
||||
editor/qmltoolbar_p.h \
|
||||
editor/toolbarcolorbox_p.h
|
||||
|
||||
RESOURCES += editor/editor.qrc
|
||||
|
||||
target.path += $$[QT_INSTALL_PLUGINS]/qmltooling
|
||||
INSTALLS += target
|
||||
|
||||
symbian:TARGET.UID3=0x20031E90
|
|
@ -0,0 +1,200 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "abstractliveedittool_p.h"
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QDeclarativeEngine>
|
||||
|
||||
#include <QtDebug>
|
||||
#include <QGraphicsItem>
|
||||
#include <QDeclarativeItem>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
AbstractLiveEditTool::AbstractLiveEditTool(QDeclarativeViewObserver *editorView)
|
||||
: QObject(editorView), m_observer(editorView)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AbstractLiveEditTool::~AbstractLiveEditTool()
|
||||
{
|
||||
}
|
||||
|
||||
QDeclarativeViewObserver *AbstractLiveEditTool::observer() const
|
||||
{
|
||||
return m_observer;
|
||||
}
|
||||
|
||||
QDeclarativeView *AbstractLiveEditTool::view() const
|
||||
{
|
||||
return m_observer->declarativeView();
|
||||
}
|
||||
|
||||
QGraphicsScene* AbstractLiveEditTool::scene() const
|
||||
{
|
||||
return view()->scene();
|
||||
}
|
||||
|
||||
void AbstractLiveEditTool::updateSelectedItems()
|
||||
{
|
||||
selectedItemsChanged(items());
|
||||
}
|
||||
|
||||
QList<QGraphicsItem*> AbstractLiveEditTool::items() const
|
||||
{
|
||||
return observer()->selectedItems();
|
||||
}
|
||||
|
||||
void AbstractLiveEditTool::enterContext(QGraphicsItem *itemToEnter)
|
||||
{
|
||||
observer()->data->enterContext(itemToEnter);
|
||||
}
|
||||
|
||||
bool AbstractLiveEditTool::topItemIsMovable(const QList<QGraphicsItem*> & itemList)
|
||||
{
|
||||
QGraphicsItem *firstSelectableItem = topMovableGraphicsItem(itemList);
|
||||
if (firstSelectableItem == 0)
|
||||
return false;
|
||||
if (toQDeclarativeItem(firstSelectableItem) != 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
bool AbstractLiveEditTool::topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList)
|
||||
{
|
||||
QList<QGraphicsItem*> selectedItems = observer()->selectedItems();
|
||||
|
||||
foreach (QGraphicsItem *item, itemList) {
|
||||
QDeclarativeItem *declarativeItem = toQDeclarativeItem(item);
|
||||
if (declarativeItem
|
||||
&& selectedItems.contains(declarativeItem)
|
||||
/*&& (declarativeItem->qmlItemNode().hasShowContent() || selectNonContentItems)*/)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
bool AbstractLiveEditTool::topItemIsResizeHandle(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QDeclarativeItem *AbstractLiveEditTool::toQDeclarativeItem(QGraphicsItem *item)
|
||||
{
|
||||
return qobject_cast<QDeclarativeItem*>(item->toGraphicsObject());
|
||||
}
|
||||
|
||||
QGraphicsItem *AbstractLiveEditTool::topMovableGraphicsItem(const QList<QGraphicsItem*> &itemList)
|
||||
{
|
||||
foreach (QGraphicsItem *item, itemList) {
|
||||
if (item->flags().testFlag(QGraphicsItem::ItemIsMovable))
|
||||
return item;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
QDeclarativeItem *AbstractLiveEditTool::topMovableDeclarativeItem(const QList<QGraphicsItem*>
|
||||
&itemList)
|
||||
{
|
||||
foreach (QGraphicsItem *item, itemList) {
|
||||
QDeclarativeItem *declarativeItem = toQDeclarativeItem(item);
|
||||
if (declarativeItem /*&& (declarativeItem->qmlItemNode().hasShowContent())*/)
|
||||
return declarativeItem;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
QList<QGraphicsObject*> AbstractLiveEditTool::toGraphicsObjectList(const QList<QGraphicsItem*>
|
||||
&itemList)
|
||||
{
|
||||
QList<QGraphicsObject*> gfxObjects;
|
||||
foreach (QGraphicsItem *item, itemList) {
|
||||
QGraphicsObject *obj = item->toGraphicsObject();
|
||||
if (obj)
|
||||
gfxObjects << obj;
|
||||
}
|
||||
|
||||
return gfxObjects;
|
||||
}
|
||||
|
||||
QString AbstractLiveEditTool::titleForItem(QGraphicsItem *item)
|
||||
{
|
||||
QString className(QLatin1String("QGraphicsItem"));
|
||||
QString objectStringId;
|
||||
|
||||
QString constructedName;
|
||||
|
||||
QGraphicsObject *gfxObject = item->toGraphicsObject();
|
||||
if (gfxObject) {
|
||||
className = QLatin1String(gfxObject->metaObject()->className());
|
||||
|
||||
className.remove(QRegExp(QLatin1String("_QMLTYPE_\\d+")));
|
||||
className.remove(QRegExp(QLatin1String("_QML_\\d+")));
|
||||
if (className.startsWith(QLatin1String("QDeclarative")))
|
||||
className = className.remove(QLatin1String("QDeclarative"));
|
||||
|
||||
QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem*>(gfxObject);
|
||||
if (declarativeItem) {
|
||||
objectStringId = m_observer->idStringForObject(declarativeItem);
|
||||
}
|
||||
|
||||
if (!objectStringId.isEmpty()) {
|
||||
constructedName = objectStringId + QLatin1String(" (") + className + QLatin1Char(')');
|
||||
} else {
|
||||
if (!gfxObject->objectName().isEmpty()) {
|
||||
constructedName = gfxObject->objectName() + QLatin1String(" (") + className + QLatin1Char(')');
|
||||
} else {
|
||||
constructedName = className;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return constructedName;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,121 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ABSTRACTLIVEEDITTOOL_H
|
||||
#define ABSTRACTLIVEEDITTOOL_H
|
||||
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QObject>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QMouseEvent;
|
||||
class QGraphicsItem;
|
||||
class QDeclarativeItem;
|
||||
class QKeyEvent;
|
||||
class QGraphicsScene;
|
||||
class QGraphicsObject;
|
||||
class QWheelEvent;
|
||||
class QDeclarativeView;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class AbstractLiveEditTool : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
AbstractLiveEditTool(QDeclarativeViewObserver *observer);
|
||||
|
||||
virtual ~AbstractLiveEditTool();
|
||||
|
||||
virtual void mousePressEvent(QMouseEvent *event) = 0;
|
||||
virtual void mouseMoveEvent(QMouseEvent *event) = 0;
|
||||
virtual void mouseReleaseEvent(QMouseEvent *event) = 0;
|
||||
virtual void mouseDoubleClickEvent(QMouseEvent *event) = 0;
|
||||
|
||||
virtual void hoverMoveEvent(QMouseEvent *event) = 0;
|
||||
virtual void wheelEvent(QWheelEvent *event) = 0;
|
||||
|
||||
virtual void keyPressEvent(QKeyEvent *event) = 0;
|
||||
virtual void keyReleaseEvent(QKeyEvent *keyEvent) = 0;
|
||||
virtual void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList) = 0;
|
||||
|
||||
virtual void clear() = 0;
|
||||
|
||||
void updateSelectedItems();
|
||||
QList<QGraphicsItem*> items() const;
|
||||
|
||||
void enterContext(QGraphicsItem *itemToEnter);
|
||||
|
||||
bool topItemIsMovable(const QList<QGraphicsItem*> &itemList);
|
||||
bool topItemIsResizeHandle(const QList<QGraphicsItem*> &itemList);
|
||||
bool topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
QString titleForItem(QGraphicsItem *item);
|
||||
|
||||
static QList<QGraphicsObject*> toGraphicsObjectList(const QList<QGraphicsItem*> &itemList);
|
||||
static QGraphicsItem* topMovableGraphicsItem(const QList<QGraphicsItem*> &itemList);
|
||||
static QDeclarativeItem* topMovableDeclarativeItem(const QList<QGraphicsItem*> &itemList);
|
||||
static QDeclarativeItem *toQDeclarativeItem(QGraphicsItem *item);
|
||||
|
||||
protected:
|
||||
virtual void selectedItemsChanged(const QList<QGraphicsItem*> &objectList) = 0;
|
||||
|
||||
QDeclarativeViewObserver *observer() const;
|
||||
QDeclarativeView *view() const;
|
||||
QGraphicsScene *scene() const;
|
||||
|
||||
private:
|
||||
QDeclarativeViewObserver *m_observer;
|
||||
QList<QGraphicsItem*> m_itemList;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // ABSTRACTLIVEEDITTOOL_H
|
|
@ -0,0 +1,284 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "boundingrecthighlighter_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p.h"
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
#include <QtGui/QGraphicsPolygonItem>
|
||||
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
const qreal AnimDelta = 0.025f;
|
||||
const int AnimInterval = 30;
|
||||
const int AnimFrames = 10;
|
||||
|
||||
BoundingBox::BoundingBox(QGraphicsObject *itemToHighlight, QGraphicsItem *parentItem,
|
||||
QObject *parent)
|
||||
: QObject(parent),
|
||||
highlightedObject(itemToHighlight),
|
||||
highlightPolygon(0),
|
||||
highlightPolygonEdge(0)
|
||||
{
|
||||
highlightPolygon = new BoundingBoxPolygonItem(parentItem);
|
||||
highlightPolygonEdge = new BoundingBoxPolygonItem(parentItem);
|
||||
|
||||
highlightPolygon->setPen(QPen(QColor(0, 22, 159)));
|
||||
highlightPolygonEdge->setPen(QPen(QColor(158, 199, 255)));
|
||||
|
||||
highlightPolygon->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||||
highlightPolygonEdge->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||||
}
|
||||
|
||||
BoundingBox::~BoundingBox()
|
||||
{
|
||||
highlightedObject.clear();
|
||||
}
|
||||
|
||||
BoundingBoxPolygonItem::BoundingBoxPolygonItem(QGraphicsItem *item) : QGraphicsPolygonItem(item)
|
||||
{
|
||||
QPen pen;
|
||||
pen.setColor(QColor(108, 141, 221));
|
||||
pen.setWidth(1);
|
||||
setPen(pen);
|
||||
}
|
||||
|
||||
int BoundingBoxPolygonItem::type() const
|
||||
{
|
||||
return Constants::EditorItemType;
|
||||
}
|
||||
|
||||
BoundingRectHighlighter::BoundingRectHighlighter(QDeclarativeViewObserver *view) :
|
||||
LiveLayerItem(view->declarativeView()->scene()),
|
||||
m_view(view),
|
||||
m_animFrame(0)
|
||||
{
|
||||
m_animTimer = new QTimer(this);
|
||||
m_animTimer->setInterval(AnimInterval);
|
||||
connect(m_animTimer, SIGNAL(timeout()), SLOT(animTimeout()));
|
||||
}
|
||||
|
||||
BoundingRectHighlighter::~BoundingRectHighlighter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::animTimeout()
|
||||
{
|
||||
++m_animFrame;
|
||||
if (m_animFrame == AnimFrames) {
|
||||
m_animTimer->stop();
|
||||
}
|
||||
|
||||
qreal alpha = m_animFrame / float(AnimFrames);
|
||||
|
||||
foreach (BoundingBox *box, m_boxes) {
|
||||
box->highlightPolygonEdge->setOpacity(alpha);
|
||||
}
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::clear()
|
||||
{
|
||||
if (m_boxes.length()) {
|
||||
m_animTimer->stop();
|
||||
|
||||
foreach (BoundingBox *box, m_boxes) {
|
||||
freeBoundingBox(box);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BoundingBox *BoundingRectHighlighter::boxFor(QGraphicsObject *item) const
|
||||
{
|
||||
foreach (BoundingBox *box, m_boxes) {
|
||||
if (box->highlightedObject.data() == item) {
|
||||
return box;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::highlight(QList<QGraphicsObject*> items)
|
||||
{
|
||||
if (items.isEmpty())
|
||||
return;
|
||||
|
||||
bool animate = false;
|
||||
|
||||
QList<BoundingBox *> newBoxes;
|
||||
foreach (QGraphicsObject *itemToHighlight, items) {
|
||||
BoundingBox *box = boxFor(itemToHighlight);
|
||||
if (!box) {
|
||||
box = createBoundingBox(itemToHighlight);
|
||||
animate = true;
|
||||
}
|
||||
|
||||
newBoxes << box;
|
||||
}
|
||||
qSort(newBoxes);
|
||||
|
||||
if (newBoxes != m_boxes) {
|
||||
clear();
|
||||
m_boxes << newBoxes;
|
||||
}
|
||||
|
||||
highlightAll(animate);
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::highlight(QGraphicsObject* itemToHighlight)
|
||||
{
|
||||
if (!itemToHighlight)
|
||||
return;
|
||||
|
||||
bool animate = false;
|
||||
|
||||
BoundingBox *box = boxFor(itemToHighlight);
|
||||
if (!box) {
|
||||
box = createBoundingBox(itemToHighlight);
|
||||
m_boxes << box;
|
||||
animate = true;
|
||||
qSort(m_boxes);
|
||||
}
|
||||
|
||||
highlightAll(animate);
|
||||
}
|
||||
|
||||
BoundingBox *BoundingRectHighlighter::createBoundingBox(QGraphicsObject *itemToHighlight)
|
||||
{
|
||||
if (!m_freeBoxes.isEmpty()) {
|
||||
BoundingBox *box = m_freeBoxes.last();
|
||||
if (box->highlightedObject.isNull()) {
|
||||
box->highlightedObject = itemToHighlight;
|
||||
box->highlightPolygon->show();
|
||||
box->highlightPolygonEdge->show();
|
||||
m_freeBoxes.removeLast();
|
||||
return box;
|
||||
}
|
||||
}
|
||||
|
||||
BoundingBox *box = new BoundingBox(itemToHighlight, this, this);
|
||||
|
||||
connect(itemToHighlight, SIGNAL(xChanged()), this, SLOT(refresh()));
|
||||
connect(itemToHighlight, SIGNAL(yChanged()), this, SLOT(refresh()));
|
||||
connect(itemToHighlight, SIGNAL(widthChanged()), this, SLOT(refresh()));
|
||||
connect(itemToHighlight, SIGNAL(heightChanged()), this, SLOT(refresh()));
|
||||
connect(itemToHighlight, SIGNAL(rotationChanged()), this, SLOT(refresh()));
|
||||
connect(itemToHighlight, SIGNAL(destroyed(QObject*)), this, SLOT(itemDestroyed(QObject*)));
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::removeBoundingBox(BoundingBox *box)
|
||||
{
|
||||
delete box;
|
||||
box = 0;
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::freeBoundingBox(BoundingBox *box)
|
||||
{
|
||||
if (!box->highlightedObject.isNull()) {
|
||||
disconnect(box->highlightedObject.data(), SIGNAL(xChanged()), this, SLOT(refresh()));
|
||||
disconnect(box->highlightedObject.data(), SIGNAL(yChanged()), this, SLOT(refresh()));
|
||||
disconnect(box->highlightedObject.data(), SIGNAL(widthChanged()), this, SLOT(refresh()));
|
||||
disconnect(box->highlightedObject.data(), SIGNAL(heightChanged()), this, SLOT(refresh()));
|
||||
disconnect(box->highlightedObject.data(), SIGNAL(rotationChanged()), this, SLOT(refresh()));
|
||||
}
|
||||
|
||||
box->highlightedObject.clear();
|
||||
box->highlightPolygon->hide();
|
||||
box->highlightPolygonEdge->hide();
|
||||
m_boxes.removeOne(box);
|
||||
m_freeBoxes << box;
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::itemDestroyed(QObject *obj)
|
||||
{
|
||||
foreach (BoundingBox *box, m_boxes) {
|
||||
if (box->highlightedObject.data() == obj) {
|
||||
freeBoundingBox(box);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::highlightAll(bool animate)
|
||||
{
|
||||
foreach (BoundingBox *box, m_boxes) {
|
||||
if (box && box->highlightedObject.isNull()) {
|
||||
// clear all highlights
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
QGraphicsObject *item = box->highlightedObject.data();
|
||||
QRectF itemAndChildRect = item->boundingRect() | item->childrenBoundingRect();
|
||||
|
||||
QPolygonF boundingRectInSceneSpace(item->mapToScene(itemAndChildRect));
|
||||
QPolygonF boundingRectInLayerItemSpace = mapFromScene(boundingRectInSceneSpace);
|
||||
QRectF bboxRect
|
||||
= m_view->adjustToScreenBoundaries(boundingRectInLayerItemSpace.boundingRect());
|
||||
QRectF edgeRect = bboxRect;
|
||||
edgeRect.adjust(-1, -1, 1, 1);
|
||||
|
||||
box->highlightPolygon->setPolygon(QPolygonF(bboxRect));
|
||||
box->highlightPolygonEdge->setPolygon(QPolygonF(edgeRect));
|
||||
|
||||
if (animate)
|
||||
box->highlightPolygonEdge->setOpacity(0);
|
||||
}
|
||||
|
||||
if (animate) {
|
||||
m_animFrame = 0;
|
||||
m_animTimer->start();
|
||||
}
|
||||
}
|
||||
|
||||
void BoundingRectHighlighter::refresh()
|
||||
{
|
||||
if (!m_boxes.isEmpty())
|
||||
highlightAll(true);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,126 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef BOUNDINGRECTHIGHLIGHTER_H
|
||||
#define BOUNDINGRECTHIGHLIGHTER_H
|
||||
|
||||
#include "livelayeritem_p.h"
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QWeakPointer>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsItem)
|
||||
QT_FORWARD_DECLARE_CLASS(QPainter)
|
||||
QT_FORWARD_DECLARE_CLASS(QWidget)
|
||||
QT_FORWARD_DECLARE_CLASS(QStyleOptionGraphicsItem)
|
||||
QT_FORWARD_DECLARE_CLASS(QTimer)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
class BoundingBox;
|
||||
|
||||
class BoundingRectHighlighter : public LiveLayerItem
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BoundingRectHighlighter(QDeclarativeViewObserver *view);
|
||||
~BoundingRectHighlighter();
|
||||
void clear();
|
||||
void highlight(QList<QGraphicsObject*> items);
|
||||
void highlight(QGraphicsObject* item);
|
||||
|
||||
private slots:
|
||||
void refresh();
|
||||
void animTimeout();
|
||||
void itemDestroyed(QObject *);
|
||||
|
||||
private:
|
||||
BoundingBox *boxFor(QGraphicsObject *item) const;
|
||||
void highlightAll(bool animate);
|
||||
BoundingBox *createBoundingBox(QGraphicsObject *itemToHighlight);
|
||||
void removeBoundingBox(BoundingBox *box);
|
||||
void freeBoundingBox(BoundingBox *box);
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(BoundingRectHighlighter)
|
||||
|
||||
QDeclarativeViewObserver *m_view;
|
||||
QList<BoundingBox* > m_boxes;
|
||||
QList<BoundingBox* > m_freeBoxes;
|
||||
QTimer *m_animTimer;
|
||||
qreal m_animScale;
|
||||
int m_animFrame;
|
||||
|
||||
};
|
||||
|
||||
class BoundingBox : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BoundingBox(QGraphicsObject *itemToHighlight, QGraphicsItem *parentItem,
|
||||
QObject *parent = 0);
|
||||
~BoundingBox();
|
||||
QWeakPointer<QGraphicsObject> highlightedObject;
|
||||
QGraphicsPolygonItem *highlightPolygon;
|
||||
QGraphicsPolygonItem *highlightPolygonEdge;
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(BoundingBox)
|
||||
|
||||
};
|
||||
|
||||
class BoundingBoxPolygonItem : public QGraphicsPolygonItem
|
||||
{
|
||||
public:
|
||||
explicit BoundingBoxPolygonItem(QGraphicsItem *item);
|
||||
int type() const;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // BOUNDINGRECTHIGHLIGHTER_H
|
|
@ -0,0 +1,131 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "colorpickertool_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p.h"
|
||||
|
||||
#include <QtGui/QMouseEvent>
|
||||
#include <QtGui/QKeyEvent>
|
||||
#include <QtCore/QRectF>
|
||||
#include <QtGui/QRgb>
|
||||
#include <QtGui/QImage>
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QPalette>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
ColorPickerTool::ColorPickerTool(QDeclarativeViewObserver *view) :
|
||||
AbstractLiveEditTool(view)
|
||||
{
|
||||
m_selectedColor.setRgb(0,0,0);
|
||||
}
|
||||
|
||||
ColorPickerTool::~ColorPickerTool()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ColorPickerTool::mousePressEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
pickColor(event->pos());
|
||||
}
|
||||
|
||||
void ColorPickerTool::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
pickColor(event->pos());
|
||||
}
|
||||
|
||||
void ColorPickerTool::mouseDoubleClickEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ColorPickerTool::hoverMoveEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::keyPressEvent(QKeyEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/)
|
||||
{
|
||||
}
|
||||
void ColorPickerTool::wheelEvent(QWheelEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::clear()
|
||||
{
|
||||
view()->setCursor(Qt::CrossCursor);
|
||||
}
|
||||
|
||||
void ColorPickerTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPickerTool::pickColor(const QPoint &pos)
|
||||
{
|
||||
QRgb fillColor = view()->backgroundBrush().color().rgb();
|
||||
if (view()->backgroundBrush().style() == Qt::NoBrush)
|
||||
fillColor = view()->palette().color(QPalette::Base).rgb();
|
||||
|
||||
QRectF target(0,0, 1, 1);
|
||||
QRect source(pos.x(), pos.y(), 1, 1);
|
||||
QImage img(1, 1, QImage::Format_ARGB32);
|
||||
img.fill(fillColor);
|
||||
QPainter painter(&img);
|
||||
view()->render(&painter, target, source);
|
||||
m_selectedColor = QColor::fromRgb(img.pixel(0, 0));
|
||||
|
||||
emit selectedColorChanged(m_selectedColor);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,99 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef COLORPICKERTOOL_H
|
||||
#define COLORPICKERTOOL_H
|
||||
|
||||
#include "abstractliveedittool_p.h"
|
||||
|
||||
#include <QtGui/QColor>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QPoint)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class ColorPickerTool : public AbstractLiveEditTool
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ColorPickerTool(QDeclarativeViewObserver *view);
|
||||
|
||||
virtual ~ColorPickerTool();
|
||||
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
|
||||
void hoverMoveEvent(QMouseEvent *event);
|
||||
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *keyEvent);
|
||||
|
||||
void wheelEvent(QWheelEvent *event);
|
||||
|
||||
void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
void clear();
|
||||
|
||||
signals:
|
||||
void selectedColorChanged(const QColor &color);
|
||||
|
||||
protected:
|
||||
|
||||
void selectedItemsChanged(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
private:
|
||||
void pickColor(const QPoint &pos);
|
||||
|
||||
private:
|
||||
QColor m_selectedColor;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // COLORPICKERTOOL_H
|
|
@ -0,0 +1,24 @@
|
|||
<RCC>
|
||||
<qresource prefix="/qml">
|
||||
<file>images/resize_handle.png</file>
|
||||
<file>images/select.png</file>
|
||||
<file>images/select-marquee.png</file>
|
||||
<file>images/color-picker.png</file>
|
||||
<file>images/play.png</file>
|
||||
<file>images/pause.png</file>
|
||||
<file>images/from-qml.png</file>
|
||||
<file>images/to-qml.png</file>
|
||||
<file>images/color-picker-hicontrast.png</file>
|
||||
<file>images/zoom.png</file>
|
||||
<file>images/color-picker-24.png</file>
|
||||
<file>images/from-qml-24.png</file>
|
||||
<file>images/pause-24.png</file>
|
||||
<file>images/play-24.png</file>
|
||||
<file>images/to-qml-24.png</file>
|
||||
<file>images/zoom-24.png</file>
|
||||
<file>images/select-24.png</file>
|
||||
<file>images/select-marquee-24.png</file>
|
||||
<file>images/observermode.png</file>
|
||||
<file>images/observermode-24.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 160 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 3.3 KiB |
|
@ -0,0 +1,92 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "livelayeritem_p.h"
|
||||
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
#include <QGraphicsScene>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
LiveLayerItem::LiveLayerItem(QGraphicsScene* scene)
|
||||
: QGraphicsObject()
|
||||
{
|
||||
scene->addItem(this);
|
||||
setZValue(1);
|
||||
setFlag(QGraphicsItem::ItemIsMovable, false);
|
||||
}
|
||||
|
||||
LiveLayerItem::~LiveLayerItem()
|
||||
{
|
||||
}
|
||||
|
||||
void LiveLayerItem::paint(QPainter * /*painter*/, const QStyleOptionGraphicsItem * /*option*/,
|
||||
QWidget * /*widget*/)
|
||||
{
|
||||
}
|
||||
|
||||
int LiveLayerItem::type() const
|
||||
{
|
||||
return Constants::EditorItemType;
|
||||
}
|
||||
|
||||
QRectF LiveLayerItem::boundingRect() const
|
||||
{
|
||||
return childrenBoundingRect();
|
||||
}
|
||||
|
||||
QList<QGraphicsItem*> LiveLayerItem::findAllChildItems() const
|
||||
{
|
||||
return findAllChildItems(this);
|
||||
}
|
||||
|
||||
QList<QGraphicsItem*> LiveLayerItem::findAllChildItems(const QGraphicsItem *item) const
|
||||
{
|
||||
QList<QGraphicsItem*> itemList(item->childItems());
|
||||
|
||||
foreach (QGraphicsItem *childItem, item->childItems())
|
||||
itemList += findAllChildItems(childItem);
|
||||
|
||||
return itemList;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,73 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIVELAYERITEM_H
|
||||
#define LIVELAYERITEM_H
|
||||
|
||||
#include <QtGui/QGraphicsObject>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class LiveLayerItem : public QGraphicsObject
|
||||
{
|
||||
public:
|
||||
LiveLayerItem(QGraphicsScene *scene);
|
||||
~LiveLayerItem();
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||
QWidget *widget = 0);
|
||||
QRectF boundingRect() const;
|
||||
int type() const;
|
||||
|
||||
QList<QGraphicsItem*> findAllChildItems() const;
|
||||
|
||||
protected:
|
||||
QList<QGraphicsItem*> findAllChildItems(const QGraphicsItem *item) const;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // LIVELAYERITEM_H
|
|
@ -0,0 +1,165 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "liverubberbandselectionmanipulator_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QtGui/QGraphicsItem>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
LiveRubberBandSelectionManipulator::LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem,
|
||||
QDeclarativeViewObserver *editorView)
|
||||
: m_selectionRectangleElement(layerItem),
|
||||
m_editorView(editorView),
|
||||
m_beginFormEditorItem(0),
|
||||
m_isActive(false)
|
||||
{
|
||||
m_selectionRectangleElement.hide();
|
||||
}
|
||||
|
||||
void LiveRubberBandSelectionManipulator::clear()
|
||||
{
|
||||
m_selectionRectangleElement.clear();
|
||||
m_isActive = false;
|
||||
m_beginPoint = QPointF();
|
||||
m_itemList.clear();
|
||||
m_oldSelectionList.clear();
|
||||
}
|
||||
|
||||
QGraphicsItem *LiveRubberBandSelectionManipulator::topFormEditorItem(const QList<QGraphicsItem*>
|
||||
&itemList)
|
||||
{
|
||||
if (itemList.isEmpty())
|
||||
return 0;
|
||||
|
||||
return itemList.first();
|
||||
}
|
||||
|
||||
void LiveRubberBandSelectionManipulator::begin(const QPointF &beginPoint)
|
||||
{
|
||||
m_beginPoint = beginPoint;
|
||||
m_selectionRectangleElement.setRect(m_beginPoint, m_beginPoint);
|
||||
m_selectionRectangleElement.show();
|
||||
m_isActive = true;
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(m_editorView);
|
||||
m_beginFormEditorItem = topFormEditorItem(observerPrivate->selectableItems(beginPoint));
|
||||
m_oldSelectionList = m_editorView->selectedItems();
|
||||
}
|
||||
|
||||
void LiveRubberBandSelectionManipulator::update(const QPointF &updatePoint)
|
||||
{
|
||||
m_selectionRectangleElement.setRect(m_beginPoint, updatePoint);
|
||||
}
|
||||
|
||||
void LiveRubberBandSelectionManipulator::end()
|
||||
{
|
||||
m_oldSelectionList.clear();
|
||||
m_selectionRectangleElement.hide();
|
||||
m_isActive = false;
|
||||
}
|
||||
|
||||
void LiveRubberBandSelectionManipulator::select(SelectionType selectionType)
|
||||
{
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(m_editorView);
|
||||
QList<QGraphicsItem*> itemList
|
||||
= observerPrivate->selectableItems(m_selectionRectangleElement.rect(),
|
||||
Qt::IntersectsItemShape);
|
||||
QList<QGraphicsItem*> newSelectionList;
|
||||
|
||||
foreach (QGraphicsItem* item, itemList) {
|
||||
if (item
|
||||
&& item->parentItem()
|
||||
&& !newSelectionList.contains(item)
|
||||
//&& m_beginFormEditorItem->childItems().contains(item) // TODO activate this test
|
||||
)
|
||||
{
|
||||
newSelectionList.append(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (newSelectionList.isEmpty() && m_beginFormEditorItem)
|
||||
newSelectionList.append(m_beginFormEditorItem);
|
||||
|
||||
QList<QGraphicsItem*> resultList;
|
||||
|
||||
switch (selectionType) {
|
||||
case AddToSelection: {
|
||||
resultList.append(m_oldSelectionList);
|
||||
resultList.append(newSelectionList);
|
||||
}
|
||||
break;
|
||||
case ReplaceSelection: {
|
||||
resultList.append(newSelectionList);
|
||||
}
|
||||
break;
|
||||
case RemoveFromSelection: {
|
||||
QSet<QGraphicsItem*> oldSelectionSet(m_oldSelectionList.toSet());
|
||||
QSet<QGraphicsItem*> newSelectionSet(newSelectionList.toSet());
|
||||
resultList.append(oldSelectionSet.subtract(newSelectionSet).toList());
|
||||
}
|
||||
}
|
||||
|
||||
m_editorView->setSelectedItems(resultList);
|
||||
}
|
||||
|
||||
|
||||
void LiveRubberBandSelectionManipulator::setItems(const QList<QGraphicsItem*> &itemList)
|
||||
{
|
||||
m_itemList = itemList;
|
||||
}
|
||||
|
||||
QPointF LiveRubberBandSelectionManipulator::beginPoint() const
|
||||
{
|
||||
return m_beginPoint;
|
||||
}
|
||||
|
||||
bool LiveRubberBandSelectionManipulator::isActive() const
|
||||
{
|
||||
return m_isActive;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,102 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef RUBBERBANDSELECTIONMANIPULATOR_H
|
||||
#define RUBBERBANDSELECTIONMANIPULATOR_H
|
||||
|
||||
#include "liveselectionrectangle_p.h"
|
||||
|
||||
#include <QtCore/QPointF>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsItem)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class LiveRubberBandSelectionManipulator
|
||||
{
|
||||
public:
|
||||
enum SelectionType {
|
||||
ReplaceSelection,
|
||||
AddToSelection,
|
||||
RemoveFromSelection
|
||||
};
|
||||
|
||||
LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem,
|
||||
QDeclarativeViewObserver *editorView);
|
||||
|
||||
void setItems(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
void begin(const QPointF& beginPoint);
|
||||
void update(const QPointF& updatePoint);
|
||||
void end();
|
||||
|
||||
void clear();
|
||||
|
||||
void select(SelectionType selectionType);
|
||||
|
||||
QPointF beginPoint() const;
|
||||
|
||||
bool isActive() const;
|
||||
|
||||
protected:
|
||||
QGraphicsItem *topFormEditorItem(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
private:
|
||||
QList<QGraphicsItem*> m_itemList;
|
||||
QList<QGraphicsItem*> m_oldSelectionList;
|
||||
LiveSelectionRectangle m_selectionRectangleElement;
|
||||
QPointF m_beginPoint;
|
||||
QDeclarativeViewObserver *m_editorView;
|
||||
QGraphicsItem *m_beginFormEditorItem;
|
||||
bool m_isActive;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // RUBBERBANDSELECTIONMANIPULATOR_H
|
|
@ -0,0 +1,148 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "liveselectionindicator_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
#include <QtGui/QGraphicsPolygonItem>
|
||||
#include <QtGui/QGraphicsObject>
|
||||
#include <QtGui/QGraphicsScene>
|
||||
#include <QtGui/QPen>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
LiveSelectionIndicator::LiveSelectionIndicator(QDeclarativeViewObserver *editorView,
|
||||
QGraphicsObject *layerItem)
|
||||
: m_layerItem(layerItem), m_view(editorView)
|
||||
{
|
||||
}
|
||||
|
||||
LiveSelectionIndicator::~LiveSelectionIndicator()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
void LiveSelectionIndicator::show()
|
||||
{
|
||||
foreach (QGraphicsPolygonItem *item, m_indicatorShapeHash.values())
|
||||
item->show();
|
||||
}
|
||||
|
||||
void LiveSelectionIndicator::hide()
|
||||
{
|
||||
foreach (QGraphicsPolygonItem *item, m_indicatorShapeHash.values())
|
||||
item->hide();
|
||||
}
|
||||
|
||||
void LiveSelectionIndicator::clear()
|
||||
{
|
||||
if (!m_layerItem.isNull()) {
|
||||
QHashIterator<QGraphicsItem*, QGraphicsPolygonItem *> iter(m_indicatorShapeHash);
|
||||
while (iter.hasNext()) {
|
||||
iter.next();
|
||||
m_layerItem.data()->scene()->removeItem(iter.value());
|
||||
delete iter.value();
|
||||
}
|
||||
}
|
||||
|
||||
m_indicatorShapeHash.clear();
|
||||
|
||||
}
|
||||
|
||||
QPolygonF LiveSelectionIndicator::addBoundingRectToPolygon(QGraphicsItem *item, QPolygonF &polygon)
|
||||
{
|
||||
// ### remove this if statement when QTBUG-12172 gets fixed
|
||||
if (item->boundingRect() != QRectF(0,0,0,0)) {
|
||||
QPolygonF bounding = item->mapToScene(item->boundingRect());
|
||||
if (bounding.isClosed()) //avoid crashes if there is an infinite scale.
|
||||
polygon = polygon.united(bounding);
|
||||
}
|
||||
|
||||
foreach (QGraphicsItem *child, item->childItems()) {
|
||||
if (!QDeclarativeViewObserverPrivate::get(m_view)->isEditorItem(child))
|
||||
addBoundingRectToPolygon(child, polygon);
|
||||
}
|
||||
return polygon;
|
||||
}
|
||||
|
||||
void LiveSelectionIndicator::setItems(const QList<QWeakPointer<QGraphicsObject> > &itemList)
|
||||
{
|
||||
clear();
|
||||
|
||||
// set selections to also all children if they are not editor items
|
||||
|
||||
foreach (const QWeakPointer<QGraphicsObject> &object, itemList) {
|
||||
if (object.isNull())
|
||||
continue;
|
||||
|
||||
QGraphicsItem *item = object.data();
|
||||
|
||||
QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem
|
||||
= new QGraphicsPolygonItem(m_layerItem.data());
|
||||
if (!m_indicatorShapeHash.contains(item)) {
|
||||
m_indicatorShapeHash.insert(item, newSelectionIndicatorGraphicsItem);
|
||||
|
||||
QPolygonF boundingShapeInSceneSpace;
|
||||
addBoundingRectToPolygon(item, boundingShapeInSceneSpace);
|
||||
|
||||
QRectF boundingRect
|
||||
= m_view->adjustToScreenBoundaries(boundingShapeInSceneSpace.boundingRect());
|
||||
QPolygonF boundingRectInLayerItemSpace = m_layerItem.data()->mapFromScene(boundingRect);
|
||||
|
||||
QPen pen;
|
||||
pen.setColor(QColor(108, 141, 221));
|
||||
newSelectionIndicatorGraphicsItem->setData(Constants::EditorItemDataKey,
|
||||
QVariant(true));
|
||||
newSelectionIndicatorGraphicsItem->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||||
newSelectionIndicatorGraphicsItem->setPolygon(boundingRectInLayerItemSpace);
|
||||
newSelectionIndicatorGraphicsItem->setPen(pen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIVESELECTIONINDICATOR_H
|
||||
#define LIVESELECTIONINDICATOR_H
|
||||
|
||||
#include <QtCore/QWeakPointer>
|
||||
#include <QtCore/QHash>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsObject;
|
||||
class QGraphicsPolygonItem;
|
||||
class QGraphicsItem;
|
||||
class QPolygonF;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class LiveSelectionIndicator
|
||||
{
|
||||
public:
|
||||
LiveSelectionIndicator(QDeclarativeViewObserver* editorView, QGraphicsObject *layerItem);
|
||||
~LiveSelectionIndicator();
|
||||
|
||||
void show();
|
||||
void hide();
|
||||
|
||||
void clear();
|
||||
|
||||
void setItems(const QList<QWeakPointer<QGraphicsObject> > &itemList);
|
||||
|
||||
private:
|
||||
QPolygonF addBoundingRectToPolygon(QGraphicsItem *item, QPolygonF &polygon);
|
||||
|
||||
private:
|
||||
QHash<QGraphicsItem*, QGraphicsPolygonItem *> m_indicatorShapeHash;
|
||||
QWeakPointer<QGraphicsObject> m_layerItem;
|
||||
QDeclarativeViewObserver *m_view;
|
||||
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // LIVESELECTIONINDICATOR_H
|
|
@ -0,0 +1,113 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "liveselectionrectangle_p.h"
|
||||
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
#include <QtGui/QPen>
|
||||
#include <QtGui/QGraphicsRectItem>
|
||||
#include <QtGui/QGraphicsObject>
|
||||
#include <QtGui/QGraphicsScene>
|
||||
|
||||
#include <QtCore/QtDebug>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class SelectionRectShape : public QGraphicsRectItem
|
||||
{
|
||||
public:
|
||||
SelectionRectShape(QGraphicsItem *parent = 0) : QGraphicsRectItem(parent) {}
|
||||
int type() const { return Constants::EditorItemType; }
|
||||
};
|
||||
|
||||
LiveSelectionRectangle::LiveSelectionRectangle(QGraphicsObject *layerItem)
|
||||
: m_controlShape(new SelectionRectShape(layerItem)),
|
||||
m_layerItem(layerItem)
|
||||
{
|
||||
m_controlShape->setPen(QPen(Qt::black));
|
||||
m_controlShape->setBrush(QColor(128, 128, 128, 50));
|
||||
}
|
||||
|
||||
LiveSelectionRectangle::~LiveSelectionRectangle()
|
||||
{
|
||||
if (m_layerItem)
|
||||
m_layerItem.data()->scene()->removeItem(m_controlShape);
|
||||
}
|
||||
|
||||
void LiveSelectionRectangle::clear()
|
||||
{
|
||||
hide();
|
||||
}
|
||||
void LiveSelectionRectangle::show()
|
||||
{
|
||||
m_controlShape->show();
|
||||
}
|
||||
|
||||
void LiveSelectionRectangle::hide()
|
||||
{
|
||||
m_controlShape->hide();
|
||||
}
|
||||
|
||||
QRectF LiveSelectionRectangle::rect() const
|
||||
{
|
||||
return m_controlShape->mapFromScene(m_controlShape->rect()).boundingRect();
|
||||
}
|
||||
|
||||
void LiveSelectionRectangle::setRect(const QPointF &firstPoint,
|
||||
const QPointF &secondPoint)
|
||||
{
|
||||
double firstX = std::floor(firstPoint.x()) + 0.5;
|
||||
double firstY = std::floor(firstPoint.y()) + 0.5;
|
||||
double secondX = std::floor(secondPoint.x()) + 0.5;
|
||||
double secondY = std::floor(secondPoint.y()) + 0.5;
|
||||
QPointF topLeftPoint(firstX < secondX ? firstX : secondX,
|
||||
firstY < secondY ? firstY : secondY);
|
||||
QPointF bottomRightPoint(firstX > secondX ? firstX : secondX,
|
||||
firstY > secondY ? firstY : secondY);
|
||||
|
||||
QRectF rect(topLeftPoint, bottomRightPoint);
|
||||
m_controlShape->setRect(rect);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,83 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIVESELECTIONRECTANGLE_H
|
||||
#define LIVESELECTIONRECTANGLE_H
|
||||
|
||||
#include <QtCore/QWeakPointer>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsObject)
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsRectItem)
|
||||
QT_FORWARD_DECLARE_CLASS(QPointF)
|
||||
QT_FORWARD_DECLARE_CLASS(QRectF)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class LiveSelectionRectangle
|
||||
{
|
||||
public:
|
||||
LiveSelectionRectangle(QGraphicsObject *layerItem);
|
||||
~LiveSelectionRectangle();
|
||||
|
||||
void show();
|
||||
void hide();
|
||||
|
||||
void clear();
|
||||
|
||||
void setRect(const QPointF &firstPoint,
|
||||
const QPointF &secondPoint);
|
||||
|
||||
QRectF rect() const;
|
||||
|
||||
private:
|
||||
QGraphicsRectItem *m_controlShape;
|
||||
QWeakPointer<QGraphicsObject> m_layerItem;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // LIVESELECTIONRECTANGLE_H
|
|
@ -0,0 +1,442 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "liveselectiontool_p.h"
|
||||
#include "livelayeritem_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QWheelEvent>
|
||||
#include <QtGui/QMouseEvent>
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtGui/QMenu>
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QGraphicsObject>
|
||||
|
||||
#include <QtDeclarative/QDeclarativeItem>
|
||||
#include <QtDeclarative/QDeclarativeEngine>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
LiveSelectionTool::LiveSelectionTool(QDeclarativeViewObserver *editorView) :
|
||||
AbstractLiveEditTool(editorView),
|
||||
m_rubberbandSelectionMode(false),
|
||||
m_rubberbandSelectionManipulator(
|
||||
QDeclarativeViewObserverPrivate::get(editorView)->manipulatorLayer, editorView),
|
||||
m_singleSelectionManipulator(editorView),
|
||||
m_selectionIndicator(editorView,
|
||||
QDeclarativeViewObserverPrivate::get(editorView)->manipulatorLayer),
|
||||
//m_resizeIndicator(editorView->manipulatorLayer()),
|
||||
m_selectOnlyContentItems(true)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LiveSelectionTool::~LiveSelectionTool()
|
||||
{
|
||||
}
|
||||
|
||||
void LiveSelectionTool::setRubberbandSelectionMode(bool value)
|
||||
{
|
||||
m_rubberbandSelectionMode = value;
|
||||
}
|
||||
|
||||
LiveSingleSelectionManipulator::SelectionType LiveSelectionTool::getSelectionType(Qt::KeyboardModifiers
|
||||
modifiers)
|
||||
{
|
||||
LiveSingleSelectionManipulator::SelectionType selectionType
|
||||
= LiveSingleSelectionManipulator::ReplaceSelection;
|
||||
if (modifiers.testFlag(Qt::ControlModifier)) {
|
||||
selectionType = LiveSingleSelectionManipulator::RemoveFromSelection;
|
||||
} else if (modifiers.testFlag(Qt::ShiftModifier)) {
|
||||
selectionType = LiveSingleSelectionManipulator::AddToSelection;
|
||||
}
|
||||
return selectionType;
|
||||
}
|
||||
|
||||
bool LiveSelectionTool::alreadySelected(const QList<QGraphicsItem*> &itemList) const
|
||||
{
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(observer());
|
||||
const QList<QGraphicsItem*> selectedItems = observerPrivate->selectedItems();
|
||||
|
||||
if (selectedItems.isEmpty())
|
||||
return false;
|
||||
|
||||
foreach (QGraphicsItem *item, itemList)
|
||||
if (selectedItems.contains(item))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LiveSelectionTool::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(observer());
|
||||
QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(event->pos());
|
||||
LiveSingleSelectionManipulator::SelectionType selectionType = getSelectionType(event->modifiers());
|
||||
|
||||
if (event->buttons() & Qt::LeftButton) {
|
||||
m_mousePressTimer.start();
|
||||
|
||||
if (m_rubberbandSelectionMode) {
|
||||
m_rubberbandSelectionManipulator.begin(event->pos());
|
||||
} else {
|
||||
m_singleSelectionManipulator.begin(event->pos());
|
||||
m_singleSelectionManipulator.select(selectionType, m_selectOnlyContentItems);
|
||||
}
|
||||
} else if (event->buttons() & Qt::RightButton) {
|
||||
createContextMenu(itemList, event->globalPos());
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::createContextMenu(QList<QGraphicsItem*> itemList, QPoint globalPos)
|
||||
{
|
||||
if (!QDeclarativeViewObserverPrivate::get(observer())->mouseInsideContextItem())
|
||||
return;
|
||||
|
||||
QMenu contextMenu;
|
||||
connect(&contextMenu, SIGNAL(hovered(QAction*)),
|
||||
this, SLOT(contextMenuElementHovered(QAction*)));
|
||||
|
||||
m_contextMenuItemList = itemList;
|
||||
|
||||
contextMenu.addAction(tr("Items"));
|
||||
contextMenu.addSeparator();
|
||||
int shortcutKey = Qt::Key_1;
|
||||
bool addKeySequence = true;
|
||||
int i = 0;
|
||||
|
||||
foreach (QGraphicsItem * const item, itemList) {
|
||||
QString itemTitle = titleForItem(item);
|
||||
QAction *elementAction = contextMenu.addAction(itemTitle, this,
|
||||
SLOT(contextMenuElementSelected()));
|
||||
|
||||
if (observer()->selectedItems().contains(item)) {
|
||||
QFont boldFont = elementAction->font();
|
||||
boldFont.setBold(true);
|
||||
elementAction->setFont(boldFont);
|
||||
}
|
||||
|
||||
elementAction->setData(i);
|
||||
if (addKeySequence)
|
||||
elementAction->setShortcut(QKeySequence(shortcutKey));
|
||||
|
||||
shortcutKey++;
|
||||
if (shortcutKey > Qt::Key_9)
|
||||
addKeySequence = false;
|
||||
|
||||
++i;
|
||||
}
|
||||
// add root item separately
|
||||
// QString itemTitle = QString(tr("%1")).arg(titleForItem(view()->currentRootItem()));
|
||||
// contextMenu.addAction(itemTitle, this, SLOT(contextMenuElementSelected()));
|
||||
// m_contextMenuItemList.append(view()->currentRootItem());
|
||||
|
||||
contextMenu.exec(globalPos);
|
||||
m_contextMenuItemList.clear();
|
||||
}
|
||||
|
||||
void LiveSelectionTool::contextMenuElementSelected()
|
||||
{
|
||||
QAction *senderAction = static_cast<QAction*>(sender());
|
||||
int itemListIndex = senderAction->data().toInt();
|
||||
if (itemListIndex >= 0 && itemListIndex < m_contextMenuItemList.length()) {
|
||||
|
||||
QPointF updatePt(0, 0);
|
||||
QGraphicsItem *item = m_contextMenuItemList.at(itemListIndex);
|
||||
m_singleSelectionManipulator.begin(updatePt);
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection,
|
||||
QList<QGraphicsItem*>() << item,
|
||||
false);
|
||||
m_singleSelectionManipulator.end(updatePt);
|
||||
enterContext(item);
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::contextMenuElementHovered(QAction *action)
|
||||
{
|
||||
int itemListIndex = action->data().toInt();
|
||||
if (itemListIndex >= 0 && itemListIndex < m_contextMenuItemList.length()) {
|
||||
QGraphicsObject *item = m_contextMenuItemList.at(itemListIndex)->toGraphicsObject();
|
||||
QDeclarativeViewObserverPrivate::get(observer())->highlight(item);
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (m_singleSelectionManipulator.isActive()) {
|
||||
QPointF mouseMovementVector = m_singleSelectionManipulator.beginPoint() - event->pos();
|
||||
|
||||
if ((mouseMovementVector.toPoint().manhattanLength() > Constants::DragStartDistance)
|
||||
&& (m_mousePressTimer.elapsed() > Constants::DragStartTime))
|
||||
{
|
||||
m_singleSelectionManipulator.end(event->pos());
|
||||
//view()->changeToMoveTool(m_singleSelectionManipulator.beginPoint());
|
||||
return;
|
||||
}
|
||||
} else if (m_rubberbandSelectionManipulator.isActive()) {
|
||||
QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->pos();
|
||||
|
||||
if ((mouseMovementVector.toPoint().manhattanLength() > Constants::DragStartDistance)
|
||||
&& (m_mousePressTimer.elapsed() > Constants::DragStartTime)) {
|
||||
m_rubberbandSelectionManipulator.update(event->pos());
|
||||
|
||||
if (event->modifiers().testFlag(Qt::ControlModifier))
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::RemoveFromSelection);
|
||||
else if (event->modifiers().testFlag(Qt::ShiftModifier))
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::AddToSelection);
|
||||
else
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::ReplaceSelection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::hoverMoveEvent(QMouseEvent * event)
|
||||
{
|
||||
// ### commented out until move tool is re-enabled
|
||||
// QList<QGraphicsItem*> itemList = view()->items(event->pos());
|
||||
// if (!itemList.isEmpty() && !m_rubberbandSelectionMode) {
|
||||
//
|
||||
// foreach (QGraphicsItem *item, itemList) {
|
||||
// if (item->type() == Constants::ResizeHandleItemType) {
|
||||
// ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(item);
|
||||
// if (resizeHandle)
|
||||
// view()->changeTool(Constants::ResizeToolMode);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// if (topSelectedItemIsMovable(itemList))
|
||||
// view()->changeTool(Constants::MoveToolMode);
|
||||
// }
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(observer());
|
||||
|
||||
QList<QGraphicsItem*> selectableItemList = observerPrivate->selectableItems(event->pos());
|
||||
if (!selectableItemList.isEmpty()) {
|
||||
QGraphicsObject *item = selectableItemList.first()->toGraphicsObject();
|
||||
if (item)
|
||||
QDeclarativeViewObserverPrivate::get(observer())->highlight(item);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
QDeclarativeViewObserverPrivate::get(observer())->clearHighlight();
|
||||
}
|
||||
|
||||
void LiveSelectionTool::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (m_singleSelectionManipulator.isActive()) {
|
||||
m_singleSelectionManipulator.end(event->pos());
|
||||
}
|
||||
else if (m_rubberbandSelectionManipulator.isActive()) {
|
||||
|
||||
QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->pos();
|
||||
if (mouseMovementVector.toPoint().manhattanLength() < Constants::DragStartDistance) {
|
||||
m_singleSelectionManipulator.begin(event->pos());
|
||||
|
||||
if (event->modifiers().testFlag(Qt::ControlModifier))
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::RemoveFromSelection,
|
||||
m_selectOnlyContentItems);
|
||||
else if (event->modifiers().testFlag(Qt::ShiftModifier))
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::AddToSelection,
|
||||
m_selectOnlyContentItems);
|
||||
else
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection,
|
||||
m_selectOnlyContentItems);
|
||||
|
||||
m_singleSelectionManipulator.end(event->pos());
|
||||
} else {
|
||||
m_rubberbandSelectionManipulator.update(event->pos());
|
||||
|
||||
if (event->modifiers().testFlag(Qt::ControlModifier))
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::RemoveFromSelection);
|
||||
else if (event->modifiers().testFlag(Qt::ShiftModifier))
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::AddToSelection);
|
||||
else
|
||||
m_rubberbandSelectionManipulator.select(
|
||||
LiveRubberBandSelectionManipulator::ReplaceSelection);
|
||||
|
||||
m_rubberbandSelectionManipulator.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::mouseDoubleClickEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void LiveSelectionTool::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
switch (event->key()) {
|
||||
case Qt::Key_Left:
|
||||
case Qt::Key_Right:
|
||||
case Qt::Key_Up:
|
||||
case Qt::Key_Down:
|
||||
// disabled for now, cannot move stuff yet.
|
||||
//view()->changeTool(Constants::MoveToolMode);
|
||||
//view()->currentTool()->keyPressEvent(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void LiveSelectionTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LiveSelectionTool::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
if (event->orientation() == Qt::Horizontal || m_rubberbandSelectionMode)
|
||||
return;
|
||||
|
||||
QDeclarativeViewObserverPrivate *observerPrivate
|
||||
= QDeclarativeViewObserverPrivate::get(observer());
|
||||
QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(event->pos());
|
||||
|
||||
if (itemList.isEmpty())
|
||||
return;
|
||||
|
||||
int selectedIdx = 0;
|
||||
if (!observer()->selectedItems().isEmpty()) {
|
||||
selectedIdx = itemList.indexOf(observer()->selectedItems().first());
|
||||
if (selectedIdx >= 0) {
|
||||
if (event->delta() > 0) {
|
||||
selectedIdx++;
|
||||
if (selectedIdx == itemList.length())
|
||||
selectedIdx = 0;
|
||||
} else if (event->delta() < 0) {
|
||||
selectedIdx--;
|
||||
if (selectedIdx == -1)
|
||||
selectedIdx = itemList.length() - 1;
|
||||
}
|
||||
} else {
|
||||
selectedIdx = 0;
|
||||
}
|
||||
}
|
||||
|
||||
QPointF updatePt(0, 0);
|
||||
m_singleSelectionManipulator.begin(updatePt);
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::ReplaceSelection,
|
||||
QList<QGraphicsItem*>() << itemList.at(selectedIdx),
|
||||
false);
|
||||
m_singleSelectionManipulator.end(updatePt);
|
||||
|
||||
}
|
||||
|
||||
void LiveSelectionTool::setSelectOnlyContentItems(bool selectOnlyContentItems)
|
||||
{
|
||||
m_selectOnlyContentItems = selectOnlyContentItems;
|
||||
}
|
||||
|
||||
void LiveSelectionTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void LiveSelectionTool::clear()
|
||||
{
|
||||
view()->setCursor(Qt::ArrowCursor);
|
||||
m_rubberbandSelectionManipulator.clear(),
|
||||
m_singleSelectionManipulator.clear();
|
||||
m_selectionIndicator.clear();
|
||||
//m_resizeIndicator.clear();
|
||||
}
|
||||
|
||||
void LiveSelectionTool::selectedItemsChanged(const QList<QGraphicsItem*> &itemList)
|
||||
{
|
||||
foreach (const QWeakPointer<QGraphicsObject> &obj, m_selectedItemList) {
|
||||
if (!obj.isNull()) {
|
||||
disconnect(obj.data(), SIGNAL(xChanged()), this, SLOT(repaintBoundingRects()));
|
||||
disconnect(obj.data(), SIGNAL(yChanged()), this, SLOT(repaintBoundingRects()));
|
||||
disconnect(obj.data(), SIGNAL(widthChanged()), this, SLOT(repaintBoundingRects()));
|
||||
disconnect(obj.data(), SIGNAL(heightChanged()), this, SLOT(repaintBoundingRects()));
|
||||
disconnect(obj.data(), SIGNAL(rotationChanged()), this, SLOT(repaintBoundingRects()));
|
||||
}
|
||||
}
|
||||
|
||||
QList<QGraphicsObject*> objects = toGraphicsObjectList(itemList);
|
||||
m_selectedItemList.clear();
|
||||
|
||||
foreach (QGraphicsObject *obj, objects) {
|
||||
m_selectedItemList.append(obj);
|
||||
connect(obj, SIGNAL(xChanged()), this, SLOT(repaintBoundingRects()));
|
||||
connect(obj, SIGNAL(yChanged()), this, SLOT(repaintBoundingRects()));
|
||||
connect(obj, SIGNAL(widthChanged()), this, SLOT(repaintBoundingRects()));
|
||||
connect(obj, SIGNAL(heightChanged()), this, SLOT(repaintBoundingRects()));
|
||||
connect(obj, SIGNAL(rotationChanged()), this, SLOT(repaintBoundingRects()));
|
||||
}
|
||||
|
||||
m_selectionIndicator.setItems(m_selectedItemList);
|
||||
//m_resizeIndicator.setItems(toGraphicsObjectList(itemList));
|
||||
}
|
||||
|
||||
void LiveSelectionTool::repaintBoundingRects()
|
||||
{
|
||||
m_selectionIndicator.setItems(m_selectedItemList);
|
||||
}
|
||||
|
||||
void LiveSelectionTool::selectUnderPoint(QMouseEvent *event)
|
||||
{
|
||||
m_singleSelectionManipulator.begin(event->pos());
|
||||
|
||||
if (event->modifiers().testFlag(Qt::ControlModifier))
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::RemoveFromSelection,
|
||||
m_selectOnlyContentItems);
|
||||
else if (event->modifiers().testFlag(Qt::ShiftModifier))
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::AddToSelection,
|
||||
m_selectOnlyContentItems);
|
||||
else
|
||||
m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection,
|
||||
m_selectOnlyContentItems);
|
||||
|
||||
m_singleSelectionManipulator.end(event->pos());
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,126 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIVESELECTIONTOOL_H
|
||||
#define LIVESELECTIONTOOL_H
|
||||
|
||||
#include "abstractliveedittool_p.h"
|
||||
#include "liverubberbandselectionmanipulator_p.h"
|
||||
#include "livesingleselectionmanipulator_p.h"
|
||||
#include "liveselectionindicator_p.h"
|
||||
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QTime>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsItem)
|
||||
QT_FORWARD_DECLARE_CLASS(QMouseEvent)
|
||||
QT_FORWARD_DECLARE_CLASS(QKeyEvent)
|
||||
QT_FORWARD_DECLARE_CLASS(QAction)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class LiveSelectionTool : public AbstractLiveEditTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LiveSelectionTool(QDeclarativeViewObserver* editorView);
|
||||
~LiveSelectionTool();
|
||||
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
void hoverMoveEvent(QMouseEvent *event);
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *keyEvent);
|
||||
void wheelEvent(QWheelEvent *event);
|
||||
|
||||
void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList);
|
||||
// QVariant itemChange(const QList<QGraphicsItem*> &itemList,
|
||||
// QGraphicsItem::GraphicsItemChange change,
|
||||
// const QVariant &value );
|
||||
|
||||
// void update();
|
||||
|
||||
void clear();
|
||||
|
||||
void selectedItemsChanged(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
void selectUnderPoint(QMouseEvent *event);
|
||||
|
||||
void setSelectOnlyContentItems(bool selectOnlyContentItems);
|
||||
|
||||
void setRubberbandSelectionMode(bool value);
|
||||
|
||||
private slots:
|
||||
void contextMenuElementSelected();
|
||||
void contextMenuElementHovered(QAction *action);
|
||||
void repaintBoundingRects();
|
||||
|
||||
private:
|
||||
void createContextMenu(QList<QGraphicsItem*> itemList, QPoint globalPos);
|
||||
LiveSingleSelectionManipulator::SelectionType getSelectionType(Qt::KeyboardModifiers modifiers);
|
||||
bool alreadySelected(const QList<QGraphicsItem*> &itemList) const;
|
||||
|
||||
private:
|
||||
bool m_rubberbandSelectionMode;
|
||||
LiveRubberBandSelectionManipulator m_rubberbandSelectionManipulator;
|
||||
LiveSingleSelectionManipulator m_singleSelectionManipulator;
|
||||
LiveSelectionIndicator m_selectionIndicator;
|
||||
//ResizeIndicator m_resizeIndicator;
|
||||
QTime m_mousePressTimer;
|
||||
bool m_selectOnlyContentItems;
|
||||
|
||||
QList<QWeakPointer<QGraphicsObject> > m_selectedItemList;
|
||||
|
||||
QList<QGraphicsItem*> m_contextMenuItemList;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // LIVESELECTIONTOOL_H
|
|
@ -0,0 +1,151 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "livesingleselectionmanipulator_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QtDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
LiveSingleSelectionManipulator::LiveSingleSelectionManipulator(QDeclarativeViewObserver *editorView)
|
||||
: m_editorView(editorView),
|
||||
m_isActive(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void LiveSingleSelectionManipulator::begin(const QPointF &beginPoint)
|
||||
{
|
||||
m_beginPoint = beginPoint;
|
||||
m_isActive = true;
|
||||
m_oldSelectionList = QDeclarativeViewObserverPrivate::get(m_editorView)->selectedItems();
|
||||
}
|
||||
|
||||
void LiveSingleSelectionManipulator::update(const QPointF &/*updatePoint*/)
|
||||
{
|
||||
m_oldSelectionList.clear();
|
||||
}
|
||||
|
||||
void LiveSingleSelectionManipulator::clear()
|
||||
{
|
||||
m_beginPoint = QPointF();
|
||||
m_oldSelectionList.clear();
|
||||
}
|
||||
|
||||
|
||||
void LiveSingleSelectionManipulator::end(const QPointF &/*updatePoint*/)
|
||||
{
|
||||
m_oldSelectionList.clear();
|
||||
m_isActive = false;
|
||||
}
|
||||
|
||||
void LiveSingleSelectionManipulator::select(SelectionType selectionType,
|
||||
const QList<QGraphicsItem*> &items,
|
||||
bool /*selectOnlyContentItems*/)
|
||||
{
|
||||
QGraphicsItem *selectedItem = 0;
|
||||
|
||||
foreach (QGraphicsItem* item, items)
|
||||
{
|
||||
//FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
|
||||
if (item
|
||||
/*&& !formEditorItem->qmlItemNode().isRootNode()
|
||||
&& (formEditorItem->qmlItemNode().hasShowContent() || !selectOnlyContentItems)*/)
|
||||
{
|
||||
selectedItem = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QList<QGraphicsItem*> resultList;
|
||||
|
||||
switch (selectionType) {
|
||||
case AddToSelection: {
|
||||
resultList.append(m_oldSelectionList);
|
||||
if (selectedItem && !m_oldSelectionList.contains(selectedItem))
|
||||
resultList.append(selectedItem);
|
||||
}
|
||||
break;
|
||||
case ReplaceSelection: {
|
||||
if (selectedItem)
|
||||
resultList.append(selectedItem);
|
||||
}
|
||||
break;
|
||||
case RemoveFromSelection: {
|
||||
resultList.append(m_oldSelectionList);
|
||||
if (selectedItem)
|
||||
resultList.removeAll(selectedItem);
|
||||
}
|
||||
break;
|
||||
case InvertSelection: {
|
||||
if (selectedItem
|
||||
&& !m_oldSelectionList.contains(selectedItem))
|
||||
{
|
||||
resultList.append(selectedItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_editorView->setSelectedItems(resultList);
|
||||
}
|
||||
|
||||
void LiveSingleSelectionManipulator::select(SelectionType selectionType, bool selectOnlyContentItems)
|
||||
{
|
||||
QDeclarativeViewObserverPrivate *observerPrivate =
|
||||
QDeclarativeViewObserverPrivate::get(m_editorView);
|
||||
QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(m_beginPoint);
|
||||
select(selectionType, itemList, selectOnlyContentItems);
|
||||
}
|
||||
|
||||
|
||||
bool LiveSingleSelectionManipulator::isActive() const
|
||||
{
|
||||
return m_isActive;
|
||||
}
|
||||
|
||||
QPointF LiveSingleSelectionManipulator::beginPoint() const
|
||||
{
|
||||
return m_beginPoint;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,95 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef LIVESINGLESELECTIONMANIPULATOR_H
|
||||
#define LIVESINGLESELECTIONMANIPULATOR_H
|
||||
|
||||
#include <QtCore/QPointF>
|
||||
#include <QtCore/QList>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsItem)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class LiveSingleSelectionManipulator
|
||||
{
|
||||
public:
|
||||
LiveSingleSelectionManipulator(QDeclarativeViewObserver *editorView);
|
||||
|
||||
enum SelectionType {
|
||||
ReplaceSelection,
|
||||
AddToSelection,
|
||||
RemoveFromSelection,
|
||||
InvertSelection
|
||||
};
|
||||
|
||||
void begin(const QPointF& beginPoint);
|
||||
void update(const QPointF& updatePoint);
|
||||
void end(const QPointF& updatePoint);
|
||||
|
||||
void select(SelectionType selectionType, const QList<QGraphicsItem*> &items,
|
||||
bool selectOnlyContentItems);
|
||||
void select(SelectionType selectionType, bool selectOnlyContentItems);
|
||||
|
||||
void clear();
|
||||
|
||||
QPointF beginPoint() const;
|
||||
|
||||
bool isActive() const;
|
||||
|
||||
private:
|
||||
QList<QGraphicsItem*> m_oldSelectionList;
|
||||
QPointF m_beginPoint;
|
||||
QDeclarativeViewObserver *m_editorView;
|
||||
bool m_isActive;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // LIVESINGLESELECTIONMANIPULATOR_H
|
|
@ -0,0 +1,328 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qmltoolbar_p.h"
|
||||
#include "toolbarcolorbox_p.h"
|
||||
|
||||
#include <QtGui/QLabel>
|
||||
#include <QtGui/QIcon>
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QMenu>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QmlToolBar::QmlToolBar(QWidget *parent)
|
||||
: QToolBar(parent)
|
||||
, m_emitSignals(true)
|
||||
, m_paused(false)
|
||||
, m_animationSpeed(1.0f)
|
||||
, ui(new Ui)
|
||||
{
|
||||
ui->playIcon = QIcon(QLatin1String(":/qml/images/play-24.png"));
|
||||
ui->pauseIcon = QIcon(QLatin1String(":/qml/images/pause-24.png"));
|
||||
|
||||
ui->designmode = new QAction(QIcon(QLatin1String(":/qml/images/observermode-24.png")),
|
||||
tr("Observer Mode"), this);
|
||||
ui->play = new QAction(ui->pauseIcon, tr("Play/Pause Animations"), this);
|
||||
ui->select = new QAction(QIcon(QLatin1String(":/qml/images/select-24.png")), tr("Select"), this);
|
||||
ui->selectMarquee = new QAction(QIcon(QLatin1String(":/qml/images/select-marquee-24.png")),
|
||||
tr("Select (Marquee)"), this);
|
||||
ui->zoom = new QAction(QIcon(QLatin1String(":/qml/images/zoom-24.png")), tr("Zoom"), this);
|
||||
ui->colorPicker = new QAction(QIcon(QLatin1String(":/qml/images/color-picker-24.png")),
|
||||
tr("Color Picker"), this);
|
||||
ui->toQml = new QAction(QIcon(QLatin1String(":/qml/images/to-qml-24.png")),
|
||||
tr("Apply Changes to QML Viewer"), this);
|
||||
ui->fromQml = new QAction(QIcon(QLatin1String(":/qml/images/from-qml-24.png")),
|
||||
tr("Apply Changes to Document"), this);
|
||||
ui->designmode->setCheckable(true);
|
||||
ui->designmode->setChecked(false);
|
||||
|
||||
ui->play->setCheckable(false);
|
||||
ui->select->setCheckable(true);
|
||||
ui->selectMarquee->setCheckable(true);
|
||||
ui->zoom->setCheckable(true);
|
||||
ui->colorPicker->setCheckable(true);
|
||||
|
||||
setWindowTitle(tr("Tools"));
|
||||
|
||||
addAction(ui->designmode);
|
||||
addAction(ui->play);
|
||||
addSeparator();
|
||||
|
||||
addAction(ui->select);
|
||||
// disabled because multi selection does not do anything useful without design mode
|
||||
//addAction(ui->selectMarquee);
|
||||
addSeparator();
|
||||
addAction(ui->zoom);
|
||||
addAction(ui->colorPicker);
|
||||
//addAction(ui->fromQml);
|
||||
|
||||
ui->colorBox = new ToolBarColorBox(this);
|
||||
ui->colorBox->setMinimumSize(24, 24);
|
||||
ui->colorBox->setMaximumSize(28, 28);
|
||||
ui->colorBox->setColor(Qt::black);
|
||||
addWidget(ui->colorBox);
|
||||
|
||||
setWindowFlags(Qt::Tool);
|
||||
|
||||
QMenu *playSpeedMenu = new QMenu(this);
|
||||
ui->playSpeedMenuActions = new QActionGroup(this);
|
||||
ui->playSpeedMenuActions->setExclusive(true);
|
||||
|
||||
QAction *speedAction = playSpeedMenu->addAction(tr("1x"), this, SLOT(changeAnimationSpeed()));
|
||||
speedAction->setCheckable(true);
|
||||
speedAction->setChecked(true);
|
||||
speedAction->setData(1.0f);
|
||||
ui->playSpeedMenuActions->addAction(speedAction);
|
||||
|
||||
speedAction = playSpeedMenu->addAction(tr("0.5x"), this, SLOT(changeAnimationSpeed()));
|
||||
speedAction->setCheckable(true);
|
||||
speedAction->setData(2.0f);
|
||||
ui->playSpeedMenuActions->addAction(speedAction);
|
||||
|
||||
speedAction = playSpeedMenu->addAction(tr("0.25x"), this, SLOT(changeAnimationSpeed()));
|
||||
speedAction->setCheckable(true);
|
||||
speedAction->setData(4.0f);
|
||||
ui->playSpeedMenuActions->addAction(speedAction);
|
||||
|
||||
speedAction = playSpeedMenu->addAction(tr("0.125x"), this, SLOT(changeAnimationSpeed()));
|
||||
speedAction->setCheckable(true);
|
||||
speedAction->setData(8.0f);
|
||||
ui->playSpeedMenuActions->addAction(speedAction);
|
||||
|
||||
speedAction = playSpeedMenu->addAction(tr("0.1x"), this, SLOT(changeAnimationSpeed()));
|
||||
speedAction->setCheckable(true);
|
||||
speedAction->setData(10.0f);
|
||||
ui->playSpeedMenuActions->addAction(speedAction);
|
||||
|
||||
ui->play->setMenu(playSpeedMenu);
|
||||
|
||||
connect(ui->designmode, SIGNAL(toggled(bool)), SLOT(setDesignModeBehaviorOnClick(bool)));
|
||||
|
||||
connect(ui->colorPicker, SIGNAL(triggered()), SLOT(activateColorPickerOnClick()));
|
||||
|
||||
connect(ui->play, SIGNAL(triggered()), SLOT(activatePlayOnClick()));
|
||||
|
||||
connect(ui->zoom, SIGNAL(triggered()), SLOT(activateZoomOnClick()));
|
||||
connect(ui->colorPicker, SIGNAL(triggered()), SLOT(activateColorPickerOnClick()));
|
||||
connect(ui->select, SIGNAL(triggered()), SLOT(activateSelectToolOnClick()));
|
||||
connect(ui->selectMarquee, SIGNAL(triggered()), SLOT(activateMarqueeSelectToolOnClick()));
|
||||
|
||||
connect(ui->toQml, SIGNAL(triggered()), SLOT(activateToQml()));
|
||||
connect(ui->fromQml, SIGNAL(triggered()), SLOT(activateFromQml()));
|
||||
}
|
||||
|
||||
QmlToolBar::~QmlToolBar()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void QmlToolBar::activateColorPicker()
|
||||
{
|
||||
m_emitSignals = false;
|
||||
activateColorPickerOnClick();
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::activateSelectTool()
|
||||
{
|
||||
m_emitSignals = false;
|
||||
activateSelectToolOnClick();
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::activateMarqueeSelectTool()
|
||||
{
|
||||
m_emitSignals = false;
|
||||
activateMarqueeSelectToolOnClick();
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::activateZoom()
|
||||
{
|
||||
m_emitSignals = false;
|
||||
activateZoomOnClick();
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::setAnimationSpeed(qreal slowDownFactor)
|
||||
{
|
||||
if (m_animationSpeed == slowDownFactor)
|
||||
return;
|
||||
|
||||
m_emitSignals = false;
|
||||
m_animationSpeed = slowDownFactor;
|
||||
|
||||
foreach (QAction *action, ui->playSpeedMenuActions->actions()) {
|
||||
if (action->data().toReal() == slowDownFactor) {
|
||||
action->setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::setAnimationPaused(bool paused)
|
||||
{
|
||||
if (m_paused == paused)
|
||||
return;
|
||||
|
||||
m_paused = paused;
|
||||
updatePlayAction();
|
||||
}
|
||||
|
||||
void QmlToolBar::changeAnimationSpeed()
|
||||
{
|
||||
QAction *action = qobject_cast<QAction*>(sender());
|
||||
m_animationSpeed = action->data().toReal();
|
||||
emit animationSpeedChanged(m_animationSpeed);
|
||||
}
|
||||
|
||||
void QmlToolBar::setDesignModeBehavior(bool inDesignMode)
|
||||
{
|
||||
m_emitSignals = false;
|
||||
ui->designmode->setChecked(inDesignMode);
|
||||
setDesignModeBehaviorOnClick(inDesignMode);
|
||||
m_emitSignals = true;
|
||||
}
|
||||
|
||||
void QmlToolBar::setDesignModeBehaviorOnClick(bool checked)
|
||||
{
|
||||
ui->select->setEnabled(checked);
|
||||
ui->selectMarquee->setEnabled(checked);
|
||||
ui->zoom->setEnabled(checked);
|
||||
ui->colorPicker->setEnabled(checked);
|
||||
ui->toQml->setEnabled(checked);
|
||||
ui->fromQml->setEnabled(checked);
|
||||
|
||||
if (m_emitSignals)
|
||||
emit designModeBehaviorChanged(checked);
|
||||
}
|
||||
|
||||
void QmlToolBar::setColorBoxColor(const QColor &color)
|
||||
{
|
||||
ui->colorBox->setColor(color);
|
||||
}
|
||||
|
||||
void QmlToolBar::activatePlayOnClick()
|
||||
{
|
||||
m_paused = !m_paused;
|
||||
emit animationPausedChanged(m_paused);
|
||||
updatePlayAction();
|
||||
}
|
||||
|
||||
void QmlToolBar::updatePlayAction()
|
||||
{
|
||||
ui->play->setIcon(m_paused ? ui->playIcon : ui->pauseIcon);
|
||||
}
|
||||
|
||||
void QmlToolBar::activateColorPickerOnClick()
|
||||
{
|
||||
ui->zoom->setChecked(false);
|
||||
ui->select->setChecked(false);
|
||||
ui->selectMarquee->setChecked(false);
|
||||
|
||||
ui->colorPicker->setChecked(true);
|
||||
if (m_activeTool != Constants::ColorPickerMode) {
|
||||
m_activeTool = Constants::ColorPickerMode;
|
||||
if (m_emitSignals)
|
||||
emit colorPickerSelected();
|
||||
}
|
||||
}
|
||||
|
||||
void QmlToolBar::activateSelectToolOnClick()
|
||||
{
|
||||
ui->zoom->setChecked(false);
|
||||
ui->selectMarquee->setChecked(false);
|
||||
ui->colorPicker->setChecked(false);
|
||||
|
||||
ui->select->setChecked(true);
|
||||
if (m_activeTool != Constants::SelectionToolMode) {
|
||||
m_activeTool = Constants::SelectionToolMode;
|
||||
if (m_emitSignals)
|
||||
emit selectToolSelected();
|
||||
}
|
||||
}
|
||||
|
||||
void QmlToolBar::activateMarqueeSelectToolOnClick()
|
||||
{
|
||||
ui->zoom->setChecked(false);
|
||||
ui->select->setChecked(false);
|
||||
ui->colorPicker->setChecked(false);
|
||||
|
||||
ui->selectMarquee->setChecked(true);
|
||||
if (m_activeTool != Constants::MarqueeSelectionToolMode) {
|
||||
m_activeTool = Constants::MarqueeSelectionToolMode;
|
||||
if (m_emitSignals)
|
||||
emit marqueeSelectToolSelected();
|
||||
}
|
||||
}
|
||||
|
||||
void QmlToolBar::activateZoomOnClick()
|
||||
{
|
||||
ui->select->setChecked(false);
|
||||
ui->selectMarquee->setChecked(false);
|
||||
ui->colorPicker->setChecked(false);
|
||||
|
||||
ui->zoom->setChecked(true);
|
||||
if (m_activeTool != Constants::ZoomMode) {
|
||||
m_activeTool = Constants::ZoomMode;
|
||||
if (m_emitSignals)
|
||||
emit zoomToolSelected();
|
||||
}
|
||||
}
|
||||
|
||||
void QmlToolBar::activateFromQml()
|
||||
{
|
||||
if (m_emitSignals)
|
||||
emit applyChangesFromQmlFileSelected();
|
||||
}
|
||||
|
||||
void QmlToolBar::activateToQml()
|
||||
{
|
||||
if (m_emitSignals)
|
||||
emit applyChangesToQmlFileSelected();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,138 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QMLTOOLBAR_H
|
||||
#define QMLTOOLBAR_H
|
||||
|
||||
#include <QtGui/QToolBar>
|
||||
#include <QtGui/QIcon>
|
||||
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QActionGroup)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class ToolBarColorBox;
|
||||
|
||||
class QmlToolBar : public QToolBar
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QmlToolBar(QWidget *parent = 0);
|
||||
~QmlToolBar();
|
||||
|
||||
public slots:
|
||||
void setDesignModeBehavior(bool inDesignMode);
|
||||
void setColorBoxColor(const QColor &color);
|
||||
void activateColorPicker();
|
||||
void activateSelectTool();
|
||||
void activateMarqueeSelectTool();
|
||||
void activateZoom();
|
||||
|
||||
void setAnimationSpeed(qreal slowDownFactor);
|
||||
void setAnimationPaused(bool paused);
|
||||
|
||||
signals:
|
||||
void animationSpeedChanged(qreal factor);
|
||||
void animationPausedChanged(bool paused);
|
||||
|
||||
void designModeBehaviorChanged(bool inDesignMode);
|
||||
void colorPickerSelected();
|
||||
void selectToolSelected();
|
||||
void marqueeSelectToolSelected();
|
||||
void zoomToolSelected();
|
||||
|
||||
void applyChangesToQmlFileSelected();
|
||||
void applyChangesFromQmlFileSelected();
|
||||
|
||||
private slots:
|
||||
void setDesignModeBehaviorOnClick(bool inDesignMode);
|
||||
void activatePlayOnClick();
|
||||
void activateColorPickerOnClick();
|
||||
void activateSelectToolOnClick();
|
||||
void activateMarqueeSelectToolOnClick();
|
||||
void activateZoomOnClick();
|
||||
|
||||
void activateFromQml();
|
||||
void activateToQml();
|
||||
|
||||
void changeAnimationSpeed();
|
||||
|
||||
void updatePlayAction();
|
||||
|
||||
private:
|
||||
class Ui {
|
||||
public:
|
||||
QAction *designmode;
|
||||
QAction *play;
|
||||
QAction *select;
|
||||
QAction *selectMarquee;
|
||||
QAction *zoom;
|
||||
QAction *colorPicker;
|
||||
QAction *toQml;
|
||||
QAction *fromQml;
|
||||
QIcon playIcon;
|
||||
QIcon pauseIcon;
|
||||
ToolBarColorBox *colorBox;
|
||||
|
||||
QActionGroup *playSpeedMenuActions;
|
||||
};
|
||||
|
||||
bool m_emitSignals;
|
||||
bool m_paused;
|
||||
qreal m_animationSpeed;
|
||||
|
||||
Constants::DesignTool m_activeTool;
|
||||
|
||||
Ui *ui;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QMLTOOLBAR_H
|
|
@ -0,0 +1,364 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "subcomponenteditortool_p.h"
|
||||
#include "subcomponentmasklayeritem_p.h"
|
||||
#include "livelayeritem_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QtGui/QGraphicsItem>
|
||||
#include <QtGui/QGraphicsObject>
|
||||
#include <QtGui/QMouseEvent>
|
||||
#include <QtGui/QKeyEvent>
|
||||
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
const qreal MaxOpacity = 0.5f;
|
||||
|
||||
SubcomponentEditorTool::SubcomponentEditorTool(QDeclarativeViewObserver *view)
|
||||
: AbstractLiveEditTool(view),
|
||||
m_animIncrement(0.05f),
|
||||
m_animTimer(new QTimer(this))
|
||||
{
|
||||
QDeclarativeViewObserverPrivate *observerPrivate =
|
||||
QDeclarativeViewObserverPrivate::get(view);
|
||||
m_mask = new SubcomponentMaskLayerItem(view, observerPrivate->manipulatorLayer);
|
||||
connect(m_animTimer, SIGNAL(timeout()), SLOT(animate()));
|
||||
m_animTimer->setInterval(20);
|
||||
}
|
||||
|
||||
SubcomponentEditorTool::~SubcomponentEditorTool()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::mousePressEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::mouseMoveEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool SubcomponentEditorTool::containsCursor(const QPoint &mousePos) const
|
||||
{
|
||||
if (!m_currentContext.size())
|
||||
return false;
|
||||
|
||||
QPointF scenePos = view()->mapToScene(mousePos);
|
||||
QRectF itemRect = m_currentContext.top()->boundingRect()
|
||||
| m_currentContext.top()->childrenBoundingRect();
|
||||
QRectF polyRect = m_currentContext.top()->mapToScene(itemRect).boundingRect();
|
||||
|
||||
return polyRect.contains(scenePos);
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::mouseReleaseEvent(QMouseEvent * /*event*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton
|
||||
&& !containsCursor(event->pos())
|
||||
&& m_currentContext.size() > 1)
|
||||
{
|
||||
aboutToPopContext();
|
||||
}
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::hoverMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (!containsCursor(event->pos()) && m_currentContext.size() > 1) {
|
||||
QDeclarativeViewObserverPrivate::get(observer())->clearHighlight();
|
||||
}
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::wheelEvent(QWheelEvent * /*event*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::keyPressEvent(QKeyEvent * /*event*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::animate()
|
||||
{
|
||||
if (m_animIncrement > 0) {
|
||||
if (m_mask->opacity() + m_animIncrement < MaxOpacity) {
|
||||
m_mask->setOpacity(m_mask->opacity() + m_animIncrement);
|
||||
} else {
|
||||
m_animTimer->stop();
|
||||
m_mask->setOpacity(MaxOpacity);
|
||||
}
|
||||
} else {
|
||||
if (m_mask->opacity() + m_animIncrement > 0) {
|
||||
m_mask->setOpacity(m_mask->opacity() + m_animIncrement);
|
||||
} else {
|
||||
m_animTimer->stop();
|
||||
m_mask->setOpacity(0);
|
||||
popContext();
|
||||
emit contextPathChanged(m_path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::clear()
|
||||
{
|
||||
m_currentContext.clear();
|
||||
m_mask->setCurrentItem(0);
|
||||
m_animTimer->stop();
|
||||
m_mask->hide();
|
||||
m_path.clear();
|
||||
|
||||
emit contextPathChanged(m_path);
|
||||
emit cleared();
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::setCurrentItem(QGraphicsItem* contextItem)
|
||||
{
|
||||
if (!contextItem)
|
||||
return;
|
||||
|
||||
QGraphicsObject *gfxObject = contextItem->toGraphicsObject();
|
||||
if (!gfxObject)
|
||||
return;
|
||||
|
||||
//QString parentClassName = gfxObject->metaObject()->className();
|
||||
//if (parentClassName.contains(QRegExp("_QMLTYPE_\\d+")))
|
||||
|
||||
bool containsSelectableItems = false;
|
||||
foreach (QGraphicsItem *item, gfxObject->childItems()) {
|
||||
if (item->type() == Constants::EditorItemType
|
||||
|| item->type() == Constants::ResizeHandleItemType)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
containsSelectableItems = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (containsSelectableItems) {
|
||||
m_mask->setCurrentItem(gfxObject);
|
||||
m_mask->setOpacity(0);
|
||||
m_mask->show();
|
||||
m_animIncrement = 0.05f;
|
||||
m_animTimer->start();
|
||||
|
||||
QDeclarativeViewObserverPrivate::get(observer())->clearHighlight();
|
||||
observer()->setSelectedItems(QList<QGraphicsItem*>());
|
||||
|
||||
pushContext(gfxObject);
|
||||
}
|
||||
}
|
||||
|
||||
QGraphicsItem *SubcomponentEditorTool::firstChildOfContext(QGraphicsItem *item) const
|
||||
{
|
||||
if (!item)
|
||||
return 0;
|
||||
|
||||
if (isDirectChildOfContext(item))
|
||||
return item;
|
||||
|
||||
QGraphicsItem *parent = item->parentItem();
|
||||
while (parent) {
|
||||
if (isDirectChildOfContext(parent))
|
||||
return parent;
|
||||
parent = parent->parentItem();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SubcomponentEditorTool::isChildOfContext(QGraphicsItem *item) const
|
||||
{
|
||||
return (firstChildOfContext(item) != 0);
|
||||
}
|
||||
|
||||
bool SubcomponentEditorTool::isDirectChildOfContext(QGraphicsItem *item) const
|
||||
{
|
||||
return (item->parentItem() == m_currentContext.top());
|
||||
}
|
||||
|
||||
bool SubcomponentEditorTool::itemIsChildOfQmlSubComponent(QGraphicsItem *item) const
|
||||
{
|
||||
if (item->parentItem() && item->parentItem() != m_currentContext.top()) {
|
||||
QGraphicsObject *parent = item->parentItem()->toGraphicsObject();
|
||||
QString parentClassName = QLatin1String(parent->metaObject()->className());
|
||||
|
||||
if (parentClassName.contains(QRegExp(QLatin1String("_QMLTYPE_\\d+")))) {
|
||||
return true;
|
||||
} else {
|
||||
return itemIsChildOfQmlSubComponent(parent);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::pushContext(QGraphicsObject *contextItem)
|
||||
{
|
||||
connect(contextItem, SIGNAL(destroyed(QObject*)), this, SLOT(contextDestroyed(QObject*)));
|
||||
connect(contextItem, SIGNAL(xChanged()), this, SLOT(resizeMask()));
|
||||
connect(contextItem, SIGNAL(yChanged()), this, SLOT(resizeMask()));
|
||||
connect(contextItem, SIGNAL(widthChanged()), this, SLOT(resizeMask()));
|
||||
connect(contextItem, SIGNAL(heightChanged()), this, SLOT(resizeMask()));
|
||||
connect(contextItem, SIGNAL(rotationChanged()), this, SLOT(resizeMask()));
|
||||
|
||||
m_currentContext.push(contextItem);
|
||||
QString title = titleForItem(contextItem);
|
||||
emit contextPushed(title);
|
||||
|
||||
m_path << title;
|
||||
emit contextPathChanged(m_path);
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::aboutToPopContext()
|
||||
{
|
||||
if (m_currentContext.size() > 2) {
|
||||
popContext();
|
||||
emit contextPathChanged(m_path);
|
||||
} else {
|
||||
m_animIncrement = -0.05f;
|
||||
m_animTimer->start();
|
||||
}
|
||||
}
|
||||
|
||||
QGraphicsObject *SubcomponentEditorTool::popContext()
|
||||
{
|
||||
QGraphicsObject *popped = m_currentContext.pop();
|
||||
m_path.removeLast();
|
||||
|
||||
emit contextPopped();
|
||||
|
||||
disconnect(popped, SIGNAL(xChanged()), this, SLOT(resizeMask()));
|
||||
disconnect(popped, SIGNAL(yChanged()), this, SLOT(resizeMask()));
|
||||
disconnect(popped, SIGNAL(scaleChanged()), this, SLOT(resizeMask()));
|
||||
disconnect(popped, SIGNAL(widthChanged()), this, SLOT(resizeMask()));
|
||||
disconnect(popped, SIGNAL(heightChanged()), this, SLOT(resizeMask()));
|
||||
|
||||
if (m_currentContext.size() > 1) {
|
||||
QGraphicsObject *item = m_currentContext.top();
|
||||
m_mask->setCurrentItem(item);
|
||||
m_mask->setOpacity(MaxOpacity);
|
||||
m_mask->setVisible(true);
|
||||
} else {
|
||||
m_mask->setVisible(false);
|
||||
}
|
||||
|
||||
return popped;
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::resizeMask()
|
||||
{
|
||||
QGraphicsObject *item = m_currentContext.top();
|
||||
m_mask->setCurrentItem(item);
|
||||
}
|
||||
|
||||
QGraphicsObject *SubcomponentEditorTool::currentRootItem() const
|
||||
{
|
||||
return m_currentContext.top();
|
||||
}
|
||||
|
||||
void SubcomponentEditorTool::contextDestroyed(QObject *contextToDestroy)
|
||||
{
|
||||
disconnect(contextToDestroy, SIGNAL(destroyed(QObject*)),
|
||||
this, SLOT(contextDestroyed(QObject*)));
|
||||
|
||||
// pop out the whole context - it might not be safe anymore.
|
||||
while (m_currentContext.size() > 1) {
|
||||
m_currentContext.pop();
|
||||
m_path.removeLast();
|
||||
emit contextPopped();
|
||||
}
|
||||
m_mask->setVisible(false);
|
||||
|
||||
emit contextPathChanged(m_path);
|
||||
}
|
||||
|
||||
QGraphicsObject *SubcomponentEditorTool::setContext(int contextIndex)
|
||||
{
|
||||
Q_ASSERT(contextIndex >= 0);
|
||||
|
||||
// sometimes we have to delete the context while user was still clicking around,
|
||||
// so just bail out.
|
||||
if (contextIndex >= m_currentContext.size() -1)
|
||||
return 0;
|
||||
|
||||
while (m_currentContext.size() - 1 > contextIndex) {
|
||||
popContext();
|
||||
}
|
||||
emit contextPathChanged(m_path);
|
||||
|
||||
return m_currentContext.top();
|
||||
}
|
||||
|
||||
int SubcomponentEditorTool::contextIndex() const
|
||||
{
|
||||
return m_currentContext.size() - 1;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,131 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef SUBCOMPONENTEDITORTOOL_H
|
||||
#define SUBCOMPONENTEDITORTOOL_H
|
||||
|
||||
#include "abstractliveedittool_p.h"
|
||||
|
||||
#include <QtCore/QStack>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QGraphicsObject)
|
||||
QT_FORWARD_DECLARE_CLASS(QPoint)
|
||||
QT_FORWARD_DECLARE_CLASS(QTimer)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class SubcomponentMaskLayerItem;
|
||||
|
||||
class SubcomponentEditorTool : public AbstractLiveEditTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SubcomponentEditorTool(QDeclarativeViewObserver *view);
|
||||
~SubcomponentEditorTool();
|
||||
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
|
||||
void hoverMoveEvent(QMouseEvent *event);
|
||||
void wheelEvent(QWheelEvent *event);
|
||||
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *keyEvent);
|
||||
void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
void clear();
|
||||
|
||||
bool containsCursor(const QPoint &mousePos) const;
|
||||
bool itemIsChildOfQmlSubComponent(QGraphicsItem *item) const;
|
||||
|
||||
bool isChildOfContext(QGraphicsItem *item) const;
|
||||
bool isDirectChildOfContext(QGraphicsItem *item) const;
|
||||
QGraphicsItem *firstChildOfContext(QGraphicsItem *item) const;
|
||||
|
||||
void setCurrentItem(QGraphicsItem *contextObject);
|
||||
|
||||
void pushContext(QGraphicsObject *contextItem);
|
||||
|
||||
QGraphicsObject *currentRootItem() const;
|
||||
QGraphicsObject *setContext(int contextIndex);
|
||||
int contextIndex() const;
|
||||
|
||||
signals:
|
||||
void exitContextRequested();
|
||||
void cleared();
|
||||
void contextPushed(const QString &contextTitle);
|
||||
void contextPopped();
|
||||
void contextPathChanged(const QStringList &path);
|
||||
|
||||
protected:
|
||||
void selectedItemsChanged(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
private slots:
|
||||
void animate();
|
||||
void contextDestroyed(QObject *context);
|
||||
void resizeMask();
|
||||
|
||||
private:
|
||||
QGraphicsObject *popContext();
|
||||
void aboutToPopContext();
|
||||
|
||||
private:
|
||||
QStack<QGraphicsObject *> m_currentContext;
|
||||
QStringList m_path;
|
||||
|
||||
qreal m_animIncrement;
|
||||
SubcomponentMaskLayerItem *m_mask;
|
||||
QTimer *m_animTimer;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // SUBCOMPONENTEDITORTOOL_H
|
|
@ -0,0 +1,124 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "subcomponentmasklayeritem_p.h"
|
||||
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
#include "../qdeclarativeviewobserver_p.h"
|
||||
|
||||
#include <QtGui/QPolygonF>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
SubcomponentMaskLayerItem::SubcomponentMaskLayerItem(QDeclarativeViewObserver *observer,
|
||||
QGraphicsItem *parentItem) :
|
||||
QGraphicsPolygonItem(parentItem),
|
||||
m_observer(observer),
|
||||
m_currentItem(0),
|
||||
m_borderRect(new QGraphicsRectItem(this))
|
||||
{
|
||||
m_borderRect->setRect(0,0,0,0);
|
||||
m_borderRect->setPen(QPen(QColor(60, 60, 60), 1));
|
||||
m_borderRect->setData(Constants::EditorItemDataKey, QVariant(true));
|
||||
|
||||
setBrush(QBrush(QColor(160,160,160)));
|
||||
setPen(Qt::NoPen);
|
||||
}
|
||||
|
||||
int SubcomponentMaskLayerItem::type() const
|
||||
{
|
||||
return Constants::EditorItemType;
|
||||
}
|
||||
|
||||
static QRectF resizeRect(const QRectF &newRect, const QRectF &oldRect)
|
||||
{
|
||||
QRectF result = newRect;
|
||||
if (oldRect.left() < newRect.left())
|
||||
result.setLeft(oldRect.left());
|
||||
|
||||
if (oldRect.top() < newRect.top())
|
||||
result.setTop(oldRect.top());
|
||||
|
||||
if (oldRect.right() > newRect.right())
|
||||
result.setRight(oldRect.right());
|
||||
|
||||
if (oldRect.bottom() > newRect.bottom())
|
||||
result.setBottom(oldRect.bottom());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void SubcomponentMaskLayerItem::setCurrentItem(QGraphicsItem *item)
|
||||
{
|
||||
QGraphicsItem *prevItem = m_currentItem;
|
||||
m_currentItem = item;
|
||||
|
||||
if (!m_currentItem)
|
||||
return;
|
||||
|
||||
QPolygonF viewPoly(QRectF(m_observer->declarativeView()->rect()));
|
||||
viewPoly = m_observer->declarativeView()->mapToScene(viewPoly.toPolygon());
|
||||
|
||||
QRectF itemRect = item->boundingRect() | item->childrenBoundingRect();
|
||||
QPolygonF itemPoly(itemRect);
|
||||
itemPoly = item->mapToScene(itemPoly);
|
||||
|
||||
// if updating the same item as before, resize the rectangle only bigger, not smaller.
|
||||
if (prevItem == item && prevItem != 0) {
|
||||
m_itemPolyRect = resizeRect(itemPoly.boundingRect(), m_itemPolyRect);
|
||||
} else {
|
||||
m_itemPolyRect = itemPoly.boundingRect();
|
||||
}
|
||||
QRectF borderRect = m_itemPolyRect;
|
||||
borderRect.adjust(-1, -1, 1, 1);
|
||||
m_borderRect->setRect(borderRect);
|
||||
|
||||
itemPoly = viewPoly.subtracted(QPolygonF(m_itemPolyRect));
|
||||
setPolygon(itemPoly);
|
||||
}
|
||||
|
||||
QGraphicsItem *SubcomponentMaskLayerItem::currentItem() const
|
||||
{
|
||||
return m_currentItem;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,77 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef SUBCOMPONENTMASKLAYERITEM_H
|
||||
#define SUBCOMPONENTMASKLAYERITEM_H
|
||||
|
||||
#include <QtGui/QGraphicsPolygonItem>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class SubcomponentMaskLayerItem : public QGraphicsPolygonItem
|
||||
{
|
||||
public:
|
||||
explicit SubcomponentMaskLayerItem(QDeclarativeViewObserver *observer,
|
||||
QGraphicsItem *parentItem = 0);
|
||||
int type() const;
|
||||
void setCurrentItem(QGraphicsItem *item);
|
||||
void setBoundingBox(const QRectF &boundingBox);
|
||||
QGraphicsItem *currentItem() const;
|
||||
QRectF itemRect() const;
|
||||
|
||||
private:
|
||||
QDeclarativeViewObserver *m_observer;
|
||||
QGraphicsItem *m_currentItem;
|
||||
QGraphicsRectItem *m_borderRect;
|
||||
QRectF m_itemPolyRect;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // SUBCOMPONENTMASKLAYERITEM_H
|
|
@ -0,0 +1,134 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "toolbarcolorbox_p.h"
|
||||
|
||||
#include "../qmlobserverconstants_p.h"
|
||||
|
||||
#include <QtGui/QPixmap>
|
||||
#include <QtGui/QPainter>
|
||||
#include <QtGui/QMenu>
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QContextMenuEvent>
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QColorDialog>
|
||||
#include <QtGui/QDrag>
|
||||
|
||||
#include <QtCore/QMimeData>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
ToolBarColorBox::ToolBarColorBox(QWidget *parent) :
|
||||
QLabel(parent)
|
||||
{
|
||||
m_copyHexColor = new QAction(QIcon(QLatin1String(":/qml/images/color-picker-hicontrast.png")),
|
||||
tr("Copy Color"), this);
|
||||
connect(m_copyHexColor, SIGNAL(triggered()), SLOT(copyColorToClipboard()));
|
||||
setScaledContents(false);
|
||||
}
|
||||
|
||||
void ToolBarColorBox::setColor(const QColor &color)
|
||||
{
|
||||
m_color = color;
|
||||
|
||||
QPixmap pix = createDragPixmap(width());
|
||||
setPixmap(pix);
|
||||
update();
|
||||
}
|
||||
|
||||
void ToolBarColorBox::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_dragBeginPoint = event->pos();
|
||||
m_dragStarted = false;
|
||||
}
|
||||
|
||||
void ToolBarColorBox::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
|
||||
if (event->buttons() & Qt::LeftButton
|
||||
&& (QPoint(event->pos() - m_dragBeginPoint).manhattanLength()
|
||||
> Constants::DragStartDistance)
|
||||
&& !m_dragStarted)
|
||||
{
|
||||
m_dragStarted = true;
|
||||
QDrag *drag = new QDrag(this);
|
||||
QMimeData *mimeData = new QMimeData;
|
||||
|
||||
mimeData->setText(m_color.name());
|
||||
drag->setMimeData(mimeData);
|
||||
drag->setPixmap(createDragPixmap());
|
||||
|
||||
drag->exec();
|
||||
}
|
||||
}
|
||||
|
||||
QPixmap ToolBarColorBox::createDragPixmap(int size) const
|
||||
{
|
||||
QPixmap pix(size, size);
|
||||
QPainter p(&pix);
|
||||
|
||||
QColor borderColor1 = QColor(143, 143 ,143);
|
||||
QColor borderColor2 = QColor(43, 43, 43);
|
||||
|
||||
p.setBrush(QBrush(m_color));
|
||||
p.setPen(QPen(QBrush(borderColor2),1));
|
||||
|
||||
p.fillRect(0, 0, size, size, borderColor1);
|
||||
p.drawRect(1,1, size - 3, size - 3);
|
||||
return pix;
|
||||
}
|
||||
|
||||
void ToolBarColorBox::contextMenuEvent(QContextMenuEvent *ev)
|
||||
{
|
||||
QMenu contextMenu;
|
||||
contextMenu.addAction(m_copyHexColor);
|
||||
contextMenu.exec(ev->globalPos());
|
||||
}
|
||||
|
||||
void ToolBarColorBox::copyColorToClipboard()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
clipboard->setText(m_color.name());
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,87 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef TOOLBARCOLORBOX_H
|
||||
#define TOOLBARCOLORBOX_H
|
||||
|
||||
#include <QtGui/QLabel>
|
||||
#include <QtGui/QColor>
|
||||
#include <QtCore/QPoint>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QContextMenuEvent)
|
||||
QT_FORWARD_DECLARE_CLASS(QAction)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class ToolBarColorBox : public QLabel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ToolBarColorBox(QWidget *parent = 0);
|
||||
void setColor(const QColor &color);
|
||||
|
||||
protected:
|
||||
void contextMenuEvent(QContextMenuEvent *ev);
|
||||
void mousePressEvent(QMouseEvent *ev);
|
||||
void mouseMoveEvent(QMouseEvent *ev);
|
||||
private slots:
|
||||
void copyColorToClipboard();
|
||||
|
||||
private:
|
||||
QPixmap createDragPixmap(int size = 24) const;
|
||||
|
||||
private:
|
||||
bool m_dragStarted;
|
||||
QPoint m_dragBeginPoint;
|
||||
QAction *m_copyHexColor;
|
||||
QColor m_color;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // TOOLBARCOLORBOX_H
|
|
@ -0,0 +1,336 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "zoomtool_p.h"
|
||||
|
||||
#include "../qdeclarativeviewobserver_p_p.h"
|
||||
|
||||
#include <QtGui/QMouseEvent>
|
||||
#include <QtGui/QWheelEvent>
|
||||
#include <QtGui/QKeyEvent>
|
||||
#include <QtGui/QMenu>
|
||||
#include <QtGui/QAction>
|
||||
|
||||
#include <QtCore/QRectF>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
ZoomTool::ZoomTool(QDeclarativeViewObserver *view) :
|
||||
AbstractLiveEditTool(view),
|
||||
m_rubberbandManipulator(),
|
||||
m_smoothZoomMultiplier(0.05f),
|
||||
m_currentScale(1.0f)
|
||||
{
|
||||
m_zoomTo100Action = new QAction(tr("Zoom to &100%"), this);
|
||||
m_zoomInAction = new QAction(tr("Zoom In"), this);
|
||||
m_zoomOutAction = new QAction(tr("Zoom Out"), this);
|
||||
m_zoomInAction->setShortcut(QKeySequence(Qt::Key_Plus));
|
||||
m_zoomOutAction->setShortcut(QKeySequence(Qt::Key_Minus));
|
||||
|
||||
|
||||
LiveLayerItem *layerItem = QDeclarativeViewObserverPrivate::get(view)->manipulatorLayer;
|
||||
QGraphicsObject *layerObject = reinterpret_cast<QGraphicsObject *>(layerItem);
|
||||
m_rubberbandManipulator = new LiveRubberBandSelectionManipulator(layerObject, view);
|
||||
|
||||
|
||||
connect(m_zoomTo100Action, SIGNAL(triggered()), SLOT(zoomTo100()));
|
||||
connect(m_zoomInAction, SIGNAL(triggered()), SLOT(zoomIn()));
|
||||
connect(m_zoomOutAction, SIGNAL(triggered()), SLOT(zoomOut()));
|
||||
}
|
||||
|
||||
ZoomTool::~ZoomTool()
|
||||
{
|
||||
delete m_rubberbandManipulator;
|
||||
}
|
||||
|
||||
void ZoomTool::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mousePos = event->pos();
|
||||
|
||||
QPointF scenePos = view()->mapToScene(event->pos());
|
||||
|
||||
if (event->buttons() & Qt::RightButton) {
|
||||
QMenu contextMenu;
|
||||
contextMenu.addAction(m_zoomTo100Action);
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addAction(m_zoomInAction);
|
||||
contextMenu.addAction(m_zoomOutAction);
|
||||
contextMenu.exec(event->globalPos());
|
||||
} else if (event->buttons() & Qt::LeftButton) {
|
||||
m_dragBeginPos = scenePos;
|
||||
m_dragStarted = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ZoomTool::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mousePos = event->pos();
|
||||
|
||||
QPointF scenePos = view()->mapToScene(event->pos());
|
||||
|
||||
if (event->buttons() & Qt::LeftButton
|
||||
&& (QPointF(scenePos - m_dragBeginPos).manhattanLength()
|
||||
> Constants::DragStartDistance / 3)
|
||||
&& !m_dragStarted)
|
||||
{
|
||||
m_dragStarted = true;
|
||||
m_rubberbandManipulator->begin(m_dragBeginPos);
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_dragStarted)
|
||||
m_rubberbandManipulator->update(scenePos);
|
||||
|
||||
}
|
||||
|
||||
void ZoomTool::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mousePos = event->pos();
|
||||
QPointF scenePos = view()->mapToScene(event->pos());
|
||||
|
||||
if (m_dragStarted) {
|
||||
m_rubberbandManipulator->end();
|
||||
|
||||
int x1 = qMin(scenePos.x(), m_rubberbandManipulator->beginPoint().x());
|
||||
int x2 = qMax(scenePos.x(), m_rubberbandManipulator->beginPoint().x());
|
||||
int y1 = qMin(scenePos.y(), m_rubberbandManipulator->beginPoint().y());
|
||||
int y2 = qMax(scenePos.y(), m_rubberbandManipulator->beginPoint().y());
|
||||
|
||||
QPointF scenePosTopLeft = QPoint(x1, y1);
|
||||
QPointF scenePosBottomRight = QPoint(x2, y2);
|
||||
|
||||
QRectF sceneArea(scenePosTopLeft, scenePosBottomRight);
|
||||
|
||||
m_currentScale = qMin(view()->rect().width() / sceneArea.width(),
|
||||
view()->rect().height() / sceneArea.height());
|
||||
|
||||
|
||||
QTransform transform;
|
||||
transform.scale(m_currentScale, m_currentScale);
|
||||
|
||||
view()->setTransform(transform);
|
||||
view()->setSceneRect(sceneArea);
|
||||
} else {
|
||||
Qt::KeyboardModifier modifierKey = Qt::ControlModifier;
|
||||
#ifdef Q_WS_MAC
|
||||
modifierKey = Qt::AltModifier;
|
||||
#endif
|
||||
if (event->modifiers() & modifierKey) {
|
||||
zoomOut();
|
||||
} else {
|
||||
zoomIn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ZoomTool::zoomIn()
|
||||
{
|
||||
m_currentScale = nextZoomScale(ZoomIn);
|
||||
scaleView(view()->mapToScene(m_mousePos));
|
||||
}
|
||||
|
||||
void ZoomTool::zoomOut()
|
||||
{
|
||||
m_currentScale = nextZoomScale(ZoomOut);
|
||||
scaleView(view()->mapToScene(m_mousePos));
|
||||
}
|
||||
|
||||
void ZoomTool::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mousePos = event->pos();
|
||||
}
|
||||
|
||||
|
||||
void ZoomTool::hoverMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mousePos = event->pos();
|
||||
}
|
||||
|
||||
|
||||
void ZoomTool::keyPressEvent(QKeyEvent * /*event*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ZoomTool::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
if (event->orientation() != Qt::Vertical)
|
||||
return;
|
||||
|
||||
Qt::KeyboardModifier smoothZoomModifier = Qt::ControlModifier;
|
||||
if (event->modifiers() & smoothZoomModifier) {
|
||||
int numDegrees = event->delta() / 8;
|
||||
m_currentScale += m_smoothZoomMultiplier * (numDegrees / 15.0f);
|
||||
|
||||
scaleView(view()->mapToScene(m_mousePos));
|
||||
|
||||
} else if (!event->modifiers()) {
|
||||
if (event->delta() > 0) {
|
||||
m_currentScale = nextZoomScale(ZoomIn);
|
||||
} else if (event->delta() < 0) {
|
||||
m_currentScale = nextZoomScale(ZoomOut);
|
||||
}
|
||||
scaleView(view()->mapToScene(m_mousePos));
|
||||
}
|
||||
}
|
||||
|
||||
void ZoomTool::keyReleaseEvent(QKeyEvent *event)
|
||||
{
|
||||
switch (event->key()) {
|
||||
case Qt::Key_Plus:
|
||||
zoomIn();
|
||||
break;
|
||||
case Qt::Key_Minus:
|
||||
zoomOut();
|
||||
break;
|
||||
case Qt::Key_1:
|
||||
case Qt::Key_2:
|
||||
case Qt::Key_3:
|
||||
case Qt::Key_4:
|
||||
case Qt::Key_5:
|
||||
case Qt::Key_6:
|
||||
case Qt::Key_7:
|
||||
case Qt::Key_8:
|
||||
case Qt::Key_9:
|
||||
{
|
||||
m_currentScale = ((event->key() - Qt::Key_0) * 1.0f);
|
||||
scaleView(view()->mapToScene(m_mousePos)); // view()->mapToScene(view()->rect().center())
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ZoomTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ZoomTool::clear()
|
||||
{
|
||||
view()->setCursor(Qt::ArrowCursor);
|
||||
}
|
||||
|
||||
void ZoomTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void ZoomTool::scaleView(const QPointF ¢erPos)
|
||||
{
|
||||
|
||||
QTransform transform;
|
||||
transform.scale(m_currentScale, m_currentScale);
|
||||
view()->setTransform(transform);
|
||||
|
||||
QPointF adjustedCenterPos = centerPos;
|
||||
QSize rectSize(view()->rect().width() / m_currentScale,
|
||||
view()->rect().height() / m_currentScale);
|
||||
|
||||
QRectF sceneRect;
|
||||
if (qAbs(m_currentScale - 1.0f) < Constants::ZoomSnapDelta) {
|
||||
adjustedCenterPos.rx() = rectSize.width() / 2;
|
||||
adjustedCenterPos.ry() = rectSize.height() / 2;
|
||||
}
|
||||
|
||||
if (m_currentScale < 1.0f) {
|
||||
adjustedCenterPos.rx() = rectSize.width() / 2;
|
||||
adjustedCenterPos.ry() = rectSize.height() / 2;
|
||||
sceneRect.setRect(view()->rect().width() / 2 -rectSize.width() / 2,
|
||||
view()->rect().height() / 2 -rectSize.height() / 2,
|
||||
rectSize.width(),
|
||||
rectSize.height());
|
||||
} else {
|
||||
sceneRect.setRect(adjustedCenterPos.x() - rectSize.width() / 2,
|
||||
adjustedCenterPos.y() - rectSize.height() / 2,
|
||||
rectSize.width(),
|
||||
rectSize.height());
|
||||
}
|
||||
|
||||
view()->setSceneRect(sceneRect);
|
||||
}
|
||||
|
||||
void ZoomTool::zoomTo100()
|
||||
{
|
||||
m_currentScale = 1.0f;
|
||||
scaleView(view()->mapToScene(view()->rect().center()));
|
||||
}
|
||||
|
||||
qreal ZoomTool::nextZoomScale(ZoomDirection direction) const
|
||||
{
|
||||
static QList<qreal> zoomScales =
|
||||
QList<qreal>()
|
||||
<< 0.125f
|
||||
<< 1.0f / 6.0f
|
||||
<< 0.25f
|
||||
<< 1.0f / 3.0f
|
||||
<< 0.5f
|
||||
<< 2.0f / 3.0f
|
||||
<< 1.0f
|
||||
<< 2.0f
|
||||
<< 3.0f
|
||||
<< 4.0f
|
||||
<< 5.0f
|
||||
<< 6.0f
|
||||
<< 7.0f
|
||||
<< 8.0f
|
||||
<< 12.0f
|
||||
<< 16.0f
|
||||
<< 32.0f
|
||||
<< 48.0f;
|
||||
|
||||
if (direction == ZoomIn) {
|
||||
for (int i = 0; i < zoomScales.length(); ++i) {
|
||||
if (zoomScales[i] > m_currentScale || i == zoomScales.length() - 1)
|
||||
return zoomScales[i];
|
||||
}
|
||||
} else {
|
||||
for (int i = zoomScales.length() - 1; i >= 0; --i) {
|
||||
if (zoomScales[i] < m_currentScale || i == 0)
|
||||
return zoomScales[i];
|
||||
}
|
||||
}
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
|
@ -0,0 +1,113 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ZOOMTOOL_H
|
||||
#define ZOOMTOOL_H
|
||||
|
||||
#include "abstractliveedittool_p.h"
|
||||
#include "liverubberbandselectionmanipulator_p.h"
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QAction)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class ZoomTool : public AbstractLiveEditTool
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum ZoomDirection {
|
||||
ZoomIn,
|
||||
ZoomOut
|
||||
};
|
||||
|
||||
explicit ZoomTool(QDeclarativeViewObserver *view);
|
||||
|
||||
virtual ~ZoomTool();
|
||||
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
|
||||
void hoverMoveEvent(QMouseEvent *event);
|
||||
void wheelEvent(QWheelEvent *event);
|
||||
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *keyEvent);
|
||||
void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
void clear();
|
||||
|
||||
protected:
|
||||
void selectedItemsChanged(const QList<QGraphicsItem*> &itemList);
|
||||
|
||||
private slots:
|
||||
void zoomTo100();
|
||||
void zoomIn();
|
||||
void zoomOut();
|
||||
|
||||
private:
|
||||
qreal nextZoomScale(ZoomDirection direction) const;
|
||||
void scaleView(const QPointF ¢erPos);
|
||||
|
||||
private:
|
||||
bool m_dragStarted;
|
||||
QPoint m_mousePos; // in view coords
|
||||
QPointF m_dragBeginPos;
|
||||
QAction *m_zoomTo100Action;
|
||||
QAction *m_zoomInAction;
|
||||
QAction *m_zoomOutAction;
|
||||
LiveRubberBandSelectionManipulator *m_rubberbandManipulator;
|
||||
|
||||
qreal m_smoothZoomMultiplier;
|
||||
qreal m_currentScale;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // ZOOMTOOL_H
|
|
@ -0,0 +1,81 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qdeclarativeobserverplugin.h"
|
||||
|
||||
#include "qdeclarativeviewobserver_p.h"
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
#include <QtDeclarative/private/qdeclarativeobserverservice_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QDeclarativeObserverPlugin::QDeclarativeObserverPlugin() :
|
||||
m_observer(0)
|
||||
{
|
||||
}
|
||||
|
||||
QDeclarativeObserverPlugin::~QDeclarativeObserverPlugin()
|
||||
{
|
||||
delete m_observer;
|
||||
}
|
||||
|
||||
void QDeclarativeObserverPlugin::activate()
|
||||
{
|
||||
QDeclarativeObserverService *service = QDeclarativeObserverService::instance();
|
||||
QList<QDeclarativeView*> views = service->views();
|
||||
if (views.isEmpty())
|
||||
return;
|
||||
|
||||
// TODO: Support multiple views
|
||||
QDeclarativeView *view = service->views().at(0);
|
||||
m_observer = new QDeclarativeViewObserver(view, view);
|
||||
}
|
||||
|
||||
void QDeclarativeObserverPlugin::deactivate()
|
||||
{
|
||||
delete m_observer;
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN2(declarativeobserver, QDeclarativeObserverPlugin)
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEOBSERVERPLUGIN_H
|
||||
#define QDECLARATIVEOBSERVERPLUGIN_H
|
||||
|
||||
#include <QtCore/QPointer>
|
||||
#include <QtDeclarative/private/qdeclarativeobserverinterface_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
|
||||
class QDeclarativeObserverPlugin : public QObject, public QDeclarativeObserverInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY(QDeclarativeObserverPlugin)
|
||||
Q_INTERFACES(QDeclarativeObserverInterface)
|
||||
|
||||
public:
|
||||
QDeclarativeObserverPlugin();
|
||||
~QDeclarativeObserverPlugin();
|
||||
|
||||
void activate();
|
||||
void deactivate();
|
||||
|
||||
private:
|
||||
QPointer<QDeclarativeViewObserver> m_observer;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QDECLARATIVEOBSERVERPLUGIN_H
|
|
@ -0,0 +1,145 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEOBSERVERPROTOCOL_H
|
||||
#define QDECLARATIVEOBSERVERPROTOCOL_H
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QMetaType>
|
||||
#include <QtCore/QMetaEnum>
|
||||
#include <QtCore/QObject>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class ObserverProtocol : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_ENUMS(Message Tool)
|
||||
|
||||
public:
|
||||
enum Message {
|
||||
AnimationSpeedChanged = 0,
|
||||
AnimationPausedChanged = 19, // highest value
|
||||
ChangeTool = 1,
|
||||
ClearComponentCache = 2,
|
||||
ColorChanged = 3,
|
||||
ContextPathUpdated = 4,
|
||||
CreateObject = 5,
|
||||
CurrentObjectsChanged = 6,
|
||||
DestroyObject = 7,
|
||||
MoveObject = 8,
|
||||
ObjectIdList = 9,
|
||||
Reload = 10,
|
||||
Reloaded = 11,
|
||||
SetAnimationSpeed = 12,
|
||||
SetAnimationPaused = 18,
|
||||
SetContextPathIdx = 13,
|
||||
SetCurrentObjects = 14,
|
||||
SetDesignMode = 15,
|
||||
ShowAppOnTop = 16,
|
||||
ToolChanged = 17
|
||||
};
|
||||
|
||||
enum Tool {
|
||||
ColorPickerTool,
|
||||
SelectMarqueeTool,
|
||||
SelectTool,
|
||||
ZoomTool
|
||||
};
|
||||
|
||||
static inline QString toString(Message message)
|
||||
{
|
||||
return QLatin1String(staticMetaObject.enumerator(0).valueToKey(message));
|
||||
}
|
||||
|
||||
static inline QString toString(Tool tool)
|
||||
{
|
||||
return QLatin1String(staticMetaObject.enumerator(1).valueToKey(tool));
|
||||
}
|
||||
};
|
||||
|
||||
inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Message message)
|
||||
{
|
||||
return stream << static_cast<quint32>(message);
|
||||
}
|
||||
|
||||
inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Message &message)
|
||||
{
|
||||
quint32 i;
|
||||
stream >> i;
|
||||
message = static_cast<ObserverProtocol::Message>(i);
|
||||
return stream;
|
||||
}
|
||||
|
||||
inline QDebug operator<< (QDebug dbg, ObserverProtocol::Message message)
|
||||
{
|
||||
dbg << ObserverProtocol::toString(message);
|
||||
return dbg;
|
||||
}
|
||||
|
||||
inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Tool tool)
|
||||
{
|
||||
return stream << static_cast<quint32>(tool);
|
||||
}
|
||||
|
||||
inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Tool &tool)
|
||||
{
|
||||
quint32 i;
|
||||
stream >> i;
|
||||
tool = static_cast<ObserverProtocol::Tool>(i);
|
||||
return stream;
|
||||
}
|
||||
|
||||
inline QDebug operator<< (QDebug dbg, ObserverProtocol::Tool tool)
|
||||
{
|
||||
dbg << ObserverProtocol::toString(tool);
|
||||
return dbg;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QDECLARATIVEOBSERVERPROTOCOL_H
|
|
@ -0,0 +1,154 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEVIEWOBSERVER_P_H
|
||||
#define QDECLARATIVEVIEWOBSERVER_P_H
|
||||
|
||||
#include <private/qdeclarativeglobal_p.h>
|
||||
#include "qmlobserverconstants_p.h"
|
||||
|
||||
#include <QtCore/QScopedPointer>
|
||||
#include <QtDeclarative/QDeclarativeView>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QDeclarativeItem)
|
||||
QT_FORWARD_DECLARE_CLASS(QMouseEvent)
|
||||
QT_FORWARD_DECLARE_CLASS(QToolBar)
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserverPrivate;
|
||||
|
||||
class QDeclarativeViewObserver : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QDeclarativeViewObserver(QDeclarativeView *view, QObject *parent = 0);
|
||||
~QDeclarativeViewObserver();
|
||||
|
||||
void setSelectedItems(QList<QGraphicsItem *> items);
|
||||
QList<QGraphicsItem *> selectedItems() const;
|
||||
|
||||
QDeclarativeView *declarativeView();
|
||||
|
||||
QRectF adjustToScreenBoundaries(const QRectF &boundingRectInSceneSpace);
|
||||
|
||||
bool showAppOnTop() const;
|
||||
|
||||
void sendDesignModeBehavior(bool inDesignMode);
|
||||
void sendCurrentObjects(QList<QObject*> items);
|
||||
void sendAnimationSpeed(qreal slowDownFactor);
|
||||
void sendAnimationPaused(bool paused);
|
||||
void sendCurrentTool(Constants::DesignTool toolId);
|
||||
void sendReloaded();
|
||||
void sendShowAppOnTop(bool showAppOnTop);
|
||||
|
||||
QString idStringForObject(QObject *obj) const;
|
||||
|
||||
public Q_SLOTS:
|
||||
void sendColorChanged(const QColor &color);
|
||||
void sendContextPathUpdated(const QStringList &contextPath);
|
||||
|
||||
void setDesignModeBehavior(bool value);
|
||||
bool designModeBehavior();
|
||||
|
||||
void setShowAppOnTop(bool appOnTop);
|
||||
|
||||
void setAnimationSpeed(qreal factor);
|
||||
void setAnimationPaused(bool paused);
|
||||
|
||||
void setObserverContext(int contextIndex);
|
||||
|
||||
Q_SIGNALS:
|
||||
void designModeBehaviorChanged(bool inDesignMode);
|
||||
void showAppOnTopChanged(bool showAppOnTop);
|
||||
void reloadRequested();
|
||||
void marqueeSelectToolActivated();
|
||||
void selectToolActivated();
|
||||
void zoomToolActivated();
|
||||
void colorPickerActivated();
|
||||
void selectedColorChanged(const QColor &color);
|
||||
|
||||
void animationSpeedChanged(qreal factor);
|
||||
void animationPausedChanged(bool paused);
|
||||
|
||||
void inspectorContextCleared();
|
||||
void inspectorContextPushed(const QString &contextTitle);
|
||||
void inspectorContextPopped();
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *obj, QEvent *event);
|
||||
|
||||
bool leaveEvent(QEvent *);
|
||||
bool mousePressEvent(QMouseEvent *event);
|
||||
bool mouseMoveEvent(QMouseEvent *event);
|
||||
bool mouseReleaseEvent(QMouseEvent *event);
|
||||
bool keyPressEvent(QKeyEvent *event);
|
||||
bool keyReleaseEvent(QKeyEvent *keyEvent);
|
||||
bool mouseDoubleClickEvent(QMouseEvent *event);
|
||||
bool wheelEvent(QWheelEvent *event);
|
||||
|
||||
void setSelectedItemsForTools(QList<QGraphicsItem *> items);
|
||||
|
||||
private slots:
|
||||
void handleMessage(const QByteArray &message);
|
||||
|
||||
void animationSpeedChangeRequested(qreal factor);
|
||||
void animationPausedChangeRequested(bool paused);
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(QDeclarativeViewObserver)
|
||||
|
||||
inline QDeclarativeViewObserverPrivate *d_func() { return data.data(); }
|
||||
QScopedPointer<QDeclarativeViewObserverPrivate> data;
|
||||
friend class QDeclarativeViewObserverPrivate;
|
||||
friend class AbstractLiveEditTool;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QDECLARATIVEVIEWOBSERVER_P_H
|
|
@ -0,0 +1,165 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDECLARATIVEVIEWOBSERVER_P_P_H
|
||||
#define QDECLARATIVEVIEWOBSERVER_P_P_H
|
||||
|
||||
#include "qdeclarativeviewobserver_p.h"
|
||||
|
||||
#include <QtCore/QWeakPointer>
|
||||
#include <QtCore/QPointF>
|
||||
|
||||
#include "QtDeclarative/private/qdeclarativeobserverservice_p.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
class QDeclarativeViewObserver;
|
||||
class LiveSelectionTool;
|
||||
class ZoomTool;
|
||||
class ColorPickerTool;
|
||||
class LiveLayerItem;
|
||||
class BoundingRectHighlighter;
|
||||
class SubcomponentEditorTool;
|
||||
class ToolBox;
|
||||
class AbstractLiveEditTool;
|
||||
|
||||
class QDeclarativeViewObserverPrivate : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum ContextFlags {
|
||||
IgnoreContext,
|
||||
ContextSensitive
|
||||
};
|
||||
|
||||
QDeclarativeViewObserverPrivate(QDeclarativeViewObserver *);
|
||||
~QDeclarativeViewObserverPrivate();
|
||||
|
||||
QDeclarativeView *view;
|
||||
QDeclarativeViewObserver *q;
|
||||
QDeclarativeObserverService *debugService;
|
||||
QWeakPointer<QWidget> viewport;
|
||||
QHash<int, QString> stringIdForObjectId;
|
||||
|
||||
QPointF cursorPos;
|
||||
QList<QWeakPointer<QGraphicsObject> > currentSelection;
|
||||
|
||||
Constants::DesignTool currentToolMode;
|
||||
AbstractLiveEditTool *currentTool;
|
||||
|
||||
LiveSelectionTool *selectionTool;
|
||||
ZoomTool *zoomTool;
|
||||
ColorPickerTool *colorPickerTool;
|
||||
SubcomponentEditorTool *subcomponentEditorTool;
|
||||
LiveLayerItem *manipulatorLayer;
|
||||
|
||||
BoundingRectHighlighter *boundingRectHighlighter;
|
||||
|
||||
bool designModeBehavior;
|
||||
bool showAppOnTop;
|
||||
|
||||
bool animationPaused;
|
||||
qreal slowDownFactor;
|
||||
|
||||
ToolBox *toolBox;
|
||||
|
||||
void setViewport(QWidget *widget);
|
||||
|
||||
void clearEditorItems();
|
||||
void createToolBox();
|
||||
void changeToSelectTool();
|
||||
QList<QGraphicsItem*> filterForCurrentContext(QList<QGraphicsItem*> &itemlist) const;
|
||||
QList<QGraphicsItem*> filterForSelection(QList<QGraphicsItem*> &itemlist) const;
|
||||
|
||||
QList<QGraphicsItem*> selectableItems(const QPoint &pos) const;
|
||||
QList<QGraphicsItem*> selectableItems(const QPointF &scenePos) const;
|
||||
QList<QGraphicsItem*> selectableItems(const QRectF &sceneRect, Qt::ItemSelectionMode selectionMode) const;
|
||||
|
||||
void setSelectedItemsForTools(QList<QGraphicsItem *> items);
|
||||
void setSelectedItems(QList<QGraphicsItem *> items);
|
||||
QList<QGraphicsItem *> selectedItems() const;
|
||||
|
||||
void changeTool(Constants::DesignTool tool,
|
||||
Constants::ToolFlags flags = Constants::NoToolFlags);
|
||||
|
||||
void clearHighlight();
|
||||
void highlight(QList<QGraphicsObject *> item, ContextFlags flags = ContextSensitive);
|
||||
void highlight(QGraphicsObject *item, ContextFlags flags = ContextSensitive);
|
||||
|
||||
bool mouseInsideContextItem() const;
|
||||
bool isEditorItem(QGraphicsItem *item) const;
|
||||
|
||||
QGraphicsItem *currentRootItem() const;
|
||||
|
||||
void enterContext(QGraphicsItem *itemToEnter);
|
||||
|
||||
public slots:
|
||||
void _q_setToolBoxVisible(bool visible);
|
||||
|
||||
void _q_reloadView();
|
||||
void _q_onStatusChanged(QDeclarativeView::Status status);
|
||||
void _q_onCurrentObjectsChanged(QList<QObject*> objects);
|
||||
void _q_applyChangesFromClient();
|
||||
void _q_createQmlObject(const QString &qml, QObject *parent,
|
||||
const QStringList &imports, const QString &filename = QString());
|
||||
void _q_reparentQmlObject(QObject *, QObject *);
|
||||
|
||||
void _q_changeToSingleSelectTool();
|
||||
void _q_changeToMarqueeSelectTool();
|
||||
void _q_changeToZoomTool();
|
||||
void _q_changeToColorPickerTool();
|
||||
void _q_changeContextPathIndex(int index);
|
||||
void _q_clearComponentCache();
|
||||
void _q_removeFromSelection(QObject *);
|
||||
|
||||
public:
|
||||
static QDeclarativeViewObserverPrivate *get(QDeclarativeViewObserver *v) { return v->d_func(); }
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QDECLARATIVEVIEWOBSERVER_P_P_H
|
|
@ -0,0 +1,90 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QMLOBSERVERCONSTANTS_H
|
||||
#define QMLOBSERVERCONSTANTS_H
|
||||
|
||||
#include <QtDeclarative/private/qdeclarativeglobal_p.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QT_MODULE(Declarative)
|
||||
|
||||
namespace Constants {
|
||||
|
||||
enum DesignTool {
|
||||
NoTool = 0,
|
||||
SelectionToolMode = 1,
|
||||
MarqueeSelectionToolMode = 2,
|
||||
MoveToolMode = 3,
|
||||
ResizeToolMode = 4,
|
||||
ColorPickerMode = 5,
|
||||
ZoomMode = 6
|
||||
};
|
||||
|
||||
enum ToolFlags {
|
||||
NoToolFlags = 0,
|
||||
UseCursorPos = 1
|
||||
};
|
||||
|
||||
static const int DragStartTime = 50;
|
||||
|
||||
static const int DragStartDistance = 20;
|
||||
|
||||
static const double ZoomSnapDelta = 0.04;
|
||||
|
||||
static const int EditorItemDataKey = 1000;
|
||||
|
||||
enum GraphicsItemTypes {
|
||||
EditorItemType = 0xEAAA,
|
||||
ResizeHandleItemType = 0xEAEA
|
||||
};
|
||||
|
||||
|
||||
} // namespace Constants
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QMLOBSERVERCONSTANTS_H
|
|
@ -109,6 +109,12 @@ void QmlOstPlugin::disconnect()
|
|||
d->protocol = 0;
|
||||
}
|
||||
|
||||
bool QmlOstPlugin::waitForMessage()
|
||||
{
|
||||
Q_D(QmlOstPlugin);
|
||||
return d->protocol->waitForReadyRead(-1);
|
||||
}
|
||||
|
||||
void QmlOstPlugin::setPort(int port, bool block)
|
||||
{
|
||||
Q_UNUSED(port);
|
||||
|
|
|
@ -68,6 +68,7 @@ public:
|
|||
bool isConnected() const;
|
||||
void send(const QByteArray &message);
|
||||
void disconnect();
|
||||
bool waitForMessage();
|
||||
|
||||
private Q_SLOTS:
|
||||
void readyRead();
|
||||
|
|
|
@ -57,6 +57,8 @@ public:
|
|||
Cancel();
|
||||
}
|
||||
|
||||
TInt& AoFlags() { return ((TInt*)&iStatus)[1]; }
|
||||
|
||||
private:
|
||||
void RunL();
|
||||
void DoCancel();
|
||||
|
@ -65,6 +67,7 @@ private:
|
|||
RUsbOstComm ost;
|
||||
TBuf8<4096> readBuf;
|
||||
QByteArray dataBuf;
|
||||
TBool inReadyRead;
|
||||
};
|
||||
|
||||
QOstDevice::QOstDevice(QObject *parent) :
|
||||
|
@ -116,7 +119,11 @@ void QOstDevicePrivate::RunL()
|
|||
ost.ReadMessage(iStatus, readBuf);
|
||||
SetActive();
|
||||
|
||||
emit q->readyRead();
|
||||
if (!inReadyRead) {
|
||||
inReadyRead = true;
|
||||
emit q->readyRead();
|
||||
inReadyRead = false;
|
||||
}
|
||||
} else {
|
||||
q->setErrorString(QString("Error %1 from RUsbOstComm::ReadMessage()").arg(iStatus.Int()));
|
||||
}
|
||||
|
@ -178,3 +185,36 @@ qint64 QOstDevice::bytesAvailable() const
|
|||
Q_D(const QOstDevice);
|
||||
return d->dataBuf.length();
|
||||
}
|
||||
|
||||
bool QOstDevice::waitForReadyRead(int msecs)
|
||||
{
|
||||
Q_D(QOstDevice);
|
||||
if (msecs >= 0) {
|
||||
RTimer timer;
|
||||
TInt err = timer.CreateLocal();
|
||||
if (err) return false;
|
||||
TRequestStatus timeoutStat;
|
||||
timer.After(timeoutStat, msecs*1000);
|
||||
User::WaitForRequest(timeoutStat, d->iStatus);
|
||||
if (timeoutStat != KRequestPending) {
|
||||
// Timed out
|
||||
timer.Close();
|
||||
return false;
|
||||
} else {
|
||||
// We got data, so cancel timer
|
||||
timer.Cancel();
|
||||
User::WaitForRequest(timeoutStat);
|
||||
timer.Close();
|
||||
// And drop through
|
||||
}
|
||||
} else {
|
||||
// Just wait forever for data
|
||||
User::WaitForRequest(d->iStatus);
|
||||
}
|
||||
|
||||
// If we get here we have data
|
||||
TInt err = d->iStatus.Int();
|
||||
d->AoFlags() &= ~3; // This is necessary to clean up the scheduler as you're not supposed to bypass it like this
|
||||
TRAP_IGNORE(d->RunL());
|
||||
return err == KErrNone;
|
||||
}
|
||||
|
|
|
@ -61,10 +61,12 @@ public:
|
|||
bool open(int ostProtocolId);
|
||||
void close();
|
||||
|
||||
bool waitForReadyRead(int msecs);
|
||||
qint64 bytesAvailable() const;
|
||||
|
||||
protected:
|
||||
qint64 readData(char *data, qint64 maxSize);
|
||||
qint64 writeData(const char *data, qint64 maxSize);
|
||||
qint64 bytesAvailable() const;
|
||||
|
||||
private:
|
||||
QOstDevicePrivate* d_ptr;
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
|
||||
#include "qtcpserverconnection.h"
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
#include <QtNetwork/qtcpserver.h>
|
||||
#include <QtNetwork/qtcpsocket.h>
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#ifndef QTCPSERVERCONNECTION_H
|
||||
#define QTCPSERVERCONNECTION_H
|
||||
|
||||
#include <QtGui/QStylePlugin>
|
||||
#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS = qmldbg_tcp
|
||||
SUBDIRS = qmldbg_tcp declarativeobserver
|
||||
symbian:SUBDIRS += qmldbg_ost
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
%moduleheaders = ( # restrict the module headers to those found in relative path
|
||||
);
|
||||
%classnames = (
|
||||
"qtdeclarativeversion.h" => "QtDeclarativeVersion",
|
||||
);
|
||||
%mastercontent = (
|
||||
"gui" => "#include <QtGui/QtGui>\n",
|
||||
|
|