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@56
|
21
|
benoitrigolleau@56
|
22 ItemContainer::ItemContainer(QWidget *parent) : QWidget(parent){
|
benoitrigolleau@56
|
23
|
benoitrigolleau@56
|
24 m_linkedList = new QLinkedList<int>();
|
benoitrigolleau@56
|
25 m_map = new QMap<int,GenericItemList*>();
|
benoitrigolleau@56
|
26
|
benoitrigolleau@56
|
27 m_cpt=0;
|
benoitrigolleau@56
|
28
|
benoitrigolleau@56
|
29 QVBoxLayout *mainlayout = new QVBoxLayout();
|
benoitrigolleau@56
|
30 m_itemLayout = new QVBoxLayout;
|
benoitrigolleau@56
|
31 mainlayout->addLayout(m_itemLayout);
|
benoitrigolleau@56
|
32 mainlayout->addStretch();
|
benoitrigolleau@56
|
33
|
benoitrigolleau@56
|
34 this->setLayout(mainlayout);
|
benoitrigolleau@56
|
35
|
benoitrigolleau@56
|
36 }
|
benoitrigolleau@56
|
37
|
benoitrigolleau@56
|
38 void ItemContainer::addItem(GenericItemList *item){
|
benoitrigolleau@56
|
39 m_map->insert(m_cpt,item);
|
benoitrigolleau@59
|
40 m_linkedList->prepend(m_cpt);
|
benoitrigolleau@56
|
41 item->setIndex(m_cpt);
|
benoitrigolleau@59
|
42 if(m_cpt==0){
|
benoitrigolleau@59
|
43 item->setAcceptDrag(false);
|
benoitrigolleau@59
|
44 }
|
benoitrigolleau@56
|
45
|
benoitrigolleau@56
|
46 std::cerr << "add Item" << std::endl;
|
benoitrigolleau@56
|
47 connect(item, SIGNAL(itemDropped(int, int)),
|
benoitrigolleau@56
|
48 this, SLOT(moveItem(int, int)));
|
benoitrigolleau@56
|
49 connect(item, SIGNAL(selected(int)),
|
benoitrigolleau@56
|
50 this, SLOT(newItemSelected(int)));
|
benoitrigolleau@56
|
51
|
benoitrigolleau@59
|
52 m_itemLayout->insertWidget(0,item);
|
benoitrigolleau@56
|
53 m_cpt++;
|
benoitrigolleau@56
|
54 }
|
benoitrigolleau@56
|
55
|
benoitrigolleau@56
|
56 void ItemContainer::setSelectedItem(QVariant &data){
|
benoitrigolleau@56
|
57
|
benoitrigolleau@56
|
58 }
|
benoitrigolleau@56
|
59
|
benoitrigolleau@56
|
60 void ItemContainer::removeSelectedItem(){
|
benoitrigolleau@56
|
61 //QLindList<int>::iterator iter = m_linkedList->find(x);
|
benoitrigolleau@56
|
62
|
benoitrigolleau@56
|
63 }
|
benoitrigolleau@56
|
64
|
benoitrigolleau@56
|
65 void ItemContainer::reset()
|
benoitrigolleau@56
|
66 {
|
benoitrigolleau@56
|
67 QLayoutItem *child;
|
benoitrigolleau@56
|
68 while ((child = m_itemLayout->takeAt(0)) != 0) {
|
benoitrigolleau@56
|
69 delete child->widget();
|
benoitrigolleau@56
|
70 }
|
benoitrigolleau@56
|
71 }
|
benoitrigolleau@56
|
72
|
benoitrigolleau@56
|
73 void ItemContainer::removeAllItems(){
|
benoitrigolleau@56
|
74 m_linkedList->clear();
|
benoitrigolleau@56
|
75 reset();
|
benoitrigolleau@56
|
76 m_map->clear();
|
benoitrigolleau@56
|
77 m_cpt=0;
|
benoitrigolleau@56
|
78
|
benoitrigolleau@56
|
79 }
|
benoitrigolleau@56
|
80
|
benoitrigolleau@56
|
81 void ItemContainer::setCurrentIndex(int i){
|
benoitrigolleau@56
|
82
|
benoitrigolleau@56
|
83
|
benoitrigolleau@56
|
84 }
|
benoitrigolleau@56
|
85
|
benoitrigolleau@56
|
86 QLinkedList<int>::iterator ItemContainer::find(int value)
|
benoitrigolleau@56
|
87 {
|
benoitrigolleau@59
|
88 QLinkedList<int>::iterator i = m_linkedList->begin();
|
benoitrigolleau@59
|
89 while (i != m_linkedList->end() && *i != value){
|
benoitrigolleau@59
|
90 ++i;
|
benoitrigolleau@56
|
91 }
|
benoitrigolleau@59
|
92 return i;
|
benoitrigolleau@56
|
93 }
|
benoitrigolleau@56
|
94
|
benoitrigolleau@56
|
95 void ItemContainer::reorganize(){
|
benoitrigolleau@59
|
96 for (int i = 0; i < m_itemLayout->count(); i++){
|
benoitrigolleau@56
|
97 m_itemLayout->removeItem(m_itemLayout->itemAt(i));
|
benoitrigolleau@56
|
98 }
|
benoitrigolleau@56
|
99 QLinkedList<int>::iterator iter;
|
benoitrigolleau@56
|
100 for(iter = m_linkedList->begin(); iter != m_linkedList->end(); iter++){
|
benoitrigolleau@56
|
101 m_itemLayout->addWidget(m_map->value(*iter));
|
benoitrigolleau@56
|
102 }
|
benoitrigolleau@56
|
103 }
|
benoitrigolleau@56
|
104
|
benoitrigolleau@56
|
105 /********* SLOTS **************/
|
benoitrigolleau@56
|
106 void ItemContainer::moveItem(int idItem1, int idItem2){
|
benoitrigolleau@56
|
107 m_linkedList->removeAll(idItem1);
|
benoitrigolleau@56
|
108 QLinkedList<int>::iterator iter = find( idItem2);
|
benoitrigolleau@56
|
109 m_linkedList->insert(iter,idItem1);
|
benoitrigolleau@56
|
110 reorganize();
|
benoitrigolleau@56
|
111 }
|
benoitrigolleau@56
|
112
|
benoitrigolleau@56
|
113 void ItemContainer::newItemSelected(int idItem){
|
benoitrigolleau@56
|
114
|
benoitrigolleau@56
|
115 GenericItemList* item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
116 if(item!=0){
|
benoitrigolleau@56
|
117 item->setBackgroundRole(QPalette::Window);
|
benoitrigolleau@56
|
118 item->setForegroundRole(QPalette::WindowText);
|
benoitrigolleau@56
|
119 }
|
benoitrigolleau@56
|
120
|
benoitrigolleau@56
|
121 m_currentItem=idItem;
|
benoitrigolleau@56
|
122
|
benoitrigolleau@56
|
123 item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
124 if(item!=0){
|
benoitrigolleau@56
|
125 item->setAutoFillBackground(true);
|
benoitrigolleau@56
|
126 item->setBackgroundRole(QPalette::Highlight);
|
benoitrigolleau@56
|
127 item->setForegroundRole(QPalette::HighlightedText);
|
benoitrigolleau@56
|
128 }
|
benoitrigolleau@56
|
129
|
benoitrigolleau@56
|
130 // il va faloir changer l'indice je pense.
|
benoitrigolleau@56
|
131 // si ça plante lorsque l'on supprime un item, ça peut etre ça
|
benoitrigolleau@56
|
132 emit currentChanged(m_currentItem);
|
benoitrigolleau@56
|
133 }
|
benoitrigolleau@56
|
134
|
benoitrigolleau@56
|
135 void ItemContainer::upCurrentItem(){
|
benoitrigolleau@56
|
136 //return if item count <=1
|
benoitrigolleau@56
|
137 if (m_linkedList->count()<= 1){
|
benoitrigolleau@56
|
138 return;
|
benoitrigolleau@56
|
139 }
|
benoitrigolleau@59
|
140
|
benoitrigolleau@59
|
141 QLinkedList<int>::iterator iter;
|
benoitrigolleau@59
|
142 // return if current item is the first
|
benoitrigolleau@59
|
143 iter = m_linkedList->end()-1;
|
benoitrigolleau@59
|
144 if(*iter==m_currentItem){
|
benoitrigolleau@59
|
145 return;
|
benoitrigolleau@59
|
146 }
|
benoitrigolleau@56
|
147 // return if current item is on top
|
benoitrigolleau@56
|
148 iter = m_linkedList->begin();
|
benoitrigolleau@56
|
149 if(*iter==m_currentItem){
|
benoitrigolleau@56
|
150 return;
|
benoitrigolleau@56
|
151 }
|
benoitrigolleau@56
|
152
|
benoitrigolleau@59
|
153
|
benoitrigolleau@56
|
154 // move item
|
benoitrigolleau@56
|
155 for(iter = m_linkedList->begin()+1; iter != m_linkedList->end(); iter++){
|
benoitrigolleau@56
|
156 if(*iter == m_currentItem){
|
benoitrigolleau@56
|
157 int itemOnTop = *(iter-1);
|
benoitrigolleau@56
|
158 *(iter-1)=m_currentItem;
|
benoitrigolleau@56
|
159 *iter = itemOnTop;
|
benoitrigolleau@56
|
160 }
|
benoitrigolleau@56
|
161 }
|
benoitrigolleau@56
|
162 reorganize();
|
benoitrigolleau@56
|
163
|
benoitrigolleau@56
|
164 }
|
benoitrigolleau@56
|
165
|
benoitrigolleau@56
|
166 void ItemContainer::downCurrentItem(){
|
benoitrigolleau@56
|
167 //return if item count <=1
|
benoitrigolleau@56
|
168 if (m_linkedList->count()<= 1){
|
benoitrigolleau@56
|
169 return;
|
benoitrigolleau@56
|
170 }
|
benoitrigolleau@56
|
171 // return if current item is on bottom
|
benoitrigolleau@56
|
172 QLinkedList<int>::iterator iter;
|
benoitrigolleau@59
|
173 iter = m_linkedList->end()-1;
|
benoitrigolleau@59
|
174 if(*iter==m_currentItem || *(iter-1)==m_currentItem){
|
benoitrigolleau@56
|
175 return;
|
benoitrigolleau@56
|
176 }
|
benoitrigolleau@56
|
177
|
benoitrigolleau@56
|
178 //move item
|
benoitrigolleau@56
|
179 for(iter = m_linkedList->end()-2; iter != m_linkedList->begin()-1; iter--){
|
benoitrigolleau@56
|
180 if(*iter == m_currentItem){
|
benoitrigolleau@56
|
181 int itemOnBottom = *(iter+1);
|
benoitrigolleau@56
|
182 *(iter+1)=m_currentItem;
|
benoitrigolleau@56
|
183 *iter = itemOnBottom;
|
benoitrigolleau@56
|
184 }
|
benoitrigolleau@56
|
185 }
|
benoitrigolleau@56
|
186 reorganize();
|
benoitrigolleau@56
|
187 }
|
benoitrigolleau@56
|
188
|
benoitrigolleau@56
|
189 void ItemContainer::openConfigBoxForCurrentItem(){
|
benoitrigolleau@56
|
190 GenericItemList* item = m_map->value(m_currentItem);
|
benoitrigolleau@56
|
191 if(item!=0){
|
benoitrigolleau@56
|
192 item->configAction();
|
benoitrigolleau@56
|
193 }
|
benoitrigolleau@56
|
194 }
|