From 8819a477d439b021a2b28ae245e531778b57751b Mon Sep 17 00:00:00 2001 From: onil Date: Thu, 10 Dec 2009 13:19:28 +0000 Subject: [PATCH] git-svn-id: file:///svnroot/family-shop-mgr@9 26eb2498-383b-47a6-be48-5d6f36779e85 --- code/family-shop-mgr/ShoppingTreeModel.cpp | 228 +++++++++++++++++++++++++++- code/family-shop-mgr/ShoppingTreeModel.h | 3 +- 2 files changed, 222 insertions(+), 9 deletions(-) diff --git a/code/family-shop-mgr/ShoppingTreeModel.cpp b/code/family-shop-mgr/ShoppingTreeModel.cpp index 9bafbee..6727fdd 100644 --- a/code/family-shop-mgr/ShoppingTreeModel.cpp +++ b/code/family-shop-mgr/ShoppingTreeModel.cpp @@ -23,6 +23,7 @@ #include "ShoppingTreeItem.h" #include +#include ShoppingTreeModel::ShoppingTreeModel(const QString &xmlFileName, QObject *parent) : @@ -39,7 +40,7 @@ QAbstractItemModel(parent), m_document("ShoppingList") if(!m_document.setContent(&file, true, &error, &errLine, &errColumn)) { emit xmlParseError(error, errLine, errColumn); - file.close((); + file.close(); return; } file.close(); @@ -51,6 +52,7 @@ QAbstractItemModel(parent), m_document("ShoppingList") return; } else if(root.attribute("version") == "1.0") + { // set column titles QVector rootData; rootData << "Category/Item name" @@ -85,30 +87,240 @@ QAbstractItemModel(parent), m_document("ShoppingList") { rootItem->child(rootItem->childCount() - 1)->setData(column, columnData[column]); } + m_domElementForItem.insert(rootItem->child(rootItem->childCount() - 1), + child); + } +} + +ShoppingTreeModel::~ShoppingTreeModel() +{ + delete rootItem; +} + +QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const +{ + if(!index.isValid()) + return QVariant(); + + if(role != Qt::DisplayRole && role != Qt::EditRole) + return QVariant(); + + ShoppingTreeItem *item = getItem(index); + return item->data(index.column()); +} + +Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const +{ + if(!index.isValid()) + return 0; + + return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +ShoppingTreeItem *ShoppingTreeModel::getItem(const QModelIndex &index) const +{ + if(index.isValid()){ + ShoppingTreeItem *item = static_cast(index.internalPointer()); + if(item) return item; } + + return rootItem; +} + +QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if(orientation == Qt::Horizontal && role == Qt::DisplayRole) + return rootItem->data(section); + + return QVariant(); +} + +QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &parent) const +{ + if(parent.isValid() && parent.column() != 0) + return QModelIndex(); + + ShoppingTreeItem *parentItem = getItem(parent); + + ShoppingTreeItem *childItem = parentItem->child(row); + if(childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +bool ShoppingTreeModel::insertColumns(int position, int columns, const QModelIndex &parent) +{ + bool success; + + beginInsertColumns(parent, position, position + columns - 1); + success = rootItem->insertColumns(position, columns); + endInsertColumns(); + + return success; +} + +bool ShoppingTreeModel::insertRows(int position, int rows, const QModelIndex &parent) +{ + ShoppingTreeItem *parentItem = getItem(parent); + bool success; + + beginInsertRows(parent, position, position + rows - 1); + success = parentItem->insertChildren(position, rows, rootItem->columnCount()); + endInsertRows(); + + return success; +} + +QModelIndex ShoppingTreeModel::parent(const QModelIndex &index) const +{ + if(!index.isValid()) + return QModelIndex(); + + ShoppingTreeItem *childItem = getItem(index); + ShoppingTreeItem *parentItem = childItem->parent(); + + if(parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->childNumber(), 0, parentItem); +} + +bool ShoppingTreeModel::removeColumns(int position, int columns, const QModelIndex &parent) +{ + bool success; + + beginRemoveColumns(parent, position, position + columns - 1); + success = rootItem->removeColumns(position, columns); + endRemoveColumns(); + + if(rootItem->columnCount() != 0) + removeRows(0, rowCount()); + + return success; +} + +bool ShoppingTreeModel::removeRows(int position, int rows, const QModelIndex &parent) +{ + ShoppingTreeItem *parentItem = getItem(parent); + bool success; + + beginRemoveRows(parent, position, position + rows - 1); + success = parentItem->removeChildren(position, rows); + endRemoveRows(); + + return success; +} + +int ShoppingTreeModel::rowCount(const QModelIndex &parent) const +{ + ShoppingTreeItem *parentItem = getItem(parent); + + return parentItem->childCount(); +} + +int ShoppingTreeModel::columnCount(const QModelIndex &parent) const +{ + return rootItem->columnCount(); +} +bool ShoppingTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if(role != Qt::EditRole) + return false; + + ShoppingTreeItem *item = getItem(index); + bool result = item->setData(index.column(),value); + + if(result) + emit dataChanged(index, index); + + return result; +} + +bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation, + const QVariant &value, int role) +{ + if(role != Qt::EditRole || orientation != Qt::Horizontal) + return false; + + bool result = rootItem->setData(section, value); + + if(result) + emit headerDataChanged(orientation, section, section); + + return result; } void ShoppingTreeModel::parseCategoryElement(const QDomElement &element, ShoppingTreeItem *parentItem) { + // if parent is null then add category to root if(!parentItem) parentItem = rootItem; - // TODO + ShoppingTreeItem *item; + QString title = element.firstChildElement("title").text(); + if(!title.isEmpty()) + { + parentItem->insertChildren(parentItem->childCount(), 1, + rootItem->columnCount()); + + parentItem->child(parentItem->childCount() - 1)->setData(0, title); + m_domElementForItem.insert(parentItem->child(parentItem->childCount() - 1), + element); + item = parentItem->child(parentItem->childCount() - 1); + } + else + { + emit invalidDocument(); + return; + } + + // add each sub category and item to the tree + QDomElement child = element.firstChildElement(); + while(!child.isNull()) + { + if(child.tagName() == "category") + { + parseCategoryElement(child, parentItem); + } + else if(child.tagName() == "item") + { + item->insertChildren( + item->childCount(), 1, + rootItem->columnCount()); + QVector columnData = + getColumnsFromItemElement(child); + for(int column = 0; column < columnData.size(); column++) + { + item->child(item->childCount() - 1)->setData(column, columnData[column]); + } + m_domElementForItem.insert(item->child(item->childCount() - 1), + child); + } + else + { + emit invalidDocument(); + return; + } + + child = child.nextSiblingElement(); + } } QVector ShoppingTreeModel::getColumnsFromItemElement(const QDomElement &element) { - QString title = child.firstChildElement("title").text(); - int quantity = child.firstChildElement("quantity").text().toInt(); - QString store = child.firstChildElement("store").text(); + QVector data; + QString title = element.firstChildElement("title").text(); + int quantity = element.firstChildElement("quantity").text().toInt(); + QString store = element.firstChildElement("store").text(); if(title.isEmpty() || quantity < 0) { - emit invalidDocument; - return; + emit invalidDocument(); + return data; } - QVector data; data << title << quantity << store; return data; } diff --git a/code/family-shop-mgr/ShoppingTreeModel.h b/code/family-shop-mgr/ShoppingTreeModel.h index 3e2de42..278edfa 100644 --- a/code/family-shop-mgr/ShoppingTreeModel.h +++ b/code/family-shop-mgr/ShoppingTreeModel.h @@ -25,6 +25,7 @@ #include #include #include +#include #include class ShoppingTreeItem; @@ -69,7 +70,7 @@ signals: protected: void parseCategoryElement(const QDomElement &element, ShoppingTreeItem *parentItem = 0); - QVector getColumnsFromItemElement(const QDomElement &element) const; + QVector getColumnsFromItemElement(const QDomElement &element); private: ShoppingTreeItem *getItem(const QModelIndex &index) const; -- 1.7.9.5