Debugger: Take advantage of new tree iterator in option page

Change-Id: I1a8e065cfaa57b49c852a3a1d67149447d4d87b2
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
hjk
2015-01-08 13:27:30 +01:00
parent ac18f9f1d8
commit 2f17b74753
3 changed files with 71 additions and 91 deletions

View File

@@ -936,63 +936,6 @@ UntypedTreeLevelItems::const_iterator::const_iterator(TreeItem *base, int level)
} }
} }
// Result is either an item of the target level, or 'end'.
void UntypedTreeLevelItems::const_iterator::goDown()
{
QTC_ASSERT(m_depth != -1, return);
QTC_ASSERT(m_depth < m_level, return);
do {
TreeItem *curr = m_item[m_depth];
int size = curr->rowCount();
if (size == 0) {
// This is a dead end not reaching to the desired level.
goUpNextDown();
return;
}
++m_depth;
m_size[m_depth] = size;
m_pos[m_depth] = 0;
m_item[m_depth] = curr->child(0);
} while (m_depth < m_level);
// Did not reach the required level? Set to end().
if (m_depth != m_level)
m_depth = -1;
}
void UntypedTreeLevelItems::const_iterator::goUpNextDown()
{
// Go up until we can move sidewards.
do {
--m_depth;
if (m_depth < 0)
return; // Solid end.
} while (++m_pos[m_depth] >= m_size[m_depth]);
m_item[m_depth] = m_item[m_depth - 1]->child(m_pos[m_depth]);
goDown();
}
bool UntypedTreeLevelItems::const_iterator::operator==(UntypedTreeLevelItems::const_iterator other) const
{
if (m_depth != other.m_depth)
return false;
for (int i = 0; i <= m_depth; ++i)
if (m_item[i] != other.m_item[i])
return false;
return true;
}
void UntypedTreeLevelItems::const_iterator::operator++()
{
QTC_ASSERT(m_depth == m_level, return);
int pos = ++m_pos[m_depth];
if (pos < m_size[m_depth])
m_item[m_depth] = m_item[m_depth - 1]->child(pos);
else
goUpNextDown();
}
UntypedTreeLevelItems::const_iterator UntypedTreeLevelItems::begin() const UntypedTreeLevelItems::const_iterator UntypedTreeLevelItems::begin() const
{ {
return const_iterator(m_item, m_level); return const_iterator(m_item, m_level);

View File

@@ -32,7 +32,9 @@
#define UTILS_TREEMODEL_H #define UTILS_TREEMODEL_H
#include "utils_global.h" #include "utils_global.h"
#include "algorithm.h" #include "algorithm.h"
#include "qtcassert.h"
#include <QAbstractItemModel> #include <QAbstractItemModel>
@@ -88,6 +90,7 @@ private:
class QTCREATOR_UTILS_EXPORT UntypedTreeLevelItems class QTCREATOR_UTILS_EXPORT UntypedTreeLevelItems
{ {
public: public:
enum { MaxSearchDepth = 12 }; // FIXME.
explicit UntypedTreeLevelItems(TreeItem *item, int level = 1); explicit UntypedTreeLevelItems(TreeItem *item, int level = 1);
typedef TreeItem *value_type; typedef TreeItem *value_type;
@@ -104,20 +107,73 @@ public:
const_iterator(TreeItem *base, int level); const_iterator(TreeItem *base, int level);
TreeItem *operator*() { return m_item[m_depth]; } TreeItem *operator*() { return m_item[m_depth]; }
void operator++();
bool operator==(const_iterator other) const; void operator++()
bool operator!=(const_iterator other) const { return !operator==(other); } {
QTC_ASSERT(m_depth == m_level, return);
int pos = ++m_pos[m_depth];
if (pos < m_size[m_depth])
m_item[m_depth] = m_item[m_depth - 1]->child(pos);
else
goUpNextDown();
}
bool operator==(const const_iterator &other) const
{
if (m_depth != other.m_depth)
return false;
for (int i = 0; i <= m_depth; ++i)
if (m_item[i] != other.m_item[i])
return false;
return true;
}
bool operator!=(const const_iterator &other) const
{
return !operator==(other);
}
private: private:
void goDown(); // Result is either an item of the target level, or 'end'.
void goUpNextDown(); void goDown()
{
QTC_ASSERT(m_depth != -1, return);
QTC_ASSERT(m_depth < m_level, return);
do {
TreeItem *curr = m_item[m_depth];
int size = curr->rowCount();
if (size == 0) {
// This is a dead end not reaching to the desired level.
goUpNextDown();
return;
}
++m_depth;
m_size[m_depth] = size;
m_pos[m_depth] = 0;
m_item[m_depth] = curr->child(0);
} while (m_depth < m_level);
// Did not reach the required level? Set to end().
if (m_depth != m_level)
m_depth = -1;
}
void goUpNextDown()
{
// Go up until we can move sidewards.
do {
--m_depth;
if (m_depth < 0)
return; // Solid end.
} while (++m_pos[m_depth] >= m_size[m_depth]);
m_item[m_depth] = m_item[m_depth - 1]->child(m_pos[m_depth]);
goDown();
}
int m_level; int m_level;
int m_depth; int m_depth;
TreeItem *m_item[8]; TreeItem *m_item[MaxSearchDepth];
int m_pos[8]; int m_pos[MaxSearchDepth];
int m_size[8]; int m_size[MaxSearchDepth];
}; };
const_iterator begin() const; const_iterator begin() const;
@@ -129,7 +185,7 @@ private:
}; };
template <class T> template <class T>
class QTCREATOR_UTILS_EXPORT TreeLevelItems class TreeLevelItems
{ {
public: public:
typedef T value_type; typedef T value_type;

View File

@@ -110,8 +110,6 @@ public:
void apply(); void apply();
private: private:
DebuggerTreeItem *findTreeItemById(const QVariant &id) const;
DebuggerTreeItem *m_currentTreeItem; DebuggerTreeItem *m_currentTreeItem;
QStringList removed; QStringList removed;
@@ -138,8 +136,10 @@ void DebuggerItemModel::addDebugger(const DebuggerItem &item, bool changed)
void DebuggerItemModel::updateDebugger(const DebuggerItem &item) void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
{ {
DebuggerTreeItem *treeItem = findTreeItemById(item.id()); auto matcher = [item](DebuggerTreeItem *n) { return n->m_item.m_id == item.id(); };
DebuggerTreeItem *treeItem = findItemAtLevel<DebuggerTreeItem *>(2, matcher);
QTC_ASSERT(treeItem, return); QTC_ASSERT(treeItem, return);
TreeItem *parent = treeItem->parent(); TreeItem *parent = treeItem->parent();
QTC_ASSERT(parent, return); QTC_ASSERT(parent, return);
@@ -150,20 +150,6 @@ void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
updateItem(treeItem); // Notify views. updateItem(treeItem); // Notify views.
} }
DebuggerTreeItem *DebuggerItemModel::findTreeItemById(const QVariant &id) const
{
TreeItem *root = rootItem();
for (int k = 0; k < rootItem()->rowCount(); ++k) {
TreeItem *group = root->child(k);
for (int i = 0, n = group->rowCount(); i != n; ++i) {
DebuggerTreeItem *treeItem = static_cast<DebuggerTreeItem *>(group->child(i));
if (treeItem->m_item.m_id == id)
return treeItem;
}
}
return 0;
}
QModelIndex DebuggerItemModel::lastIndex() const QModelIndex DebuggerItemModel::lastIndex() const
{ {
TreeItem *manualGroup = rootItem()->lastChild(); TreeItem *manualGroup = rootItem()->lastChild();
@@ -192,14 +178,9 @@ void DebuggerItemModel::apply()
foreach (const QVariant &id, m_removedItems) foreach (const QVariant &id, m_removedItems)
DebuggerItemManager::deregisterDebugger(id); DebuggerItemManager::deregisterDebugger(id);
TreeItem *root = rootItem(); foreach (auto item, treeLevelItems<DebuggerTreeItem *>(2)) {
for (int k = 0; k < rootItem()->rowCount(); ++k) { item->m_changed = false;
TreeItem *group = root->child(k); DebuggerItemManager::updateOrAddDebugger(item->m_item);
for (int i = 0, n = group->rowCount(); i != n; ++i) {
DebuggerTreeItem *treeItem = static_cast<DebuggerTreeItem *>(group->child(i));
treeItem->m_changed = false;
DebuggerItemManager::updateOrAddDebugger(treeItem->m_item);
}
} }
} }