annotate widgets/ItemContainer.cpp @ 79:afcf540ae3a2

add the real time filter stack to manage real time filters and their attributes
author lbajardsilogic
date Tue, 19 Jun 2007 15:15:12 +0000
parents 57c85a9d9b4a
children 5060939ca69d
rev   line source
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
lbajardsilogic@79 36 m_currentItem = -1;
lbajardsilogic@79 37
benoitrigolleau@56 38 }
benoitrigolleau@56 39
benoitrigolleau@56 40 void ItemContainer::addItem(GenericItemList *item){
benoitrigolleau@56 41 m_map->insert(m_cpt,item);
benoitrigolleau@59 42 m_linkedList->prepend(m_cpt);
benoitrigolleau@56 43 item->setIndex(m_cpt);
benoitrigolleau@59 44 if(m_cpt==0){
benoitrigolleau@59 45 item->setAcceptDrag(false);
benoitrigolleau@59 46 }
benoitrigolleau@56 47
benoitrigolleau@56 48 std::cerr << "add Item" << std::endl;
benoitrigolleau@56 49 connect(item, SIGNAL(itemDropped(int, int)),
benoitrigolleau@56 50 this, SLOT(moveItem(int, int)));
benoitrigolleau@56 51 connect(item, SIGNAL(selected(int)),
benoitrigolleau@56 52 this, SLOT(newItemSelected(int)));
benoitrigolleau@56 53
benoitrigolleau@59 54 m_itemLayout->insertWidget(0,item);
benoitrigolleau@56 55 m_cpt++;
benoitrigolleau@56 56 }
benoitrigolleau@56 57
benoitrigolleau@56 58 void ItemContainer::setSelectedItem(QVariant &data){
benoitrigolleau@56 59
benoitrigolleau@56 60 }
benoitrigolleau@56 61
benoitrigolleau@56 62 void ItemContainer::removeSelectedItem(){
lbajardsilogic@79 63 if (m_currentItem < 0)
lbajardsilogic@79 64 return;
benoitrigolleau@56 65
lbajardsilogic@79 66 QLinkedList<int>::iterator iter = find(m_currentItem);
lbajardsilogic@79 67 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(*iter);
lbajardsilogic@79 68
lbajardsilogic@79 69 QLinkedList<int>::iterator newCurItem = iter + 1;
lbajardsilogic@79 70
lbajardsilogic@79 71 if (iter != m_linkedList->end())
lbajardsilogic@79 72 {
lbajardsilogic@79 73 m_linkedList->erase(iter);
lbajardsilogic@79 74 }
lbajardsilogic@79 75 if (iterItem != m_map->end())
lbajardsilogic@79 76 {
lbajardsilogic@79 77 delete iterItem.value();
lbajardsilogic@79 78 m_map->erase(iterItem);
lbajardsilogic@79 79 }
lbajardsilogic@79 80
lbajardsilogic@79 81 reorganize();
lbajardsilogic@79 82
lbajardsilogic@79 83
lbajardsilogic@79 84 if (newCurItem != m_linkedList->end())
lbajardsilogic@79 85 {
lbajardsilogic@79 86 m_currentItem = *newCurItem;
lbajardsilogic@79 87 newItemSelected(m_currentItem);
lbajardsilogic@79 88 return;
lbajardsilogic@79 89 } else if (!m_linkedList->isEmpty()) {
lbajardsilogic@79 90 m_currentItem = *(m_linkedList->end() - 1);
lbajardsilogic@79 91 newItemSelected(m_currentItem);
lbajardsilogic@79 92 return;
lbajardsilogic@79 93 }
benoitrigolleau@56 94 }
benoitrigolleau@56 95
lbajardsilogic@79 96 void ItemContainer::removeItem(QString &name){
lbajardsilogic@79 97
lbajardsilogic@79 98 QMap<int,GenericItemList*>::iterator iterItem;
lbajardsilogic@79 99
lbajardsilogic@79 100 int index = -1;
lbajardsilogic@79 101
lbajardsilogic@79 102 //erase the element from the widget map
lbajardsilogic@79 103 for (iterItem = m_map->begin(); iterItem != m_map->end(); iterItem++)
lbajardsilogic@79 104 {
lbajardsilogic@79 105 QString iterName = iterItem.value()->getName();
lbajardsilogic@79 106 if (iterName == name)
lbajardsilogic@79 107 {
lbajardsilogic@79 108 index = iterItem.key();
lbajardsilogic@79 109 delete iterItem.value();
lbajardsilogic@79 110 m_map->erase(iterItem);
lbajardsilogic@79 111 break;
lbajardsilogic@79 112 }
lbajardsilogic@79 113 }
lbajardsilogic@79 114
lbajardsilogic@79 115 if (index != -1)
lbajardsilogic@79 116 {
lbajardsilogic@79 117 QLinkedList<int>::iterator iter = find(index);
lbajardsilogic@79 118
lbajardsilogic@79 119 QLinkedList<int>::iterator newCurItem = iter + 1;
lbajardsilogic@79 120
lbajardsilogic@79 121 //erase the element from the linked list
lbajardsilogic@79 122 if (iter != m_linkedList->end())
lbajardsilogic@79 123 {
lbajardsilogic@79 124 m_linkedList->erase(iter);
lbajardsilogic@79 125 }
lbajardsilogic@79 126
lbajardsilogic@79 127 //if it was the current item, select the following item if it exists
lbajardsilogic@79 128 if (index == m_currentItem)
lbajardsilogic@79 129 {
lbajardsilogic@79 130 if (newCurItem != m_linkedList->end())
lbajardsilogic@79 131 {
lbajardsilogic@79 132 m_currentItem = *newCurItem;
lbajardsilogic@79 133 newItemSelected(m_currentItem);
lbajardsilogic@79 134 return;
lbajardsilogic@79 135 } else if (!m_linkedList->isEmpty()) {
lbajardsilogic@79 136 m_currentItem = *(m_linkedList->end() - 1);
lbajardsilogic@79 137 newItemSelected(m_currentItem);
lbajardsilogic@79 138 return;
lbajardsilogic@79 139 }
lbajardsilogic@79 140 }
lbajardsilogic@79 141 }
lbajardsilogic@79 142
lbajardsilogic@79 143 reorganize();
lbajardsilogic@79 144 }
benoitrigolleau@56 145 void ItemContainer::reset()
benoitrigolleau@56 146 {
benoitrigolleau@56 147 QLayoutItem *child;
benoitrigolleau@56 148 while ((child = m_itemLayout->takeAt(0)) != 0) {
benoitrigolleau@56 149 delete child->widget();
benoitrigolleau@56 150 }
benoitrigolleau@56 151 }
benoitrigolleau@56 152
benoitrigolleau@56 153 void ItemContainer::removeAllItems(){
benoitrigolleau@56 154 m_linkedList->clear();
benoitrigolleau@56 155 reset();
lbajardsilogic@79 156 m_cpt=0;
benoitrigolleau@56 157 m_map->clear();
benoitrigolleau@56 158 }
benoitrigolleau@56 159
benoitrigolleau@56 160 void ItemContainer::setCurrentIndex(int i){
benoitrigolleau@56 161
benoitrigolleau@56 162
benoitrigolleau@56 163 }
benoitrigolleau@56 164
benoitrigolleau@56 165 QLinkedList<int>::iterator ItemContainer::find(int value)
benoitrigolleau@56 166 {
benoitrigolleau@59 167 QLinkedList<int>::iterator i = m_linkedList->begin();
benoitrigolleau@59 168 while (i != m_linkedList->end() && *i != value){
benoitrigolleau@59 169 ++i;
benoitrigolleau@56 170 }
benoitrigolleau@59 171 return i;
benoitrigolleau@56 172 }
benoitrigolleau@56 173
benoitrigolleau@56 174 void ItemContainer::reorganize(){
lbajardsilogic@79 175 int count = m_itemLayout->count();
lbajardsilogic@79 176 for (int i = count-1; i >= 0; i--){
benoitrigolleau@56 177 m_itemLayout->removeItem(m_itemLayout->itemAt(i));
benoitrigolleau@56 178 }
benoitrigolleau@56 179 QLinkedList<int>::iterator iter;
benoitrigolleau@56 180 for(iter = m_linkedList->begin(); iter != m_linkedList->end(); iter++){
lbajardsilogic@79 181 int j = *iter;
lbajardsilogic@79 182 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(j);
lbajardsilogic@79 183 if (iterItem != m_map->end())
lbajardsilogic@79 184 {
lbajardsilogic@79 185 int toto = iterItem.key();
lbajardsilogic@79 186 m_itemLayout->addWidget(iterItem.value());
lbajardsilogic@79 187 }
lbajardsilogic@79 188
lbajardsilogic@79 189
lbajardsilogic@79 190 //m_itemLayout->addWidget(m_map->value(*iter));
benoitrigolleau@56 191 }
lbajardsilogic@79 192 m_itemLayout->update();
benoitrigolleau@56 193 }
benoitrigolleau@56 194
benoitrigolleau@56 195 /********* SLOTS **************/
benoitrigolleau@56 196 void ItemContainer::moveItem(int idItem1, int idItem2){
benoitrigolleau@56 197 m_linkedList->removeAll(idItem1);
benoitrigolleau@56 198 QLinkedList<int>::iterator iter = find( idItem2);
benoitrigolleau@56 199 m_linkedList->insert(iter,idItem1);
benoitrigolleau@56 200 reorganize();
benoitrigolleau@56 201 }
benoitrigolleau@56 202
benoitrigolleau@56 203 void ItemContainer::newItemSelected(int idItem){
benoitrigolleau@56 204
benoitrigolleau@56 205 GenericItemList* item = m_map->value(m_currentItem);
benoitrigolleau@56 206 if(item!=0){
benoitrigolleau@56 207 item->setBackgroundRole(QPalette::Window);
benoitrigolleau@56 208 item->setForegroundRole(QPalette::WindowText);
benoitrigolleau@56 209 }
benoitrigolleau@56 210
benoitrigolleau@56 211 m_currentItem=idItem;
benoitrigolleau@56 212
benoitrigolleau@56 213 item = m_map->value(m_currentItem);
benoitrigolleau@56 214 if(item!=0){
benoitrigolleau@56 215 item->setAutoFillBackground(true);
benoitrigolleau@56 216 item->setBackgroundRole(QPalette::Highlight);
benoitrigolleau@56 217 item->setForegroundRole(QPalette::HighlightedText);
benoitrigolleau@56 218 }
benoitrigolleau@56 219
benoitrigolleau@56 220 // il va faloir changer l'indice je pense.
benoitrigolleau@56 221 // si ça plante lorsque l'on supprime un item, ça peut etre ça
benoitrigolleau@56 222 emit currentChanged(m_currentItem);
benoitrigolleau@56 223 }
benoitrigolleau@56 224
benoitrigolleau@56 225 void ItemContainer::upCurrentItem(){
benoitrigolleau@56 226 //return if item count <=1
benoitrigolleau@56 227 if (m_linkedList->count()<= 1){
benoitrigolleau@56 228 return;
benoitrigolleau@56 229 }
benoitrigolleau@59 230
benoitrigolleau@59 231 QLinkedList<int>::iterator iter;
benoitrigolleau@59 232 // return if current item is the first
benoitrigolleau@59 233 iter = m_linkedList->end()-1;
benoitrigolleau@59 234 if(*iter==m_currentItem){
benoitrigolleau@59 235 return;
benoitrigolleau@59 236 }
benoitrigolleau@56 237 // return if current item is on top
benoitrigolleau@56 238 iter = m_linkedList->begin();
benoitrigolleau@56 239 if(*iter==m_currentItem){
benoitrigolleau@56 240 return;
benoitrigolleau@56 241 }
benoitrigolleau@56 242
benoitrigolleau@59 243
benoitrigolleau@56 244 // move item
benoitrigolleau@56 245 for(iter = m_linkedList->begin()+1; iter != m_linkedList->end(); iter++){
benoitrigolleau@56 246 if(*iter == m_currentItem){
benoitrigolleau@56 247 int itemOnTop = *(iter-1);
benoitrigolleau@56 248 *(iter-1)=m_currentItem;
benoitrigolleau@56 249 *iter = itemOnTop;
benoitrigolleau@56 250 }
benoitrigolleau@56 251 }
benoitrigolleau@56 252 reorganize();
benoitrigolleau@56 253
benoitrigolleau@56 254 }
benoitrigolleau@56 255
benoitrigolleau@56 256 void ItemContainer::downCurrentItem(){
benoitrigolleau@56 257 //return if item count <=1
benoitrigolleau@56 258 if (m_linkedList->count()<= 1){
benoitrigolleau@56 259 return;
benoitrigolleau@56 260 }
benoitrigolleau@56 261 // return if current item is on bottom
benoitrigolleau@56 262 QLinkedList<int>::iterator iter;
benoitrigolleau@59 263 iter = m_linkedList->end()-1;
benoitrigolleau@59 264 if(*iter==m_currentItem || *(iter-1)==m_currentItem){
benoitrigolleau@56 265 return;
benoitrigolleau@56 266 }
benoitrigolleau@56 267
benoitrigolleau@56 268 //move item
benoitrigolleau@56 269 for(iter = m_linkedList->end()-2; iter != m_linkedList->begin()-1; iter--){
benoitrigolleau@56 270 if(*iter == m_currentItem){
benoitrigolleau@56 271 int itemOnBottom = *(iter+1);
benoitrigolleau@56 272 *(iter+1)=m_currentItem;
benoitrigolleau@56 273 *iter = itemOnBottom;
benoitrigolleau@56 274 }
benoitrigolleau@56 275 }
benoitrigolleau@56 276 reorganize();
benoitrigolleau@56 277 }
benoitrigolleau@56 278
benoitrigolleau@56 279 void ItemContainer::openConfigBoxForCurrentItem(){
benoitrigolleau@56 280 GenericItemList* item = m_map->value(m_currentItem);
benoitrigolleau@56 281 if(item!=0){
benoitrigolleau@56 282 item->configAction();
benoitrigolleau@56 283 }
benoitrigolleau@56 284 }
lbajardsilogic@79 285
lbajardsilogic@79 286 QString ItemContainer::getCurrentFilterName()
lbajardsilogic@79 287 {
lbajardsilogic@79 288 QString name = "";
lbajardsilogic@79 289
lbajardsilogic@79 290 if (m_currentItem < 0)
lbajardsilogic@79 291 return name;
lbajardsilogic@79 292
lbajardsilogic@79 293 QLinkedList<int>::iterator iter = find(m_currentItem);
lbajardsilogic@79 294
lbajardsilogic@79 295 if (iter != m_linkedList->end())
lbajardsilogic@79 296 {
lbajardsilogic@79 297 QMap<int,GenericItemList*>::iterator iterItem = m_map->find(*iter);
lbajardsilogic@79 298 if (iterItem != m_map->end())
lbajardsilogic@79 299 {
lbajardsilogic@79 300 GenericItemList* item = iterItem.value();
lbajardsilogic@79 301 name = item->getName();
lbajardsilogic@79 302 }
lbajardsilogic@79 303 }
lbajardsilogic@79 304 return name;
lbajardsilogic@79 305 }