From 5285379f18fc4e46a9bd3a92abda53df68eaec9c Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Wed, 17 Dec 2008 17:43:01 +0100 Subject: [PATCH] make watchers persistent in the session --- bin/gdbmacros/gdbmacros.cpp | 1 + src/plugins/debugger/debuggermanager.cpp | 6 +++ src/plugins/debugger/watchhandler.cpp | 61 +++++++++++++++++++----- src/plugins/debugger/watchhandler.h | 11 +++++ tests/manual/gdbdebugger/simple/app.cpp | 2 +- 5 files changed, 68 insertions(+), 13 deletions(-) diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp index a3b3de6a4de..e99c4dc8a1f 100644 --- a/bin/gdbmacros/gdbmacros.cpp +++ b/bin/gdbmacros/gdbmacros.cpp @@ -2157,6 +2157,7 @@ static void qDumpStdMap(QDumper &d) // HACK: we need a properly const qualified version of the // std::pair used. We extract it from the allocator parameter + // (#4, "std::allocator<std::pair<key, value> >") // as it is there, and, equally importantly, in an order that // gdb accepts when fed with it. char *pairType = (char *)(d.templateParameters[3]) + 16; diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ae32033b0dd..62820b3fd1b 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -250,6 +250,10 @@ void DebuggerManager::init() this, SLOT(watchExpression(QString))); connect(watchersView, SIGNAL(requestRemoveWatchExpression(QString)), this, SLOT(removeWatchExpression(QString))); + connect(m_watchHandler, SIGNAL(sessionValueRequested(QString,QVariant*)), + this, SIGNAL(sessionValueRequested(QString,QVariant*))); + connect(m_watchHandler, SIGNAL(setSessionValueRequested(QString,QVariant)), + this, SIGNAL(setSessionValueRequested(QString,QVariant))); // Tooltip QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow); @@ -948,6 +952,7 @@ void DebuggerManager::aboutToSaveSession() void DebuggerManager::loadSessionData() { m_breakHandler->loadSessionData(); + m_watchHandler->loadSessionData(); QVariant value; querySessionValue(QLatin1String("UseFastStart"), &value); @@ -964,6 +969,7 @@ void DebuggerManager::loadSessionData() void DebuggerManager::saveSessionData() { m_breakHandler->saveSessionData(); + m_watchHandler->saveSessionData(); setSessionValue(QLatin1String("UseFastStart"), m_useFastStartAction->isChecked()); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 59e37f2acb3..152011c26ea 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -888,6 +888,8 @@ void WatchHandler::watchExpression(const QString &exp) data.name = exp; data.iname = "watch." + exp; insertData(data); + m_watchers.append(exp); + saveWatchers(); emit watchModelUpdateRequested(); } @@ -965,7 +967,9 @@ void WatchHandler::showEditValue(const WatchData &data) void WatchHandler::removeWatchExpression(const QString &iname) { MODEL_DEBUG("REMOVE WATCH: " << iname); - (void) takeData(iname); + WatchData data = takeData(iname); + m_watchers.removeOne(data.iname); + saveWatchers(); emit watchModelUpdateRequested(); } @@ -973,19 +977,26 @@ void WatchHandler::reinitializeWatchers() { m_completeSet = initialSet(); m_incompleteSet.clear(); + reinitializeWatchersHelper(); +} +void WatchHandler::reinitializeWatchersHelper() +{ // copy over all watchers and mark all watchers as incomplete - for (int i = 0, n = m_oldSet.size(); i < n; ++i) { - WatchData data = m_oldSet.at(i); - if (data.isWatcher()) { - data.level = -1; - data.row = -1; - data.parentIndex = -1; - data.variable.clear(); - data.setAllNeeded(); - data.valuedisabled = false; - insertData(data); // properly handles "neededChildren" - } + int i = 0; + foreach (const QString &exp, m_watchers) { + WatchData data; + data.level = -1; + data.row = -1; + data.parentIndex = -1; + data.variable.clear(); + data.setAllNeeded(); + data.valuedisabled = false; + data.iname = "watch." + QString::number(i); + data.name = exp; + data.exp = exp; + insertData(data); + ++i; } } @@ -1180,3 +1191,29 @@ bool WatchHandler::checkIndex(int id) const } return true; } + +void WatchHandler::loadWatchers() +{ + QVariant value; + sessionValueRequested("Watchers", &value); + m_watchers = value.toStringList(); + qDebug() << "LOAD WATCHERS: " << m_watchers; + reinitializeWatchersHelper(); +} + +void WatchHandler::saveWatchers() +{ + qDebug() << "SAVE WATCHERS: " << m_watchers; + setSessionValueRequested("Watchers", m_watchers); +} + +void WatchHandler::saveSessionData() +{ + saveWatchers(); +} + +void WatchHandler::loadSessionData() +{ + loadWatchers(); + rebuildModel(); +} diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index 4ac2218a471..4c2a20b167f 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -186,13 +186,23 @@ public: WatchData *findData(const QString &iname); + void loadSessionData(); + void saveSessionData(); + signals: void watchModelUpdateRequested(); + void sessionValueRequested(const QString &name, QVariant *value); + void setSessionValueRequested(const QString &name, const QVariant &value); + private: + void reinitializeWatchersHelper(); WatchData takeData(const QString &iname); QString toString() const; + void loadWatchers(); + void saveWatchers(); + bool m_expandPointers; bool m_inChange; @@ -203,6 +213,7 @@ private: QList<WatchData> m_completeSet; QList<WatchData> m_oldSet; QList<WatchData> m_displaySet; + QStringList m_watchers; void setDisplayedIName(const QString &iname, bool on); QSet<QString> m_expandedINames; // those expanded in the treeview diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 24626064e4f..5156e6fb5fd 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -116,7 +116,7 @@ private: void testArray() { - QString x[4]; + QString x[20]; x[0] = "a"; x[1] = "b"; x[2] = "c"; -- GitLab