benoitrigolleau@56
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
benoitrigolleau@56
|
2
|
benoitrigolleau@56
|
3 /*
|
benoitrigolleau@56
|
4 Sound Access
|
benoitrigolleau@56
|
5 EASAIER client application.
|
benoitrigolleau@56
|
6 Silogic 2007. Benoit Rigolleau.
|
benoitrigolleau@56
|
7
|
benoitrigolleau@56
|
8 This program is free software; you can redistribute it and/or
|
benoitrigolleau@56
|
9 modify it under the terms of the GNU General Public License as
|
benoitrigolleau@56
|
10 published by the Free Software Foundation; either version 2 of the
|
benoitrigolleau@56
|
11 License, or (at your option) any later version. See the file
|
benoitrigolleau@56
|
12 COPYING included with this distribution for more information.
|
benoitrigolleau@56
|
13 */
|
benoitrigolleau@56
|
14
|
benoitrigolleau@56
|
15 #include "ItemContainer.h"
|
benoitrigolleau@56
|
16
|
benoitrigolleau@56
|
17 #include <QtAlgorithms>
|
benoitrigolleau@56
|
18 #include <iostream>
|
benoitrigolleau@56
|
19 #include <QList>
|
benoitrigolleau@56
|
20 #include <QPalette>
|
benoitrigolleau@88
|
21 #include <QScrollArea>
|
benoitrigolleau@56
|
22
|
benoitrigolleau@56
|
23 ItemContainer::ItemContainer(QWidget *parent) : QWidget(parent){
|
benoitrigolleau@56
|
24
|
benoitrigolleau@56
|
25 m_linkedList = new QLinkedList<int>();
|
benoitrigolleau@56
|
26 m_map = new QMap<int,GenericItemList*>();
|
benoitrigolleau@56
|
27
|
benoitrigolleau@56
|
28 m_cpt=0;
|
benoitrigolleau@56
|
29
|
benoitrigolleau@56
|
30 QVBoxLayout *mainlayout = new QVBoxLayout();
|
benoitrigolleau@56
|
31 m_itemLayout = new QVBoxLayout;
|
benoitrigolleau@88
|
32
|
benoitrigolleau@56
|
33 mainlayout->addLayout(m_itemLayout);
|
benoitrigolleau@56
|
34 mainlayout->addStretch();
|
benoitrigolleau@56
|
35
|
benoitrigolleau@56
|
36 this->setLayout(mainlayout);
|
benoitrigolleau@56
|
37
|
lbajardsilogic@79
|
38 m_currentItem = -1;
|
benoitrigolleau@56
|
39 }
|
benoitrigolleau@56
|
40
|
benoitrigolleau@56
|
41 void ItemContainer::addItem(GenericItemList *item){
|
benoitrigolleau@97
|
42
|
benoitrigolleau@56
|
43 m_map->insert(m_cpt,item);
|
benoitrigolleau@59
|
44 m_linkedList->prepend(m_cpt);
|
benoitrigolleau@56
|
45 item->setIndex(m_cpt);
|
benoitrigolleau@59
|
46 if(m_cpt==0){
|
benoitrigolleau@59
|
47 item->setAcceptDrag(false);
|
benoitrigolleau@59
|
48 }
|
benoitrigolleau@56
|
49
|
benoitrigolleau@56
|
50 std::cerr << "add Item" << std::endl;
|
benoitrigolleau@56
|
51 connect(item, SIGNAL(itemDropped(int, int)),
|
benoitrigolleau@56
|
52 this, SLOT(moveItem(int, int)));
|
benoitrigolleau@56
|
53 connect(item, SIGNAL(selected(int)),
|
benoitrigolleau@56
|
54 this, SLOT(newItemSelected(int)));
|
benoitrigolleau@56
|
55
|
benoitrigolleau@59
|
56 m_itemLayout->insertWidget(0,item);
|
benoitrigolleau@88
|
57
|
benoitrigolleau@56
|
58 m_cpt++;
|
benoitrigolleau@56
|
59 }
|
benoitrigolleau@56
|
60
|
benoitrigolleau@56
|
61 void ItemContainer::setSelectedItem(QVariant &data){
|
benoitrigolleau@56
|
62
|
benoitrigolleau@56
|
63 }
|
benoitrigolleau@56
|
64
|
benoitrigolleau@56
|
65 void ItemContainer::removeSelectedItem(){
|
lbajardsilogic@79
|
66 if (m_currentItem < 0)
|
lbajardsilogic@79
|
67 return;
|
benoitrigolleau@56
|
68
|
lbajardsilogic@79
|
69 QLinkedList<int>::iterator iter = find(m_currentItem);
|
lbajardsilogic@79
|
70 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(*iter);
|
lbajardsilogic@79
|
71
|
lbajardsilogic@79
|
72 QLinkedList<int>::iterator newCurItem = iter + 1;
|
lbajardsilogic@79
|
73
|
lbajardsilogic@79
|
74 if (iter != m_linkedList->end())
|
lbajardsilogic@79
|
75 {
|
lbajardsilogic@79
|
76 m_linkedList->erase(iter);
|
lbajardsilogic@79
|
77 }
|
lbajardsilogic@79
|
78 if (iterItem != m_map->end())
|
lbajardsilogic@79
|
79 {
|
lbajardsilogic@79
|
80 delete iterItem.value();
|
lbajardsilogic@79
|
81 m_map->erase(iterItem);
|
lbajardsilogic@79
|
82 }
|
lbajardsilogic@79
|
83
|
lbajardsilogic@79
|
84 reorganize();
|
lbajardsilogic@79
|
85
|
lbajardsilogic@79
|
86
|
lbajardsilogic@79
|
87 if (newCurItem != m_linkedList->end())
|
lbajardsilogic@79
|
88 {
|
lbajardsilogic@79
|
89 m_currentItem = *newCurItem;
|
lbajardsilogic@79
|
90 newItemSelected(m_currentItem);
|
lbajardsilogic@79
|
91 return;
|
lbajardsilogic@79
|
92 } else if (!m_linkedList->isEmpty()) {
|
lbajardsilogic@79
|
93 m_currentItem = *(m_linkedList->end() - 1);
|
lbajardsilogic@79
|
94 newItemSelected(m_currentItem);
|
lbajardsilogic@79
|
95 return;
|
lbajardsilogic@79
|
96 }
|
benoitrigolleau@56
|
97 }
|
benoitrigolleau@56
|
98
|
lbajardsilogic@79
|
99 void ItemContainer::removeItem(QString &name){
|
lbajardsilogic@79
|
100
|
lbajardsilogic@79
|
101 QMap<int,GenericItemList*>::iterator iterItem;
|
lbajardsilogic@79
|
102
|
lbajardsilogic@79
|
103 int index = -1;
|
lbajardsilogic@79
|
104
|
lbajardsilogic@79
|
105 //erase the element from the widget map
|
lbajardsilogic@79
|
106 for (iterItem = m_map->begin(); iterItem != m_map->end(); iterItem++)
|
lbajardsilogic@79
|
107 {
|
lbajardsilogic@79
|
108 QString iterName = iterItem.value()->getName();
|
lbajardsilogic@79
|
109 if (iterName == name)
|
lbajardsilogic@79
|
110 {
|
lbajardsilogic@79
|
111 index = iterItem.key();
|
lbajardsilogic@79
|
112 delete iterItem.value();
|
lbajardsilogic@79
|
113 m_map->erase(iterItem);
|
lbajardsilogic@79
|
114 break;
|
lbajardsilogic@79
|
115 }
|
lbajardsilogic@79
|
116 }
|
lbajardsilogic@79
|
117
|
lbajardsilogic@79
|
118 if (index != -1)
|
lbajardsilogic@79
|
119 {
|
lbajardsilogic@79
|
120 QLinkedList<int>::iterator iter = find(index);
|
lbajardsilogic@79
|
121
|
lbajardsilogic@79
|
122 QLinkedList<int>::iterator newCurItem = iter + 1;
|
lbajardsilogic@79
|
123
|
lbajardsilogic@79
|
124 //erase the element from the linked list
|
lbajardsilogic@79
|
125 if (iter != m_linkedList->end())
|
lbajardsilogic@79
|
126 {
|
lbajardsilogic@79
|
127 m_linkedList->erase(iter);
|
lbajardsilogic@79
|
128 }
|
lbajardsilogic@79
|
129
|
lbajardsilogic@79
|
130 //if it was the current item, select the following item if it exists
|
lbajardsilogic@79
|
131 if (index == m_currentItem)
|
lbajardsilogic@79
|
132 {
|
lbajardsilogic@79
|
133 if (newCurItem != m_linkedList->end())
|
lbajardsilogic@79
|
134 {
|
lbajardsilogic@79
|
135 m_currentItem = *newCurItem;
|
lbajardsilogic@79
|
136 newItemSelected(m_currentItem);
|
lbajardsilogic@79
|
137 return;
|
lbajardsilogic@79
|
138 } else if (!m_linkedList->isEmpty()) {
|
lbajardsilogic@79
|
139 m_currentItem = *(m_linkedList->end() - 1);
|
lbajardsilogic@79
|
140 newItemSelected(m_currentItem);
|
lbajardsilogic@79
|
141 return;
|
lbajardsilogic@79
|
142 }
|
lbajardsilogic@79
|
143 }
|
lbajardsilogic@79
|
144 }
|
lbajardsilogic@79
|
145
|
lbajardsilogic@79
|
146 reorganize();
|
lbajardsilogic@79
|
147 }
|
benoitrigolleau@56
|
148 void ItemContainer::reset()
|
benoitrigolleau@56
|
149 {
|
benoitrigolleau@56
|
150 QLayoutItem *child;
|
benoitrigolleau@56
|
151 while ((child = m_itemLayout->takeAt(0)) != 0) {
|
benoitrigolleau@56
|
152 delete child->widget();
|
benoitrigolleau@56
|
153 }
|
benoitrigolleau@56
|
154 }
|
benoitrigolleau@56
|
155
|
benoitrigolleau@56
|
156 void ItemContainer::removeAllItems(){
|
benoitrigolleau@56
|
157 m_linkedList->clear();
|
benoitrigolleau@56
|
158 reset();
|
lbajardsilogic@79
|
159 m_cpt=0;
|
benoitrigolleau@56
|
160 m_map->clear();
|
benoitrigolleau@56
|
161 }
|
benoitrigolleau@56
|
162
|
benoitrigolleau@56
|
163 void ItemContainer::setCurrentIndex(int i){
|
benoitrigolleau@56
|
164
|
benoitrigolleau@56
|
165
|
benoitrigolleau@56
|
166 }
|
benoitrigolleau@56
|
167
|
benoitrigolleau@56
|
168 QLinkedList<int>::iterator ItemContainer::find(int value)
|
benoitrigolleau@56
|
169 {
|
benoitrigolleau@59
|
170 QLinkedList<int>::iterator i = m_linkedList->begin();
|
benoitrigolleau@59
|
171 while (i != m_linkedList->end() && *i != value){
|
benoitrigolleau@59
|
172 ++i;
|
benoitrigolleau@56
|
173 }
|
benoitrigolleau@59
|
174 return i;
|
benoitrigolleau@56
|
175 }
|
benoitrigolleau@56
|
176
|
benoitrigolleau@56
|
177 void ItemContainer::reorganize(){
|
lbajardsilogic@79
|
178 int count = m_itemLayout->count();
|
lbajardsilogic@79
|
179 for (int i = count-1; i >= 0; i--){
|
benoitrigolleau@56
|
180 m_itemLayout->removeItem(m_itemLayout->itemAt(i));
|
benoitrigolleau@56
|
181 }
|
benoitrigolleau@56
|
182 QLinkedList<int>::iterator iter;
|
benoitrigolleau@56
|
183 for(iter = m_linkedList->begin(); iter != m_linkedList->end(); iter++){
|
lbajardsilogic@79
|
184 int j = *iter;
|
lbajardsilogic@79
|
185 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(j);
|
lbajardsilogic@79
|
186 if (iterItem != m_map->end())
|
lbajardsilogic@79
|
187 {
|
lbajardsilogic@79
|
188 int toto = iterItem.key();
|
lbajardsilogic@79
|
189 m_itemLayout->addWidget(iterItem.value());
|
lbajardsilogic@79
|
190 }
|
lbajardsilogic@79
|
191
|
lbajardsilogic@79
|
192
|
lbajardsilogic@79
|
193 //m_itemLayout->addWidget(m_map->value(*iter));
|
benoitrigolleau@56
|
194 }
|
lbajardsilogic@79
|
195 m_itemLayout->update();
|
benoitrigolleau@56
|
196 }
|
benoitrigolleau@56
|
197
|
benoitrigolleau@56
|
198 /********* SLOTS **************/
|
benoitrigolleau@56
|
199 void ItemContainer::moveItem(int idItem1, int idItem2){
|
benoitrigolleau@56
|
200 m_linkedList->removeAll(idItem1);
|
benoitrigolleau@56
|
201 QLinkedList<int>::iterator iter = find( idItem2);
|
benoitrigolleau@56
|
202 m_linkedList->insert(iter,idItem1);
|
benoitrigolleau@56
|
203 reorganize();
|
benoitrigolleau@56
|
204 }
|
benoitrigolleau@56
|
205
|
benoitrigolleau@56
|
206 void ItemContainer::newItemSelected(int idItem){
|
benoitrigolleau@56
|
207
|
benoitrigolleau@56
|
208 GenericItemList* item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
209 if(item!=0){
|
benoitrigolleau@56
|
210 item->setBackgroundRole(QPalette::Window);
|
benoitrigolleau@56
|
211 item->setForegroundRole(QPalette::WindowText);
|
benoitrigolleau@56
|
212 }
|
benoitrigolleau@56
|
213
|
benoitrigolleau@56
|
214 m_currentItem=idItem;
|
benoitrigolleau@56
|
215
|
benoitrigolleau@56
|
216 item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
217 if(item!=0){
|
benoitrigolleau@56
|
218 item->setAutoFillBackground(true);
|
benoitrigolleau@56
|
219 item->setBackgroundRole(QPalette::Highlight);
|
benoitrigolleau@56
|
220 item->setForegroundRole(QPalette::HighlightedText);
|
benoitrigolleau@56
|
221 }
|
benoitrigolleau@56
|
222
|
benoitrigolleau@56
|
223 // il va faloir changer l'indice je pense.
|
benoitrigolleau@56
|
224 // si ça plante lorsque l'on supprime un item, ça peut etre ça
|
benoitrigolleau@56
|
225 emit currentChanged(m_currentItem);
|
benoitrigolleau@56
|
226 }
|
benoitrigolleau@56
|
227
|
benoitrigolleau@56
|
228 void ItemContainer::upCurrentItem(){
|
benoitrigolleau@56
|
229 //return if item count <=1
|
benoitrigolleau@56
|
230 if (m_linkedList->count()<= 1){
|
benoitrigolleau@56
|
231 return;
|
benoitrigolleau@56
|
232 }
|
benoitrigolleau@59
|
233
|
benoitrigolleau@59
|
234 QLinkedList<int>::iterator iter;
|
benoitrigolleau@59
|
235 // return if current item is the first
|
benoitrigolleau@59
|
236 iter = m_linkedList->end()-1;
|
benoitrigolleau@59
|
237 if(*iter==m_currentItem){
|
benoitrigolleau@59
|
238 return;
|
benoitrigolleau@59
|
239 }
|
benoitrigolleau@56
|
240 // return if current item is on top
|
benoitrigolleau@56
|
241 iter = m_linkedList->begin();
|
benoitrigolleau@56
|
242 if(*iter==m_currentItem){
|
benoitrigolleau@56
|
243 return;
|
benoitrigolleau@56
|
244 }
|
benoitrigolleau@56
|
245
|
benoitrigolleau@59
|
246
|
benoitrigolleau@56
|
247 // move item
|
benoitrigolleau@56
|
248 for(iter = m_linkedList->begin()+1; iter != m_linkedList->end(); iter++){
|
benoitrigolleau@56
|
249 if(*iter == m_currentItem){
|
benoitrigolleau@56
|
250 int itemOnTop = *(iter-1);
|
benoitrigolleau@56
|
251 *(iter-1)=m_currentItem;
|
benoitrigolleau@56
|
252 *iter = itemOnTop;
|
benoitrigolleau@56
|
253 }
|
benoitrigolleau@56
|
254 }
|
benoitrigolleau@56
|
255 reorganize();
|
benoitrigolleau@56
|
256
|
benoitrigolleau@56
|
257 }
|
benoitrigolleau@56
|
258
|
benoitrigolleau@56
|
259 void ItemContainer::downCurrentItem(){
|
benoitrigolleau@56
|
260 //return if item count <=1
|
benoitrigolleau@56
|
261 if (m_linkedList->count()<= 1){
|
benoitrigolleau@56
|
262 return;
|
benoitrigolleau@56
|
263 }
|
benoitrigolleau@56
|
264 // return if current item is on bottom
|
benoitrigolleau@56
|
265 QLinkedList<int>::iterator iter;
|
benoitrigolleau@59
|
266 iter = m_linkedList->end()-1;
|
benoitrigolleau@59
|
267 if(*iter==m_currentItem || *(iter-1)==m_currentItem){
|
benoitrigolleau@56
|
268 return;
|
benoitrigolleau@56
|
269 }
|
benoitrigolleau@56
|
270
|
benoitrigolleau@56
|
271 //move item
|
benoitrigolleau@56
|
272 for(iter = m_linkedList->end()-2; iter != m_linkedList->begin()-1; iter--){
|
benoitrigolleau@56
|
273 if(*iter == m_currentItem){
|
benoitrigolleau@56
|
274 int itemOnBottom = *(iter+1);
|
benoitrigolleau@56
|
275 *(iter+1)=m_currentItem;
|
benoitrigolleau@56
|
276 *iter = itemOnBottom;
|
benoitrigolleau@56
|
277 }
|
benoitrigolleau@56
|
278 }
|
benoitrigolleau@56
|
279 reorganize();
|
benoitrigolleau@56
|
280 }
|
benoitrigolleau@56
|
281
|
benoitrigolleau@56
|
282 void ItemContainer::openConfigBoxForCurrentItem(){
|
benoitrigolleau@56
|
283 GenericItemList* item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
284 if(item!=0){
|
benoitrigolleau@56
|
285 item->configAction();
|
benoitrigolleau@56
|
286 }
|
benoitrigolleau@56
|
287 }
|
lbajardsilogic@79
|
288
|
lbajardsilogic@79
|
289 QString ItemContainer::getCurrentFilterName()
|
lbajardsilogic@79
|
290 {
|
lbajardsilogic@79
|
291 QString name = "";
|
lbajardsilogic@79
|
292
|
lbajardsilogic@79
|
293 if (m_currentItem < 0)
|
lbajardsilogic@79
|
294 return name;
|
lbajardsilogic@79
|
295
|
lbajardsilogic@79
|
296 QLinkedList<int>::iterator iter = find(m_currentItem);
|
lbajardsilogic@79
|
297
|
lbajardsilogic@79
|
298 if (iter != m_linkedList->end())
|
lbajardsilogic@79
|
299 {
|
lbajardsilogic@79
|
300 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(*iter);
|
lbajardsilogic@79
|
301 if (iterItem != m_map->end())
|
lbajardsilogic@79
|
302 {
|
lbajardsilogic@79
|
303 GenericItemList* item = iterItem.value();
|
lbajardsilogic@79
|
304 name = item->getName();
|
lbajardsilogic@79
|
305 }
|
lbajardsilogic@79
|
306 }
|
lbajardsilogic@79
|
307 return name;
|
lbajardsilogic@79
|
308 } |