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 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) (limited to 'libqmenumodel/src/menunode.cpp') 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(); } -- cgit v1.2.3