annotate widgets/PropertyStack.cpp @ 72:9e1a46a72cde

update widgets.pro
author lbajardsilogic
date Wed, 13 Jun 2007 13:55:31 +0000
parents 429cfea499ad
children be6d31baecb9
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "PropertyStack.h"
lbajardsilogic@0 17 #include "PropertyBox.h"
lbajardsilogic@0 18 #include "base/PropertyContainer.h"
lbajardsilogic@0 19 #include "view/View.h"
lbajardsilogic@0 20 #include "layer/Layer.h"
lbajardsilogic@0 21 #include "layer/LayerFactory.h"
lbajardsilogic@0 22 #include "widgets/NotifyingTabBar.h"
benoitrigolleau@56 23 #include "ItemLayerList.h"
lbajardsilogic@0 24
lbajardsilogic@0 25 #include <QIcon>
lbajardsilogic@0 26 #include <QTabWidget>
lbajardsilogic@0 27
lbajardsilogic@0 28 #include <iostream>
lbajardsilogic@0 29
lbajardsilogic@0 30 //#define DEBUG_PROPERTY_STACK 1
lbajardsilogic@0 31
lbajardsilogic@0 32 PropertyStack::PropertyStack(QWidget *parent, View *client) :
benoitrigolleau@56 33 LayerViewerWidget(parent),
lbajardsilogic@0 34 m_client(client)
lbajardsilogic@0 35 {
lbajardsilogic@0 36 NotifyingTabBar *bar = new NotifyingTabBar();
lbajardsilogic@0 37 bar->setDrawBase(false);
lbajardsilogic@0 38
lbajardsilogic@0 39 connect(bar, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredTabBar()));
lbajardsilogic@0 40 connect(bar, SIGNAL(mouseLeft()), this, SLOT(mouseLeftTabBar()));
lbajardsilogic@0 41 connect(bar, SIGNAL(activeTabClicked()), this, SLOT(activeTabClicked()));
lbajardsilogic@0 42
benoitrigolleau@56 43 //setTabBar(bar);
lbajardsilogic@0 44
benoitrigolleau@56 45 /*#if (QT_VERSION >= 0x0402)
lbajardsilogic@0 46 setElideMode(Qt::ElideNone);
lbajardsilogic@0 47 tabBar()->setUsesScrollButtons(true);
lbajardsilogic@0 48 tabBar()->setIconSize(QSize(16, 16));
benoitrigolleau@56 49 #endif*/
lbajardsilogic@0 50
lbajardsilogic@0 51 repopulate();
lbajardsilogic@0 52
lbajardsilogic@0 53 connect(this, SIGNAL(currentChanged(int)),
lbajardsilogic@0 54 this, SLOT(selectedContainerChanged(int)));
lbajardsilogic@0 55
lbajardsilogic@0 56 connect(m_client, SIGNAL(propertyContainerAdded(PropertyContainer *)),
lbajardsilogic@0 57 this, SLOT(propertyContainerAdded(PropertyContainer *)));
lbajardsilogic@0 58
lbajardsilogic@0 59 connect(m_client, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
lbajardsilogic@0 60 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
lbajardsilogic@0 61
lbajardsilogic@0 62 connect(m_client, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)),
lbajardsilogic@0 63 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
lbajardsilogic@0 64
lbajardsilogic@0 65 connect(m_client, SIGNAL(propertyContainerPropertyRangeChanged(PropertyContainer *)),
lbajardsilogic@0 66 this, SLOT(propertyContainerPropertyRangeChanged(PropertyContainer *)));
lbajardsilogic@0 67
lbajardsilogic@0 68 connect(m_client, SIGNAL(propertyContainerNameChanged(PropertyContainer *)),
lbajardsilogic@0 69 this, SLOT(propertyContainerNameChanged(PropertyContainer *)));
lbajardsilogic@0 70
lbajardsilogic@0 71 connect(this, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)),
lbajardsilogic@0 72 m_client, SLOT(propertyContainerSelected(View *, PropertyContainer *)));
lbajardsilogic@0 73 }
lbajardsilogic@0 74
lbajardsilogic@51 75 PropertyStack::~PropertyStack()
lbajardsilogic@51 76 {
lbajardsilogic@51 77 blockSignals(true);
lbajardsilogic@51 78
benoitrigolleau@56 79 /*while (count() > 0)
lbajardsilogic@51 80 {
lbajardsilogic@51 81 removeTab(0);
benoitrigolleau@56 82 }*/
benoitrigolleau@56 83 removeAllItems();
lbajardsilogic@51 84
lbajardsilogic@51 85 for (size_t i = 0; i < m_boxes.size(); ++i)
lbajardsilogic@51 86 {
lbajardsilogic@51 87 delete m_boxes[i];
lbajardsilogic@51 88 }
lbajardsilogic@51 89 m_boxes.clear();
lbajardsilogic@51 90 m_client = 0;
lbajardsilogic@51 91 }
lbajardsilogic@51 92
lbajardsilogic@0 93 void
lbajardsilogic@0 94 PropertyStack::repopulate()
lbajardsilogic@0 95 {
lbajardsilogic@0 96 blockSignals(true);
lbajardsilogic@0 97
lbajardsilogic@0 98 #ifdef DEBUG_PROPERTY_STACK
lbajardsilogic@0 99 std::cerr << "PropertyStack::repopulate" << std::endl;
lbajardsilogic@0 100 #endif
lbajardsilogic@0 101
benoitrigolleau@56 102 /*while (count() > 0) {
lbajardsilogic@0 103 removeTab(0);
benoitrigolleau@56 104 }*/
benoitrigolleau@56 105 removeAllItems();
benoitrigolleau@56 106
lbajardsilogic@0 107 for (size_t i = 0; i < m_boxes.size(); ++i) {
benoitrigolleau@56 108 delete m_boxes[i];
lbajardsilogic@0 109 }
lbajardsilogic@0 110 m_boxes.clear();
lbajardsilogic@0 111
lbajardsilogic@0 112 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 113
lbajardsilogic@0 114 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 115 QString name = container->getPropertyContainerName();
lbajardsilogic@0 116
lbajardsilogic@0 117 PropertyBox *box = new PropertyBox(container);
lbajardsilogic@0 118 connect(box, SIGNAL(showLayer(bool)), this, SLOT(showLayer(bool)));
lbajardsilogic@0 119 connect(box, SIGNAL(contextHelpChanged(const QString &)),
lbajardsilogic@0 120 this, SIGNAL(contextHelpChanged(const QString &)));
lbajardsilogic@0 121
lbajardsilogic@0 122 Layer *layer = dynamic_cast<Layer *>(container);
lbajardsilogic@0 123 if (layer) {
lbajardsilogic@0 124 box->layerVisibilityChanged(!layer->isLayerDormant(m_client));
lbajardsilogic@0 125 }
lbajardsilogic@0 126
lbajardsilogic@0 127 QString shortName = name;
lbajardsilogic@0 128
lbajardsilogic@0 129 if (layer) {
lbajardsilogic@0 130 shortName = LayerFactory::getInstance()->getLayerPresentationName
lbajardsilogic@0 131 (LayerFactory::getInstance()->getLayerType(layer));
lbajardsilogic@0 132 }
lbajardsilogic@0 133
lbajardsilogic@0 134 shortName = QString("&%1 %2").arg(i + 1).arg(shortName);
lbajardsilogic@0 135
benoitrigolleau@56 136 /*#ifdef Q_WS_MAC
lbajardsilogic@0 137
lbajardsilogic@0 138 // Qt 4.2 on OS/X doesn't show the icons in the tab bar, and
lbajardsilogic@0 139 // I'm not sure why -- use labels instead
lbajardsilogic@0 140
lbajardsilogic@0 141 addTab(box, shortName);
lbajardsilogic@0 142
benoitrigolleau@56 143 #else*/
lbajardsilogic@0 144
lbajardsilogic@0 145 // Icons on other platforms
lbajardsilogic@0 146
lbajardsilogic@0 147 QString iconName = container->getPropertyContainerIconName();
lbajardsilogic@0 148
lbajardsilogic@0 149 QIcon icon(QString(":/icons/%1.png").arg(iconName));
benoitrigolleau@56 150
benoitrigolleau@56 151 ItemLayerList *item = new ItemLayerList();
lbajardsilogic@0 152
benoitrigolleau@56 153 //if (icon.isNull()) {
benoitrigolleau@56 154 //addTab(box, shortName);
benoitrigolleau@56 155 //} else {
benoitrigolleau@56 156
benoitrigolleau@56 157 //item->setColor(QColor ( 100, 60, 20));
benoitrigolleau@56 158 //addTab(box, icon, QString("&%1").arg(i + 1));
benoitrigolleau@56 159 //setTabToolTip(i, name);
benoitrigolleau@56 160 //}
benoitrigolleau@56 161
benoitrigolleau@56 162 item->setToolTip(name);
benoitrigolleau@56 163 item->setIcon(QString(":/icons/%1.png").arg(iconName));
benoitrigolleau@56 164 item->setName(name);
benoitrigolleau@56 165 item->setPropertyBox(box);
benoitrigolleau@56 166 addItem(item);
benoitrigolleau@56 167
benoitrigolleau@56 168 //#endif
lbajardsilogic@0 169
lbajardsilogic@0 170 m_boxes.push_back(box);
lbajardsilogic@0 171 }
lbajardsilogic@0 172
lbajardsilogic@0 173 blockSignals(false);
lbajardsilogic@0 174 }
lbajardsilogic@0 175
lbajardsilogic@0 176 bool
lbajardsilogic@0 177 PropertyStack::containsContainer(PropertyContainer *pc) const
lbajardsilogic@0 178 {
lbajardsilogic@0 179 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 180 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 181 if (pc == container) return true;
lbajardsilogic@0 182 }
lbajardsilogic@0 183
lbajardsilogic@0 184 return false;
lbajardsilogic@0 185 }
lbajardsilogic@0 186
lbajardsilogic@0 187 int
lbajardsilogic@0 188 PropertyStack::getContainerIndex(PropertyContainer *pc) const
lbajardsilogic@0 189 {
lbajardsilogic@0 190 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 191 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 192 if (pc == container) return i;
lbajardsilogic@0 193 }
lbajardsilogic@0 194
lbajardsilogic@0 195 return false;
lbajardsilogic@0 196 }
lbajardsilogic@0 197
benoitrigolleau@56 198
benoitrigolleau@56 199 /*** SLOTs ************/
lbajardsilogic@0 200 void
lbajardsilogic@0 201 PropertyStack::propertyContainerAdded(PropertyContainer *)
lbajardsilogic@0 202 {
lbajardsilogic@0 203 if (sender() != m_client) return;
lbajardsilogic@0 204 repopulate();
lbajardsilogic@0 205 }
lbajardsilogic@0 206
lbajardsilogic@0 207 void
lbajardsilogic@0 208 PropertyStack::propertyContainerRemoved(PropertyContainer *)
lbajardsilogic@0 209 {
lbajardsilogic@0 210 if (sender() != m_client) return;
lbajardsilogic@0 211 repopulate();
lbajardsilogic@0 212 }
lbajardsilogic@0 213
lbajardsilogic@0 214 void
lbajardsilogic@0 215 PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc)
lbajardsilogic@0 216 {
lbajardsilogic@0 217 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 218 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 219 m_boxes[i]->propertyContainerPropertyChanged(pc);
lbajardsilogic@0 220 }
lbajardsilogic@0 221 }
lbajardsilogic@0 222 }
lbajardsilogic@0 223
lbajardsilogic@0 224 void
lbajardsilogic@0 225 PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc)
lbajardsilogic@0 226 {
lbajardsilogic@0 227 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 228 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 229 m_boxes[i]->propertyContainerPropertyRangeChanged(pc);
lbajardsilogic@0 230 }
lbajardsilogic@0 231 }
lbajardsilogic@0 232 }
lbajardsilogic@0 233
lbajardsilogic@0 234 void
lbajardsilogic@0 235 PropertyStack::propertyContainerNameChanged(PropertyContainer *)
lbajardsilogic@0 236 {
lbajardsilogic@0 237 if (sender() != m_client) return;
lbajardsilogic@0 238 repopulate();
lbajardsilogic@0 239 }
lbajardsilogic@0 240
lbajardsilogic@0 241 void
lbajardsilogic@0 242 PropertyStack::showLayer(bool show)
lbajardsilogic@0 243 {
lbajardsilogic@0 244 QObject *obj = sender();
lbajardsilogic@0 245
lbajardsilogic@0 246 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 247 if (obj == m_boxes[i]) {
lbajardsilogic@0 248 Layer *layer = dynamic_cast<Layer *>(m_boxes[i]->getContainer());
lbajardsilogic@0 249 if (layer) {
lbajardsilogic@0 250 layer->showLayer(m_client, show);
lbajardsilogic@0 251 return;
lbajardsilogic@0 252 }
lbajardsilogic@0 253 }
lbajardsilogic@0 254 }
lbajardsilogic@0 255 }
lbajardsilogic@0 256
lbajardsilogic@0 257 void
lbajardsilogic@0 258 PropertyStack::selectedContainerChanged(int n)
lbajardsilogic@0 259 {
lbajardsilogic@0 260 if (n >= int(m_boxes.size())) return;
lbajardsilogic@0 261 emit propertyContainerSelected(m_client, m_boxes[n]->getContainer());
lbajardsilogic@0 262 }
lbajardsilogic@0 263
lbajardsilogic@0 264 void
lbajardsilogic@0 265 PropertyStack::mouseEnteredTabBar()
lbajardsilogic@0 266 {
lbajardsilogic@0 267 emit contextHelpChanged(tr("Click to change the current active layer"));
lbajardsilogic@0 268 }
lbajardsilogic@0 269
lbajardsilogic@0 270 void
lbajardsilogic@0 271 PropertyStack::mouseLeftTabBar()
lbajardsilogic@0 272 {
lbajardsilogic@0 273 emit contextHelpChanged("");
lbajardsilogic@0 274 }
lbajardsilogic@0 275
lbajardsilogic@0 276 void
lbajardsilogic@0 277 PropertyStack::activeTabClicked()
lbajardsilogic@0 278 {
lbajardsilogic@0 279 emit viewSelected(m_client);
lbajardsilogic@0 280 }
lbajardsilogic@0 281
benoitrigolleau@56 282 void PropertyStack::removeSelectedItemRequested(){
benoitrigolleau@65 283 emit removeSelectedItem();
benoitrigolleau@56 284 }