forked from qt-creator/qt-creator
QmlEngineDebugClient: Simplify the client and utility classes
Change-Id: I86033bdbdef94c6f17e706f8e13ce390969171c6 Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -40,256 +40,157 @@
|
||||
namespace QmlJsDebugClient {
|
||||
|
||||
class QDeclarativeDebugConnection;
|
||||
class QDeclarativeDebugWatch;
|
||||
class QDeclarativeDebugPropertyWatch;
|
||||
class QDeclarativeDebugObjectExpressionWatch;
|
||||
class QDeclarativeDebugEnginesQuery;
|
||||
class QDeclarativeDebugRootContextQuery;
|
||||
class QDeclarativeDebugObjectQuery;
|
||||
class QDeclarativeDebugExpressionQuery;
|
||||
class QDeclarativeDebugPropertyReference;
|
||||
class QDeclarativeDebugContextReference;
|
||||
class QDeclarativeDebugObjectReference;
|
||||
class QDeclarativeDebugFileReference;
|
||||
class QDeclarativeDebugEngineReference;
|
||||
class QmlEngineDebugClientPrivate;
|
||||
class QmlDebugPropertyReference;
|
||||
class QmlDebugContextReference;
|
||||
class QmlDebugObjectReference;
|
||||
class QmlDebugFileReference;
|
||||
class QmlDebugEngineReference;
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QmlEngineDebugClient : public QDeclarativeDebugClient
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit QmlEngineDebugClient(QDeclarativeDebugConnection *);
|
||||
~QmlEngineDebugClient();
|
||||
QmlEngineDebugClient(QDeclarativeDebugConnection *conn);
|
||||
|
||||
QDeclarativeDebugPropertyWatch *addWatch(const QDeclarativeDebugPropertyReference &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugContextReference &, const QString &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugObjectExpressionWatch *addWatch(const QDeclarativeDebugObjectReference &, const QString &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugObjectReference &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugFileReference &,
|
||||
QObject *parent = 0);
|
||||
quint32 addWatch(const QmlDebugPropertyReference &property);
|
||||
quint32 addWatch(const QmlDebugContextReference &context, const QString &id);
|
||||
quint32 addWatch(const QmlDebugObjectReference &object, const QString &expr);
|
||||
quint32 addWatch(const QmlDebugObjectReference &object);
|
||||
quint32 addWatch(const QmlDebugFileReference &file);
|
||||
|
||||
void removeWatch(QDeclarativeDebugWatch *watch);
|
||||
void removeWatch(quint32 watch);
|
||||
|
||||
QDeclarativeDebugEnginesQuery *queryAvailableEngines(QObject *parent = 0);
|
||||
QDeclarativeDebugRootContextQuery *queryRootContexts(const QDeclarativeDebugEngineReference &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugObjectQuery *queryObject(const QDeclarativeDebugObjectReference &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugObjectQuery *queryObjectRecursive(const QDeclarativeDebugObjectReference &,
|
||||
QObject *parent = 0);
|
||||
QDeclarativeDebugExpressionQuery *queryExpressionResult(int objectDebugId,
|
||||
const QString &expr,
|
||||
QObject *parent = 0);
|
||||
bool setBindingForObject(int objectDebugId, const QString &propertyName,
|
||||
const QVariant &bindingExpression, bool isLiteralValue,
|
||||
QString source = QString(), int line = -1);
|
||||
bool resetBindingForObject(int objectDebugId, const QString &propertyName);
|
||||
bool setMethodBody(int objectDebugId, const QString &methodName, const QString &methodBody);
|
||||
quint32 queryAvailableEngines();
|
||||
quint32 queryRootContexts(const QmlDebugEngineReference &context);
|
||||
quint32 queryObject(const QmlDebugObjectReference &object);
|
||||
quint32 queryObjectRecursive(const QmlDebugObjectReference &object);
|
||||
quint32 queryExpressionResult(int objectDebugId,
|
||||
const QString &expr);
|
||||
quint32 setBindingForObject(int objectDebugId, const QString &propertyName,
|
||||
const QVariant &bindingExpression,
|
||||
bool isLiteralValue,
|
||||
QString source, int line);
|
||||
quint32 resetBindingForObject(int objectDebugId,
|
||||
const QString &propertyName);
|
||||
quint32 setMethodBody(int objectDebugId, const QString &methodName,
|
||||
const QString &methodBody);
|
||||
|
||||
QmlEngineDebugClientPrivate *priv() const { return d; }
|
||||
Q_SIGNALS:
|
||||
void newObjects();
|
||||
signals:
|
||||
void newStatus(QDeclarativeDebugClient::Status status);
|
||||
void newObjects();
|
||||
void valueChanged(int debugId, const QByteArray &name,
|
||||
const QVariant &value);
|
||||
void result(quint32 queryId, const QVariant &result);
|
||||
|
||||
protected:
|
||||
virtual void statusChanged(Status status);
|
||||
virtual void messageReceived(const QByteArray &);
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QmlEngineDebugClientPrivate *d;
|
||||
quint32 getId() { return m_nextId++; }
|
||||
|
||||
void decode(QDataStream &d, QmlDebugContextReference &context);
|
||||
void decode(QDataStream &d, QmlDebugObjectReference &object, bool simple);
|
||||
|
||||
private:
|
||||
quint32 m_nextId;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugWatch : public QObject
|
||||
class QmlDebugFileReference
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum State { Waiting, Active, Inactive, Dead };
|
||||
QmlDebugFileReference() : m_lineNumber(-1), m_columnNumber(-1) {}
|
||||
|
||||
QDeclarativeDebugWatch(QObject *);
|
||||
~QDeclarativeDebugWatch();
|
||||
|
||||
int queryId() const;
|
||||
int objectDebugId() const;
|
||||
State state() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void stateChanged(QDeclarativeDebugWatch::State);
|
||||
//void objectChanged(int, const QDeclarativeDebugObjectReference &);
|
||||
//void valueChanged(int, const QVariant &);
|
||||
|
||||
// Server sends value as string if it is a user-type variant
|
||||
void valueChanged(const QByteArray &name, const QVariant &value);
|
||||
QUrl url() const { return m_url; }
|
||||
int lineNumber() const { return m_lineNumber; }
|
||||
int columnNumber() const { return m_columnNumber; }
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
void setState(State);
|
||||
State m_state;
|
||||
int m_queryId;
|
||||
QmlEngineDebugClient *m_client;
|
||||
int m_objectDebugId;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugPropertyWatch : public QDeclarativeDebugWatch
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QDeclarativeDebugPropertyWatch(QObject *parent);
|
||||
|
||||
QString name() const;
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
QString m_name;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectExpressionWatch : public QDeclarativeDebugWatch
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QDeclarativeDebugObjectExpressionWatch(QObject *parent);
|
||||
|
||||
QString expression() const;
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
QString m_expr;
|
||||
int m_debugId;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugQuery : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum State { Waiting, Error, Completed };
|
||||
|
||||
State state() const;
|
||||
bool isWaiting() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State);
|
||||
|
||||
protected:
|
||||
QDeclarativeDebugQuery(QObject *);
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
void setState(State);
|
||||
State m_state;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugFileReference
|
||||
{
|
||||
public:
|
||||
QDeclarativeDebugFileReference();
|
||||
QDeclarativeDebugFileReference(const QDeclarativeDebugFileReference &);
|
||||
QDeclarativeDebugFileReference &operator=(const QDeclarativeDebugFileReference &);
|
||||
|
||||
QUrl url() const;
|
||||
void setUrl(const QUrl &);
|
||||
int lineNumber() const;
|
||||
void setLineNumber(int);
|
||||
int columnNumber() const;
|
||||
void setColumnNumber(int);
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QUrl m_url;
|
||||
int m_lineNumber;
|
||||
int m_columnNumber;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugEngineReference
|
||||
class QmlDebugEngineReference
|
||||
{
|
||||
public:
|
||||
QDeclarativeDebugEngineReference();
|
||||
QDeclarativeDebugEngineReference(int);
|
||||
QDeclarativeDebugEngineReference(const QDeclarativeDebugEngineReference &);
|
||||
QDeclarativeDebugEngineReference &operator=(const QDeclarativeDebugEngineReference &);
|
||||
QmlDebugEngineReference() : m_debugId(-1) {}
|
||||
QmlDebugEngineReference(int id) : m_debugId(id) {}
|
||||
|
||||
int debugId() const;
|
||||
QString name() const;
|
||||
int debugId() const { return m_debugId; }
|
||||
QString name() const { return m_name; }
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
friend class QmlEngineDebugClient;
|
||||
int m_debugId;
|
||||
QString m_name;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectReference
|
||||
typedef QList<QmlDebugEngineReference> QmlDebugEngineReferenceList;
|
||||
|
||||
class QmlDebugObjectReference
|
||||
{
|
||||
public:
|
||||
QDeclarativeDebugObjectReference();
|
||||
QDeclarativeDebugObjectReference(int);
|
||||
QDeclarativeDebugObjectReference(const QDeclarativeDebugObjectReference &);
|
||||
QDeclarativeDebugObjectReference &operator=(const QDeclarativeDebugObjectReference &);
|
||||
QmlDebugObjectReference() : m_debugId(-1), m_contextDebugId(-1) {}
|
||||
QmlDebugObjectReference(int id) : m_debugId(id), m_contextDebugId(-1) {}
|
||||
|
||||
int debugId() const;
|
||||
QString className() const;
|
||||
QString idString() const;
|
||||
QString name() const;
|
||||
int debugId() const { return m_debugId; }
|
||||
QString className() const { return m_className; }
|
||||
QString idString() const { return m_idString; }
|
||||
QString name() const { return m_name; }
|
||||
|
||||
QDeclarativeDebugFileReference source() const;
|
||||
int contextDebugId() const;
|
||||
QmlDebugFileReference source() const { return m_source; }
|
||||
int contextDebugId() const { return m_contextDebugId; }
|
||||
|
||||
QList<QDeclarativeDebugPropertyReference> properties() const;
|
||||
QList<QDeclarativeDebugObjectReference> children() const;
|
||||
QList<QmlDebugPropertyReference> properties() const { return m_properties; }
|
||||
QList<QmlDebugObjectReference> children() const { return m_children; }
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
friend class QmlEngineDebugClient;
|
||||
int m_debugId;
|
||||
QString m_class;
|
||||
QString m_className;
|
||||
QString m_idString;
|
||||
QString m_name;
|
||||
QDeclarativeDebugFileReference m_source;
|
||||
QmlDebugFileReference m_source;
|
||||
int m_contextDebugId;
|
||||
QList<QDeclarativeDebugPropertyReference> m_properties;
|
||||
QList<QDeclarativeDebugObjectReference> m_children;
|
||||
QList<QmlDebugPropertyReference> m_properties;
|
||||
QList<QmlDebugObjectReference> m_children;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugContextReference
|
||||
class QmlDebugContextReference
|
||||
{
|
||||
public:
|
||||
QDeclarativeDebugContextReference();
|
||||
QDeclarativeDebugContextReference(const QDeclarativeDebugContextReference &);
|
||||
QDeclarativeDebugContextReference &operator=(const QDeclarativeDebugContextReference &);
|
||||
QmlDebugContextReference() : m_debugId(-1) {}
|
||||
|
||||
int debugId() const;
|
||||
QString name() const;
|
||||
int debugId() const { return m_debugId; }
|
||||
QString name() const { return m_name; }
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> objects() const;
|
||||
QList<QDeclarativeDebugContextReference> contexts() const;
|
||||
QList<QmlDebugObjectReference> objects() const { return m_objects; }
|
||||
QList<QmlDebugContextReference> contexts() const { return m_contexts; }
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
friend class QmlEngineDebugClient;
|
||||
int m_debugId;
|
||||
QString m_name;
|
||||
QList<QDeclarativeDebugObjectReference> m_objects;
|
||||
QList<QDeclarativeDebugContextReference> m_contexts;
|
||||
QList<QmlDebugObjectReference> m_objects;
|
||||
QList<QmlDebugContextReference> m_contexts;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugPropertyReference
|
||||
class QmlDebugPropertyReference
|
||||
{
|
||||
public:
|
||||
QDeclarativeDebugPropertyReference();
|
||||
QDeclarativeDebugPropertyReference(const QDeclarativeDebugPropertyReference &);
|
||||
QDeclarativeDebugPropertyReference &operator=(const QDeclarativeDebugPropertyReference &);
|
||||
QmlDebugPropertyReference() : m_objectDebugId(-1), m_hasNotifySignal(false) {}
|
||||
|
||||
int objectDebugId() const;
|
||||
QString name() const;
|
||||
QVariant value() const;
|
||||
QString valueTypeName() const;
|
||||
QString binding() const;
|
||||
bool hasNotifySignal() const;
|
||||
int debugId() const { return m_objectDebugId; }
|
||||
QString name() const { return m_name; }
|
||||
QVariant value() const { return m_value; }
|
||||
QString valueTypeName() const { return m_valueTypeName; }
|
||||
QString binding() const { return m_binding; }
|
||||
bool hasNotifySignal() const { return m_hasNotifySignal; }
|
||||
|
||||
private:
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
friend class QmlEngineDebugClient;
|
||||
int m_objectDebugId;
|
||||
QString m_name;
|
||||
QVariant m_value;
|
||||
@@ -298,75 +199,11 @@ private:
|
||||
bool m_hasNotifySignal;
|
||||
};
|
||||
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugEnginesQuery : public QDeclarativeDebugQuery
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
virtual ~QDeclarativeDebugEnginesQuery();
|
||||
QList<QDeclarativeDebugEngineReference> engines() const;
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QDeclarativeDebugEnginesQuery(QObject *);
|
||||
QmlEngineDebugClient *m_client;
|
||||
int m_queryId;
|
||||
QList<QDeclarativeDebugEngineReference> m_engines;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugRootContextQuery : public QDeclarativeDebugQuery
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
virtual ~QDeclarativeDebugRootContextQuery();
|
||||
QDeclarativeDebugContextReference rootContext() const;
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QDeclarativeDebugRootContextQuery(QObject *);
|
||||
QmlEngineDebugClient *m_client;
|
||||
int m_queryId;
|
||||
QDeclarativeDebugContextReference m_context;
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectQuery : public QDeclarativeDebugQuery
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
virtual ~QDeclarativeDebugObjectQuery();
|
||||
QDeclarativeDebugObjectReference object() const;
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QDeclarativeDebugObjectQuery(QObject *);
|
||||
QmlEngineDebugClient *m_client;
|
||||
int m_queryId;
|
||||
QDeclarativeDebugObjectReference m_object;
|
||||
|
||||
};
|
||||
|
||||
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugExpressionQuery : public QDeclarativeDebugQuery
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
virtual ~QDeclarativeDebugExpressionQuery();
|
||||
QVariant expression() const;
|
||||
QVariant result() const;
|
||||
private:
|
||||
friend class QmlEngineDebugClient;
|
||||
friend class QmlEngineDebugClientPrivate;
|
||||
QDeclarativeDebugExpressionQuery(QObject *);
|
||||
QmlEngineDebugClient *m_client;
|
||||
int m_queryId;
|
||||
QVariant m_expr;
|
||||
QVariant m_result;
|
||||
};
|
||||
|
||||
} // namespace QmlJsDebugClient
|
||||
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugEngineReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugObjectReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugContextReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugPropertyReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugObjectReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugEngineReference)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugEngineReferenceList)
|
||||
Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugContextReference)
|
||||
|
||||
#endif // QMLENGINEDEBUGCLIENT_H
|
||||
|
@@ -311,7 +311,17 @@ QmlJsDebugClient::QmlEngineDebugClient *QmlAdapter::engineDebugClient() const
|
||||
|
||||
void QmlAdapter::setEngineDebugClient(QmlJsDebugClient::QmlEngineDebugClient *client)
|
||||
{
|
||||
Internal::QmlEngine *engine =
|
||||
qobject_cast<Internal::QmlEngine *>(d->m_engine.data());
|
||||
if (engine && d->m_engineDebugClient)
|
||||
disconnect(d->m_engineDebugClient, SIGNAL(result(quint32,QVariant)),
|
||||
engine,
|
||||
SLOT(expressionEvaluated(quint32,QVariant)));
|
||||
d->m_engineDebugClient = client;
|
||||
if (engine && d->m_engineDebugClient)
|
||||
connect(d->m_engineDebugClient, SIGNAL(result(quint32,QVariant)),
|
||||
engine,
|
||||
SLOT(expressionEvaluated(quint32,QVariant)));
|
||||
}
|
||||
|
||||
QmlJsDebugClient::QDebugMessageClient *QmlAdapter::messageClient() const
|
||||
|
@@ -57,6 +57,7 @@
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#include <projectexplorer/applicationlauncher.h>
|
||||
#include <qmljsdebugclient/qdeclarativeoutputparser.h>
|
||||
#include <qmljsdebugclient/qmlenginedebugclient.h>
|
||||
#include <qmljseditor/qmljseditorconstants.h>
|
||||
#include <qmljs/parser/qmljsast_p.h>
|
||||
#include <qmljs/qmljsmodelmanagerinterface.h>
|
||||
@@ -120,6 +121,7 @@ private:
|
||||
bool m_validContext;
|
||||
QHash<QString,BreakpointModelId> pendingBreakpoints;
|
||||
bool m_retryOnConnectFail;
|
||||
QList<quint32> queryIds;
|
||||
};
|
||||
|
||||
QmlEnginePrivate::QmlEnginePrivate(QmlEngine *q)
|
||||
@@ -1038,21 +1040,14 @@ void QmlEngine::synchronizeWatchers()
|
||||
}
|
||||
}
|
||||
|
||||
void QmlEngine::onDebugQueryStateChanged(
|
||||
QmlJsDebugClient::QDeclarativeDebugQuery::State state)
|
||||
void QmlEngine::expressionEvaluated(quint32 queryId, const QVariant &result)
|
||||
{
|
||||
QmlJsDebugClient::QDeclarativeDebugExpressionQuery *query =
|
||||
qobject_cast<QmlJsDebugClient::QDeclarativeDebugExpressionQuery *>(
|
||||
sender());
|
||||
if (query && state != QmlJsDebugClient::QDeclarativeDebugQuery::Error) {
|
||||
QtMessageLogItem *item = constructLogItemTree(query->result());
|
||||
if (d->queryIds.contains(queryId)) {
|
||||
d->queryIds.removeOne(queryId);
|
||||
QtMessageLogItem *item = constructLogItemTree(result);
|
||||
if (item)
|
||||
qtMessageLogHandler()->appendItem(item);
|
||||
} else
|
||||
qtMessageLogHandler()->
|
||||
appendItem(new QtMessageLogItem(QtMessageLogHandler::ErrorType,
|
||||
_("Error evaluating expression.")));
|
||||
delete query;
|
||||
}
|
||||
}
|
||||
|
||||
bool QmlEngine::hasCapability(unsigned cap) const
|
||||
@@ -1154,16 +1149,19 @@ bool QmlEngine::evaluateScriptExpression(const QString& expression)
|
||||
|
||||
int id = d->m_adapter.currentSelectedDebugId();
|
||||
if (engineDebug && id != -1) {
|
||||
QDeclarativeDebugExpressionQuery *query =
|
||||
engineDebug->queryExpressionResult(id, expression);
|
||||
connect(query,
|
||||
SIGNAL(stateChanged(
|
||||
QmlJsDebugClient::QDeclarativeDebugQuery
|
||||
::State)),
|
||||
this,
|
||||
SLOT(onDebugQueryStateChanged(
|
||||
QmlJsDebugClient::QDeclarativeDebugQuery
|
||||
::State)));
|
||||
quint32 queryId =
|
||||
engineDebug->queryExpressionResult(
|
||||
id, expression);
|
||||
if (queryId) {
|
||||
d->queryIds << queryId;
|
||||
} else {
|
||||
didEvaluate = false;
|
||||
qtMessageLogHandler()->
|
||||
appendItem(
|
||||
new QtMessageLogItem(
|
||||
QtMessageLogHandler::ErrorType,
|
||||
_("Error evaluating expression.")));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
executeDebuggerCommand(expression);
|
||||
|
@@ -34,7 +34,6 @@
|
||||
#define DEBUGGER_QMLENGINE_H
|
||||
|
||||
#include "debuggerengine.h"
|
||||
#include <qmljsdebugclient/qmlenginedebugclient.h>
|
||||
#include <qmljsdebugclient/qdebugmessageclient.h>
|
||||
#include <utils/outputformat.h>
|
||||
#include <qmljs/qmljsdocument.h>
|
||||
@@ -96,6 +95,7 @@ public:
|
||||
public slots:
|
||||
void disconnected();
|
||||
void documentUpdated(QmlJS::Document::Ptr doc);
|
||||
void expressionEvaluated(quint32 queryId, const QVariant &result);
|
||||
|
||||
private slots:
|
||||
void errorMessageBoxFinished(int result);
|
||||
@@ -171,8 +171,6 @@ private slots:
|
||||
void appendMessage(const QString &msg, Utils::OutputFormat);
|
||||
|
||||
void synchronizeWatchers();
|
||||
void onDebugQueryStateChanged(
|
||||
QmlJsDebugClient::QDeclarativeDebugQuery::State state);
|
||||
|
||||
private:
|
||||
void closeConnection();
|
||||
|
@@ -53,13 +53,14 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent)
|
||||
, m_adapter(adapter)
|
||||
, m_engineClient(0)
|
||||
, m_inspectorClient(0)
|
||||
, m_engineQuery(0)
|
||||
, m_contextQuery(0)
|
||||
, m_engineQueryId(0)
|
||||
, m_contextQueryId(0)
|
||||
, m_isConnected(false)
|
||||
{
|
||||
m_requestObjectsTimer.setSingleShot(true);
|
||||
m_requestObjectsTimer.setInterval(3000);
|
||||
connect(&m_requestObjectsTimer, SIGNAL(timeout()), this, SLOT(refreshObjectTree()));
|
||||
connect(&m_requestObjectsTimer, SIGNAL(timeout()),
|
||||
this, SLOT(refreshObjectTree()));
|
||||
connectToServer();
|
||||
}
|
||||
|
||||
@@ -74,15 +75,22 @@ void ClientProxy::connectToServer()
|
||||
m_engineClient = new QmlEngineDebugClient(m_adapter.data()->connection());
|
||||
|
||||
connect(m_engineClient, SIGNAL(newObjects()), this, SLOT(newObjects()));
|
||||
connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)),
|
||||
connect(m_engineClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
|
||||
SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
|
||||
connect(m_engineClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
|
||||
SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status)));
|
||||
connect(m_engineClient, SIGNAL(result(quint32,QVariant)),
|
||||
SLOT(onResult(quint32,QVariant)));
|
||||
connect(m_engineClient, SIGNAL(valueChanged(int,QByteArray,QVariant)),
|
||||
SLOT(objectWatchTriggered(int,QByteArray,QVariant)));
|
||||
|
||||
|
||||
m_inspectorClient =
|
||||
new QmlJSInspectorClient(m_adapter.data()->connection(), this);
|
||||
|
||||
connect(m_inspectorClient,
|
||||
SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
|
||||
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
|
||||
connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)),
|
||||
this, SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status)));
|
||||
|
||||
m_inspectorClient = new QmlJSInspectorClient(m_adapter.data()->connection(), this);
|
||||
|
||||
connect(m_inspectorClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
|
||||
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
|
||||
connect(m_inspectorClient, SIGNAL(currentObjectsChanged(QList<int>)),
|
||||
SLOT(onCurrentObjectsChanged(QList<int>)));
|
||||
connect(m_inspectorClient, SIGNAL(colorPickerActivated()),
|
||||
@@ -127,26 +135,27 @@ void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status)
|
||||
void ClientProxy::engineClientStatusChanged(QDeclarativeDebugClient::Status status)
|
||||
{
|
||||
if (status == QDeclarativeDebugClient::Enabled) {
|
||||
m_adapter.data()->setEngineDebugClient(qobject_cast<QmlEngineDebugClient *>(sender()));
|
||||
m_adapter.data()->setEngineDebugClient(
|
||||
qobject_cast<QmlEngineDebugClient *>(sender()));
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::refreshObjectTree()
|
||||
{
|
||||
if (!m_contextQuery) {
|
||||
if (!m_contextQueryId) {
|
||||
m_requestObjectsTimer.stop();
|
||||
qDeleteAll(m_objectTreeQuery);
|
||||
m_objectTreeQuery.clear();
|
||||
m_objectTreeQueryIds.clear();
|
||||
queryEngineContext(m_engines.value(0).debugId());
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::onCurrentObjectsChanged(const QList<int> &debugIds, bool requestIfNeeded)
|
||||
void ClientProxy::onCurrentObjectsChanged(const QList<int> &debugIds,
|
||||
bool requestIfNeeded)
|
||||
{
|
||||
QList<QDeclarativeDebugObjectReference> selectedItems;
|
||||
QList<QmlDebugObjectReference> selectedItems;
|
||||
|
||||
foreach (int debugId, debugIds) {
|
||||
QDeclarativeDebugObjectReference ref = objectReferenceForId(debugId);
|
||||
QmlDebugObjectReference ref = objectReferenceForId(debugId);
|
||||
if (ref.debugId() != -1) {
|
||||
selectedItems << ref;
|
||||
} else if (requestIfNeeded) {
|
||||
@@ -171,12 +180,13 @@ void ClientProxy::setSelectedItemsByDebugId(const QList<int> &debugIds)
|
||||
m_inspectorClient->setCurrentObjects(debugIds);
|
||||
}
|
||||
|
||||
void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs)
|
||||
void ClientProxy::setSelectedItemsByObjectId(
|
||||
const QList<QmlDebugObjectReference> &objectRefs)
|
||||
{
|
||||
if (isConnected()) {
|
||||
QList<int> debugIds;
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &ref, objectRefs) {
|
||||
foreach (const QmlDebugObjectReference &ref, objectRefs) {
|
||||
debugIds << ref.debugId();
|
||||
}
|
||||
|
||||
@@ -184,14 +194,14 @@ void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObject
|
||||
}
|
||||
}
|
||||
|
||||
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const
|
||||
QmlDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const
|
||||
{
|
||||
foreach (const QDeclarativeDebugObjectReference& it, m_rootObjects) {
|
||||
QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, it);
|
||||
foreach (const QmlDebugObjectReference& it, m_rootObjects) {
|
||||
QmlDebugObjectReference result = objectReferenceForId(debugId, it);
|
||||
if (result.debugId() == debugId)
|
||||
return result;
|
||||
}
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
void ClientProxy::log(LogDirection direction, const QString &message)
|
||||
@@ -208,71 +218,76 @@ void ClientProxy::log(LogDirection direction, const QString &message)
|
||||
m_adapter.data()->logServiceActivity("QDeclarativeDebug", msg);
|
||||
}
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> QmlJSInspector::Internal::ClientProxy::rootObjectReference() const
|
||||
QList<QmlDebugObjectReference>
|
||||
QmlJSInspector::Internal::ClientProxy::rootObjectReference() const
|
||||
{
|
||||
return m_rootObjects;
|
||||
}
|
||||
|
||||
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId,
|
||||
const QDeclarativeDebugObjectReference &objectRef) const
|
||||
QmlDebugObjectReference
|
||||
ClientProxy::objectReferenceForId(int debugId,
|
||||
const QmlDebugObjectReference &objectRef) const
|
||||
{
|
||||
if (objectRef.debugId() == debugId)
|
||||
return objectRef;
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) {
|
||||
QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, child);
|
||||
foreach (const QmlDebugObjectReference &child, objectRef.children()) {
|
||||
QmlDebugObjectReference result = objectReferenceForId(debugId, child);
|
||||
if (result.debugId() == debugId)
|
||||
return result;
|
||||
}
|
||||
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(const QString &objectId) const
|
||||
QmlDebugObjectReference ClientProxy::objectReferenceForId(
|
||||
const QString &objectId) const
|
||||
{
|
||||
if (!objectId.isEmpty() && objectId[0].isLower()) {
|
||||
const QList<QDeclarativeDebugObjectReference> refs = objectReferences();
|
||||
foreach (const QDeclarativeDebugObjectReference &ref, refs) {
|
||||
const QList<QmlDebugObjectReference> refs = objectReferences();
|
||||
foreach (const QmlDebugObjectReference &ref, refs) {
|
||||
if (ref.idString() == objectId)
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForLocation(const int line, const int column) const
|
||||
QmlDebugObjectReference ClientProxy::objectReferenceForLocation(
|
||||
const int line, const int column) const
|
||||
{
|
||||
const QList<QDeclarativeDebugObjectReference> refs = objectReferences();
|
||||
foreach (const QDeclarativeDebugObjectReference &ref, refs) {
|
||||
const QList<QmlDebugObjectReference> refs = objectReferences();
|
||||
foreach (const QmlDebugObjectReference &ref, refs) {
|
||||
if (ref.source().lineNumber() == line && ref.source().columnNumber() == column)
|
||||
return ref;
|
||||
}
|
||||
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> ClientProxy::objectReferences() const
|
||||
QList<QmlDebugObjectReference> ClientProxy::objectReferences() const
|
||||
{
|
||||
QList<QDeclarativeDebugObjectReference> result;
|
||||
foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects) {
|
||||
QList<QmlDebugObjectReference> result;
|
||||
foreach (const QmlDebugObjectReference &it, m_rootObjects) {
|
||||
result.append(objectReferences(it));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> ClientProxy::objectReferences(const QDeclarativeDebugObjectReference &objectRef) const
|
||||
QList<QmlDebugObjectReference>
|
||||
ClientProxy::objectReferences(const QmlDebugObjectReference &objectRef) const
|
||||
{
|
||||
QList<QDeclarativeDebugObjectReference> result;
|
||||
QList<QmlDebugObjectReference> result;
|
||||
result.append(objectRef);
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) {
|
||||
foreach (const QmlDebugObjectReference &child, objectRef.children()) {
|
||||
result.append(objectReferences(child));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool ClientProxy::setBindingForObject(int objectDebugId,
|
||||
quint32 ClientProxy::setBindingForObject(int objectDebugId,
|
||||
const QString &propertyName,
|
||||
const QVariant &value,
|
||||
bool isLiteralValue,
|
||||
@@ -288,17 +303,23 @@ bool ClientProxy::setBindingForObject(int objectDebugId,
|
||||
if (!isConnected())
|
||||
return false;
|
||||
|
||||
log(LogSend, QString("SET_BINDING %1 %2 %3 %4").arg(QString::number(objectDebugId), propertyName, value.toString(), QString(isLiteralValue ? "true" : "false")));
|
||||
log(LogSend, QString("SET_BINDING %1 %2 %3 %4").arg(
|
||||
QString::number(objectDebugId), propertyName, value.toString(),
|
||||
QString(isLiteralValue ? "true" : "false")));
|
||||
|
||||
bool result = m_engineClient->setBindingForObject(objectDebugId, propertyName, value.toString(), isLiteralValue, source, line);
|
||||
quint32 queryId = m_engineClient->setBindingForObject(
|
||||
objectDebugId, propertyName, value.toString(), isLiteralValue,
|
||||
source, line);
|
||||
|
||||
if (!result)
|
||||
if (!queryId)
|
||||
log(LogSend, QString("failed!"));
|
||||
|
||||
return result;
|
||||
return queryId;
|
||||
}
|
||||
|
||||
bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody)
|
||||
quint32 ClientProxy::setMethodBodyForObject(int objectDebugId,
|
||||
const QString &methodName,
|
||||
const QString &methodBody)
|
||||
{
|
||||
if (objectDebugId == -1)
|
||||
return false;
|
||||
@@ -306,17 +327,20 @@ bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &metho
|
||||
if (!isConnected())
|
||||
return false;
|
||||
|
||||
log(LogSend, QString("SET_METHOD_BODY %1 %2 %3").arg(QString::number(objectDebugId), methodName, methodBody));
|
||||
log(LogSend, QString("SET_METHOD_BODY %1 %2 %3").arg(
|
||||
QString::number(objectDebugId), methodName, methodBody));
|
||||
|
||||
bool result = m_engineClient->setMethodBody(objectDebugId, methodName, methodBody);
|
||||
quint32 queryId = m_engineClient->setMethodBody(
|
||||
objectDebugId, methodName, methodBody);
|
||||
|
||||
if (!result)
|
||||
if (!queryId)
|
||||
log(LogSend, QString("failed!"));
|
||||
|
||||
return result;
|
||||
return queryId;
|
||||
}
|
||||
|
||||
bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& propertyName)
|
||||
quint32 ClientProxy::resetBindingForObject(int objectDebugId,
|
||||
const QString& propertyName)
|
||||
{
|
||||
if (objectDebugId == -1)
|
||||
return false;
|
||||
@@ -324,17 +348,20 @@ bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& proper
|
||||
if (!isConnected())
|
||||
return false;
|
||||
|
||||
log(LogSend, QString("RESET_BINDING %1 %2").arg(QString::number(objectDebugId), propertyName));
|
||||
log(LogSend, QString("RESET_BINDING %1 %2").arg(
|
||||
QString::number(objectDebugId), propertyName));
|
||||
|
||||
bool result = m_engineClient->resetBindingForObject(objectDebugId, propertyName);
|
||||
quint32 queryId = m_engineClient->resetBindingForObject(
|
||||
objectDebugId, propertyName);
|
||||
|
||||
if (!result)
|
||||
if (!queryId)
|
||||
log(LogSend, QString("failed!"));
|
||||
|
||||
return result;
|
||||
return queryId;
|
||||
}
|
||||
|
||||
QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectDebugId, const QString &expr)
|
||||
quint32 ClientProxy::queryExpressionResult(int objectDebugId,
|
||||
const QString &expr)
|
||||
{
|
||||
if (objectDebugId == -1)
|
||||
return 0;
|
||||
@@ -346,13 +373,13 @@ QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectD
|
||||
if (m_adapter)
|
||||
block = m_adapter.data()->disableJsDebugging(true);
|
||||
|
||||
log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg(QString::number(objectDebugId), expr));
|
||||
QDeclarativeDebugExpressionQuery *query
|
||||
= m_engineClient->queryExpressionResult(objectDebugId, expr, m_engineClient);
|
||||
log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg(
|
||||
QString::number(objectDebugId), expr));
|
||||
quint32 queryId = m_engineClient->queryExpressionResult(objectDebugId, expr);
|
||||
|
||||
if (m_adapter)
|
||||
m_adapter.data()->disableJsDebugging(block);
|
||||
return query;
|
||||
return queryId;
|
||||
}
|
||||
|
||||
void ClientProxy::clearComponentCache()
|
||||
@@ -370,32 +397,28 @@ bool ClientProxy::addObjectWatch(int objectDebugId)
|
||||
return false;
|
||||
|
||||
// already set
|
||||
if (m_objectWatches.keys().contains(objectDebugId))
|
||||
if (m_objectWatches.contains(objectDebugId))
|
||||
return true;
|
||||
|
||||
QDeclarativeDebugObjectReference ref = objectReferenceForId(objectDebugId);
|
||||
QmlDebugObjectReference ref = objectReferenceForId(objectDebugId);
|
||||
if (ref.debugId() != objectDebugId)
|
||||
return false;
|
||||
|
||||
// is flooding the debugging output log!
|
||||
// log(LogSend, QString("WATCH_PROPERTY %1").arg(objectDebugId));
|
||||
|
||||
QDeclarativeDebugWatch *watch = m_engineClient->addWatch(ref, m_engineClient);
|
||||
m_objectWatches.insert(objectDebugId, watch);
|
||||
|
||||
connect(watch,SIGNAL(valueChanged(QByteArray,QVariant)),this,SLOT(objectWatchTriggered(QByteArray,QVariant)));
|
||||
if (m_engineClient->addWatch(ref))
|
||||
m_objectWatches.append(objectDebugId);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ClientProxy::objectWatchTriggered(const QByteArray &propertyName, const QVariant &propertyValue)
|
||||
void ClientProxy::objectWatchTriggered(int objectDebugId,
|
||||
const QByteArray &propertyName,
|
||||
const QVariant &propertyValue)
|
||||
{
|
||||
// is flooding the debugging output log!
|
||||
// log(LogReceive, QString("UPDATE_WATCH %1 %2").arg(QString::fromAscii(propertyName), propertyValue.toString()));
|
||||
|
||||
QDeclarativeDebugWatch *watch = dynamic_cast<QDeclarativeDebugWatch *>(QObject::sender());
|
||||
if (watch)
|
||||
emit propertyChanged(watch->objectDebugId(),propertyName, propertyValue);
|
||||
if (m_objectWatches.contains(objectDebugId))
|
||||
emit propertyChanged(objectDebugId, propertyName, propertyValue);
|
||||
}
|
||||
|
||||
bool ClientProxy::removeObjectWatch(int objectDebugId)
|
||||
@@ -403,29 +426,19 @@ bool ClientProxy::removeObjectWatch(int objectDebugId)
|
||||
if (objectDebugId == -1)
|
||||
return false;
|
||||
|
||||
if (!m_objectWatches.keys().contains(objectDebugId))
|
||||
if (!m_objectWatches.contains(objectDebugId))
|
||||
return false;
|
||||
|
||||
if (!isConnected())
|
||||
return false;
|
||||
|
||||
QDeclarativeDebugWatch *watch = m_objectWatches.value(objectDebugId);
|
||||
disconnect(watch,SIGNAL(valueChanged(QByteArray,QVariant)), this, SLOT(objectWatchTriggered(QByteArray,QVariant)));
|
||||
|
||||
// is flooding the debugging output log!
|
||||
// log(LogSend, QString("NO_WATCH %1").arg(QString::number(objectDebugId)));
|
||||
|
||||
m_engineClient->removeWatch(watch);
|
||||
delete watch;
|
||||
m_objectWatches.remove(objectDebugId);
|
||||
|
||||
|
||||
m_objectWatches.removeOne(objectDebugId);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ClientProxy::removeAllObjectWatches()
|
||||
{
|
||||
foreach (int watchedObject, m_objectWatches.keys())
|
||||
foreach (int watchedObject, m_objectWatches)
|
||||
removeObjectWatch(watchedObject);
|
||||
}
|
||||
|
||||
@@ -437,87 +450,75 @@ void ClientProxy::queryEngineContext(int id)
|
||||
if (!isConnected())
|
||||
return;
|
||||
|
||||
if (m_contextQuery) {
|
||||
delete m_contextQuery;
|
||||
m_contextQuery = 0;
|
||||
}
|
||||
if (m_contextQueryId)
|
||||
m_contextQueryId = 0;
|
||||
|
||||
log(LogSend, QString("LIST_OBJECTS %1").arg(QString::number(id)));
|
||||
|
||||
m_contextQuery = m_engineClient->queryRootContexts(QDeclarativeDebugEngineReference(id),
|
||||
m_engineClient);
|
||||
if (!m_contextQuery->isWaiting())
|
||||
contextChanged();
|
||||
else
|
||||
connect(m_contextQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
|
||||
this, SLOT(contextChanged()));
|
||||
m_contextQueryId = m_engineClient->queryRootContexts(QmlDebugEngineReference(id));
|
||||
}
|
||||
|
||||
void ClientProxy::contextChanged()
|
||||
void ClientProxy::contextChanged(const QVariant &value)
|
||||
{
|
||||
log(LogReceive, QString("LIST_OBJECTS_R"));
|
||||
if (m_contextQuery) {
|
||||
if (m_contextQueryId) {
|
||||
m_rootObjects.clear();
|
||||
QDeclarativeDebugContextReference rootContext = m_contextQuery->rootContext();
|
||||
delete m_contextQuery;
|
||||
m_contextQuery = 0;
|
||||
QmlDebugContextReference rootContext =
|
||||
qvariant_cast<QmlDebugContextReference>(value);
|
||||
m_contextQueryId = 0;
|
||||
|
||||
qDeleteAll(m_objectTreeQuery);
|
||||
m_objectTreeQuery.clear();
|
||||
m_objectTreeQueryIds.clear();
|
||||
m_requestObjectsTimer.stop();
|
||||
|
||||
fetchContextObjectRecursive(rootContext);
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::fetchContextObjectRecursive(const QDeclarativeDebugContextReference& context)
|
||||
void ClientProxy::fetchContextObjectRecursive(
|
||||
const QmlDebugContextReference& context)
|
||||
{
|
||||
if (!isConnected())
|
||||
return;
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference & obj, context.objects()) {
|
||||
foreach (const QmlDebugObjectReference & obj, context.objects()) {
|
||||
|
||||
log(LogSend, QString("FETCH_OBJECT %1").arg(obj.idString()));
|
||||
|
||||
QDeclarativeDebugObjectQuery* query
|
||||
= m_engineClient->queryObjectRecursive(obj, m_engineClient);
|
||||
if (!query->isWaiting()) {
|
||||
query->deleteLater(); //ignore errors;
|
||||
} else {
|
||||
m_objectTreeQuery << query;
|
||||
connect(query,
|
||||
SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
|
||||
SLOT(objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
|
||||
}
|
||||
quint32 queryId = m_engineClient->queryObjectRecursive(obj);
|
||||
if (queryId)
|
||||
m_objectTreeQueryIds << queryId;
|
||||
}
|
||||
foreach (const QDeclarativeDebugContextReference& child, context.contexts()) {
|
||||
foreach (const QmlDebugContextReference& child, context.contexts()) {
|
||||
fetchContextObjectRecursive(child);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State state)
|
||||
void ClientProxy::onResult(quint32 queryId, const QVariant &value)
|
||||
{
|
||||
QDeclarativeDebugObjectQuery *query = qobject_cast<QDeclarativeDebugObjectQuery *>(sender());
|
||||
if (!query || state == QDeclarativeDebugQuery::Error) {
|
||||
delete query;
|
||||
return;
|
||||
}
|
||||
if (m_objectTreeQueryIds.contains(queryId))
|
||||
objectTreeFetched(queryId, value);
|
||||
else if (queryId == m_engineQueryId)
|
||||
updateEngineList(value);
|
||||
else if (queryId == m_contextQueryId)
|
||||
contextChanged(value);
|
||||
else
|
||||
emit result(queryId, value);
|
||||
}
|
||||
|
||||
log(LogReceive, QString("FETCH_OBJECT_R %1").arg(query->object().idString()));
|
||||
void ClientProxy::objectTreeFetched(quint32 queryId, const QVariant &result)
|
||||
{
|
||||
QmlDebugObjectReference obj = qvariant_cast<QmlDebugObjectReference>(result);
|
||||
|
||||
m_rootObjects.append(query->object());
|
||||
log(LogReceive, QString("FETCH_OBJECT_R %1").arg(obj.idString()));
|
||||
|
||||
int removed = m_objectTreeQuery.removeAll(query);
|
||||
Q_ASSERT(removed == 1);
|
||||
Q_UNUSED(removed);
|
||||
delete query;
|
||||
m_rootObjects.append(obj);
|
||||
|
||||
if (m_objectTreeQuery.isEmpty()) {
|
||||
m_objectTreeQueryIds.removeOne(queryId);
|
||||
if (m_objectTreeQueryIds.isEmpty()) {
|
||||
int old_count = m_debugIdHash.count();
|
||||
m_debugIdHash.clear();
|
||||
m_debugIdHash.reserve(old_count + 1);
|
||||
foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects)
|
||||
foreach (const QmlDebugObjectReference &it, m_rootObjects)
|
||||
buildDebugIdHashRecursive(it);
|
||||
emit objectTreeUpdated();
|
||||
|
||||
@@ -530,14 +531,15 @@ void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::St
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReference& ref)
|
||||
void ClientProxy::buildDebugIdHashRecursive(const QmlDebugObjectReference& ref)
|
||||
{
|
||||
QUrl fileUrl = ref.source().url();
|
||||
int lineNum = ref.source().lineNumber();
|
||||
int colNum = ref.source().columnNumber();
|
||||
int rev = 0;
|
||||
|
||||
// handle the case where the url contains the revision number encoded. (for object created by the debugger)
|
||||
// handle the case where the url contains the revision number encoded.
|
||||
//(for object created by the debugger)
|
||||
static QRegExp rx("(.*)_(\\d+):(\\d+)$");
|
||||
if (rx.exactMatch(fileUrl.path())) {
|
||||
fileUrl.setPath(rx.cap(1));
|
||||
@@ -548,9 +550,10 @@ void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReferen
|
||||
const QString filePath = InspectorUi::instance()->findFileInProject(fileUrl);
|
||||
|
||||
// append the debug ids in the hash
|
||||
m_debugIdHash[qMakePair<QString, int>(filePath, rev)][qMakePair<int, int>(lineNum, colNum)].append(ref.debugId());
|
||||
m_debugIdHash[qMakePair<QString, int>(filePath, rev)][qMakePair<int, int>(
|
||||
lineNum, colNum)].append(ref.debugId());
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &it, ref.children())
|
||||
foreach (const QmlDebugObjectReference &it, ref.children())
|
||||
buildDebugIdHashRecursive(it);
|
||||
}
|
||||
|
||||
@@ -609,10 +612,12 @@ void ClientProxy::showAppOnTop(bool showOnTop)
|
||||
}
|
||||
|
||||
void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId,
|
||||
const QStringList &imports, const QString &filename, int order)
|
||||
const QStringList &imports,
|
||||
const QString &filename, int order)
|
||||
{
|
||||
if (isConnected())
|
||||
m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports, filename, order);
|
||||
m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports,
|
||||
filename, order);
|
||||
}
|
||||
|
||||
void ClientProxy::destroyQmlObject(int debugId)
|
||||
@@ -629,8 +634,10 @@ void ClientProxy::reparentQmlObject(int debugId, int newParent)
|
||||
|
||||
void ClientProxy::updateConnected()
|
||||
{
|
||||
bool isConnected = m_inspectorClient && m_inspectorClient->status() == QDeclarativeDebugClient::Enabled
|
||||
&& m_engineClient && m_engineClient->status() == QDeclarativeDebugClient::Enabled;
|
||||
bool isConnected = m_inspectorClient &&
|
||||
m_inspectorClient->status() == QDeclarativeDebugClient::Enabled &&
|
||||
m_engineClient &&
|
||||
m_engineClient->status() == QDeclarativeDebugClient::Enabled;
|
||||
|
||||
if (isConnected != m_isConnected) {
|
||||
m_isConnected = isConnected;
|
||||
@@ -645,11 +652,6 @@ void ClientProxy::updateConnected()
|
||||
|
||||
void ClientProxy::reloadEngines()
|
||||
{
|
||||
if (m_engineQuery) {
|
||||
emit connectionStatusMessage("[Inspector] Waiting for response to previous engine query");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isConnected())
|
||||
return;
|
||||
|
||||
@@ -657,28 +659,20 @@ void ClientProxy::reloadEngines()
|
||||
|
||||
log(LogSend, QString("LIST_ENGINES"));
|
||||
|
||||
m_engineQuery = m_engineClient->queryAvailableEngines(m_engineClient);
|
||||
if (!m_engineQuery->isWaiting()) {
|
||||
updateEngineList();
|
||||
} else {
|
||||
connect(m_engineQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
|
||||
this, SLOT(updateEngineList()));
|
||||
}
|
||||
m_engineQueryId = m_engineClient->queryAvailableEngines();
|
||||
}
|
||||
|
||||
QList<QDeclarativeDebugEngineReference> ClientProxy::engines() const
|
||||
QList<QmlDebugEngineReference> ClientProxy::engines() const
|
||||
{
|
||||
return m_engines;
|
||||
}
|
||||
|
||||
void ClientProxy::updateEngineList()
|
||||
void ClientProxy::updateEngineList(const QVariant &value)
|
||||
{
|
||||
log(LogReceive, QString("LIST_ENGINES_R"));
|
||||
|
||||
m_engines = m_engineQuery->engines();
|
||||
delete m_engineQuery;
|
||||
m_engineQuery = 0;
|
||||
|
||||
m_engines = qvariant_cast<QmlDebugEngineReferenceList>(value);
|
||||
m_engineQueryId = 0;
|
||||
emit enginesChanged();
|
||||
}
|
||||
|
||||
|
@@ -60,16 +60,16 @@ public:
|
||||
explicit ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent = 0);
|
||||
~ClientProxy();
|
||||
|
||||
bool setBindingForObject(int objectDebugId,
|
||||
quint32 setBindingForObject(int objectDebugId,
|
||||
const QString &propertyName,
|
||||
const QVariant &value,
|
||||
bool isLiteralValue,
|
||||
QString source,
|
||||
int line);
|
||||
|
||||
bool setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody);
|
||||
bool resetBindingForObject(int objectDebugId, const QString &propertyName);
|
||||
QDeclarativeDebugExpressionQuery *queryExpressionResult(int objectDebugId, const QString &expr);
|
||||
quint32 setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody);
|
||||
quint32 resetBindingForObject(int objectDebugId, const QString &propertyName);
|
||||
quint32 queryExpressionResult(int objectDebugId, const QString &expr);
|
||||
void clearComponentCache();
|
||||
|
||||
bool addObjectWatch(int objectDebugId);
|
||||
@@ -77,19 +77,19 @@ public:
|
||||
void removeAllObjectWatches();
|
||||
|
||||
// returns the object references
|
||||
QList<QDeclarativeDebugObjectReference> objectReferences() const;
|
||||
QDeclarativeDebugObjectReference objectReferenceForId(int debugId) const;
|
||||
QDeclarativeDebugObjectReference objectReferenceForId(const QString &objectId) const;
|
||||
QDeclarativeDebugObjectReference objectReferenceForLocation(const int line, const int column) const;
|
||||
QList<QDeclarativeDebugObjectReference> rootObjectReference() const;
|
||||
QList<QmlDebugObjectReference> objectReferences() const;
|
||||
QmlDebugObjectReference objectReferenceForId(int debugId) const;
|
||||
QmlDebugObjectReference objectReferenceForId(const QString &objectId) const;
|
||||
QmlDebugObjectReference objectReferenceForLocation(const int line, const int column) const;
|
||||
QList<QmlDebugObjectReference> rootObjectReference() const;
|
||||
DebugIdHash debugIdHash() const { return m_debugIdHash; }
|
||||
|
||||
bool isConnected() const;
|
||||
|
||||
void setSelectedItemsByDebugId(const QList<int> &debugIds);
|
||||
void setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs);
|
||||
void setSelectedItemsByObjectId(const QList<QmlDebugObjectReference> &objectRefs);
|
||||
|
||||
QList<QDeclarativeDebugEngineReference> engines() const;
|
||||
QList<QmlDebugEngineReference> engines() const;
|
||||
|
||||
Debugger::QmlAdapter *qmlAdapter() const;
|
||||
|
||||
@@ -100,7 +100,7 @@ signals:
|
||||
void aboutToReloadEngines();
|
||||
void enginesChanged();
|
||||
|
||||
void selectedItemsChanged(const QList<QDeclarativeDebugObjectReference> &selectedItems);
|
||||
void selectedItemsChanged(const QList<QmlDebugObjectReference> &selectedItems);
|
||||
|
||||
void connected();
|
||||
void disconnected();
|
||||
@@ -117,6 +117,8 @@ signals:
|
||||
void selectedColorChanged(const QColor &color);
|
||||
void propertyChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
|
||||
|
||||
void result(quint32 queryId, const QVariant &result);
|
||||
|
||||
public slots:
|
||||
void refreshObjectTree();
|
||||
void queryEngineContext(int id);
|
||||
@@ -140,21 +142,21 @@ private slots:
|
||||
void clientStatusChanged(QDeclarativeDebugClient::Status status);
|
||||
void engineClientStatusChanged(QDeclarativeDebugClient::Status status);
|
||||
|
||||
void contextChanged();
|
||||
|
||||
void onCurrentObjectsChanged(const QList<int> &debugIds, bool requestIfNeeded = true);
|
||||
void updateEngineList();
|
||||
void objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State state = QmlJsDebugClient::QDeclarativeDebugQuery::Completed);
|
||||
void fetchContextObjectRecursive(const QmlJsDebugClient::QDeclarativeDebugContextReference& context);
|
||||
void fetchContextObjectRecursive(const QmlDebugContextReference &context);
|
||||
void newObjects();
|
||||
void objectWatchTriggered(const QByteArray &propertyName, const QVariant &propertyValue);
|
||||
void objectWatchTriggered(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
|
||||
void onResult(quint32 queryId, const QVariant &result);
|
||||
|
||||
private:
|
||||
void contextChanged(const QVariant &value);
|
||||
void updateEngineList(const QVariant &value);
|
||||
void objectTreeFetched(quint32 queryId, const QVariant &result);
|
||||
void updateConnected();
|
||||
void reloadEngines();
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> objectReferences(const QDeclarativeDebugObjectReference &objectRef) const;
|
||||
QDeclarativeDebugObjectReference objectReferenceForId(int debugId, const QDeclarativeDebugObjectReference &ref) const;
|
||||
QList<QmlDebugObjectReference> objectReferences(const QmlDebugObjectReference &objectRef) const;
|
||||
QmlDebugObjectReference objectReferenceForId(int debugId, const QmlDebugObjectReference &ref) const;
|
||||
|
||||
enum LogDirection {
|
||||
LogSend,
|
||||
@@ -164,22 +166,22 @@ private:
|
||||
|
||||
|
||||
private:
|
||||
void buildDebugIdHashRecursive(const QDeclarativeDebugObjectReference &ref);
|
||||
void buildDebugIdHashRecursive(const QmlDebugObjectReference &ref);
|
||||
|
||||
QWeakPointer<Debugger::QmlAdapter> m_adapter;
|
||||
QmlEngineDebugClient *m_engineClient;
|
||||
QmlJSInspectorClient *m_inspectorClient;
|
||||
|
||||
QDeclarativeDebugEnginesQuery *m_engineQuery;
|
||||
QDeclarativeDebugRootContextQuery *m_contextQuery;
|
||||
QList<QDeclarativeDebugObjectQuery *> m_objectTreeQuery;
|
||||
quint32 m_engineQueryId;
|
||||
quint32 m_contextQueryId;
|
||||
QList<quint32> m_objectTreeQueryIds;
|
||||
|
||||
QList<QDeclarativeDebugObjectReference> m_rootObjects;
|
||||
QList<QDeclarativeDebugEngineReference> m_engines;
|
||||
QList<QmlDebugObjectReference> m_rootObjects;
|
||||
QmlDebugEngineReferenceList m_engines;
|
||||
QTimer m_requestObjectsTimer;
|
||||
DebugIdHash m_debugIdHash;
|
||||
|
||||
QHash<int, QDeclarativeDebugWatch *> m_objectWatches;
|
||||
QList<int> m_objectWatches;
|
||||
|
||||
bool m_isConnected;
|
||||
};
|
||||
|
@@ -224,7 +224,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
|
||||
if (!qmlNode)
|
||||
return;
|
||||
|
||||
QDeclarativeDebugObjectReference ref;
|
||||
QmlDebugObjectReference ref;
|
||||
if (QmlJS::AST::Node *node
|
||||
= qmlEditor->semanticInfo().declaringMemberNoProperties(cursorPos)) {
|
||||
if (QmlJS::AST::UiObjectMember *objMember = node->uiObjectMemberCast()) {
|
||||
@@ -249,7 +249,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
|
||||
if ((qmlNode->kind == QmlJS::AST::Node::Kind_IdentifierExpression) &&
|
||||
(m_clientProxy->objectReferenceForId(refToLook).debugId() == -1)) {
|
||||
query = doubleQuote + QString("local: ") + refToLook + doubleQuote;
|
||||
foreach (const QDeclarativeDebugPropertyReference &property, ref.properties()) {
|
||||
foreach (const QmlDebugPropertyReference &property, ref.properties()) {
|
||||
if (property.name() == wordAtCursor
|
||||
&& !property.valueTypeName().isEmpty()) {
|
||||
query = doubleQuote + property.name() + QLatin1Char(':')
|
||||
@@ -263,7 +263,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
|
||||
+ QLatin1Char('+') + refToLook;
|
||||
} else {
|
||||
// show properties
|
||||
foreach (const QDeclarativeDebugPropertyReference &property, ref.properties()) {
|
||||
foreach (const QmlDebugPropertyReference &property, ref.properties()) {
|
||||
if (property.name() == wordAtCursor && !property.valueTypeName().isEmpty()) {
|
||||
query = doubleQuote + property.name() + QLatin1Char(':')
|
||||
+ doubleQuote + QLatin1Char('+') + property.name();
|
||||
@@ -275,25 +275,19 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
|
||||
|
||||
if (!query.isEmpty()) {
|
||||
m_debugQuery = m_clientProxy->queryExpressionResult(ref.debugId(), query);
|
||||
connect(m_debugQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
|
||||
this, SLOT(debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InspectorUi::debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State newState)
|
||||
void InspectorUi::onResult(quint32 queryId, const QVariant &result)
|
||||
{
|
||||
if (newState != QDeclarativeDebugExpressionQuery::Completed)
|
||||
return;
|
||||
if (!m_debugQuery)
|
||||
if (m_debugQuery != queryId)
|
||||
return;
|
||||
|
||||
QString text = m_debugQuery->result().toString();
|
||||
m_debugQuery = 0;
|
||||
QString text = result.toString();
|
||||
if (!text.isEmpty())
|
||||
QToolTip::showText(QCursor::pos(), text);
|
||||
|
||||
disconnect(m_debugQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
|
||||
this, SLOT(debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
|
||||
}
|
||||
|
||||
bool InspectorUi::isConnected() const
|
||||
@@ -303,7 +297,13 @@ bool InspectorUi::isConnected() const
|
||||
|
||||
void InspectorUi::connected(ClientProxy *clientProxy)
|
||||
{
|
||||
if (m_clientProxy)
|
||||
disconnect(m_clientProxy, SIGNAL(result(quint32,QVariant)),
|
||||
this, SLOT(onResult(quint32,QVariant)));
|
||||
m_clientProxy = clientProxy;
|
||||
if (m_clientProxy)
|
||||
connect(m_clientProxy, SIGNAL(result(quint32,QVariant)),
|
||||
SLOT(onResult(quint32,QVariant)));
|
||||
|
||||
QmlJS::Snapshot snapshot = modelManager()->snapshot();
|
||||
for (QHash<QString, QmlJSLiveTextPreview *>::const_iterator it = m_textPreviews.constBegin();
|
||||
@@ -365,19 +365,19 @@ void InspectorUi::objectTreeReady()
|
||||
|
||||
void InspectorUi::updateEngineList()
|
||||
{
|
||||
QList<QDeclarativeDebugEngineReference> engines = m_clientProxy->engines();
|
||||
QList<QmlDebugEngineReference> engines = m_clientProxy->engines();
|
||||
|
||||
//#warning update the QML engines combo
|
||||
|
||||
if (engines.isEmpty())
|
||||
qWarning("qmldebugger: no engines found!");
|
||||
else {
|
||||
const QDeclarativeDebugEngineReference engine = engines.first();
|
||||
const QmlDebugEngineReference engine = engines.first();
|
||||
m_clientProxy->queryEngineContext(engine.debugId());
|
||||
}
|
||||
}
|
||||
|
||||
void InspectorUi::changeSelectedItems(const QList<QDeclarativeDebugObjectReference> &objects)
|
||||
void InspectorUi::changeSelectedItems(const QList<QmlDebugObjectReference> &objects)
|
||||
{
|
||||
if (m_selectionCallbackExpected) {
|
||||
m_selectionCallbackExpected = false;
|
||||
@@ -386,9 +386,9 @@ void InspectorUi::changeSelectedItems(const QList<QDeclarativeDebugObjectReferen
|
||||
m_cursorPositionChangedExternally = true;
|
||||
|
||||
// QmlJSLiveTextPreview doesn't provide valid references, only correct debugIds. We need to remap them
|
||||
QList <QDeclarativeDebugObjectReference> realList;
|
||||
foreach (const QDeclarativeDebugObjectReference &obj, objects) {
|
||||
QDeclarativeDebugObjectReference clientRef = m_clientProxy->objectReferenceForId(obj.debugId());
|
||||
QList <QmlDebugObjectReference> realList;
|
||||
foreach (const QmlDebugObjectReference &obj, objects) {
|
||||
QmlDebugObjectReference clientRef = m_clientProxy->objectReferenceForId(obj.debugId());
|
||||
realList << clientRef;
|
||||
}
|
||||
|
||||
@@ -476,8 +476,8 @@ QmlJSLiveTextPreview *InspectorUi::createPreviewForEditor(Core::IEditor *newEdit
|
||||
} else {
|
||||
preview = new QmlJSLiveTextPreview(doc, initdoc, m_clientProxy, this);
|
||||
connect(preview,
|
||||
SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)),
|
||||
SLOT(changeSelectedItems(QList<QDeclarativeDebugObjectReference>)));
|
||||
SIGNAL(selectedItemsChanged(QList<QmlDebugObjectReference>)),
|
||||
SLOT(changeSelectedItems(QList<QmlDebugObjectReference>)));
|
||||
connect(preview, SIGNAL(reloadQmlViewerRequested()),
|
||||
m_clientProxy, SLOT(reloadQmlViewer()));
|
||||
connect(preview, SIGNAL(disableLivePreviewRequested()), SLOT(disableLivePreview()));
|
||||
@@ -503,36 +503,36 @@ void InspectorUi::reloadQmlViewer()
|
||||
m_clientProxy->reloadQmlViewer();
|
||||
}
|
||||
|
||||
inline QDeclarativeDebugObjectReference findParentRecursive( int goalDebugId,
|
||||
const QList< QDeclarativeDebugObjectReference > &objectsToSearch)
|
||||
inline QmlDebugObjectReference findParentRecursive( int goalDebugId,
|
||||
const QList<QmlDebugObjectReference > &objectsToSearch)
|
||||
{
|
||||
if (goalDebugId == -1)
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &possibleParent, objectsToSearch) {
|
||||
foreach (const QmlDebugObjectReference &possibleParent, objectsToSearch) {
|
||||
// Am I a root object? No parent
|
||||
if ( possibleParent.debugId() == goalDebugId )
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
|
||||
// Is the goal one of my children?
|
||||
foreach (const QDeclarativeDebugObjectReference &child, possibleParent.children())
|
||||
foreach (const QmlDebugObjectReference &child, possibleParent.children())
|
||||
if ( child.debugId() == goalDebugId )
|
||||
return possibleParent;
|
||||
|
||||
// no luck? pass this on
|
||||
QDeclarativeDebugObjectReference candidate = findParentRecursive(goalDebugId, possibleParent.children());
|
||||
QmlDebugObjectReference candidate = findParentRecursive(goalDebugId, possibleParent.children());
|
||||
if (candidate.debugId() != -1)
|
||||
return candidate;
|
||||
}
|
||||
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
inline QString displayName(const QDeclarativeDebugObjectReference &obj)
|
||||
inline QString displayName(const QmlDebugObjectReference &obj)
|
||||
{
|
||||
// special! state names
|
||||
if (obj.className() == "State") {
|
||||
foreach (const QDeclarativeDebugPropertyReference &prop, obj.properties()) {
|
||||
foreach (const QmlDebugPropertyReference &prop, obj.properties()) {
|
||||
if (prop.name() == "name")
|
||||
return prop.value().toString();
|
||||
}
|
||||
@@ -551,16 +551,16 @@ inline QString displayName(const QDeclarativeDebugObjectReference &obj)
|
||||
return QString("<%1>").arg(objTypeName);
|
||||
}
|
||||
|
||||
void InspectorUi::selectItems(const QList<QDeclarativeDebugObjectReference> &objectReferences)
|
||||
void InspectorUi::selectItems(const QList<QmlDebugObjectReference> &objectReferences)
|
||||
{
|
||||
foreach (const QDeclarativeDebugObjectReference &objref, objectReferences) {
|
||||
foreach (const QmlDebugObjectReference &objref, objectReferences) {
|
||||
int debugId = objref.debugId();
|
||||
if (debugId != -1) {
|
||||
// select only the first valid element of the list
|
||||
|
||||
m_clientProxy->removeAllObjectWatches();
|
||||
m_clientProxy->addObjectWatch(debugId);
|
||||
QList <QDeclarativeDebugObjectReference> selectionList;
|
||||
QList <QmlDebugObjectReference> selectionList;
|
||||
selectionList << objref;
|
||||
m_propertyInspector->setCurrentObjects(selectionList);
|
||||
populateCrumblePath(objref);
|
||||
@@ -574,21 +574,21 @@ void InspectorUi::selectItems(const QList<QDeclarativeDebugObjectReference> &obj
|
||||
}
|
||||
}
|
||||
|
||||
bool InspectorUi::isRoot(const QDeclarativeDebugObjectReference &obj) const
|
||||
bool InspectorUi::isRoot(const QmlDebugObjectReference &obj) const
|
||||
{
|
||||
foreach (const QDeclarativeDebugObjectReference &rootObj, m_clientProxy->rootObjectReference())
|
||||
foreach (const QmlDebugObjectReference &rootObj, m_clientProxy->rootObjectReference())
|
||||
if (obj.debugId() == rootObj.debugId())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &objRef)
|
||||
void InspectorUi::populateCrumblePath(const QmlDebugObjectReference &objRef)
|
||||
{
|
||||
QStringList crumbleStrings;
|
||||
QList <int> crumbleData;
|
||||
|
||||
// first find path by climbing the hierarchy
|
||||
QDeclarativeDebugObjectReference ref = objRef;
|
||||
QmlDebugObjectReference ref = objRef;
|
||||
crumbleData << objRef.debugId();
|
||||
crumbleStrings << displayName(objRef);
|
||||
|
||||
@@ -603,7 +603,7 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob
|
||||
crumbleData.clear();
|
||||
|
||||
// now append the children
|
||||
foreach (const QDeclarativeDebugObjectReference &child, objRef.children()) {
|
||||
foreach (const QmlDebugObjectReference &child, objRef.children()) {
|
||||
crumbleData.push_back(child.debugId());
|
||||
crumbleStrings.push_back( displayName(child) );
|
||||
}
|
||||
@@ -613,10 +613,10 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob
|
||||
|
||||
void InspectorUi::selectItems(const QList<int> &objectIds)
|
||||
{
|
||||
QList<QDeclarativeDebugObjectReference> objectReferences;
|
||||
QList<QmlDebugObjectReference> objectReferences;
|
||||
foreach (int objectId, objectIds)
|
||||
{
|
||||
QDeclarativeDebugObjectReference ref = m_clientProxy->objectReferenceForId(objectId);
|
||||
QmlDebugObjectReference ref = m_clientProxy->objectReferenceForId(objectId);
|
||||
if (ref.debugId() == objectId)
|
||||
objectReferences.append(ref);
|
||||
}
|
||||
@@ -646,7 +646,7 @@ void InspectorUi::disable()
|
||||
m_filterExp->setEnabled(false);
|
||||
}
|
||||
|
||||
QDeclarativeDebugObjectReference InspectorUi::objectReferenceForLocation(const QString &fileName, int cursorPosition) const
|
||||
QmlDebugObjectReference InspectorUi::objectReferenceForLocation(const QString &fileName, int cursorPosition) const
|
||||
{
|
||||
Core::EditorManager *editorManager = Core::EditorManager::instance();
|
||||
Core::IEditor *editor = editorManager->openEditor(fileName);
|
||||
@@ -667,17 +667,17 @@ QDeclarativeDebugObjectReference InspectorUi::objectReferenceForLocation(const Q
|
||||
}
|
||||
}
|
||||
}
|
||||
return QDeclarativeDebugObjectReference();
|
||||
return QmlDebugObjectReference();
|
||||
}
|
||||
|
||||
void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj)
|
||||
void InspectorUi::gotoObjectReferenceDefinition(const QmlDebugObjectReference &obj)
|
||||
{
|
||||
if (m_cursorPositionChangedExternally) {
|
||||
m_cursorPositionChangedExternally = false;
|
||||
return;
|
||||
}
|
||||
|
||||
QDeclarativeDebugFileReference source = obj.source();
|
||||
QmlDebugFileReference source = obj.source();
|
||||
|
||||
const QString fileName = m_projectFinder.findFile(source.url());
|
||||
|
||||
@@ -690,7 +690,7 @@ void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectRef
|
||||
m_selectionCallbackExpected = true;
|
||||
|
||||
if (textEditor) {
|
||||
QDeclarativeDebugObjectReference ref = objectReferenceForLocation(fileName);
|
||||
QmlDebugObjectReference ref = objectReferenceForLocation(fileName);
|
||||
if (ref.debugId() != obj.debugId()) {
|
||||
m_selectionCallbackExpected = true;
|
||||
editorManager->addCurrentPositionToNavigationHistory();
|
||||
@@ -843,8 +843,8 @@ void InspectorUi::connectSignals()
|
||||
connect(m_clientProxy, SIGNAL(propertyChanged(int,QByteArray,QVariant)),
|
||||
m_propertyInspector, SLOT(propertyValueChanged(int,QByteArray,QVariant)));
|
||||
|
||||
connect(m_clientProxy, SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)),
|
||||
this, SLOT(selectItems(QList<QDeclarativeDebugObjectReference>)));
|
||||
connect(m_clientProxy, SIGNAL(selectedItemsChanged(QList<QmlDebugObjectReference>)),
|
||||
this, SLOT(selectItems(QList<QmlDebugObjectReference>)));
|
||||
connect(m_clientProxy, SIGNAL(enginesChanged()),
|
||||
this, SLOT(updateEngineList()));
|
||||
connect(m_clientProxy, SIGNAL(serverReloaded()),
|
||||
|
@@ -112,14 +112,15 @@ public slots:
|
||||
void reloadQmlViewer();
|
||||
void serverReloaded();
|
||||
void setApplyChangesToQmlInspector(bool applyChanges);
|
||||
void onResult(quint32 queryId, const QVariant &result);
|
||||
|
||||
private slots:
|
||||
void enable();
|
||||
void disable();
|
||||
void gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj);
|
||||
void selectItems(const QList<QDeclarativeDebugObjectReference> &objectReferences);
|
||||
void gotoObjectReferenceDefinition(const QmlDebugObjectReference &obj);
|
||||
void selectItems(const QList<QmlDebugObjectReference> &objectReferences);
|
||||
void selectItems(const QList<int> &objectIds);
|
||||
void changeSelectedItems(const QList<QDeclarativeDebugObjectReference> &objects);
|
||||
void changeSelectedItems(const QList<QmlDebugObjectReference> &objects);
|
||||
void changePropertyValue(int debugId,const QString &propertyName, const QString &valueExpression);
|
||||
void objectTreeReady();
|
||||
|
||||
@@ -133,7 +134,6 @@ private slots:
|
||||
|
||||
void updatePendingPreviewDocuments(QmlJS::Document::Ptr doc);
|
||||
void showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos);
|
||||
void debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State);
|
||||
|
||||
private:
|
||||
bool addQuotesForData(const QVariant &value) const;
|
||||
@@ -143,9 +143,9 @@ private:
|
||||
void applyChangesToQmlInspectorHelper(bool applyChanges);
|
||||
void setupDockWidgets();
|
||||
QString filenameForShadowBuildFile(const QString &filename) const;
|
||||
void populateCrumblePath(const QDeclarativeDebugObjectReference &objRef);
|
||||
bool isRoot(const QDeclarativeDebugObjectReference &obj) const;
|
||||
QDeclarativeDebugObjectReference objectReferenceForLocation(const QString &fileName, int cursorPosition=-1) const;
|
||||
void populateCrumblePath(const QmlDebugObjectReference &objRef);
|
||||
bool isRoot(const QmlDebugObjectReference &obj) const;
|
||||
QmlDebugObjectReference objectReferenceForLocation(const QString &fileName, int cursorPosition=-1) const;
|
||||
|
||||
void connectSignals();
|
||||
void disconnectSignals();
|
||||
@@ -160,7 +160,7 @@ private:
|
||||
InspectorSettings *m_settings;
|
||||
ClientProxy *m_clientProxy;
|
||||
QObject *m_qmlEngine;
|
||||
QDeclarativeDebugExpressionQuery *m_debugQuery;
|
||||
quint32 m_debugQuery;
|
||||
|
||||
// Qml/JS integration
|
||||
QHash<QString, QmlJSLiveTextPreview *> m_textPreviews;
|
||||
|
@@ -182,15 +182,15 @@ void QmlJSInspectorClient::setCurrentObjects(const QList<int> &debugIds)
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
void recurseObjectIdList(const QDeclarativeDebugObjectReference &ref, QList<int> &debugIds, QList<QString> &objectIds)
|
||||
void recurseObjectIdList(const QmlDebugObjectReference &ref, QList<int> &debugIds, QList<QString> &objectIds)
|
||||
{
|
||||
debugIds << ref.debugId();
|
||||
objectIds << ref.idString();
|
||||
foreach (const QDeclarativeDebugObjectReference &child, ref.children())
|
||||
foreach (const QmlDebugObjectReference &child, ref.children())
|
||||
recurseObjectIdList(child, debugIds, objectIds);
|
||||
}
|
||||
|
||||
void QmlJSInspectorClient::setObjectIdList(const QList<QDeclarativeDebugObjectReference> &objectRoots)
|
||||
void QmlJSInspectorClient::setObjectIdList(const QList<QmlDebugObjectReference> &objectRoots)
|
||||
{
|
||||
QByteArray message;
|
||||
QDataStream ds(&message, QIODevice::WriteOnly);
|
||||
@@ -198,7 +198,7 @@ void QmlJSInspectorClient::setObjectIdList(const QList<QDeclarativeDebugObjectRe
|
||||
QList<int> debugIds;
|
||||
QList<QString> objectIds;
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &ref, objectRoots)
|
||||
foreach (const QmlDebugObjectReference &ref, objectRoots)
|
||||
recurseObjectIdList(ref, debugIds, objectIds);
|
||||
|
||||
InspectorProtocol::Message cmd = InspectorProtocol::ObjectIdList;
|
||||
|
@@ -68,7 +68,7 @@ public:
|
||||
QList<int> currentObjects() const;
|
||||
|
||||
// ### Qt 4.8: remove if we can have access to qdeclarativecontextdata or id's
|
||||
void setObjectIdList(const QList<QDeclarativeDebugObjectReference> &objectRoots);
|
||||
void setObjectIdList(const QList<QmlDebugObjectReference> &objectRoots);
|
||||
|
||||
void clearComponentCache();
|
||||
|
||||
|
@@ -220,7 +220,7 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList<int> offsets, const QStr
|
||||
if (m_editors.isEmpty() || !m_previousDoc || !m_clientProxy)
|
||||
return;
|
||||
|
||||
QDeclarativeDebugObjectReference objectRefUnderCursor;
|
||||
QmlDebugObjectReference objectRefUnderCursor;
|
||||
objectRefUnderCursor = m_clientProxy.data()->objectReferenceForId(wordAtCursor);
|
||||
|
||||
QList<int> selectedReferences;
|
||||
@@ -252,20 +252,20 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList<int> offsets, const QStr
|
||||
}
|
||||
|
||||
if (!selectedReferences.isEmpty()) {
|
||||
QList<QDeclarativeDebugObjectReference> refs;
|
||||
QList<QmlDebugObjectReference> refs;
|
||||
foreach(int i, selectedReferences)
|
||||
refs << QDeclarativeDebugObjectReference(i);
|
||||
refs << QmlDebugObjectReference(i);
|
||||
emit selectedItemsChanged(refs);
|
||||
}
|
||||
}
|
||||
|
||||
static QList<int> findRootObjectRecursive(const QDeclarativeDebugObjectReference &object, const Document::Ptr &doc)
|
||||
static QList<int> findRootObjectRecursive(const QmlDebugObjectReference &object, const Document::Ptr &doc)
|
||||
{
|
||||
QList<int> result;
|
||||
if (object.className() == doc->componentName())
|
||||
result += object.debugId();
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &it, object.children()) {
|
||||
foreach (const QmlDebugObjectReference &it, object.children()) {
|
||||
result += findRootObjectRecursive(it, doc);
|
||||
}
|
||||
return result;
|
||||
@@ -305,7 +305,7 @@ void QmlJSLiveTextPreview::updateDebugIds()
|
||||
if(doc->qmlProgram()->members && doc->qmlProgram()->members->member) {
|
||||
UiObjectMember* root = doc->qmlProgram()->members->member;
|
||||
QList<int> r;
|
||||
foreach(const QDeclarativeDebugObjectReference& it, clientProxy->rootObjectReference())
|
||||
foreach (const QmlDebugObjectReference& it, clientProxy->rootObjectReference())
|
||||
r += findRootObjectRecursive(it, doc);
|
||||
if (!r.isEmpty())
|
||||
m_debugIds[root] += r;
|
||||
@@ -464,7 +464,10 @@ protected:
|
||||
if (isLiteral)
|
||||
expr = castToLiteral(scriptCode, scriptBinding);
|
||||
appliedChangesToViewer = true;
|
||||
m_clientProxy->setBindingForObject(debugId, propertyName, expr, isLiteral, document()->fileName(), scriptBinding->firstSourceLocation().startLine);
|
||||
m_clientProxy->setBindingForObject(
|
||||
debugId, propertyName, expr,
|
||||
isLiteral, document()->fileName(),
|
||||
scriptBinding->firstSourceLocation().startLine);
|
||||
}
|
||||
|
||||
virtual void resetBindingForObject(int debugId, const QString &propertyName)
|
||||
|
@@ -72,8 +72,8 @@ public:
|
||||
|
||||
void associateEditor(Core::IEditor *editor);
|
||||
void unassociateEditor(Core::IEditor *editor);
|
||||
void setActiveObject(const QDeclarativeDebugObjectReference &object);
|
||||
void mapObjectToQml(const QDeclarativeDebugObjectReference &object);
|
||||
void setActiveObject(const QmlDebugObjectReference &object);
|
||||
void mapObjectToQml(const QmlDebugObjectReference &object);
|
||||
void resetInitialDoc(const QmlJS::Document::Ptr &doc);
|
||||
|
||||
void setClientProxy(ClientProxy *clientProxy);
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
};
|
||||
|
||||
signals:
|
||||
void selectedItemsChanged(const QList<QDeclarativeDebugObjectReference> &objects);
|
||||
void selectedItemsChanged(const QList<QmlDebugObjectReference> &objects);
|
||||
void reloadQmlViewerRequested();
|
||||
void disableLivePreviewRequested();
|
||||
|
||||
|
@@ -295,14 +295,14 @@ void QmlJSPropertyInspector::clear()
|
||||
m_currentObjects.clear();
|
||||
}
|
||||
|
||||
void QmlJSPropertyInspector::setCurrentObjects(const QList<QDeclarativeDebugObjectReference> &objectList)
|
||||
void QmlJSPropertyInspector::setCurrentObjects(const QList<QmlDebugObjectReference> &objectList)
|
||||
{
|
||||
if (objectList.isEmpty())
|
||||
return;
|
||||
|
||||
clear();
|
||||
|
||||
foreach (const QDeclarativeDebugObjectReference &obj, objectList) {
|
||||
foreach (const QmlDebugObjectReference &obj, objectList) {
|
||||
m_currentObjects << obj.debugId();
|
||||
buildPropertyTree(obj);
|
||||
}
|
||||
@@ -350,7 +350,7 @@ void QmlJSPropertyInspector::propertyValueEdited(const int objectId,const QStrin
|
||||
emit changePropertyValue(objectId, propertyName, propertyValue);
|
||||
}
|
||||
|
||||
void QmlJSPropertyInspector::buildPropertyTree(const QDeclarativeDebugObjectReference &obj)
|
||||
void QmlJSPropertyInspector::buildPropertyTree(const QmlDebugObjectReference &obj)
|
||||
{
|
||||
// Strip off the misleading metadata
|
||||
QString objTypeName = obj.className();
|
||||
@@ -375,7 +375,7 @@ void QmlJSPropertyInspector::buildPropertyTree(const QDeclarativeDebugObjectRefe
|
||||
false);
|
||||
}
|
||||
|
||||
foreach (const QDeclarativeDebugPropertyReference &prop, obj.properties()) {
|
||||
foreach (const QmlDebugPropertyReference &prop, obj.properties()) {
|
||||
QString propertyName = prop.name();
|
||||
QString propertyValue = prop.value().toString();
|
||||
|
||||
|
@@ -129,7 +129,7 @@ signals:
|
||||
void customContextMenuRequested(const QPoint &pos);
|
||||
|
||||
public slots:
|
||||
void setCurrentObjects(const QList<QDeclarativeDebugObjectReference> &);
|
||||
void setCurrentObjects(const QList<QmlDebugObjectReference> &);
|
||||
void propertyValueEdited(const int objectId,const QString &propertyName, const QString &propertyValue);
|
||||
void propertyValueChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
|
||||
void filterBy(const QString &expression);
|
||||
@@ -139,7 +139,7 @@ public slots:
|
||||
|
||||
private:
|
||||
friend class PropertyEditDelegate;
|
||||
void buildPropertyTree(const QDeclarativeDebugObjectReference &);
|
||||
void buildPropertyTree(const QmlDebugObjectReference &);
|
||||
void addRow(const QString &name, const QString &value, const QString &type,
|
||||
const int debugId = -1, bool editable = true);
|
||||
void setColorIcon(int row);
|
||||
|
Reference in New Issue
Block a user