From 73101efc3c060bff816ff17a0e45cb9e33f81e17 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 26 Nov 2009 14:11:57 +0100
Subject: [PATCH] debugger: second attempty to workaround the locals view issue

Adding items to an empty container did not result in a [+] in front of
the container in the locals view.
---
 src/plugins/debugger/watchhandler.cpp | 41 ++++++++++++++++-----------
 src/plugins/debugger/watchhandler.h   |  5 ++++
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 5e90d9d5263..3b7e54c4c27 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -83,16 +83,15 @@ static int generationCounter = 0;
 class WatchItem : public WatchData
 {
 public:
-    WatchItem() { parent = 0; fetchTriggered = false; }
+    WatchItem() { parent = 0; }
 
     WatchItem(const WatchData &data) : WatchData(data)
-        { parent = 0; fetchTriggered = false; }
+        { parent = 0; }
 
     void setData(const WatchData &data)
         { static_cast<WatchData &>(*this) = data; }
 
     WatchItem *parent;
-    bool fetchTriggered;      // children fetch has been triggered
     QList<WatchItem *> children;  // fetched children
 };
 
@@ -340,12 +339,12 @@ QString WatchData::shadowedName(const QString &name, int seen)
 WatchModel::WatchModel(WatchHandler *handler, WatchType type)
     : QAbstractItemModel(handler), m_handler(handler), m_type(type)
 {
+    m_inExtraLayoutChanged = false;
     m_root = new WatchItem;
     m_root->hasChildren = 1;
     m_root->state = 0;
     m_root->name = WatchHandler::tr("Root");
     m_root->parent = 0;
-    m_root->fetchTriggered = true;
 
     switch (m_type) {
         case LocalsWatch:
@@ -393,6 +392,7 @@ void WatchModel::emitAllChanged()
 
 void WatchModel::beginCycle()
 {
+    m_fetchTriggered.clear();
     emit enableUpdates(false);
 }
 
@@ -400,6 +400,15 @@ void WatchModel::endCycle()
 {
     removeOutdated();
     emit enableUpdates(true);
+    // Prevent 'fetchMore()' from being triggered
+    m_inExtraLayoutChanged = true;
+    emit layoutChanged();
+    QTimer::singleShot(0, this, SLOT(resetExtraLayoutChanged()));
+}
+
+void WatchModel::resetExtraLayoutChanged()
+{
+    m_inExtraLayoutChanged = false;
 }
 
 void WatchModel::dump()
@@ -436,7 +445,6 @@ void WatchModel::removeOutdatedHelper(WatchItem *item)
     } else {
         foreach (WatchItem *child, item->children)
             removeOutdatedHelper(child);
-        item->fetchTriggered = false;
     }
 }
 
@@ -624,21 +632,23 @@ static QString formattedValue(const WatchData &data,
 
 bool WatchModel::canFetchMore(const QModelIndex &index) const
 {
-    return index.isValid() && !watchItem(index)->fetchTriggered;
+    return !m_inExtraLayoutChanged && index.isValid() && !m_fetchTriggered.contains(watchItem(index)->iname);
 }
 
 void WatchModel::fetchMore(const QModelIndex &index)
 {
+    if (m_inExtraLayoutChanged)
+        return;
     QTC_ASSERT(index.isValid(), return);
-    QTC_ASSERT(!watchItem(index)->fetchTriggered, return);
-    if (WatchItem *item = watchItem(index)) {
-        m_handler->m_expandedINames.insert(item->iname);
-        item->fetchTriggered = true;
-        if (item->children.isEmpty()) {
-            WatchData data = *item;
-            data.setChildrenNeeded();
-            m_handler->m_manager->updateWatchData(data);
-        }
+    WatchItem *item = watchItem(index);
+    QTC_ASSERT(item, return);
+    QTC_ASSERT(!m_fetchTriggered.contains(item->iname), return);
+    m_handler->m_expandedINames.insert(item->iname);
+    m_fetchTriggered.insert(item->iname);
+    if (item->children.isEmpty()) {
+        WatchData data = *item;
+        data.setChildrenNeeded();
+        m_handler->m_manager->updateWatchData(data);
     }
 }
 
@@ -943,7 +953,6 @@ void WatchModel::insertData(const WatchData &data)
         oldItem->generation = generationCounter;
         QModelIndex idx = watchIndex(oldItem);
         emit dataChanged(idx, idx.sibling(idx.row(), 2));
-        emit layoutChanged();
     } else {
         // add new entry
         //MODEL_DEBUG("ADD : " << data.iname << data.value);
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index a53a80989f6..f0b31c03ead 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -222,6 +222,7 @@ private:
     void dump();
     void dumpHelper(WatchItem *item);
     void emitAllChanged();
+    Q_SLOT void resetExtraLayoutChanged();
 
 signals:
     void enableUpdates(bool);
@@ -232,6 +233,10 @@ private:
     WatchHandler *m_handler;
     WatchType m_type;
     WatchItem *m_root;
+    QSet<QString> m_fetchTriggered;
+    // Part of the workaround to update the [+] marker when items
+    // are added to a container.
+    bool m_inExtraLayoutChanged;
 };
 
 class WatchHandler : public QObject
-- 
GitLab