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