Merge branch 'master' into qtquick2

Conflicts:
	src/declarative/graphicsitems/qdeclarativetextinput.cpp
	src/declarative/qml/qdeclarativeengine.cpp
This commit is contained in:
Alan Alpert 2011-06-06 15:19:50 +10:00
commit 6e22ead176
81 changed files with 7909 additions and 41 deletions

2
.gitignore vendored
View File

@ -119,6 +119,8 @@ translations/*.qm
translations/*_untranslated.ts
qrc_*.cpp
src/declarative/qtdeclarativeversion.h
# Test generated files
QObject.log
tst_*

View File

@ -8,7 +8,10 @@ SOURCES += \
$$PWD/qdeclarativedebug.cpp \
$$PWD/qdeclarativedebugtrace.cpp \
$$PWD/qdeclarativedebughelper.cpp \
$$PWD/qdeclarativedebugserver.cpp
$$PWD/qdeclarativedebugserver.cpp \
$$PWD/qdeclarativeobserverservice.cpp \
$$PWD/qjsdebuggeragent.cpp \
$$PWD/qjsdebugservice.cpp
HEADERS += \
$$PWD/qdeclarativedebuggerstatus_p.h \
@ -20,4 +23,8 @@ HEADERS += \
$$PWD/qdeclarativedebugtrace_p.h \
$$PWD/qdeclarativedebughelper_p.h \
$$PWD/qdeclarativedebugserver_p.h \
debugger/qdeclarativedebugserverconnection_p.h
$$PWD/qdeclarativedebugserverconnection_p.h \
$$PWD/qdeclarativeobserverservice_p.h \
$$PWD/qdeclarativeobserverinterface_p.h \
$$PWD/qjsdebuggeragent_p.h \
$$PWD/qjsdebugservice_p.h

View File

@ -188,7 +188,7 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
pluginName = QLatin1String("qmldbg_tcp");
} else if (appD->qmljsDebugArgumentsString().contains("ost")) {
} else if (appD->qmljsDebugArgumentsString().contains(QLatin1String("ost"))) {
pluginName = QLatin1String("qmldbg_ost");
ok = true;
}
@ -253,6 +253,17 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
int version;
in >> version >> d->clientPlugins;
// Send the hello answer immediately, since it needs to arrive before
// the plugins below start sending messages.
QByteArray helloAnswer;
{
QDataStream out(&helloAnswer, QIODevice::WriteOnly);
out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
}
d->connection->send(helloAnswer);
d->gotHello = true;
QHash<QString, QDeclarativeDebugService*>::Iterator iter = d->plugins.begin();
for (; iter != d->plugins.end(); ++iter) {
QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable;
@ -262,14 +273,6 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message)
iter.value()->statusChanged(newStatus);
}
QByteArray helloAnswer;
{
QDataStream out(&helloAnswer, QIODevice::WriteOnly);
out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys();
}
d->connection->send(helloAnswer);
d->gotHello = true;
qWarning("QDeclarativeDebugServer: Connection established");
} else {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -21,6 +21,8 @@ exists("qdeclarative_enable_gcov") {
include($$QT_SOURCE_TREE/src/qbase.pri)
HEADERS += qtdeclarativeversion.h
#INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$TARGET
#DESTDIR=.

View File

@ -70,7 +70,7 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextInputPrivate : public QDeclarativeImplic
{
Q_DECLARE_PUBLIC(QDeclarativeTextInput)
public:
QDeclarativeTextInputPrivate() : control(new QLineControl(QString())),
QDeclarativeTextInputPrivate() : control(new QLineControl),
color((QRgb)0), style(QDeclarativeText::Normal),
styleColor((QRgb)0), hAlign(QDeclarativeTextInput::AlignLeft),
mouseSelectionMode(QDeclarativeTextInput::SelectCharacters), inputMethodHints(Qt::ImhNone),

View File

@ -72,6 +72,7 @@
#include "private/qdeclarativenotifier_p.h"
#include "private/qdeclarativedebugtrace_p.h"
#include "private/qdeclarativeapplication_p.h"
#include "private/qjsdebugservice_p.h"
#include <QtCore/qmetaobject.h>
#include <QScriptClass>
@ -126,7 +127,7 @@ QT_BEGIN_NAMESPACE
\brief The QtObject element is the most basic element in QML.
The QtObject element is a non-visual element which contains only the
objectName property.
objectName property.
It can be useful to create a QtObject if you need an extremely
lightweight element to enclose a set of custom properties:
@ -141,7 +142,7 @@ QT_BEGIN_NAMESPACE
This property holds the QObject::objectName for this specific object instance.
This allows a C++ application to locate an item within a QML component
using the QObject::findChild() method. For example, the following C++
using the QObject::findChild() method. For example, the following C++
application locates the child \l Rectangle item and dynamically changes its
\c color value:
@ -155,7 +156,7 @@ QT_BEGIN_NAMESPACE
Rectangle {
anchors.fill: parent
color: "red"
color: "red"
objectName: "myRect"
}
}
@ -169,7 +170,7 @@ QT_BEGIN_NAMESPACE
view.show();
QDeclarativeItem *item = view.rootObject()->findChild<QDeclarativeItem*>("myRect");
if (item)
if (item)
item->setProperty("color", QColor(Qt::yellow));
\endcode
*/
@ -205,7 +206,7 @@ void QDeclarativeEnginePrivate::defineModule()
\keyword QmlGlobalQtObject
\brief The \c Qt object provides useful enums and functions from Qt, for use in all QML files.
\brief The \c Qt object provides useful enums and functions from Qt, for use in all QML files.
The \c Qt object is a global object with utility functions, properties and enums.
@ -594,6 +595,7 @@ void QDeclarativeEnginePrivate::init()
QDeclarativeEngineDebugServer::isDebuggingEnabled()) {
isDebugging = true;
QDeclarativeEngineDebugServer::instance()->addEngine(q);
QJSDebugService::instance()->addEngine(q);
}
}
@ -656,8 +658,9 @@ QDeclarativeEngine::QDeclarativeEngine(QObject *parent)
QDeclarativeEngine::~QDeclarativeEngine()
{
Q_D(QDeclarativeEngine);
if (d->isDebugging)
if (d->isDebugging) {
QDeclarativeEngineDebugServer::instance()->remEngine(this);
}
// if we are the parent of any of the qobject module api instances,
// we need to remove them from our internal list, in order to prevent
@ -784,7 +787,7 @@ QNetworkAccessManager *QDeclarativeEngine::networkAccessManager() const
/*!
Sets the \a provider to use for images requested via the \e
image: url scheme, with host \a providerId. The QDeclarativeEngine
image: url scheme, with host \a providerId. The QDeclarativeEngine
takes ownership of \a provider.
Image providers enable support for pixmap and threaded image
@ -1105,7 +1108,7 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre
rv = pf(const_cast<QObject *>(object));
if (rv)
if (rv)
data->attachedProperties()->insert(id, rv);
return rv;
@ -1297,7 +1300,7 @@ Returns a \l Component object created using the QML file at the specified \a url
or \c null if an empty string was given.
The returned component's \l Component::status property indicates whether the
component was successfully created. If the status is \c Component.Error,
component was successfully created. If the status is \c Component.Error,
see \l Component::errorString() for an error description.
Call \l {Component::createObject()}{Component.createObject()} on the returned
@ -1659,7 +1662,7 @@ QScriptValue QDeclarativeEnginePrivate::formatDateTime(QScriptContext*ctxt, QScr
return engine->newVariant(QVariant::fromValue(date.toString(format)));
} else if (formatArg.isNumber()) {
enumFormat = Qt::DateFormat(formatArg.toUInt32());
} else {
} else {
return ctxt->throwError(QLatin1String("Qt.formatDateTime(): Invalid datetime format"));
}
}
@ -1724,7 +1727,7 @@ QScriptValue QDeclarativeEnginePrivate::hsla(QScriptContext *ctxt, QScriptEngine
}
/*!
\qmlmethod rect Qt::rect(int x, int y, int width, int height)
\qmlmethod rect Qt::rect(int x, int y, int width, int height)
Returns a \c rect with the top-left corner at \c x, \c y and the specified \c width and \c height.
@ -1893,7 +1896,7 @@ Binary to ASCII - this function returns a base64 encoding of \c data.
*/
QScriptValue QDeclarativeEnginePrivate::btoa(QScriptContext *ctxt, QScriptEngine *)
{
if (ctxt->argumentCount() != 1)
if (ctxt->argumentCount() != 1)
return ctxt->throwError(QLatin1String("Qt.btoa(): Invalid arguments"));
QByteArray data = ctxt->argument(0).toString().toUtf8();
@ -1908,7 +1911,7 @@ ASCII to binary - this function returns a base64 decoding of \c data.
QScriptValue QDeclarativeEnginePrivate::atob(QScriptContext *ctxt, QScriptEngine *)
{
if (ctxt->argumentCount() != 1)
if (ctxt->argumentCount() != 1)
return ctxt->throwError(QLatin1String("Qt.atob(): Invalid arguments"));
QByteArray data = ctxt->argument(0).toString().toUtf8();
@ -2412,7 +2415,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(const QMetaObj
}
}
QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeType *type, int minorVersion,
QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeType *type, int minorVersion,
QDeclarativeError &error)
{
QList<QDeclarativeType *> types;
@ -2421,7 +2424,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
const QMetaObject *metaObject = type->metaObject();
while (metaObject) {
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
QDeclarativeType *t = QDeclarativeMetaType::qmlType(metaObject, type->module(),
type->majorVersion(), minorVersion);
if (t) {
maxMinorVersion = qMax(maxMinorVersion, t->minorVersion());
@ -2465,7 +2468,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
// Signals override:
// * other signals and methods of the same name.
// * properties named on<Signal Name>
// * properties named on<Signal Name>
// * automatic <property name>Changed notify signals
// Methods override:
@ -2490,7 +2493,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
QDeclarativePropertyCache::Data *current = d;
while (!overloadError && current) {
current = d->overrideData(current);
if (current && raw->isAllowedInRevision(current))
if (current && raw->isAllowedInRevision(current))
overloadError = true;
}
}
@ -2498,7 +2501,7 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::createCache(QDeclarativeTy
if (overloadError) {
if (hasCopied) raw->release();
error.setDescription(QLatin1String("Type ") + QString::fromUtf8(type->qmlTypeName()) + QLatin1String(" ") + QString::number(type->majorVersion()) + QLatin1String(".") + QString::number(minorVersion) + QLatin1String(" contains an illegal property \"") + overloadName + QLatin1String("\". This is an error in the type's implementation."));
return 0;
}

View File

@ -98,7 +98,6 @@ class QDeclarativeScarceResourceScriptClass;
class ScarceResourceData;
class QDeclarativeTypeNameScriptClass;
class QDeclarativeValueTypeScriptClass;
class QScriptEngineDebugger;
class QNetworkReply;
class QNetworkAccessManager;
class QDeclarativeNetworkAccessManagerFactory;
@ -353,14 +352,14 @@ public:
/*!
Returns a QDeclarativePropertyCache for \a obj if one is available.
If \a obj is null, being deleted or contains a dynamic meta object 0
If \a obj is null, being deleted or contains a dynamic meta object 0
is returned.
The returned cache is not referenced, so if it is to be stored, call addref().
*/
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
{
if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
return 0;
const QMetaObject *mo = obj->metaObject();
@ -370,10 +369,10 @@ QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
}
/*!
Returns a QDeclarativePropertyCache for \a metaObject.
Returns a QDeclarativePropertyCache for \a metaObject.
As the cache is persisted for the life of the engine, \a metaObject must be
a static "compile time" meta-object, or a meta-object that is otherwise known to
a static "compile time" meta-object, or a meta-object that is otherwise known to
exist for the lifetime of the QDeclarativeEngine.
The returned cache is not referenced, so if it is to be stored, call addref().

View File

@ -49,6 +49,7 @@
#include <qdeclarativeguard_p.h>
#include <private/qdeclarativedebugtrace_p.h>
#include <private/qdeclarativeobserverservice_p.h>
#include <qscriptvalueiterator.h>
#include <qdebug.h>
@ -299,6 +300,8 @@ void QDeclarativeViewPrivate::init()
q->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
q->viewport()->setAttribute(Qt::WA_NoSystemBackground);
#endif
QDeclarativeObserverService::instance()->addView(q);
}
/*!
@ -306,6 +309,7 @@ void QDeclarativeViewPrivate::init()
*/
QDeclarativeView::~QDeclarativeView()
{
QDeclarativeObserverService::instance()->removeView(this);
}
/*! \property QDeclarativeView::source
@ -558,7 +562,6 @@ void QDeclarativeView::continueExecute()
emit statusChanged(status());
}
/*!
\internal
*/

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 &centerPos)
{
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

View File

@ -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 &centerPos);
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

View File

@ -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

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -109,6 +109,12 @@ void QmlOstPlugin::disconnect()
d->protocol = 0;
}
bool QmlOstPlugin::waitForMessage()
{
Q_D(QmlOstPlugin);
return d->protocol->waitForReadyRead(-1);
}
void QmlOstPlugin::setPort(int port, bool block)
{
Q_UNUSED(port);

View File

@ -68,6 +68,7 @@ public:
bool isConnected() const;
void send(const QByteArray &message);
void disconnect();
bool waitForMessage();
private Q_SLOTS:
void readyRead();

View File

@ -57,6 +57,8 @@ public:
Cancel();
}
TInt& AoFlags() { return ((TInt*)&iStatus)[1]; }
private:
void RunL();
void DoCancel();
@ -65,6 +67,7 @@ private:
RUsbOstComm ost;
TBuf8<4096> readBuf;
QByteArray dataBuf;
TBool inReadyRead;
};
QOstDevice::QOstDevice(QObject *parent) :
@ -116,7 +119,11 @@ void QOstDevicePrivate::RunL()
ost.ReadMessage(iStatus, readBuf);
SetActive();
emit q->readyRead();
if (!inReadyRead) {
inReadyRead = true;
emit q->readyRead();
inReadyRead = false;
}
} else {
q->setErrorString(QString("Error %1 from RUsbOstComm::ReadMessage()").arg(iStatus.Int()));
}
@ -178,3 +185,36 @@ qint64 QOstDevice::bytesAvailable() const
Q_D(const QOstDevice);
return d->dataBuf.length();
}
bool QOstDevice::waitForReadyRead(int msecs)
{
Q_D(QOstDevice);
if (msecs >= 0) {
RTimer timer;
TInt err = timer.CreateLocal();
if (err) return false;
TRequestStatus timeoutStat;
timer.After(timeoutStat, msecs*1000);
User::WaitForRequest(timeoutStat, d->iStatus);
if (timeoutStat != KRequestPending) {
// Timed out
timer.Close();
return false;
} else {
// We got data, so cancel timer
timer.Cancel();
User::WaitForRequest(timeoutStat);
timer.Close();
// And drop through
}
} else {
// Just wait forever for data
User::WaitForRequest(d->iStatus);
}
// If we get here we have data
TInt err = d->iStatus.Int();
d->AoFlags() &= ~3; // This is necessary to clean up the scheduler as you're not supposed to bypass it like this
TRAP_IGNORE(d->RunL());
return err == KErrNone;
}

