annotate widgets/ItemContainer.cpp @ 59:57c85a9d9b4a

(none)
author benoitrigolleau
date Mon, 28 May 2007 08:14:40 +0000
parents 81921835ddf1
children afcf540ae3a2
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
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 }