git-svn-id: file:///svnroot/family-shop-mgr@21 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 /*******************************************************************/\r
25 ShoppingTreeItem::ShoppingTreeItem(const QVector<QVariant> &data,\r
26                                    ShoppingTreeItem *parent) : m_itemType(NotDefined)\r
27 {\r
28     parentItem = parent;\r
29     itemData = data;\r
30 }\r
31 \r
32 /*******************************************************************/\r
33 ShoppingTreeItem::~ShoppingTreeItem()\r
34 {\r
35     qDeleteAll(childItems);\r
36 }\r
37 \r
38 /*******************************************************************/\r
39 ShoppingTreeItem *ShoppingTreeItem::child(int number)\r
40 {\r
41     return childItems.value(number);\r
42 }\r
43 \r
44 /*******************************************************************/\r
45 int ShoppingTreeItem::childCount() const\r
46 {\r
47     return childItems.count();\r
48 }\r
49 \r
50 /*******************************************************************/\r
51 int ShoppingTreeItem::childNumber() const\r
52 {\r
53     if (parentItem)\r
54         return parentItem->childItems.indexOf(const_cast<ShoppingTreeItem*>(this));\r
55 \r
56     return 0;\r
57 }\r
58 \r
59 /*******************************************************************/\r
60 int ShoppingTreeItem::columnCount() const\r
61 {\r
62     return itemData.count();\r
63 }\r
64 \r
65 /*******************************************************************/\r
66 QVariant ShoppingTreeItem::data(int column) const\r
67 {\r
68     return itemData.value(column);\r
69 }\r
70 \r
71 /*******************************************************************/\r
72 bool ShoppingTreeItem::insertChildren(int position, int count, int columns)\r
73 {\r
74     if (position < 0 || position > childItems.size())\r
75         return false;\r
76 \r
77     for (int row = 0; row < count; ++row) {\r
78         QVector<QVariant> data(columns);\r
79         ShoppingTreeItem *item = new ShoppingTreeItem(data, this);\r
80         childItems.insert(position, item);\r
81         emit childInserted(item);\r
82     }\r
83 \r
84     return true;\r
85 }\r
86 \r
87 /*******************************************************************/\r
88 bool ShoppingTreeItem::insertColumns(int position, int columns)\r
89 {\r
90     if (position < 0 || position > itemData.size())\r
91         return false;\r
92 \r
93     for (int column = 0; column < columns; ++column)\r
94         itemData.insert(position, QVariant());\r
95 \r
96     foreach (ShoppingTreeItem *child, childItems)\r
97         child->insertColumns(position, columns);\r
98 \r
99     return true;\r
100 }\r
101 \r
102 /*******************************************************************/\r
103 ShoppingTreeItem *ShoppingTreeItem::parent()\r
104 {\r
105     return parentItem;\r
106 }\r
107 \r
108 /*******************************************************************/\r
109 bool ShoppingTreeItem::removeChildren(int position, int count)\r
110 {\r
111     if (position < 0 || position + count > childItems.size())\r
112         return false;\r
113 \r
114     for (int row = 0; row < count; ++row)\r
115     {\r
116         ShoppingTreeItem *item = childItems.takeAt(position);\r
117         emit childRemoved(item);\r
118         delete item;\r
119     }\r
120 \r
121     return true;\r
122 }\r
123 \r
124 /*******************************************************************/\r
125 bool ShoppingTreeItem::removeColumns(int position, int columns)\r
126 {\r
127     if (position < 0 || position + columns > itemData.size())\r
128         return false;\r
129 \r
130     for (int column = 0; column < columns; ++column)\r
131         itemData.remove(position);\r
132 \r
133     foreach (ShoppingTreeItem *child, childItems)\r
134         child->removeColumns(position, columns);\r
135 \r
136     return true;\r
137 }\r
138 \r
139 /*******************************************************************/\r
140 bool ShoppingTreeItem::setData(int column, const QVariant &value)\r
141 {\r
142     if (column < 0 || column >= itemData.size())\r
143         return false;\r
144 \r
145     if(m_itemType == Category && column != 0)\r
146         return false;\r
147 \r
148     itemData[column] = value;\r
149     emit dataChanged(column);\r
150     return true;\r
151 }\r
152 \r
153 /*******************************************************************/\r
154 bool ShoppingTreeItem::setItemType(ItemType type)\r
155 {\r
156     if(type == NotDefined)\r
157         return false;\r
158 \r
159     m_itemType = type;\r
160 \r
161     // release enough resources in case we call wait more than once\r
162     m_typeSemaphore.release(1000);\r
163 \r
164     return (m_itemType == type) ? true : false;\r
165 }\r
166 \r
167 /*******************************************************************/\r
168 ShoppingTreeItem::ItemType ShoppingTreeItem::getItemType() const\r
169 {\r
170     return m_itemType;\r
171 }\r
172 \r
173 /*******************************************************************/\r
174 void ShoppingTreeItem::waitItemTypeDefinition()\r
175 {\r
176     m_typeSemaphore.acquire();\r
177 }\r