git-svn-id: file:///svnroot/family-shop-mgr@11 26eb2498-383b-47a6-be48-5d6f36779e85
[family-shop-mgr] / code / family-shop-mgr / ShoppingTreeItem.cpp
1 /*\r
2  * This file is part of family-shop-mgr.\r
3  *\r
4  * family-shop-mgr is free software: you can redistribute it and/or modify\r
5  * it under the terms of the GNU General Public License as published by\r
6  * the Free Software Foundation, either version 3 of the License, or\r
7  * (at your option) any later version.\r
8  *\r
9  * family-shop-mgr is distributed in the hope that it will be useful,\r
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12  * GNU General Public License for more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License\r
15  * along with family-shop-mgr.  If not, see <http://www.gnu.org/licenses/>.\r
16  *\r
17  * Author: Unai IRIGOYEN\r
18  * Date: 12/07/2009\r
19  *\r
20  */\r
21 \r
22 #include "ShoppingTreeItem.h"\r
23 \r
24 ShoppingTreeItem::ShoppingTreeItem(const QVector<QVariant> &data,\r
25                                    ShoppingTreeItem *parent) : m_itemType(NotDefined)\r
26 {\r
27     parentItem = parent;\r
28     itemData = data;\r
29 }\r
30 \r
31 ShoppingTreeItem::~ShoppingTreeItem()\r
32 {\r
33     qDeleteAll(childItems);\r
34 }\r
35 \r
36 ShoppingTreeItem *ShoppingTreeItem::child(int number)\r
37 {\r
38     return childItems.value(number);\r
39 }\r
40 \r
41 int ShoppingTreeItem::childCount() const\r
42 {\r
43     return childItems.count();\r
44 }\r
45 \r
46 int ShoppingTreeItem::childNumber() const\r
47 {\r
48     if (parentItem)\r
49         return parentItem->childItems.indexOf(const_cast<ShoppingTreeItem*>(this));\r
50 \r
51     return 0;\r
52 }\r
53 \r
54 int ShoppingTreeItem::columnCount() const\r
55 {\r
56     return itemData.count();\r
57 }\r
58 \r
59 QVariant ShoppingTreeItem::data(int column) const\r
60 {\r
61     return itemData.value(column);\r
62 }\r
63 \r
64 bool ShoppingTreeItem::insertChildren(int position, int count, int columns)\r
65 {\r
66     if (position < 0 || position > childItems.size())\r
67         return false;\r
68 \r
69     for (int row = 0; row < count; ++row) {\r
70         QVector<QVariant> data(columns);\r
71         ShoppingTreeItem *item = new ShoppingTreeItem(data, this);\r
72         childItems.insert(position, item);\r
73         emit childInserted(item);\r
74     }\r
75 \r
76     return true;\r
77 }\r
78 \r
79 bool ShoppingTreeItem::insertColumns(int position, int columns)\r
80 {\r
81     if (position < 0 || position > itemData.size())\r
82         return false;\r
83 \r
84     for (int column = 0; column < columns; ++column)\r
85         itemData.insert(position, QVariant());\r
86 \r
87     foreach (ShoppingTreeItem *child, childItems)\r
88         child->insertColumns(position, columns);\r
89 \r
90     return true;\r
91 }\r
92 \r
93 ShoppingTreeItem *ShoppingTreeItem::parent()\r
94 {\r
95     return parentItem;\r
96 }\r
97 \r
98 bool ShoppingTreeItem::removeChildren(int position, int count)\r
99 {\r
100     if (position < 0 || position + count > childItems.size())\r
101         return false;\r
102 \r
103     for (int row = 0; row < count; ++row)\r
104     {\r
105         ShoppingTreeItem *item = childItems.takeAt(position);\r
106         emit childRemoved(item);\r
107         delete item;\r
108     }\r
109 \r
110     return true;\r
111 }\r
112 \r
113 bool ShoppingTreeItem::removeColumns(int position, int columns)\r
114 {\r
115     if (position < 0 || position + columns > itemData.size())\r
116         return false;\r
117 \r
118     for (int column = 0; column < columns; ++column)\r
119         itemData.remove(position);\r
120 \r
121     foreach (ShoppingTreeItem *child, childItems)\r
122         child->removeColumns(position, columns);\r
123 \r
124     return true;\r
125 }\r
126 \r
127 bool ShoppingTreeItem::setData(int column, const QVariant &value)\r
128 {\r
129     if (column < 0 || column >= itemData.size())\r
130         return false;\r
131 \r
132     if(m_itemType == Category && column != 0)\r
133         return false;\r
134 \r
135     itemData[column] = value;\r
136     emit dataChanged(column);\r
137     return true;\r
138 }\r
139 \r
140 bool ShoppingTreeItem::setItemType(ItemType type)\r
141 {\r
142     if(type == NotDefined)\r
143         return false;\r
144 \r
145     m_itemType = type;\r
146 \r
147     // release enough resources in case we call wait more than once\r
148     m_typeSemaphore.release(1000);\r
149 \r
150     return (m_itemType == type) ? true : false;\r
151 }\r
152 \r
153 ShoppingTreeItem::ItemType ShoppingTreeItem::getItemType() const\r
154 {\r
155     return m_itemType;\r
156 }\r
157 \r
158 void ShoppingTreeItem::waitItemTypeDefinition()\r
159 {\r
160     m_typeSemaphore.acquire();\r
161 }\r