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
|
translations/*_untranslated.ts
|
||||||
qrc_*.cpp
|
qrc_*.cpp
|
||||||
|
|
||||||
|
src/declarative/qtdeclarativeversion.h
|
||||||
|
|
||||||
# Test generated files
|
# Test generated files
|
||||||
QObject.log
|
QObject.log
|
||||||
tst_*
|
tst_*
|
||||||
|
|
|
@ -8,7 +8,10 @@ SOURCES += \
|
||||||
$$PWD/qdeclarativedebug.cpp \
|
$$PWD/qdeclarativedebug.cpp \
|
||||||
$$PWD/qdeclarativedebugtrace.cpp \
|
$$PWD/qdeclarativedebugtrace.cpp \
|
||||||
$$PWD/qdeclarativedebughelper.cpp \
|
$$PWD/qdeclarativedebughelper.cpp \
|
||||||
$$PWD/qdeclarativedebugserver.cpp
|
$$PWD/qdeclarativedebugserver.cpp \
|
||||||
|
$$PWD/qdeclarativeobserverservice.cpp \
|
||||||
|
$$PWD/qjsdebuggeragent.cpp \
|
||||||
|
$$PWD/qjsdebugservice.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/qdeclarativedebuggerstatus_p.h \
|
$$PWD/qdeclarativedebuggerstatus_p.h \
|
||||||
|
@ -20,4 +23,8 @@ HEADERS += \
|
||||||
$$PWD/qdeclarativedebugtrace_p.h \
|
$$PWD/qdeclarativedebugtrace_p.h \
|
||||||
$$PWD/qdeclarativedebughelper_p.h \
|
$$PWD/qdeclarativedebughelper_p.h \
|
||||||
$$PWD/qdeclarativedebugserver_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(','));
|
int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
|
||||||
port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
|
port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
|
||||||
pluginName = QLatin1String("qmldbg_tcp");
|
pluginName = QLatin1String("qmldbg_tcp");
|
||||||
} else if (appD->qmljsDebugArgumentsString().contains("ost")) {
|
} else if (appD->qmljsDebugArgumentsString().contains(QLatin1String("ost"))) {
|
||||||
pluginName = QLatin1String("qmldbg_ost");
|
pluginName = QLatin1String("qmldbg_ost");
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
|
@ -253,6 +253,17 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
|
||||||
int version;
|
int version;
|
||||||
in >> version >> d->clientPlugins;
|
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();
|
QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
|
||||||
for (; iter != d->plugins.end(); ++iter) {
|
for (; iter != d->plugins.end(); ++iter) {
|
||||||
QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
|
QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
|
||||||
|
@ -262,14 +273,6 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
|
||||||
iter.value()->statusChanged(newStatus);
|
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");
|
qWarning("QDeclarativeDebugServer: Connection established");
|
||||||
} else {
|
} 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)
|
include($$QT_SOURCE_TREE/src/qbase.pri)
|
||||||
|
|
||||||
|
HEADERS += qtdeclarativeversion.h
|
||||||
|
|
||||||
#INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$TARGET
|
#INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$TARGET
|
||||||
#DESTDIR=.
|
#DESTDIR=.
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextInputPrivate : public QDeclarativeImplic
|
||||||
{
|
{
|
||||||
Q_DECLARE_PUBLIC(QDeclarativeTextInput)
|
Q_DECLARE_PUBLIC(QDeclarativeTextInput)
|
||||||
public:
|
public:
|
||||||
QDeclarativeTextInputPrivate() : control(new QLineControl(QString())),
|
QDeclarativeTextInputPrivate() : control(new QLineControl),
|
||||||
color((QRgb)0), style(QDeclarativeText::Normal),
|
color((QRgb)0), style(QDeclarativeText::Normal),
|
||||||
styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
|
styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
|
||||||
mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone),
|
mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone),
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
#include "private/qdeclarativenotifier_p.h"
|
#include "private/qdeclarativenotifier_p.h"
|
||||||
#include "private/qdeclarativedebugtrace_p.h"
|
#include "private/qdeclarativedebugtrace_p.h"
|
||||||
#include "private/qdeclarativeapplication_p.h"
|
#include "private/qdeclarativeapplication_p.h"
|
||||||
|
#include "private/qjsdebugservice_p.h"
|
||||||
|
|
||||||
#include <QtCore/qmetaobject.h>
|
#include <QtCore/qmetaobject.h>
|
||||||
#include <QScriptClass>
|
#include <QScriptClass>
|
||||||
|
@ -126,7 +127,7 @@ QT_BEGIN_NAMESPACE
|
||||||
\brief The QtObject element is the most basic element in QML.
|
\brief The QtObject element is the most basic element in QML.
|
||||||
|
|
||||||
The QtObject element is a non-visual element which contains only the
|
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
|
It can be useful to create a QtObject if you need an extremely
|
||||||
lightweight element to enclose a set of custom properties:
|
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 property holds the QObject::objectName for this specific object instance.
|
||||||
|
|
||||||
This allows a C++ application to locate an item within a QML component
|
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
|
application locates the child \l Rectangle item and dynamically changes its
|
||||||
\c color value:
|
\c color value:
|
||||||
|
|
||||||
|
@ -155,7 +156,7 @@ QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: "red"
|
color: "red"
|
||||||
objectName: "myRect"
|
objectName: "myRect"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,7 +170,7 @@ QT_BEGIN_NAMESPACE
|
||||||
view.show();
|
view.show();
|
||||||
|
|
||||||
QDeclarativeItem *item = view.rootObject()->findChild<QDeclarativeItem*>("myRect");
|
QDeclarativeItem *item = view.rootObject()->findChild<QDeclarativeItem*>("myRect");
|
||||||
if (item)
|
if (item)
|
||||||
item->setProperty("color", QColor(Qt::yellow));
|
item->setProperty("color", QColor(Qt::yellow));
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -205,7 +206,7 @@ void QDeclarativeEnginePrivate::defineModule()
|
||||||
|
|
||||||
\keyword QmlGlobalQtObject
|
\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.
|
The \c Qt object is a global object with utility functions, properties and enums.
|
||||||
|
|
||||||
|
@ -594,6 +595,7 @@ void QDeclarativeEnginePrivate::init()
|
||||||
QDeclarativeEngineDebugServer::isDebuggingEnabled()) {
|
QDeclarativeEngineDebugServer::isDebuggingEnabled()) {
|
||||||
isDebugging = true;
|
isDebugging = true;
|
||||||
QDeclarativeEngineDebugServer::instance()->addEngine(q);
|
QDeclarativeEngineDebugServer::instance()->addEngine(q);
|
||||||
|
QJSDebugService::instance()->addEngine(q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,8 +658,9 @@ QDeclarativeEngine::QDeclarativeEngine(QObject *parent)
|
||||||
QDeclarativeEngine::~QDeclarativeEngine()
|
QDeclarativeEngine::~QDeclarativeEngine()
|
||||||
{
|
{
|
||||||
Q_D(QDeclarativeEngine);
|
Q_D(QDeclarativeEngine);
|
||||||
if (d->isDebugging)
|
if (d->isDebugging) {
|
||||||
QDeclarativeEngineDebugServer::instance()->remEngine(this);
|
QDeclarativeEngineDebugServer::instance()->remEngine(this);
|
||||||
|
}
|
||||||
|
|
||||||
// if we are the parent of any of the qobject module api instances,
|
// 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
|
// 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
|
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.
|
takes ownership of \a provider.
|
||||||
|
|
||||||
Image providers enable support for pixmap and threaded image
|
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));
|
rv = pf(const_cast<QObject *>(object));
|
||||||
|
|
||||||
if (rv)
|
if (rv)
|
||||||
data->attachedProperties()->insert(id, rv);
|
data->attachedProperties()->insert(id, rv);
|
||||||
|
|
||||||
return 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.
|
or \c null if an empty string was given.
|
||||||
|
|
||||||
The returned component's \l Component::status property indicates whether the
|
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.
|
see \l Component::errorString() for an error description.
|
||||||
|
|
||||||
Call \l {Component::createObject()}{Component.createObject()} on the returned
|
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)));
|
return engine->newVariant(QVariant::fromValue(date.toString(format)));
|
||||||
} else if (formatArg.isNumber()) {
|
} else if (formatArg.isNumber()) {
|
||||||
enumFormat = Qt::DateFormat(formatArg.toUInt32());
|
enumFormat = Qt::DateFormat(formatArg.toUInt32());
|
||||||
} else {
|
} else {
|
||||||
return ctxt->throwError(QLatin1String("Qt.formatDateTime(): Invalid datetime format"));
|
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.
|
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 *)
|
QScriptValue QDeclarativeEnginePrivate::btoa(QScriptContext *ctxt, QScriptEngine *)
|
||||||
{
|
{
|
||||||
if (ctxt->argumentCount() != 1)
|
if (ctxt->argumentCount() != 1)
|
||||||
return ctxt->throwError(QLatin1String("Qt.btoa(): Invalid arguments"));
|
return ctxt->throwError(QLatin1String("Qt.btoa(): Invalid arguments"));
|
||||||
|
|
||||||
QByteArray data = ctxt->argument(0).toString().toUtf8();
|
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 *)
|
QScriptValue QDeclarativeEnginePrivate::atob(QScriptContext *ctxt, QScriptEngine *)
|
||||||
{
|
{
|
||||||
if (ctxt->argumentCount() != 1)
|
if (ctxt->argumentCount() != 1)
|
||||||
return ctxt->throwError(QLatin1String("Qt.atob(): Invalid arguments"));
|
return ctxt->throwError(QLatin1String("Qt.atob(): Invalid arguments"));
|
||||||
|
|
||||||
QByteArray data = ctxt->argument(0).toString().toUtf8();
|
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)
|
QDeclarativeError &error)
|
||||||
{
|
{
|
||||||
QList<QDeclarativeType *> types;
|
QList<QDeclarativeType *> types;
|
||||||
|
@ -2421,7 +2424,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
||||||
|
|
||||||
const QMetaObject *metaObject = type->metaObject();
|
const QMetaObject *metaObject = type->metaObject();
|
||||||
while (metaObject) {
|
while (metaObject) {
|
||||||
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
|
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
|
||||||
type->majorVersion(), minorVersion);
|
type->majorVersion(), minorVersion);
|
||||||
if (t) {
|
if (t) {
|
||||||
maxMinorVersion = qMax(maxMinorVersion, t->minorVersion());
|
maxMinorVersion = qMax(maxMinorVersion, t->minorVersion());
|
||||||
|
@ -2465,7 +2468,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
||||||
|
|
||||||
// Signals override:
|
// Signals override:
|
||||||
// * other signals and methods of the same name.
|
// * other signals and methods of the same name.
|
||||||
// * properties named on<Signal Name>
|
// * properties named on<Signal Name>
|
||||||
// * automatic <property name>Changed notify signals
|
// * automatic <property name>Changed notify signals
|
||||||
|
|
||||||
// Methods override:
|
// Methods override:
|
||||||
|
@ -2490,7 +2493,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
||||||
QDeclarativePropertyCache::Data *current = d;
|
QDeclarativePropertyCache::Data *current = d;
|
||||||
while (!overloadError && current) {
|
while (!overloadError && current) {
|
||||||
current = d->overrideData(current);
|
current = d->overrideData(current);
|
||||||
if (current && raw->isAllowedInRevision(current))
|
if (current && raw->isAllowedInRevision(current))
|
||||||
overloadError = true;
|
overloadError = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2498,7 +2501,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
|
||||||
|
|
||||||
if (overloadError) {
|
if (overloadError) {
|
||||||
if (hasCopied) raw->release();
|
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."));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,6 @@ class QDeclarativeScarceResourceScriptClass;
|
||||||
class ScarceResourceData;
|
class ScarceResourceData;
|
||||||
class QDeclarativeTypeNameScriptClass;
|
class QDeclarativeTypeNameScriptClass;
|
||||||
class QDeclarativeValueTypeScriptClass;
|
class QDeclarativeValueTypeScriptClass;
|
||||||
class QScriptEngineDebugger;
|
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QDeclarativeNetworkAccessManagerFactory;
|
class QDeclarativeNetworkAccessManagerFactory;
|
||||||
|
@ -353,14 +352,14 @@ public:
|
||||||
/*!
|
/*!
|
||||||
Returns a QDeclarativePropertyCache for \a obj if one is available.
|
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.
|
is returned.
|
||||||
|
|
||||||
The returned cache is not referenced, so if it is to be stored, call addref().
|
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;
|
return 0;
|
||||||
|
|
||||||
const QMetaObject *mo = obj->metaObject();
|
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
|
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.
|
exist for the lifetime of the QDeclarativeEngine.
|
||||||
|
|
||||||
The returned cache is not referenced, so if it is to be stored, call addref().
|
The returned cache is not referenced, so if it is to be stored, call addref().
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#include <qdeclarativeguard_p.h>
|
#include <qdeclarativeguard_p.h>
|
||||||
|
|
||||||
#include <private/qdeclarativedebugtrace_p.h>
|
#include <private/qdeclarativedebugtrace_p.h>
|
||||||
|
#include <private/qdeclarativeobserverservice_p.h>
|
||||||
|
|
||||||
#include <qscriptvalueiterator.h>
|
#include <qscriptvalueiterator.h>
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
@ -299,6 +300,8 @@ void QDeclarativeViewPrivate::init()
|
||||||
q->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
|
q->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
|
||||||
q->viewport()->setAttribute(Qt::WA_NoSystemBackground);
|
q->viewport()->setAttribute(Qt::WA_NoSystemBackground);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
QDeclarativeObserverService::instance()->addView(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -306,6 +309,7 @@ void QDeclarativeViewPrivate::init()
|
||||||
*/
|
*/
|
||||||
QDeclarativeView::~QDeclarativeView()
|
QDeclarativeView::~QDeclarativeView()
|
||||||
{
|
{
|
||||||
|
QDeclarativeObserverService::instance()->removeView(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \property QDeclarativeView::source
|
/*! \property QDeclarativeView::source
|
||||||
|
@ -558,7 +562,6 @@ void QDeclarativeView::continueExecute()
|
||||||
emit statusChanged(status());
|
emit statusChanged(status());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\internal
|
\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;
|
d->protocol = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QmlOstPlugin::waitForMessage()
|
||||||
|
{
|
||||||
|
Q_D(QmlOstPlugin);
|
||||||
|
return d->protocol->waitForReadyRead(-1);
|
||||||
|
}
|
||||||
|
|
||||||
void QmlOstPlugin::setPort(int port, bool block)
|
void QmlOstPlugin::setPort(int port, bool block)
|
||||||
{
|
{
|
||||||
Q_UNUSED(port);
|
Q_UNUSED(port);
|
||||||
|
|
|
@ -68,6 +68,7 @@ public:
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
void send(const QByteArray &message);
|
void send(const QByteArray &message);
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
bool waitForMessage();
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void readyRead();
|
void readyRead();
|
||||||
|
|
|
@ -57,6 +57,8 @@ public:
|
||||||
Cancel();
|
Cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TInt& AoFlags() { return ((TInt*)&iStatus)[1]; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void RunL();
|
void RunL();
|
||||||
void DoCancel();
|
void DoCancel();
|
||||||
|
@ -65,6 +67,7 @@ private:
|
||||||
RUsbOstComm ost;
|
RUsbOstComm ost;
|
||||||
TBuf8<4096> readBuf;
|
TBuf8<4096> readBuf;
|
||||||
QByteArray dataBuf;
|
QByteArray dataBuf;
|
||||||
|
TBool inReadyRead;
|
||||||
};
|
};
|
||||||
|
|
||||||
QOstDevice::QOstDevice(QObject *parent) :
|
QOstDevice::QOstDevice(QObject *parent) :
|
||||||
|
@ -116,7 +119,11 @@ void QOstDevicePrivate::RunL()
|
||||||
ost.ReadMessage(iStatus, readBuf);
|
ost.ReadMessage(iStatus, readBuf);
|
||||||
SetActive();
|
SetActive();
|
||||||
|
|
||||||
emit q->readyRead();
|
if (!inReadyRead) {
|
||||||
|
inReadyRead = true;
|
||||||
|
emit q->readyRead();
|
||||||
|
inReadyRead = false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
q->setErrorString(QString("Error %1 from RUsbOstComm::ReadMessage()").arg(iStatus.Int()));
|
q->setErrorString(QString("Error %1 from RUsbOstComm::ReadMessage()").arg(iStatus.Int()));
|
||||||
}
|
}
|
||||||
|
@ -178,3 +185,36 @@ qint64 QOstDevice::bytesAvailable() const
|
||||||
Q_D(const QOstDevice);
|
Q_D(const QOstDevice);
|
||||||
return d->dataBuf.length();
|
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);
|
bool open(int ostProtocolId);
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
|
bool waitForReadyRead(int msecs);
|
||||||
|
qint64 bytesAvailable() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
qint64 readData(char *data, qint64 maxSize);
|
qint64 readData(char *data, qint64 maxSize);
|
||||||
qint64 writeData(const char *data, qint64 maxSize);
|
qint64 writeData(const char *data, qint64 maxSize);
|
||||||
qint64 bytesAvailable() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QOstDevicePrivate* d_ptr;
|
QOstDevicePrivate* d_ptr;
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include "qtcpserverconnection.h"
|
#include "qtcpserverconnection.h"
|
||||||
|
|
||||||
|
#include <QtCore/qplugin.h>
|
||||||
#include <QtNetwork/qtcpserver.h>
|
#include <QtNetwork/qtcpserver.h>
|
||||||
#include <QtNetwork/qtcpsocket.h>
|
#include <QtNetwork/qtcpsocket.h>
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
#ifndef QTCPSERVERCONNECTION_H
|
#ifndef QTCPSERVERCONNECTION_H
|
||||||
#define QTCPSERVERCONNECTION_H
|
#define QTCPSERVERCONNECTION_H
|
||||||
|
|
||||||
#include <QtGui/QStylePlugin>
|
|
||||||
#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h>
|
#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
SUBDIRS = qmldbg_tcp
|
SUBDIRS = qmldbg_tcp declarativeobserver
|
||||||
symbian:SUBDIRS += qmldbg_ost
|
symbian:SUBDIRS += qmldbg_ost
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
%moduleheaders = ( # restrict the module headers to those found in relative path
|
%moduleheaders = ( # restrict the module headers to those found in relative path
|
||||||
);
|
);
|
||||||
%classnames = (
|
%classnames = (
|
||||||
|
"qtdeclarativeversion.h" => "QtDeclarativeVersion",
|
||||||
);
|
);
|
||||||
%mastercontent = (
|
%mastercontent = (
|
||||||
"gui" => "#include <QtGui/QtGui>\n",
|
"gui" => "#include <QtGui/QtGui>\n",
|
||||||
|
|