#include "ShoppingTreeItem.h"\r
#include "ShoppingTreeModel.h"\r
\r
-DomModel::DomModel(QDomDocument document, QObject *parent)\r
- : QAbstractItemModel(parent), domDocument(document),\r
- rootItemNode(domDocument.firstChildElement("shoppingList"))\r
+ShoppingTreeModel::ShoppingTreeModel(QString fileName, QObject *parent)\r
+ : QAbstractItemModel(parent),m_fileName(fileName)\r
{\r
- rootItem = new DomItem(rootItemNode, 0);\r
+ connect(this, SIGNAL(documentChanged()), this, SLOT(save()));\r
+ QFile file(m_fileName);\r
+ if (!file.open(QIODevice::ReadOnly))\r
+ return;\r
+ if (!domDocument.setContent(&file)) {\r
+ file.close();\r
+ return;\r
+ }\r
+ file.close();\r
+\r
+ rootItemNode = domDocument.firstChildElement("shoppingList");\r
+ rootItem = new ShoppingTreeItem(rootItemNode, 0);\r
}\r
\r
/*******************************************************************/\r
-DomModel::~DomModel()\r
+ShoppingTreeModel::~ShoppingTreeModel()\r
{\r
delete rootItem;\r
}\r
\r
/*******************************************************************/\r
-int DomModel::columnCount(const QModelIndex &/*parent*/) const\r
+int ShoppingTreeModel::columnCount(const QModelIndex &/*parent*/) const\r
{\r
return 4;\r
}\r
\r
/*******************************************************************/\r
-QVariant DomModel::data(const QModelIndex &index, int role) const\r
+QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const\r
{\r
if (!index.isValid())\r
return QVariant();\r
if (role != Qt::DisplayRole)\r
return QVariant();\r
\r
- DomItem *item = static_cast<DomItem*>(index.internalPointer());\r
+ ShoppingTreeItem *item = static_cast<ShoppingTreeItem*>(index.internalPointer());\r
\r
QDomNode node = item->node();\r
\r
}\r
\r
/*******************************************************************/\r
-Qt::ItemFlags DomModel::flags(const QModelIndex &index) const\r
+Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const\r
{\r
if (!index.isValid())\r
return 0;\r
}\r
\r
/*******************************************************************/\r
-QVariant DomModel::headerData(int section, Qt::Orientation orientation,\r
+QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation,\r
int role) const\r
{\r
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {\r
}\r
\r
/*******************************************************************/\r
-QModelIndex DomModel::index(int row, int column, const QModelIndex &parent)\r
+QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &parent)\r
const\r
{\r
if (!hasIndex(row, column, parent))\r
return QModelIndex();\r
\r
- DomItem *parentItem;\r
+ ShoppingTreeItem *parentItem;\r
\r
if (!parent.isValid())\r
parentItem = rootItem;\r
else\r
- parentItem = static_cast<DomItem*>(parent.internalPointer());\r
+ parentItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
\r
- DomItem *childItem = parentItem->child(row);\r
+ ShoppingTreeItem *childItem = parentItem->child(row);\r
if (childItem)\r
return createIndex(row, column, childItem);\r
else\r
}\r
\r
/*******************************************************************/\r
-QModelIndex DomModel::parent(const QModelIndex &child) const\r
+QModelIndex ShoppingTreeModel::parent(const QModelIndex &child) const\r
{\r
if (!child.isValid())\r
return QModelIndex();\r
\r
- DomItem *childItem = static_cast<DomItem*>(child.internalPointer());\r
- DomItem *parentItem = childItem->parent();\r
+ ShoppingTreeItem *childItem = static_cast<ShoppingTreeItem*>(child.internalPointer());\r
+ ShoppingTreeItem *parentItem = childItem->parent();\r
\r
if (!parentItem || parentItem == rootItem)\r
return QModelIndex();\r
}\r
\r
/*******************************************************************/\r
-int DomModel::rowCount(const QModelIndex &parent) const\r
+int ShoppingTreeModel::rowCount(const QModelIndex &parent) const\r
{\r
if (parent.column() > 0)\r
return 0;\r
\r
- DomItem *parentItem;\r
+ ShoppingTreeItem *parentItem;\r
\r
if (!parent.isValid())\r
parentItem = rootItem;\r
else\r
- parentItem = static_cast<DomItem*>(parent.internalPointer());\r
+ parentItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
\r
int childCount = 0;\r
for(QDomElement childElement = parentItem->node().firstChildElement();\r
}\r
return childCount;\r
}\r
+\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::insertRows(int row, int count, const QModelIndex &parent, ItemType type)\r
+{\r
+ ShoppingTreeItem *parentItem;\r
+\r
+ if (!parent.isValid())\r
+ parentItem = rootItem;\r
+ else\r
+ parentItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
+\r
+ for(int i = 0; i < count; i++)\r
+ {\r
+ QDomElement newElement;\r
+ QDomElement titleElement;\r
+ titleElement.setTagName("title");\r
+ if(type == category)\r
+ {\r
+ newElement.setTagName("category");\r
+ titleElement.setNodeValue(tr("new category"));\r
+ newElement.appendChild(titleElement);\r
+ parentItem->node().insertAfter(newElement, parentItem->child(row + i)->node());\r
+ }\r
+ else if(type == item)\r
+ {\r
+ newElement.setTagName("item");\r
+ titleElement.setNodeValue(tr("new item"));\r
+ newElement.appendChild(titleElement);\r
+ QDomElement quantityElement;\r
+ quantityElement.setTagName("quantity");\r
+ newElement.appendChild(quantityElement);\r
+ QDomElement storeElement;\r
+ storeElement.setTagName("store");\r
+ newElement.appendChild(storeElement);\r
+ QDomElement checkedElement;\r
+ checkedElement.setTagName("checked");\r
+ checkedElement.setNodeValue("0");\r
+ newElement.appendChild(checkedElement);\r
+ QDomElement lastModifiedElement;\r
+ lastModifiedElement.setTagName("lastModified");\r
+ lastModifiedElement.setNodeValue(QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss"));\r
+ newElement.appendChild(lastModifiedElement);\r
+ parentItem->node().insertAfter(newElement, parentItem->child(row + i)->node());\r
+ }\r
+ }\r
+ emit documentChanged();\r
+}\r
+\r
+/*******************************************************************/\r
+ShoppingTreeModel::removeRows(int row, int count, const QModelIndex &parent)\r
+{\r
+ ShoppingTreeItem *parentItem;\r
+\r
+ if (!parent.isValid())\r
+ parentItem = rootItem;\r
+ else\r
+ parentItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
+\r
+ for(int i = 0; i < count; i++)\r
+ {\r
+ parentItem->node().removeChild(parentItem->child(i)->node());\r
+ }\r
+ emit documentChanged();\r
+}\r
+\r
+/*******************************************************************/\r
+ShoppingTreeModel::addCategory(QModelIndex &index)\r
+{\r
+ ShoppingTreeItem *selectedItem;\r
+\r
+ if (!parent.isValid())\r
+ selectedItem = rootItem;\r
+ else\r
+ selectedItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
+\r
+ insertRows(selectedItem->row(), 1, parent(index), category);\r
+}\r
+\r
+/*******************************************************************/\r
+ShoppingTreeModel::addItem(QModelIndex &index)\r
+{\r
+ ShoppingTreeItem *selectedItem;\r
+\r
+ if (!parent.isValid())\r
+ selectedItem = rootItem;\r
+ else\r
+ selectedItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
+\r
+ insertRows(selectedItem->row(), 1, parent(index), item);\r
+}\r
+\r
+/*******************************************************************/\r
+ShoppingTreeModel::removeElement(QModelIndex &index)\r
+{\r
+ ShoppingTreeItem *selectedItem;\r
+\r
+ if (!parent.isValid())\r
+ selectedItem = rootItem;\r
+ else\r
+ selectedItem = static_cast<ShoppingTreeItem*>(parent.internalPointer());\r
+\r
+ removeRows(selectedItem->row(), 1, parent(index));\r
+}\r
+\r
+/*******************************************************************/\r
+ShoppingTreeModel::save()\r
+{\r
+ QFile file(m_fileName);\r
+ file.remove();\r
+ if (!file.open(QIODevice::WriteOnly))\r
+ return;\r
+ if (!file.write(domDocument.toString(4).toUtf8())) {\r
+ file.close();\r
+ return;\r
+ }\r
+ file.close();\r
+}\r