From 806519aae438812f848aefd8400846e3a3c2259f Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Mon, 28 Sep 2009 11:00:34 +1000 Subject: Auto-remove from watch table depending on watch state, and check a watch is created ok before adding it. --- tools/qmldebugger/engine.cpp | 46 ++++++++++++++++++++--------------- tools/qmldebugger/watchtablemodel.cpp | 10 ++++++++ tools/qmldebugger/watchtablemodel.h | 6 +++-- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/tools/qmldebugger/engine.cpp b/tools/qmldebugger/engine.cpp index f76110c..8a06213 100644 --- a/tools/qmldebugger/engine.cpp +++ b/tools/qmldebugger/engine.cpp @@ -259,9 +259,11 @@ void EnginePane::showProperties() } QmlDebugWatch *watch = m_client.addWatch(obj, this); - m_watchedObject = watch; - QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), - this, SLOT(valueChanged(QByteArray,QVariant))); + if (watch->state() != QmlDebugWatch::Dead) { + m_watchedObject = watch; + QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), + this, SLOT(valueChanged(QByteArray,QVariant))); + } delete m_object; m_object = 0; } @@ -270,10 +272,12 @@ void EnginePane::addExpressionWatch(int debugId, const QString &expr) { QmlDebugWatch *watch = m_client.addWatch(QmlDebugObjectReference(debugId), expr, this); - QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), - this, SLOT(valueChanged(QByteArray,QVariant))); - m_watchTableModel->addWatch(watch, expr); - m_watchTable->resizeColumnsToContents(); + if (watch->state() != QmlDebugWatch::Dead) { + QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), + this, SLOT(valueChanged(QByteArray,QVariant))); + m_watchTableModel->addWatch(watch, expr); + m_watchTable->resizeColumnsToContents(); + } } void EnginePane::valueChanged(const QByteArray &propertyName, const QVariant &value) @@ -297,22 +301,24 @@ void EnginePane::propertyActivated(const QmlDebugPropertyReference &property) QmlDebugObjectReference object = view->object(); QmlDebugWatch *watch = m_watchTableModel->findWatch(object.debugId(), property.name()); if (watch) { - m_watchTableModel->removeWatch(watch); m_client.removeWatch(watch); delete watch; + watch = 0; } else { QmlDebugWatch *watch = m_client.addWatch(property, this); - QObject::connect(watch, SIGNAL(stateChanged(State)), - this, SLOT(propertyWatchStateChanged())); - QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), - this, SLOT(valueChanged(QByteArray,QVariant))); - QString desc = property.name() - + QLatin1String(" on\n") - + object.className() - + QLatin1String(": ") - + (object.name().isEmpty() ? QLatin1String("") : object.name()); - m_watchTableModel->addWatch(watch, desc); - m_watchTable->resizeColumnsToContents(); + if (watch->state() != QmlDebugWatch::Dead) { + QObject::connect(watch, SIGNAL(stateChanged(State)), + this, SLOT(propertyWatchStateChanged())); + QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), + this, SLOT(valueChanged(QByteArray,QVariant))); + QString desc = property.name() + + QLatin1String(" on\n") + + object.className() + + QLatin1String(": ") + + (object.name().isEmpty() ? QLatin1String("") : object.name()); + m_watchTableModel->addWatch(watch, desc); + m_watchTable->resizeColumnsToContents(); + } } } @@ -327,9 +333,9 @@ void EnginePane::stopWatching(int column) { QmlDebugWatch *watch = m_watchTableModel->findWatch(column); if (watch) { - m_watchTableModel->removeWatch(watch); m_client.removeWatch(watch); delete watch; + watch = 0; } } diff --git a/tools/qmldebugger/watchtablemodel.cpp b/tools/qmldebugger/watchtablemodel.cpp index f9defc4..2fed199 100644 --- a/tools/qmldebugger/watchtablemodel.cpp +++ b/tools/qmldebugger/watchtablemodel.cpp @@ -18,6 +18,9 @@ void WatchTableModel::addWatch(QmlDebugWatch *watch, const QString &title) if (qobject_cast(watch)) property = qobject_cast(watch)->name(); + // Watch will be automatically removed when its state is Inactive + QObject::connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged())); + int col = columnCount(QModelIndex()); beginInsertColumns(QModelIndex(), col, col); @@ -142,6 +145,13 @@ QVariant WatchTableModel::data(const QModelIndex &idx, int role) const } } +void WatchTableModel::watchStateChanged() +{ + QmlDebugWatch *watch = qobject_cast(sender()); + if (watch && watch->state() == QmlDebugWatch::Inactive) + removeWatch(watch); +} + int WatchTableModel::columnForWatch(QmlDebugWatch *watch) const { for (int i=0; i