git-svn-id: file:///svnroot/family-shop-mgr@31 26eb2498-383b-47a6-be48-5d6f36779e85
[family-shop-mgr] / code / family-shop-mgr / ShoppingTreeModel.cpp
index d304c41..28dd5d0 100644 (file)
@@ -62,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
@@ -90,18 +91,25 @@ 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
@@ -122,13 +130,11 @@ bool ShoppingTreeModel::addCategory(QString name)
     if (!this->insertRow(parent.row()+1, 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
+    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
@@ -156,13 +162,12 @@ bool ShoppingTreeModel::addItem(QString name, int position,
     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::Item);\r
-        this->setData(child, QVariant(name), Qt::EditRole);\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
@@ -207,7 +212,8 @@ ShoppingTreeItem *ShoppingTreeModel::getItem(const QModelIndex &index) const
 }\r
 \r
 /*******************************************************************/\r
-QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation,\r
+QVariant ShoppingTreeModel::headerData(int section,\r
+                                       Qt::Orientation orientation,\r
                                        int role) const\r
 {\r
     if(orientation == Qt::Horizontal && role == Qt::DisplayRole)\r
@@ -217,7 +223,8 @@ QVariant ShoppingTreeModel::headerData(int section, Qt::Orientation orientation,
 }\r
 \r
 /*******************************************************************/\r
-QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &parent) const\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
@@ -232,7 +239,8 @@ QModelIndex ShoppingTreeModel::index(int row, int column, const QModelIndex &par
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::insertColumns(int position, int columns, const QModelIndex &parent)\r
+bool ShoppingTreeModel::insertColumns(int position, int columns,\r
+                                      const QModelIndex &parent)\r
 {\r
     bool success;\r
 \r
@@ -244,13 +252,15 @@ bool ShoppingTreeModel::insertColumns(int position, int columns, const QModelInd
 }\r
 \r
 /*******************************************************************/\r
-bool ShoppingTreeModel::insertRows(int position, int rows, const QModelIndex &parent)\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
@@ -310,7 +320,10 @@ int ShoppingTreeModel::rowCount(const QModelIndex &parent) const
 /*******************************************************************/\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
@@ -353,25 +366,43 @@ bool ShoppingTreeModel::setHeaderData(int section, Qt::Orientation orientation,
 /*******************************************************************/\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
@@ -471,8 +502,8 @@ bool ShoppingTreeModel::updateDomElement(ShoppingTreeItem *item, int column)
     if(element.isNull())\r
      return false;\r
 \r
-    bool success;\r
-    switch(column)/*******************************************************************/\r
+    bool success = false;\r
+    switch(column)\r
     {\r
         case 0:\r
         {\r
@@ -514,6 +545,18 @@ 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
@@ -528,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