From 33147e96ae17a01a3f025a5b7b78bff7943b4851 Mon Sep 17 00:00:00 2001 From: Renato Araujo Oliveira Filho Date: Thu, 10 Jan 2013 15:54:35 -0300 Subject: Fixed item removal and insertion. Removed debug messages. Fixed tests to work with new tree model structure. --- libqmenumodel/src/menunode.cpp | 47 +++++++++++++++++++++++++++++++++++----- libqmenumodel/src/menunode.h | 6 +++++ libqmenumodel/src/qmenumodel.cpp | 25 +++++++-------------- 3 files changed, 56 insertions(+), 22 deletions(-) (limited to 'libqmenumodel/src') diff --git a/libqmenumodel/src/menunode.cpp b/libqmenumodel/src/menunode.cpp index bfdd28a..3d8c5fd 100644 --- a/libqmenumodel/src/menunode.cpp +++ b/libqmenumodel/src/menunode.cpp @@ -26,9 +26,13 @@ MenuNode::MenuNode(const QString &linkType, GMenuModel *model, MenuNode *parent, : m_model(model), m_parent(parent), m_signalChangedId(0), - m_linkType(linkType) + m_linkType(linkType), + m_currentOpPosition(-1), + m_currentOpAdded(0), + m_currentOpRemoved(0) { g_object_ref(model); + if (m_parent) { m_parent->insertChild(this, pos); } @@ -114,7 +118,6 @@ int MenuNode::childPosition(GMenuModel *item) const } return 0; } - int MenuNode::childPosition(const MenuNode *item) const { return childPosition(item->m_model); @@ -136,6 +139,23 @@ int MenuNode::depth() const return depth; } +int MenuNode::realPosition(int row) const +{ + int result = row; + if ((row >= 0) && (row < m_size)) { + if (row >= m_currentOpPosition) { + if ((m_currentOpRemoved > 0) && (row < (m_currentOpPosition + m_currentOpRemoved))) { + result = -1; + } else { + result += (m_currentOpAdded - m_currentOpRemoved); + } + } + return result; + } else { + return -1; + } +} + void MenuNode::change(int start, int added, int removed) { if (added > 0) { @@ -144,6 +164,12 @@ void MenuNode::change(int start, int added, int removed) m_children.insert(i + added, m_children.take(i)); } } + + m_size += added; + + for (int i = start; i < (start + added); i++) { + MenuNode::create(m_model, i, this, m_listener); + } } if (removed > 0) { @@ -155,6 +181,7 @@ void MenuNode::change(int start, int added, int removed) m_children.insert(i - removed, m_children.take(i)); } } + m_size -= removed; } } @@ -200,15 +227,26 @@ MenuNode *MenuNode::create(GMenuModel *model, int pos, MenuNode *parent, QObject return 0; } +void MenuNode::commitOperation() +{ + change(m_currentOpPosition, m_currentOpAdded, m_currentOpRemoved); + + m_currentOpPosition = -1; + m_currentOpAdded = m_currentOpRemoved = 0; +} + void MenuNode::onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data) { MenuNode *self = reinterpret_cast(data); + self->m_currentOpPosition = position; + self->m_currentOpAdded = added; + self->m_currentOpRemoved = removed; + if (self->m_listener) { const QMetaObject *mobj = self->m_listener->metaObject(); int slotIndex = mobj->indexOfSlot(QMetaObject::normalizedSignature("onItemsChanged(MenuNode*, int, int, int)")); if (slotIndex > -1) { QMetaMethod slot = mobj->method(slotIndex); - qDebug() << "invoke" << model << "pos" << position << removed << added; slot.invoke(self->m_listener, Q_ARG(MenuNode*, self), Q_ARG(int, position), @@ -217,7 +255,6 @@ void MenuNode::onItemsChanged(GMenuModel *model, gint position, gint removed, gi } else { qWarning() << "Slot 'onItemsChanged(MenuNode*, int, int, int)' not found in" << self->m_listener; } - } else { - qDebug() << "No listener" << position << removed << added; } + self->commitOperation(); } diff --git a/libqmenumodel/src/menunode.h b/libqmenumodel/src/menunode.h index d7a893c..21fc5bc 100644 --- a/libqmenumodel/src/menunode.h +++ b/libqmenumodel/src/menunode.h @@ -53,6 +53,9 @@ public: void change(int start, int added, int removed); MenuNode *find(GMenuModel *item); + int realPosition(int row) const; + void commitOperation(); + static MenuNode *create(GMenuModel *model, int pos, MenuNode *parent=0, QObject *listener=0); private: @@ -63,6 +66,9 @@ private: QObject *m_listener; gulong m_signalChangedId; QString m_linkType; + int m_currentOpPosition; + int m_currentOpAdded; + int m_currentOpRemoved; static void onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data); }; diff --git a/libqmenumodel/src/qmenumodel.cpp b/libqmenumodel/src/qmenumodel.cpp index 4f0769c..5faeb43 100644 --- a/libqmenumodel/src/qmenumodel.cpp +++ b/libqmenumodel/src/qmenumodel.cpp @@ -25,7 +25,6 @@ extern "C" { #include "qmenumodel.h" #include "menunode.h" #include "converter.h" -#include #include #include @@ -54,7 +53,6 @@ QMenuModel::~QMenuModel() /*! \internal */ void QMenuModel::setMenuModel(GMenuModel *other) { - //qDebug() << "SetModel" << m_root << other; if ((m_root != 0) && (m_root->model() == other)) { return; } @@ -65,7 +63,6 @@ void QMenuModel::setMenuModel(GMenuModel *other) if (other) { m_root = new MenuNode("", other, 0, 0, this); - //qDebug() << "new size:" << m_root << m_root->size(); } endResetModel(); @@ -99,7 +96,6 @@ QHash QMenuModel::roleNames() const QModelIndex QMenuModel::index(int row, int column, const QModelIndex &parent) const { MenuNode *node = nodeFromIndex(parent); - //qDebug() << "get index: root" << m_root << "node:" << node << "row" << row << "parent is valid:" << parent.isValid() << "parent row:" << parent.row(); if (node == 0) { return QModelIndex(); } @@ -135,10 +131,9 @@ QVariant QMenuModel::data(const QModelIndex &index, int role) const } MenuNode *node = nodeFromIndex(index); - int rowCountValue = node->size(); - int row = index.row(); + int row = node ? node->realPosition(index.row()) : -1; - if (node && (row >= 0) && (row < rowCountValue)) { + if (row >= 0) { switch (role) { case Action: attribute = getStringAttribute(node, row, G_MENU_ATTRIBUTE_ACTION); @@ -179,7 +174,10 @@ int QMenuModel::rowCount(const QModelIndex &index) const } return 0; } - return m_root->size(); + if (m_root) { + return m_root->size(); + } + return 0; } /*! \internal */ @@ -233,13 +231,11 @@ void QMenuModel::onItemsChanged(MenuNode *node, int removed, int added) { - qDebug() << "+[onItemsChanged]" << this << "pos" << position << "removed" << removed << "added" << added << "thread" << QThread::currentThread(); - QModelIndex index = indexFromNode(node); if (removed > 0) { beginRemoveRows(index, position, position + removed - 1); - node->change(position, added, removed); + node->commitOperation(); endRemoveRows(); } @@ -247,15 +243,10 @@ void QMenuModel::onItemsChanged(MenuNode *node, if (added > 0) { beginInsertRows(index, position, position + added - 1); - node->change(position, added, removed); - for (int i = position; i < (position + added); i++) { - MenuNode::create(node->model(), i, node, this); - } + node->commitOperation(); endInsertRows(); } - - //qDebug() << "-[onItemsChanged]" << self << "pos" << position << "removed" << removed << "added" << added << "thread" << QThread::currentThread(); } /*! \internal */ -- cgit v1.2.3