aboutsummaryrefslogtreecommitdiff
path: root/libqmenumodel/src
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@canonical.com>2013-01-10 15:54:35 -0300
committerRenato Araujo Oliveira Filho <renato.filho@canonical.com>2013-01-10 15:54:35 -0300
commit33147e96ae17a01a3f025a5b7b78bff7943b4851 (patch)
tree5b9f5421585d19516f0b8f964eb878e0695f5d43 /libqmenumodel/src
parent2d050cddb8a4aa3ada8f956e071efed9d53898fd (diff)
downloadqmenumodel-33147e96ae17a01a3f025a5b7b78bff7943b4851.tar.gz
qmenumodel-33147e96ae17a01a3f025a5b7b78bff7943b4851.tar.bz2
qmenumodel-33147e96ae17a01a3f025a5b7b78bff7943b4851.zip
Fixed item removal and insertion.
Removed debug messages. Fixed tests to work with new tree model structure.
Diffstat (limited to 'libqmenumodel/src')
-rw-r--r--libqmenumodel/src/menunode.cpp47
-rw-r--r--libqmenumodel/src/menunode.h6
-rw-r--r--libqmenumodel/src/qmenumodel.cpp25
3 files changed, 56 insertions, 22 deletions
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<MenuNode*>(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 <QDebug>
#include <QCoreApplication>
#include <QThread>
@@ -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<int, QByteArray> 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 */