From c8fe8c6762998fd5238ed8816b8b862b6edaa30d Mon Sep 17 00:00:00 2001 From: onil Date: Fri, 28 May 2010 22:57:20 +0000 Subject: [PATCH] git-svn-id: file:///svnroot/family-shop-mgr@33 26eb2498-383b-47a6-be48-5d6f36779e85 --- code/family-shop-mgr/ShoppingTreeItem.cpp | 16 +-- code/family-shop-mgr/ShoppingTreeItem.h | 51 ++------ code/family-shop-mgr/ShoppingTreeModel.cpp | 167 ++++++++++++++++++++++--- code/family-shop-mgr/ShoppingTreeModel.h | 29 ++++- code/family-shop-mgr/family-shop-mgr.pro.user | 26 ++-- 5 files changed, 203 insertions(+), 86 deletions(-) diff --git a/code/family-shop-mgr/ShoppingTreeItem.cpp b/code/family-shop-mgr/ShoppingTreeItem.cpp index ae21ccc..6e473e7 100644 --- a/code/family-shop-mgr/ShoppingTreeItem.cpp +++ b/code/family-shop-mgr/ShoppingTreeItem.cpp @@ -24,7 +24,7 @@ #include "ShoppingTreeItem.h" -DomItem::DomItem(QDomNode &node, int row, DomItem *parent) +ShoppingTreeItem::ShoppingTreeItem(QDomNode &node, int row, ShoppingTreeItem *parent) { domNode = node; rowNumber = row; @@ -32,27 +32,27 @@ DomItem::DomItem(QDomNode &node, int row, DomItem *parent) } /*******************************************************************/ -DomItem::~DomItem() +ShoppingTreeItem::~ShoppingTreeItem() { - QHash::iterator it; + QHash::iterator it; for (it = childItems.begin(); it != childItems.end(); ++it) delete it.value(); } /*******************************************************************/ -QDomNode DomItem::node() const +QDomNode ShoppingTreeItem::node() const { return domNode; } /*******************************************************************/ -DomItem *DomItem::parent() +ShoppingTreeItem *ShoppingTreeItem::parent() { return parentItem; } /*******************************************************************/ -DomItem *DomItem::child(int i) +ShoppingTreeItem *ShoppingTreeItem::child(int i) { if (childItems.contains(i)) return childItems[i]; @@ -71,7 +71,7 @@ DomItem *DomItem::child(int i) } if (i >= 0 && i < childElementsList.count()) { childNode = childElementsList.at(i); - DomItem *childItem = new DomItem(childNode, i, this); + ShoppingTreeItem *childItem = new ShoppingTreeItem(childNode, i, this); childItems[i] = childItem; return childItem; } @@ -79,7 +79,7 @@ DomItem *DomItem::child(int i) } /*******************************************************************/ -int DomItem::row() +int ShoppingTreeItem::row() { return rowNumber; } diff --git a/code/family-shop-mgr/ShoppingTreeItem.h b/code/family-shop-mgr/ShoppingTreeItem.h index 214db12..d0a14a4 100644 --- a/code/family-shop-mgr/ShoppingTreeItem.h +++ b/code/family-shop-mgr/ShoppingTreeItem.h @@ -22,55 +22,24 @@ #ifndef SHOPPINGTREEITEM_H #define SHOPPINGTREEITEM_H -#include -#include -#include +#include +#include -#include "ShoppingTreeModel.h" - -class ShoppingTreeItem : public QObject +class ShoppingTreeItem { -Q_OBJECT - public: - - enum ItemType - { - Category = 0, - Item = 1, - - NotDefined = -1 - }; - - ShoppingTreeItem(const QVector &data, ShoppingTreeItem *parent = 0); + ShoppingTreeItem(QDomNode &node, int row, ShoppingTreeItem *parent = 0); ~ShoppingTreeItem(); - - ShoppingTreeItem *child(int number); - int childCount() const; - int columnCount() const; - QVariant data(int column) const; - bool insertChildren(int position, int count, int columns, - ShoppingTreeModel* model = 0); - bool insertColumns(int position, int columns); + ShoppingTreeItem *child(int i); ShoppingTreeItem *parent(); - bool removeChildren(int position, int count); - bool removeColumns(int position, int columns); - int childNumber() const; - bool setData(int column, const QVariant &value); - bool setItemType(const ItemType type); - ItemType getItemType() const; - -signals: - void childItemSet(ShoppingTreeItem *item); - void dataChanged(int column); - void childRemoved(ShoppingTreeItem *item); + QDomNode node() const; + int row(); private: - QList childItems; - QVector itemData; + QDomNode domNode; + QHash childItems; ShoppingTreeItem *parentItem; - - ItemType m_itemType; + int rowNumber; }; #endif // SHOPPINGTREEITEM_H diff --git a/code/family-shop-mgr/ShoppingTreeModel.cpp b/code/family-shop-mgr/ShoppingTreeModel.cpp index f79b957..ee00a89 100644 --- a/code/family-shop-mgr/ShoppingTreeModel.cpp +++ b/code/family-shop-mgr/ShoppingTreeModel.cpp @@ -24,27 +24,37 @@ #include "ShoppingTreeItem.h" #include "ShoppingTreeModel.h" -DomModel::DomModel(QDomDocument document, QObject *parent) - : QAbstractItemModel(parent), domDocument(document), - rootItemNode(domDocument.firstChildElement("shoppingList")) +ShoppingTreeModel::ShoppingTreeModel(QString fileName, QObject *parent) + : QAbstractItemModel(parent),m_fileName(fileName) { - rootItem = new DomItem(rootItemNode, 0); + connect(this, SIGNAL(documentChanged()), this, SLOT(save())); + QFile file(m_fileName); + if (!file.open(QIODevice::ReadOnly)) + return; + if (!domDocument.setContent(&file)) { + file.close(); + return; + } + file.close(); + + rootItemNode = domDocument.firstChildElement("shoppingList"); + rootItem = new ShoppingTreeItem(rootItemNode, 0); } /*******************************************************************/ -DomModel::~DomModel() +ShoppingTreeModel::~ShoppingTreeModel() { delete rootItem; } /*******************************************************************/ -int DomModel::columnCount(const QModelIndex &/*parent*/) const +int ShoppingTreeModel::columnCount(const QModelIndex &/*parent*/) const { return 4; } /*******************************************************************/ -QVariant DomModel::data(const QModelIndex &index, int role) const +QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); @@ -52,7 +62,7 @@ QVariant DomModel::data(const QModelIndex &index, int role) const if (role != Qt::DisplayRole) return QVariant(); - DomItem *item = static_cast(index.internalPointer()); + ShoppingTreeItem *item = static_cast(index.internalPointer()); QDomNode node = item->node(); @@ -83,7 +93,7 @@ QVariant DomModel::data(const QModelIndex &index, int role) const } /*******************************************************************/ -Qt::ItemFlags DomModel::flags(const QModelIndex &index) const +Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; @@ -92,7 +102,7 @@ Qt::ItemFlags DomModel::flags(const QModelIndex &index) const } /*******************************************************************/ -QVariant DomModel::headerData(int section, Qt::Orientation orientation, +QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { @@ -114,20 +124,20 @@ QVariant DomModel::headerData(int section, Qt::Orientation orientation, } /*******************************************************************/ -QModelIndex DomModel::index(int row, int column, const QModelIndex &parent) +QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); - DomItem *parentItem; + ShoppingTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else - parentItem = static_cast(parent.internalPointer()); + parentItem = static_cast(parent.internalPointer()); - DomItem *childItem = parentItem->child(row); + ShoppingTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else @@ -135,13 +145,13 @@ QModelIndex DomModel::index(int row, int column, const QModelIndex &parent) } /*******************************************************************/ -QModelIndex DomModel::parent(const QModelIndex &child) const +QModelIndex ShoppingTreeModel::parent(const QModelIndex &child) const { if (!child.isValid()) return QModelIndex(); - DomItem *childItem = static_cast(child.internalPointer()); - DomItem *parentItem = childItem->parent(); + ShoppingTreeItem *childItem = static_cast(child.internalPointer()); + ShoppingTreeItem *parentItem = childItem->parent(); if (!parentItem || parentItem == rootItem) return QModelIndex(); @@ -150,17 +160,17 @@ QModelIndex DomModel::parent(const QModelIndex &child) const } /*******************************************************************/ -int DomModel::rowCount(const QModelIndex &parent) const +int ShoppingTreeModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0) return 0; - DomItem *parentItem; + ShoppingTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else - parentItem = static_cast(parent.internalPointer()); + parentItem = static_cast(parent.internalPointer()); int childCount = 0; for(QDomElement childElement = parentItem->node().firstChildElement(); @@ -171,3 +181,120 @@ int DomModel::rowCount(const QModelIndex &parent) const } return childCount; } + +/*******************************************************************/ +bool ShoppingTreeModel::insertRows(int row, int count, const QModelIndex &parent, ItemType type) +{ + ShoppingTreeItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + for(int i = 0; i < count; i++) + { + QDomElement newElement; + QDomElement titleElement; + titleElement.setTagName("title"); + if(type == category) + { + newElement.setTagName("category"); + titleElement.setNodeValue(tr("new category")); + newElement.appendChild(titleElement); + parentItem->node().insertAfter(newElement, parentItem->child(row + i)->node()); + } + else if(type == item) + { + newElement.setTagName("item"); + titleElement.setNodeValue(tr("new item")); + newElement.appendChild(titleElement); + QDomElement quantityElement; + quantityElement.setTagName("quantity"); + newElement.appendChild(quantityElement); + QDomElement storeElement; + storeElement.setTagName("store"); + newElement.appendChild(storeElement); + QDomElement checkedElement; + checkedElement.setTagName("checked"); + checkedElement.setNodeValue("0"); + newElement.appendChild(checkedElement); + QDomElement lastModifiedElement; + lastModifiedElement.setTagName("lastModified"); + lastModifiedElement.setNodeValue(QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss")); + newElement.appendChild(lastModifiedElement); + parentItem->node().insertAfter(newElement, parentItem->child(row + i)->node()); + } + } + emit documentChanged(); +} + +/*******************************************************************/ +ShoppingTreeModel::removeRows(int row, int count, const QModelIndex &parent) +{ + ShoppingTreeItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + for(int i = 0; i < count; i++) + { + parentItem->node().removeChild(parentItem->child(i)->node()); + } + emit documentChanged(); +} + +/*******************************************************************/ +ShoppingTreeModel::addCategory(QModelIndex &index) +{ + ShoppingTreeItem *selectedItem; + + if (!parent.isValid()) + selectedItem = rootItem; + else + selectedItem = static_cast(parent.internalPointer()); + + insertRows(selectedItem->row(), 1, parent(index), category); +} + +/*******************************************************************/ +ShoppingTreeModel::addItem(QModelIndex &index) +{ + ShoppingTreeItem *selectedItem; + + if (!parent.isValid()) + selectedItem = rootItem; + else + selectedItem = static_cast(parent.internalPointer()); + + insertRows(selectedItem->row(), 1, parent(index), item); +} + +/*******************************************************************/ +ShoppingTreeModel::removeElement(QModelIndex &index) +{ + ShoppingTreeItem *selectedItem; + + if (!parent.isValid()) + selectedItem = rootItem; + else + selectedItem = static_cast(parent.internalPointer()); + + removeRows(selectedItem->row(), 1, parent(index)); +} + +/*******************************************************************/ +ShoppingTreeModel::save() +{ + QFile file(m_fileName); + file.remove(); + if (!file.open(QIODevice::WriteOnly)) + return; + if (!file.write(domDocument.toString(4).toUtf8())) { + file.close(); + return; + } + file.close(); +} diff --git a/code/family-shop-mgr/ShoppingTreeModel.h b/code/family-shop-mgr/ShoppingTreeModel.h index 92ef5c7..cb283b0 100644 --- a/code/family-shop-mgr/ShoppingTreeModel.h +++ b/code/family-shop-mgr/ShoppingTreeModel.h @@ -27,15 +27,20 @@ #include #include -class DomItem; +class ShoppingTreeItem; -class DomModel : public QAbstractItemModel +enum ItemType{ + item, + category +}; + +class ShoppingTreeModel : public QAbstractItemModel { Q_OBJECT public: - DomModel(QDomDocument document, QObject *parent = 0); - ~DomModel(); + ShoppingTreeModel(QString fileName, QObject *parent = 0); + ~ShoppingTreeModel(); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; @@ -46,11 +51,25 @@ public: QModelIndex parent(const QModelIndex &child) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; + bool insertRows(int row, int count, + const QModelIndex & parent = QModelIndex(), + ItemType type = item); + bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); + +public slots: + void addCategory(QModelIndex & index); + void addItem(QModelIndex & index); + void removeElement(QModelIndex & index); + void save(); + +signals: + void documentChanged(); private: + QString m_fileName; QDomDocument domDocument; QDomNode rootItemNode; - DomItem *rootItem; + ShoppingTreeItem *rootItem; }; #endif // SHOPPINGTREEMODEL_H diff --git a/code/family-shop-mgr/family-shop-mgr.pro.user b/code/family-shop-mgr/family-shop-mgr.pro.user index eab2836..6b78c17 100644 --- a/code/family-shop-mgr/family-shop-mgr.pro.user +++ b/code/family-shop-mgr/family-shop-mgr.pro.user @@ -97,11 +97,11 @@ Debug - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-YZNnnsfbiV,guid=cb79688c9fb6e8c85ff790f94bb8fbb8 + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-eKukEAYkED,guid=329729b2f92e20a20feb0a184bfff74d DESKTOP_SESSION=default DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl - GPG_AGENT_INFO=/tmp/gpg-27YKzu/S.gpg-agent:1914:1 + GPG_AGENT_INFO=/tmp/gpg-qWEYAr/S.gpg-agent:1575:1 GS_LIB=/home/onil/.fonts GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/onil/.gtkrc-2.0:/home/onil/.gtkrc-2.0-kde4:/home/onil/.kde/share/config/gtkrc-2.0 GTK_RC_FILES=/etc/gtk/gtkrc:/home/onil/.gtkrc::/home/onil/.kde/share/config/gtkrc @@ -111,22 +111,23 @@ KDE_SESSION_UID=1000 KDE_SESSION_VERSION=4 LANG=fr_FR.UTF-8 + LANGUAGE= LD_LIBRARY_PATH=/usr/lib/qtcreator: LOGNAME=onil PATH=/usr/bin:/home/onil/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/home/onil/Documents QTDIR=/usr/share/qt4 QT_PLUGIN_PATH=/home/onil/.kde/lib/kde4/plugins/:/usr/lib/kde4/plugins/ - SESSION_MANAGER=local/onil-netbook:@/tmp/.ICE-unix/2004,unix/onil-netbook:/tmp/.ICE-unix/2004 + SESSION_MANAGER=local/onil-netbook:@/tmp/.ICE-unix/1718,unix/onil-netbook:/tmp/.ICE-unix/1718 SHELL=/bin/bash SHLVL=0 - SSH_AGENT_PID=1913 - SSH_AUTH_SOCK=/tmp/ssh-HoJAfw1868/agent.1868 + SSH_AGENT_PID=1574 + SSH_AUTH_SOCK=/tmp/ssh-kcUDTw1523/agent.1523 USER=onil WINDOWPATH=7 XCURSOR_THEME=oxy-white XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share - XDG_SESSION_COOKIE=67465ad3dd74e5003d0b02474b126985-1270414262.693559-1541288722 + XDG_SESSION_COOKIE=67465ad3dd74e5003d0b02474b126985-1275066187.875603-169541383 XDM_MANAGED=method=classic @@ -147,11 +148,11 @@ Debug - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-YZNnnsfbiV,guid=cb79688c9fb6e8c85ff790f94bb8fbb8 + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-eKukEAYkED,guid=329729b2f92e20a20feb0a184bfff74d DESKTOP_SESSION=default DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl - GPG_AGENT_INFO=/tmp/gpg-27YKzu/S.gpg-agent:1914:1 + GPG_AGENT_INFO=/tmp/gpg-qWEYAr/S.gpg-agent:1575:1 GS_LIB=/home/onil/.fonts GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/onil/.gtkrc-2.0:/home/onil/.gtkrc-2.0-kde4:/home/onil/.kde/share/config/gtkrc-2.0 GTK_RC_FILES=/etc/gtk/gtkrc:/home/onil/.gtkrc::/home/onil/.kde/share/config/gtkrc @@ -161,22 +162,23 @@ KDE_SESSION_UID=1000 KDE_SESSION_VERSION=4 LANG=fr_FR.UTF-8 + LANGUAGE= LD_LIBRARY_PATH=/usr/lib/qtcreator: LOGNAME=onil PATH=/usr/bin:/home/onil/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/home/onil/Documents QTDIR=/usr/share/qt4 QT_PLUGIN_PATH=/home/onil/.kde/lib/kde4/plugins/:/usr/lib/kde4/plugins/ - SESSION_MANAGER=local/onil-netbook:@/tmp/.ICE-unix/2004,unix/onil-netbook:/tmp/.ICE-unix/2004 + SESSION_MANAGER=local/onil-netbook:@/tmp/.ICE-unix/1718,unix/onil-netbook:/tmp/.ICE-unix/1718 SHELL=/bin/bash SHLVL=0 - SSH_AGENT_PID=1913 - SSH_AUTH_SOCK=/tmp/ssh-HoJAfw1868/agent.1868 + SSH_AGENT_PID=1574 + SSH_AUTH_SOCK=/tmp/ssh-kcUDTw1523/agent.1523 USER=onil WINDOWPATH=7 XCURSOR_THEME=oxy-white XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share - XDG_SESSION_COOKIE=67465ad3dd74e5003d0b02474b126985-1270414262.693559-1541288722 + XDG_SESSION_COOKIE=67465ad3dd74e5003d0b02474b126985-1275066187.875603-169541383 XDM_MANAGED=method=classic false -- 1.7.9.5