#include <QApplication>\r
#include <QtGui>\r
\r
+/*******************************************************************/\r
ShoppingTreeModel::ShoppingTreeModel(const QString &xmlFileName,\r
QObject *parent) :\r
QAbstractItemModel(parent), m_document("ShoppingList")\r
<< "Quantity" << "Store";\r
\r
rootItem = new ShoppingTreeItem(rootData);\r
+ m_domElementForItem.insert(rootItem, root);\r
}\r
else\r
{\r
setItemType(ShoppingTreeItem::Item);\r
for(int column = 0; column < columnData.size(); column++)\r
{\r
- rootItem->child(rootItem->childCount() - 1)->setData(column, columnData[column]);\r
+ rootItem->child(rootItem->childCount() - 1)->\r
+ setData(column, columnData[column]);\r
}\r
m_domElementForItem.insert(rootItem->child(rootItem->childCount() - 1),\r
child);\r
+ child = child.nextSiblingElement("item");\r
}\r
\r
+\r
+ connect(rootItem, SIGNAL(childItemSet(ShoppingTreeItem*)), this,\r
+ SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
+ connect(rootItem, SIGNAL(childRemoved(ShoppingTreeItem*)), this,\r
+ SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
+\r
QHashIterator<ShoppingTreeItem*,QDomElement> i(m_domElementForItem);\r
while(i.hasNext())\r
{\r
i.next();\r
- connect(i.key(), SIGNAL(childInserted(ShoppingTreeItem*)), this,\r
+ connect(i.key(), SIGNAL(childItemSet(ShoppingTreeItem*)), this,\r
SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
connect(i.key(), SIGNAL(childRemoved(ShoppingTreeItem*)), this,\r
SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
}\r
}\r
\r
+/*******************************************************************/\r
ShoppingTreeModel::~ShoppingTreeModel()\r
{\r
delete rootItem;\r
}\r
\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::addCategory(QString name)\r
+{\r
+ QModelIndex parent = QModelIndex();\r
+\r
+ if (!this->insertRow(parent.row()+1, parent))\r
+ return false;\r
+\r
+ int column = 0;\r
+ QModelIndex child = this->index(parent.row()+1, column, parent);\r
+ ShoppingTreeItem* item = this->getItem(child);\r
+ item->setItemType(ShoppingTreeItem::Category);\r
+ this->setData(child, QVariant(name), Qt::EditRole);\r
+ return true;\r
+}\r
+\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::addSubCategory(QString name, int position,\r
+ const QModelIndex &parent)\r
+{\r
+ if (!this->insertRow(position, parent))\r
+ return false;\r
+\r
+ for(int column = 0; column < this->columnCount(parent); ++column)\r
+ {\r
+ QModelIndex child = this->index(parent.row()+1, column, parent);\r
+ ShoppingTreeItem* item = this->getItem(child);\r
+ item->setItemType(ShoppingTreeItem::Category);\r
+ this->setData(child, QVariant(name), Qt::EditRole);\r
+ }\r
+ return true;\r
+}\r
+\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::addItem(QString name, int position,\r
+ const QModelIndex &parent)\r
+{\r
+ if (!this->insertRow(position, parent))\r
+ return false;\r
+\r
+ int column = 0;\r
+ QModelIndex child = this->index(parent.row()+1, column, parent);\r
+ ShoppingTreeItem* item = this->getItem(child);\r
+ item->setItemType(ShoppingTreeItem::Item);\r
+ this->setData(child, QVariant(name), Qt::EditRole);\r
+\r
+ return true;\r
+}\r
+\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::removeCategoryOrItem(const QModelIndex &index)\r
+{\r
+ return this->removeRow(index.row(), index.parent());\r
+}\r
+\r
+/*******************************************************************/\r
QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const\r
{\r
if(!index.isValid())\r
return item->data(index.column());\r
}\r
\r
+/*******************************************************************/\r
Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const\r
{\r
if(!index.isValid())\r
return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
}\r
\r
+/*******************************************************************/\r
ShoppingTreeItem *ShoppingTreeModel::getItem(const QModelIndex &index) const\r
{\r
if(index.isValid()){\r
- ShoppingTreeItem *item = static_cast<ShoppingTreeItem*>(index.internalPointer());\r
+ ShoppingTreeItem *item =\r
+ static_cast<ShoppingTreeItem*>(index.internalPointer());\r
if(item) return item;\r
}\r
\r
return rootItem;\r
}\r
\r
-QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation,\r
+/*******************************************************************/\r
+QVariant ShoppingTreeModel::headerData(int section,\r
+ Qt::Orientation orientation,\r
int role) const\r
{\r
if(orientation == Qt::Horizontal && role == Qt::DisplayRole)\r
return QVariant();\r
}\r
\r
-QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &parent) const\r
+/*******************************************************************/\r
+QModelIndex ShoppingTreeModel::index(int row, int column,\r
+ const QModelIndex &parent) const\r
{\r
if(parent.isValid() && parent.column() != 0)\r
return QModelIndex();\r
return QModelIndex();\r
}\r
\r
-bool ShoppingTreeModel::insertColumns(int position, int columns, const QModelIndex &parent)\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::insertColumns(int position, int columns,\r
+ const QModelIndex &parent)\r
{\r
bool success;\r
\r
return success;\r
}\r
\r
-bool ShoppingTreeModel::insertRows(int position, int rows, const QModelIndex &parent)\r
+/*******************************************************************/\r
+bool ShoppingTreeModel::insertRows(int position, int rows,\r
+ const QModelIndex &parent)\r
{\r
ShoppingTreeItem *parentItem = getItem(parent);\r
- bool success;\r
+ bool success = false;\r
\r
beginInsertRows(parent, position, position + rows - 1);\r
- success = parentItem->insertChildren(position, rows, rootItem->columnCount());\r
+ success = parentItem->insertChildren(position, rows,\r
+ rootItem->columnCount(), this);\r
endInsertRows();\r
\r
return success;\r
}\r
\r
+/*******************************************************************/\r
QModelIndex ShoppingTreeModel::parent(const QModelIndex &index) const\r
{\r
if(!index.isValid())\r
return createIndex(parentItem->childNumber(), 0, parentItem);\r
}\r
\r
+/*******************************************************************/\r
bool ShoppingTreeModel::removeColumns(int position, int columns, const QModelIndex &parent)\r
{\r
bool success;\r
return success;\r
}\r
\r
+/*******************************************************************/\r
bool ShoppingTreeModel::removeRows(int position, int rows, const QModelIndex &parent)\r
{\r
ShoppingTreeItem *parentItem = getItem(parent);\r
return success;\r
}\r
\r
+/*******************************************************************/\r
int ShoppingTreeModel::rowCount(const QModelIndex &parent) const\r
{\r
ShoppingTreeItem *parentItem = getItem(parent);\r
return parentItem->childCount();\r
}\r
\r
+/*******************************************************************/\r
int ShoppingTreeModel::columnCount(const QModelIndex &parent) const\r
{\r
- return rootItem->columnCount();\r
+ if(parent.isValid())\r
+ return getItem(parent)->columnCount();\r
+ else\r
+ return rootItem->columnCount();\r
}\r
+\r
+/*******************************************************************/\r
bool ShoppingTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
{\r
if(role != Qt::EditRole)\r
return result;\r
}\r
\r
+/*******************************************************************/\r
bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation,\r
const QVariant &value, int role)\r
{\r
return result;\r
}\r
\r
+/*******************************************************************/\r
void ShoppingTreeModel::registerInsertedChild(ShoppingTreeItem *item)\r
{\r
- // wait until item type is defined\r
- item->waitItemTypeDefinition();\r
-\r
QDomElement parentElement = m_domElementForItem.value(item->parent());\r
- QDomElement element;\r
+ QDomElement childElement;\r
if(item->getItemType() == ShoppingTreeItem::Category)\r
- element = m_document.createElement("category");\r
+ {\r
+ childElement = m_document.createElement("category");\r
+ QDomElement title = m_document.createElement("title");\r
+ QDomText newTitleText = m_document.createTextNode("new category");\r
+ title.appendChild(newTitleText);\r
+ childElement.appendChild(title);\r
+ }\r
else if(item->getItemType() == ShoppingTreeItem::Item)\r
- element = m_document.createElement("item");\r
+ {\r
+ childElement = m_document.createElement("category");\r
+ QDomElement title = m_document.createElement("title");\r
+ QDomText newTitleText = m_document.createTextNode("new category");\r
+ title.appendChild(newTitleText);\r
+ childElement.appendChild(title);\r
+ QDomElement quantity = m_document.createElement("quantity");\r
+ QDomText newQuantityText = m_document.createTextNode("0");\r
+ quantity.appendChild(newQuantityText);\r
+ childElement.appendChild(quantity);\r
+ QDomElement store = m_document.createElement("store");\r
+ QDomText newStoreText = m_document.createTextNode("");\r
+ store.appendChild(newStoreText);\r
+ childElement.appendChild(store);\r
+ QDomElement lastModified = m_document.createElement("lastModified");\r
+ QDomText newDateText = m_document.createTextNode(\r
+ QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss"));\r
+ lastModified.appendChild(newDateText);\r
+ childElement.appendChild(lastModified);\r
+ }\r
else\r
return;\r
\r
- parentElement.appendChild(element);\r
+ parentElement.appendChild(childElement);\r
+ m_domElementForItem.insert(item, childElement);\r
updateXmlFile();\r
- m_domElementForItem.insert(item, element);\r
- connect(item, SIGNAL(childInserted(ShoppingTreeItem*)), this,\r
- SLOT(registerInsertedChild(ShoppingTreeItem*)));\r
- connect(item, SIGNAL(childRemoved(ShoppingTreeItem*)), this,\r
- SLOT(deleteRemovedChild(ShoppingTreeItem*)));\r
}\r
\r
+/*******************************************************************/\r
void ShoppingTreeModel::deleteRemovedChild(ShoppingTreeItem *item)\r
{\r
QDomElement element = m_domElementForItem.value(item);\r
m_domElementForItem.remove(item);\r
}\r
\r
+/*******************************************************************/\r
void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,\r
ShoppingTreeItem *parentItem)\r
{\r
parentItem = rootItem;\r
\r
ShoppingTreeItem *item;\r
- QString title = element.firstChildElement("title").text();\r
+ QDomElement child = element.firstChildElement("title");\r
+ QString title = child.text();\r
if(!title.isEmpty())\r
{\r
parentItem->insertChildren(parentItem->childCount(), 1,\r
}\r
\r
// add each sub category and item to the tree\r
- QDomElement child = element.firstChildElement();\r
+ child = child.nextSiblingElement();\r
while(!child.isNull())\r
{\r
if(child.tagName() == "category")\r
}\r
}\r
\r
+/*******************************************************************/\r
QVector<QVariant> ShoppingTreeModel::getColumnsFromItemElement(const QDomElement &element)\r
{\r
QVector<QVariant> data;\r
return data;\r
}\r
\r
+/*******************************************************************/\r
bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)\r
{\r
QDomElement element = m_domElementForItem.value(item);\r
if(element.isNull())\r
return false;\r
\r
- bool success;\r
+ bool success = false;\r
switch(column)\r
{\r
case 0:\r
success = false;\r
}\r
\r
+ QDomElement oldDateElement = element.firstChildElement("lastModified");\r
+ if(!oldDateElement.isNull())\r
+ {\r
+ QDomElement newDateElement = m_document.createElement("lastModified");\r
+\r
+ QDomText newDateText = m_document.createTextNode(\r
+ QDateTime::currentDateTime().toString("dd/MM/yyyy-hh:mm:ss"));\r
+ newDateElement.appendChild(newDateText);\r
+\r
+ element.replaceChild(newDateElement, oldDateElement);\r
+ }\r
+\r
updateXmlFile();\r
\r
return success;\r
}\r
\r
+/*******************************************************************/\r
void ShoppingTreeModel::updateXmlFile() const\r
{\r
QFile xmlFile(m_xmlFileName);\r