annotate widgets/ItemContainer.cpp @ 130:b3df8b8185db

video in a widget, with a basic solution (not optimal)
author benoitrigolleau
date Thu, 08 Nov 2007 14:27:36 +0000
parents 486e44e12a5d
children
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@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 }