View File

@ -61,10 +61,12 @@ public:
bool open(int ostProtocolId);
void close();
bool waitForReadyRead(int msecs);
qint64 bytesAvailable() const;
protected:
qint64 readData(char *data, qint64 maxSize);
qint64 writeData(const char *data, qint64 maxSize);
qint64 bytesAvailable() const;
private:
QOstDevicePrivate* d_ptr;

View File

@ -41,6 +41,7 @@
#include "qtcpserverconnection.h"
#include <QtCore/qplugin.h>
#include <QtNetwork/qtcpserver.h>
#include <QtNetwork/qtcpsocket.h>

View File

@ -42,7 +42,6 @@
#ifndef QTCPSERVERCONNECTION_H
#define QTCPSERVERCONNECTION_H
#include <QtGui/QStylePlugin>
#include <QtDeclarative/private/qdeclarativedebugserverconnection_p.h>
QT_BEGIN_NAMESPACE

View File

@ -1,4 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = qmldbg_tcp
SUBDIRS = qmldbg_tcp declarativeobserver
symbian:SUBDIRS += qmldbg_ost

View File

@ -5,6 +5,7 @@
%moduleheaders = ( # restrict the module headers to those found in relative path
);
%classnames = (
"qtdeclarativeversion.h" => "QtDeclarativeVersion",
);
%mastercontent = (
"gui" => "#include <QtGui/QtGui>\n",