From f1e06cdd804934ff8c0b350b41d3d7187a21560c Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Thu, 24 Sep 2009 16:19:56 +1000 Subject: Indicate which properties are watchable and use bold text instead of coloured text for watched properties. --- src/declarative/debugger/qmldebug.cpp | 14 ++++++++---- src/declarative/debugger/qmldebug.h | 2 ++ src/declarative/qml/qmlenginedebug.cpp | 5 +++-- src/declarative/qml/qmlenginedebug_p.h | 1 + tools/qmldebugger/engine.cpp | 41 +++++++++++++++++++++------------- tools/qmldebugger/engine.h | 5 ++--- tools/qmldebugger/propertyview.cpp | 24 ++++++++++---------- tools/qmldebugger/propertyview.h | 4 ++-- 8 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/declarative/debugger/qmldebug.cpp b/src/declarative/debugger/qmldebug.cpp index 406d955..a515c1d 100644 --- a/src/declarative/debugger/qmldebug.cpp +++ b/src/declarative/debugger/qmldebug.cpp @@ -105,9 +105,10 @@ void QmlEngineDebugPrivate::decode(QDataStream &ds, QmlDebugObjectReference &o, QmlEngineDebugServer::QmlObjectProperty data; ds >> data; QmlDebugPropertyReference prop; + prop.m_objectDebugId = o.m_debugId; prop.m_name = data.name; prop.m_binding = data.binding; - prop.m_objectDebugId = o.m_debugId; + prop.m_hasNotifySignal = data.hasNotifySignal; if (data.type == QmlEngineDebugServer::QmlObjectProperty::Basic) prop.m_value = data.value; else if (data.type == QmlEngineDebugServer::QmlObjectProperty::Object) { @@ -742,18 +743,18 @@ void QmlDebugFileReference::setColumnNumber(int c) } QmlDebugPropertyReference::QmlDebugPropertyReference() -: m_objectDebugId(-1) +: m_objectDebugId(-1), m_hasNotifySignal(false) { } QmlDebugPropertyReference::QmlDebugPropertyReference(const QmlDebugPropertyReference &o) -: m_objectDebugId(o.m_objectDebugId), m_name(o.m_name), m_value(o.m_value), m_binding(o.m_binding) +: m_objectDebugId(o.m_objectDebugId), m_name(o.m_name), m_value(o.m_value), m_binding(o.m_binding), m_hasNotifySignal(o.m_hasNotifySignal) { } QmlDebugPropertyReference &QmlDebugPropertyReference::operator=(const QmlDebugPropertyReference &o) { - m_objectDebugId = o.m_objectDebugId; m_name = o.m_name; m_value = o.m_value; m_binding = o.m_binding; + m_objectDebugId = o.m_objectDebugId; m_name = o.m_name; m_value = o.m_value; m_binding = o.m_binding; m_hasNotifySignal = o.m_hasNotifySignal; return *this; } @@ -776,3 +777,8 @@ QString QmlDebugPropertyReference::binding() const { return m_binding; } + +bool QmlDebugPropertyReference::hasNotifySignal() const +{ + return m_hasNotifySignal; +} diff --git a/src/declarative/debugger/qmldebug.h b/src/declarative/debugger/qmldebug.h index be28a7e..9fd5fae 100644 --- a/src/declarative/debugger/qmldebug.h +++ b/src/declarative/debugger/qmldebug.h @@ -229,6 +229,7 @@ public: QString name() const; QVariant value() const; QString binding() const; + bool hasNotifySignal() const; private: friend class QmlEngineDebugPrivate; @@ -236,6 +237,7 @@ private: QString m_name; QVariant m_value; QString m_binding; + bool m_hasNotifySignal; }; diff --git a/src/declarative/qml/qmlenginedebug.cpp b/src/declarative/qml/qmlenginedebug.cpp index 7896afe..9f0bae6 100644 --- a/src/declarative/qml/qmlenginedebug.cpp +++ b/src/declarative/qml/qmlenginedebug.cpp @@ -80,7 +80,7 @@ QDataStream &operator>>(QDataStream &ds, QDataStream &operator<<(QDataStream &ds, const QmlEngineDebugServer::QmlObjectProperty &data) { - ds << (int)data.type << data.name << data.value << data.binding; + ds << (int)data.type << data.name << data.value << data.binding << data.hasNotifySignal; return ds; } @@ -88,7 +88,7 @@ QDataStream &operator>>(QDataStream &ds, QmlEngineDebugServer::QmlObjectProperty &data) { int type; - ds >> type >> data.name >> data.value >> data.binding; + ds >> type >> data.name >> data.value >> data.binding >> data.hasNotifySignal; data.type = (QmlEngineDebugServer::QmlObjectProperty::Type)type; return ds; } @@ -102,6 +102,7 @@ QmlEngineDebugServer::propertyData(QObject *obj, int propIdx) rv.type = QmlObjectProperty::Unknown; rv.name = prop.name(); + rv.hasNotifySignal = prop.hasNotifySignal(); QmlAbstractBinding *binding = QmlMetaProperty(obj, rv.name).binding(); if (binding) rv.binding = binding->expression(); diff --git a/src/declarative/qml/qmlenginedebug_p.h b/src/declarative/qml/qmlenginedebug_p.h index f935c04..e2f903c 100644 --- a/src/declarative/qml/qmlenginedebug_p.h +++ b/src/declarative/qml/qmlenginedebug_p.h @@ -86,6 +86,7 @@ public: QString name; QVariant value; QString binding; + bool hasNotifySignal; }; static void addEngine(QmlEngine *); diff --git a/tools/qmldebugger/engine.cpp b/tools/qmldebugger/engine.cpp index 3fee46d..f76110c 100644 --- a/tools/qmldebugger/engine.cpp +++ b/tools/qmldebugger/engine.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -97,31 +98,38 @@ void QmlObjectTree::mousePressEvent(QMouseEvent *me) } - -class WatchTableView : public QTableView +class WatchTableHeaderView : public QHeaderView { Q_OBJECT public: - WatchTableView(QWidget *parent); + WatchTableHeaderView(QTableView *parent); signals: void stopWatching(int column); protected: void mousePressEvent(QMouseEvent *me); + +private: + QTableView *m_table; }; -WatchTableView::WatchTableView(QWidget *parent) - : QTableView(parent) +WatchTableHeaderView::WatchTableHeaderView(QTableView *parent) + : QHeaderView(Qt::Horizontal, parent), m_table(parent) { + QObject::connect(this, SIGNAL(sectionClicked(int)), + m_table, SLOT(selectColumn(int))); + setClickable(true); } -void WatchTableView::mousePressEvent(QMouseEvent *me) +void WatchTableHeaderView::mousePressEvent(QMouseEvent *me) { - QTableView::mousePressEvent(me); - if (me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) { - int col = columnAt(me->x()); + QHeaderView::mousePressEvent(me); + + if (me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) { + int col = logicalIndexAt(me->pos()); if (col >= 0) { + m_table->selectColumn(col); QAction action(tr("Stop watching"), 0); QList actions; actions << &action; @@ -193,20 +201,22 @@ EnginePane::EnginePane(QmlDebugConnection *client, QWidget *parent) hbox->addWidget(m_objTree); m_propView = new PropertyView(this); - connect(m_propView, SIGNAL(propertyDoubleClicked(QmlDebugPropertyReference)), - this, SLOT(propertyDoubleClicked(QmlDebugPropertyReference))); + connect(m_propView, SIGNAL(propertyActivated(QmlDebugPropertyReference)), + this, SLOT(propertyActivated(QmlDebugPropertyReference))); m_watchTableModel = new WatchTableModel(this); - m_watchTable = new WatchTableView(this); + m_watchTable = new QTableView(this); m_watchTable->setModel(m_watchTableModel); QObject::connect(m_watchTable, SIGNAL(activated(QModelIndex)), this, SLOT(watchedItemActivated(QModelIndex))); - QObject::connect(m_watchTable, SIGNAL(stopWatching(int)), + WatchTableHeaderView *header = new WatchTableHeaderView(m_watchTable); + m_watchTable->setHorizontalHeader(header); + QObject::connect(header, SIGNAL(stopWatching(int)), this, SLOT(stopWatching(int))); m_tabs = new QTabWidget(this); m_tabs->addTab(m_propView, tr("Properties")); - m_tabs->addTab(m_watchTable, tr("Watching")); + m_tabs->addTab(m_watchTable, tr("Watched")); hbox->addWidget(m_tabs); hbox->setStretchFactor(m_tabs, 2); @@ -278,7 +288,7 @@ void EnginePane::valueChanged(const QByteArray &propertyName, const QVariant &va } } -void EnginePane::propertyDoubleClicked(const QmlDebugPropertyReference &property) +void EnginePane::propertyActivated(const QmlDebugPropertyReference &property) { PropertyView *view = qobject_cast(sender()); if (!view) @@ -331,6 +341,7 @@ void EnginePane::watchedItemActivated(const QModelIndex &index) QTreeWidgetItem *item = m_objTree->findItemByObjectId(watch->objectDebugId()); if (item) { m_objTree->setCurrentItem(item); + m_objTree->scrollToItem(item); item->setExpanded(true); } } diff --git a/tools/qmldebugger/engine.h b/tools/qmldebugger/engine.h index b3e0129..8e5d384 100644 --- a/tools/qmldebugger/engine.h +++ b/tools/qmldebugger/engine.h @@ -17,7 +17,6 @@ class QmlObjectTree; class EngineClientPlugin; class PropertyView; class WatchTableModel; -class WatchTableView; class QLineEdit; class QModelIndex; class QTreeWidget; @@ -52,7 +51,7 @@ private slots: void valueChanged(const QByteArray &property, const QVariant &value); - void propertyDoubleClicked(const QmlDebugPropertyReference &property); + void propertyActivated(const QmlDebugPropertyReference &property); void propertyWatchStateChanged(); void watchedItemActivated(const QModelIndex &index); void stopWatching(int column); @@ -71,7 +70,7 @@ private: QmlObjectTree *m_objTree; QTabWidget *m_tabs; PropertyView *m_propView; - WatchTableView *m_watchTable; + QTableView *m_watchTable; QmlView *m_engineView; QList m_engineItems; diff --git a/tools/qmldebugger/propertyview.cpp b/tools/qmldebugger/propertyview.cpp index d5bb3df..44e406b 100644 --- a/tools/qmldebugger/propertyview.cpp +++ b/tools/qmldebugger/propertyview.cpp @@ -16,8 +16,8 @@ PropertyView::PropertyView(QWidget *parent) m_tree = new QTreeWidget(this); m_tree->setExpandsOnDoubleClick(false); m_tree->setHeaderLabels(QStringList() << tr("Property") << tr("Value")); - QObject::connect(m_tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), - this, SLOT(itemDoubleClicked(QTreeWidgetItem *))); + QObject::connect(m_tree, SIGNAL(itemActivated(QTreeWidgetItem *, int)), + this, SLOT(itemActivated(QTreeWidgetItem *))); m_tree->setColumnCount(2); @@ -55,11 +55,12 @@ void PropertyView::setObject(const QmlDebugObjectReference &object) const QmlDebugPropertyReference &p = properties[i]; PropertyViewItem *item = new PropertyViewItem(m_tree); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); - item->setCheckState(0, Qt::Unchecked); item->property = p; item->setText(0, p.name()); + item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + if (!p.hasNotifySignal()) + item->setForeground(0, Qt::lightGray); if (!p.binding().isEmpty()) { PropertyViewItem *binding = new PropertyViewItem(item); @@ -96,20 +97,19 @@ void PropertyView::setPropertyIsWatched(const QString &name, bool watched) { for (int i=0; itopLevelItemCount(); i++) { PropertyViewItem *item = static_cast(m_tree->topLevelItem(i)); - if (item->property.name() == name) { - if (watched) - item->setCheckState(0, Qt::Checked); - else - item->setCheckState(0, Qt::Unchecked); + if (item->property.name() == name && item->property.hasNotifySignal()) { + QFont font = m_tree->font(); + font.setBold(watched); + item->setFont(0, font); } } } -void PropertyView::itemDoubleClicked(QTreeWidgetItem *i) +void PropertyView::itemActivated(QTreeWidgetItem *i) { PropertyViewItem *item = static_cast(i); - if (!item->property.name().isEmpty()) - emit propertyDoubleClicked(item->property); + if (!item->property.name().isEmpty() && item->property.hasNotifySignal()) + emit propertyActivated(item->property); } QT_END_NAMESPACE diff --git a/tools/qmldebugger/propertyview.h b/tools/qmldebugger/propertyview.h index 92200fa..6b69bdf 100644 --- a/tools/qmldebugger/propertyview.h +++ b/tools/qmldebugger/propertyview.h @@ -25,10 +25,10 @@ public: void clear(); signals: - void propertyDoubleClicked(const QmlDebugPropertyReference &property); + void propertyActivated(const QmlDebugPropertyReference &property); private slots: - void itemDoubleClicked(QTreeWidgetItem *); + void itemActivated(QTreeWidgetItem *); private: QmlDebugObjectReference m_object; -- cgit v0.12