git-svn-id: file:///svnroot/family-shop-mgr@31 26eb2498-383b-47a6-be48-5d6f36779e85
[family-shop-mgr] / code / family-shop-mgr / ShoppingTreeModel.cpp
index 20852e4..28dd5d0 100644 (file)
@@ -26,6 +26,7 @@
 #include <QApplication>\r
 #include <QtGui>\r
 \r
+/*******************************************************************/\r
 ShoppingTreeModel::ShoppingTreeModel(const QString &xmlFileName,\r
                                      QObject *parent) :\r
 QAbstractItemModel(parent), m_document("ShoppingList")\r
@@ -61,6 +62,7 @@ QAbstractItemModel(parent), m_document("ShoppingList")
                 << "Quantity" << "Store";\r
 \r
         rootItem = new ShoppingTreeItem(rootData);\r
+        m_domElementForItem.insert(rootItem, root);\r
     }\r
     else\r
     {\r
@@ -89,28 +91,93 @@ QAbstractItemModel(parent), m_document("ShoppingList")
                 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
@@ -123,6 +190,7 @@ QVariant ShoppingTreeModel::data(const QModelIndex &index, int role) const
     return item->data(index.column());\r
 }\r
 \r
+/*******************************************************************/\r
 Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const\r
 {\r
     if(!index.isValid())\r
@@ -131,17 +199,21 @@ Qt::ItemFlags ShoppingTreeModel::flags(const QModelIndex &index) const
     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
@@ -150,7 +222,9 @@ QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation,
     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
@@ -164,7 +238,9 @@ QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &par
         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
@@ -175,18 +251,22 @@ bool ShoppingTreeModel::insertColumns(int position, int columns, const QModelInd
     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
@@ -201,6 +281,7 @@ QModelIndex ShoppingTreeModel::parent(const QModelIndex &index) const
     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
@@ -215,6 +296,7 @@ bool ShoppingTreeModel::removeColumns(int position, int columns, const QModelInd
     return success;\r
 }\r
 \r
+/*******************************************************************/\r
 bool ShoppingTreeModel::removeRows(int position, int rows, const QModelIndex &parent)\r
 {\r
     ShoppingTreeItem *parentItem = getItem(parent);\r
@@ -227,6 +309,7 @@ bool ShoppingTreeModel::removeRows(int position, int rows, const QModelIndex &pa
     return success;\r
 }\r
 \r
+/*******************************************************************/\r
 int ShoppingTreeModel::rowCount(const QModelIndex &parent) const\r
 {\r
     ShoppingTreeItem *parentItem = getItem(parent);\r
@@ -234,10 +317,16 @@ int ShoppingTreeModel::rowCount(const QModelIndex &parent) const
     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
@@ -259,6 +348,7 @@ bool ShoppingTreeModel::setData(const QModelIndex &index, const QVariant &value,
     return result;\r
 }\r
 \r
+/*******************************************************************/\r
 bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation,\r
                                       const QVariant &value, int role)\r
 {\r
@@ -273,29 +363,49 @@ bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation,
     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
@@ -305,6 +415,7 @@ void ShoppingTreeModel::deleteRemovedChild(ShoppingTreeItem *item)
     m_domElementForItem.remove(item);\r
 }\r
 \r
+/*******************************************************************/\r
 void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,\r
                                              ShoppingTreeItem *parentItem)\r
 {\r
@@ -313,7 +424,8 @@ void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,
         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
@@ -333,7 +445,7 @@ void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,
     }\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
@@ -365,6 +477,7 @@ void ShoppingTreeModel::parseCategoryElement(const QDomElement &element,
     }\r
 }\r
 \r
+/*******************************************************************/\r
 QVector<QVariant> ShoppingTreeModel::getColumnsFromItemElement(const QDomElement &element)\r
 {\r
     QVector<QVariant> data;\r
@@ -381,6 +494,7 @@ QVector<QVariant> ShoppingTreeModel::getColumnsFromItemElement(const QDomElement
     return data;\r
 }\r
 \r
+/*******************************************************************/\r
 bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)\r
 {\r
     QDomElement element = m_domElementForItem.value(item);\r
@@ -388,7 +502,7 @@ bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)
     if(element.isNull())\r
      return false;\r
 \r
-    bool success;\r
+    bool success = false;\r
     switch(column)\r
     {\r
         case 0:\r
@@ -431,11 +545,24 @@ bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)
             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
@@ -444,3 +571,10 @@ void ShoppingTreeModel::updateXmlFile() const
     xmlFile.write(m_document.toByteArray(4));\r
     xmlFile.close();\r
 }\r
+\r
+/*******************************************************************/\r
+void ShoppingTreeModel::sort(int column, Qt::SortOrder order)\r
+{\r
+    // TODO: implement sorting\r
+    ;\r
+}\r