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