benoitrigolleau@56: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ benoitrigolleau@56: benoitrigolleau@56: /* benoitrigolleau@56: Sound Access benoitrigolleau@56: EASAIER client application. benoitrigolleau@56: Silogic 2007. Benoit Rigolleau. benoitrigolleau@56: benoitrigolleau@56: This program is free software; you can redistribute it and/or benoitrigolleau@56: modify it under the terms of the GNU General Public License as benoitrigolleau@56: published by the Free Software Foundation; either version 2 of the benoitrigolleau@56: License, or (at your option) any later version. See the file benoitrigolleau@56: COPYING included with this distribution for more information. benoitrigolleau@56: */ benoitrigolleau@56: benoitrigolleau@56: #include "ItemContainer.h" benoitrigolleau@56: benoitrigolleau@56: #include benoitrigolleau@56: #include benoitrigolleau@56: #include benoitrigolleau@56: #include benoitrigolleau@88: #include benoitrigolleau@56: benoitrigolleau@56: ItemContainer::ItemContainer(QWidget *parent) : QWidget(parent){ benoitrigolleau@56: benoitrigolleau@56: m_linkedList = new QLinkedList(); benoitrigolleau@56: m_map = new QMap(); benoitrigolleau@56: benoitrigolleau@56: m_cpt=0; benoitrigolleau@56: benoitrigolleau@56: QVBoxLayout *mainlayout = new QVBoxLayout(); benoitrigolleau@56: m_itemLayout = new QVBoxLayout; benoitrigolleau@88: benoitrigolleau@56: mainlayout->addLayout(m_itemLayout); benoitrigolleau@56: mainlayout->addStretch(); benoitrigolleau@56: benoitrigolleau@56: this->setLayout(mainlayout); benoitrigolleau@56: lbajardsilogic@79: m_currentItem = -1; benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::addItem(GenericItemList *item){ benoitrigolleau@97: benoitrigolleau@56: m_map->insert(m_cpt,item); benoitrigolleau@59: m_linkedList->prepend(m_cpt); benoitrigolleau@56: item->setIndex(m_cpt); benoitrigolleau@59: if(m_cpt==0){ benoitrigolleau@59: item->setAcceptDrag(false); benoitrigolleau@59: } benoitrigolleau@56: benoitrigolleau@56: std::cerr << "add Item" << std::endl; benoitrigolleau@56: connect(item, SIGNAL(itemDropped(int, int)), benoitrigolleau@56: this, SLOT(moveItem(int, int))); benoitrigolleau@56: connect(item, SIGNAL(selected(int)), benoitrigolleau@56: this, SLOT(newItemSelected(int))); benoitrigolleau@56: benoitrigolleau@59: m_itemLayout->insertWidget(0,item); benoitrigolleau@88: benoitrigolleau@56: m_cpt++; benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::setSelectedItem(QVariant &data){ benoitrigolleau@56: benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::removeSelectedItem(){ lbajardsilogic@79: if (m_currentItem < 0) lbajardsilogic@79: return; benoitrigolleau@56: lbajardsilogic@79: QLinkedList::iterator iter = find(m_currentItem); lbajardsilogic@79: QMap::iterator iterItem = m_map->find(*iter); lbajardsilogic@79: lbajardsilogic@79: QLinkedList::iterator newCurItem = iter + 1; lbajardsilogic@79: lbajardsilogic@79: if (iter != m_linkedList->end()) lbajardsilogic@79: { lbajardsilogic@79: m_linkedList->erase(iter); lbajardsilogic@79: } lbajardsilogic@79: if (iterItem != m_map->end()) lbajardsilogic@79: { lbajardsilogic@79: delete iterItem.value(); lbajardsilogic@79: m_map->erase(iterItem); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: reorganize(); lbajardsilogic@79: lbajardsilogic@79: lbajardsilogic@79: if (newCurItem != m_linkedList->end()) lbajardsilogic@79: { lbajardsilogic@79: m_currentItem = *newCurItem; lbajardsilogic@79: newItemSelected(m_currentItem); lbajardsilogic@79: return; lbajardsilogic@79: } else if (!m_linkedList->isEmpty()) { lbajardsilogic@79: m_currentItem = *(m_linkedList->end() - 1); lbajardsilogic@79: newItemSelected(m_currentItem); lbajardsilogic@79: return; lbajardsilogic@79: } benoitrigolleau@56: } benoitrigolleau@56: lbajardsilogic@79: void ItemContainer::removeItem(QString &name){ lbajardsilogic@79: lbajardsilogic@79: QMap::iterator iterItem; lbajardsilogic@79: lbajardsilogic@79: int index = -1; lbajardsilogic@79: lbajardsilogic@79: //erase the element from the widget map lbajardsilogic@79: for (iterItem = m_map->begin(); iterItem != m_map->end(); iterItem++) lbajardsilogic@79: { lbajardsilogic@79: QString iterName = iterItem.value()->getName(); lbajardsilogic@79: if (iterName == name) lbajardsilogic@79: { lbajardsilogic@79: index = iterItem.key(); lbajardsilogic@79: delete iterItem.value(); lbajardsilogic@79: m_map->erase(iterItem); lbajardsilogic@79: break; lbajardsilogic@79: } lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: if (index != -1) lbajardsilogic@79: { lbajardsilogic@79: QLinkedList::iterator iter = find(index); lbajardsilogic@79: lbajardsilogic@79: QLinkedList::iterator newCurItem = iter + 1; lbajardsilogic@79: lbajardsilogic@79: //erase the element from the linked list lbajardsilogic@79: if (iter != m_linkedList->end()) lbajardsilogic@79: { lbajardsilogic@79: m_linkedList->erase(iter); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: //if it was the current item, select the following item if it exists lbajardsilogic@79: if (index == m_currentItem) lbajardsilogic@79: { lbajardsilogic@79: if (newCurItem != m_linkedList->end()) lbajardsilogic@79: { lbajardsilogic@79: m_currentItem = *newCurItem; lbajardsilogic@79: newItemSelected(m_currentItem); lbajardsilogic@79: return; lbajardsilogic@79: } else if (!m_linkedList->isEmpty()) { lbajardsilogic@79: m_currentItem = *(m_linkedList->end() - 1); lbajardsilogic@79: newItemSelected(m_currentItem); lbajardsilogic@79: return; lbajardsilogic@79: } lbajardsilogic@79: } lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: reorganize(); lbajardsilogic@79: } benoitrigolleau@56: void ItemContainer::reset() benoitrigolleau@56: { benoitrigolleau@56: QLayoutItem *child; benoitrigolleau@56: while ((child = m_itemLayout->takeAt(0)) != 0) { benoitrigolleau@56: delete child->widget(); benoitrigolleau@56: } benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::removeAllItems(){ benoitrigolleau@56: m_linkedList->clear(); benoitrigolleau@56: reset(); lbajardsilogic@79: m_cpt=0; benoitrigolleau@56: m_map->clear(); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::setCurrentIndex(int i){ benoitrigolleau@56: benoitrigolleau@56: benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: QLinkedList::iterator ItemContainer::find(int value) benoitrigolleau@56: { benoitrigolleau@59: QLinkedList::iterator i = m_linkedList->begin(); benoitrigolleau@59: while (i != m_linkedList->end() && *i != value){ benoitrigolleau@59: ++i; benoitrigolleau@56: } benoitrigolleau@59: return i; benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::reorganize(){ lbajardsilogic@79: int count = m_itemLayout->count(); lbajardsilogic@79: for (int i = count-1; i >= 0; i--){ benoitrigolleau@56: m_itemLayout->removeItem(m_itemLayout->itemAt(i)); benoitrigolleau@56: } benoitrigolleau@56: QLinkedList::iterator iter; benoitrigolleau@56: for(iter = m_linkedList->begin(); iter != m_linkedList->end(); iter++){ lbajardsilogic@79: int j = *iter; lbajardsilogic@79: QMap::iterator iterItem = m_map->find(j); lbajardsilogic@79: if (iterItem != m_map->end()) lbajardsilogic@79: { lbajardsilogic@79: int toto = iterItem.key(); lbajardsilogic@79: m_itemLayout->addWidget(iterItem.value()); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: lbajardsilogic@79: //m_itemLayout->addWidget(m_map->value(*iter)); benoitrigolleau@56: } lbajardsilogic@79: m_itemLayout->update(); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: /********* SLOTS **************/ benoitrigolleau@56: void ItemContainer::moveItem(int idItem1, int idItem2){ benoitrigolleau@56: m_linkedList->removeAll(idItem1); benoitrigolleau@56: QLinkedList::iterator iter = find( idItem2); benoitrigolleau@56: m_linkedList->insert(iter,idItem1); benoitrigolleau@56: reorganize(); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::newItemSelected(int idItem){ benoitrigolleau@56: benoitrigolleau@56: GenericItemList* item = m_map->value(m_currentItem); benoitrigolleau@56: if(item!=0){ benoitrigolleau@56: item->setBackgroundRole(QPalette::Window); benoitrigolleau@56: item->setForegroundRole(QPalette::WindowText); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: m_currentItem=idItem; benoitrigolleau@56: benoitrigolleau@56: item = m_map->value(m_currentItem); benoitrigolleau@56: if(item!=0){ benoitrigolleau@56: item->setAutoFillBackground(true); benoitrigolleau@56: item->setBackgroundRole(QPalette::Highlight); benoitrigolleau@56: item->setForegroundRole(QPalette::HighlightedText); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: // il va faloir changer l'indice je pense. benoitrigolleau@56: // si ça plante lorsque l'on supprime un item, ça peut etre ça benoitrigolleau@56: emit currentChanged(m_currentItem); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::upCurrentItem(){ benoitrigolleau@56: //return if item count <=1 benoitrigolleau@56: if (m_linkedList->count()<= 1){ benoitrigolleau@56: return; benoitrigolleau@56: } benoitrigolleau@59: benoitrigolleau@59: QLinkedList::iterator iter; benoitrigolleau@59: // return if current item is the first benoitrigolleau@59: iter = m_linkedList->end()-1; benoitrigolleau@59: if(*iter==m_currentItem){ benoitrigolleau@59: return; benoitrigolleau@59: } benoitrigolleau@56: // return if current item is on top benoitrigolleau@56: iter = m_linkedList->begin(); benoitrigolleau@56: if(*iter==m_currentItem){ benoitrigolleau@56: return; benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@59: benoitrigolleau@56: // move item benoitrigolleau@56: for(iter = m_linkedList->begin()+1; iter != m_linkedList->end(); iter++){ benoitrigolleau@56: if(*iter == m_currentItem){ benoitrigolleau@56: int itemOnTop = *(iter-1); benoitrigolleau@56: *(iter-1)=m_currentItem; benoitrigolleau@56: *iter = itemOnTop; benoitrigolleau@56: } benoitrigolleau@56: } benoitrigolleau@56: reorganize(); benoitrigolleau@56: benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::downCurrentItem(){ benoitrigolleau@56: //return if item count <=1 benoitrigolleau@56: if (m_linkedList->count()<= 1){ benoitrigolleau@56: return; benoitrigolleau@56: } benoitrigolleau@56: // return if current item is on bottom benoitrigolleau@56: QLinkedList::iterator iter; benoitrigolleau@59: iter = m_linkedList->end()-1; benoitrigolleau@59: if(*iter==m_currentItem || *(iter-1)==m_currentItem){ benoitrigolleau@56: return; benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: //move item benoitrigolleau@56: for(iter = m_linkedList->end()-2; iter != m_linkedList->begin()-1; iter--){ benoitrigolleau@56: if(*iter == m_currentItem){ benoitrigolleau@56: int itemOnBottom = *(iter+1); benoitrigolleau@56: *(iter+1)=m_currentItem; benoitrigolleau@56: *iter = itemOnBottom; benoitrigolleau@56: } benoitrigolleau@56: } benoitrigolleau@56: reorganize(); benoitrigolleau@56: } benoitrigolleau@56: benoitrigolleau@56: void ItemContainer::openConfigBoxForCurrentItem(){ benoitrigolleau@56: GenericItemList* item = m_map->value(m_currentItem); benoitrigolleau@56: if(item!=0){ benoitrigolleau@56: item->configAction(); benoitrigolleau@56: } benoitrigolleau@56: } lbajardsilogic@79: lbajardsilogic@79: QString ItemContainer::getCurrentFilterName() lbajardsilogic@79: { lbajardsilogic@79: QString name = ""; lbajardsilogic@79: lbajardsilogic@79: if (m_currentItem < 0) lbajardsilogic@79: return name; lbajardsilogic@79: lbajardsilogic@79: QLinkedList::iterator iter = find(m_currentItem); lbajardsilogic@79: lbajardsilogic@79: if (iter != m_linkedList->end()) lbajardsilogic@79: { lbajardsilogic@79: QMap::iterator iterItem = m_map->find(*iter); lbajardsilogic@79: if (iterItem != m_map->end()) lbajardsilogic@79: { lbajardsilogic@79: GenericItemList* item = iterItem.value(); lbajardsilogic@79: name = item->getName(); lbajardsilogic@79: } lbajardsilogic@79: } lbajardsilogic@79: return name; lbajardsilogic@79: }