annotate widgets/PropertyStack.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fa034c6ae8bf
children
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@206 119
lbajardsilogic@206 120 connect(box, SIGNAL(contextHelpChanged(const QString &)),
lbajardsilogic@0 121 this, SIGNAL(contextHelpChanged(const QString &)));
lbajardsilogic@0 122
lbajardsilogic@0 123 Layer *layer = dynamic_cast<Layer *>(container);
lbajardsilogic@0 124 if (layer) {
lbajardsilogic@0 125 box->layerVisibilityChanged(!layer->isLayerDormant(m_client));
lbajardsilogic@0 126 }
lbajardsilogic@0 127
lbajardsilogic@0 128 QString shortName = name;
lbajardsilogic@0 129
lbajardsilogic@0 130 if (layer) {
lbajardsilogic@0 131 shortName = LayerFactory::getInstance()->getLayerPresentationName
lbajardsilogic@0 132 (LayerFactory::getInstance()->getLayerType(layer));
lbajardsilogic@0 133 }
lbajardsilogic@0 134
lbajardsilogic@0 135 shortName = QString("&%1 %2").arg(i + 1).arg(shortName);
lbajardsilogic@0 136
benoitrigolleau@56 137 /*#ifdef Q_WS_MAC
lbajardsilogic@0 138
lbajardsilogic@0 139 // Qt 4.2 on OS/X doesn't show the icons in the tab bar, and
lbajardsilogic@0 140 // I'm not sure why -- use labels instead
lbajardsilogic@0 141
lbajardsilogic@0 142 addTab(box, shortName);
lbajardsilogic@0 143
benoitrigolleau@56 144 #else*/
lbajardsilogic@0 145
lbajardsilogic@0 146 // Icons on other platforms
lbajardsilogic@0 147
lbajardsilogic@0 148 QString iconName = container->getPropertyContainerIconName();
lbajardsilogic@0 149
lbajardsilogic@0 150 QIcon icon(QString(":/icons/%1.png").arg(iconName));
benoitrigolleau@56 151
benoitrigolleau@56 152 ItemLayerList *item = new ItemLayerList();
lbajardsilogic@0 153
benoitrigolleau@56 154 //if (icon.isNull()) {
benoitrigolleau@56 155 //addTab(box, shortName);
benoitrigolleau@56 156 //} else {
benoitrigolleau@56 157
benoitrigolleau@56 158 //item->setColor(QColor ( 100, 60, 20));
benoitrigolleau@56 159 //addTab(box, icon, QString("&%1").arg(i + 1));
benoitrigolleau@56 160 //setTabToolTip(i, name);
benoitrigolleau@56 161 //}
benoitrigolleau@56 162
benoitrigolleau@56 163 item->setToolTip(name);
lbajardsilogic@191 164 QString iconDir = ":/icons/" + iconName + ".png";
lbajardsilogic@191 165 item->setIcon(iconDir);
benoitrigolleau@56 166 item->setName(name);
benoitrigolleau@56 167 item->setPropertyBox(box);
benoitrigolleau@56 168 addItem(item);
benoitrigolleau@56 169
benoitrigolleau@56 170 //#endif
lbajardsilogic@0 171
lbajardsilogic@0 172 m_boxes.push_back(box);
lbajardsilogic@0 173 }
lbajardsilogic@0 174
lbajardsilogic@0 175 blockSignals(false);
lbajardsilogic@0 176 }
lbajardsilogic@0 177
lbajardsilogic@0 178 bool
lbajardsilogic@0 179 PropertyStack::containsContainer(PropertyContainer *pc) const
lbajardsilogic@0 180 {
lbajardsilogic@0 181 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 182 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 183 if (pc == container) return true;
lbajardsilogic@0 184 }
lbajardsilogic@0 185
lbajardsilogic@0 186 return false;
lbajardsilogic@0 187 }
lbajardsilogic@0 188
lbajardsilogic@0 189 int
lbajardsilogic@0 190 PropertyStack::getContainerIndex(PropertyContainer *pc) const
lbajardsilogic@0 191 {
lbajardsilogic@0 192 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 193 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 194 if (pc == container) return i;
lbajardsilogic@0 195 }
lbajardsilogic@0 196
lbajardsilogic@0 197 return false;
lbajardsilogic@0 198 }
lbajardsilogic@0 199
benoitrigolleau@56 200
benoitrigolleau@56 201 /*** SLOTs ************/
lbajardsilogic@0 202 void
lbajardsilogic@0 203 PropertyStack::propertyContainerAdded(PropertyContainer *)
lbajardsilogic@0 204 {
lbajardsilogic@0 205 if (sender() != m_client) return;
lbajardsilogic@0 206 repopulate();
lbajardsilogic@0 207 }
lbajardsilogic@0 208
lbajardsilogic@0 209 void
lbajardsilogic@0 210 PropertyStack::propertyContainerRemoved(PropertyContainer *)
lbajardsilogic@0 211 {
lbajardsilogic@0 212 if (sender() != m_client) return;
lbajardsilogic@0 213 repopulate();
lbajardsilogic@0 214 }
lbajardsilogic@0 215
lbajardsilogic@0 216 void
lbajardsilogic@0 217 PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc)
lbajardsilogic@0 218 {
lbajardsilogic@0 219 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 220 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 221 m_boxes[i]->propertyContainerPropertyChanged(pc);
lbajardsilogic@0 222 }
lbajardsilogic@0 223 }
lbajardsilogic@0 224 }
lbajardsilogic@0 225
lbajardsilogic@0 226 void
lbajardsilogic@0 227 PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc)
lbajardsilogic@0 228 {
lbajardsilogic@0 229 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 230 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 231 m_boxes[i]->propertyContainerPropertyRangeChanged(pc);
lbajardsilogic@0 232 }
lbajardsilogic@0 233 }
lbajardsilogic@0 234 }
lbajardsilogic@0 235
lbajardsilogic@0 236 void
lbajardsilogic@0 237 PropertyStack::propertyContainerNameChanged(PropertyContainer *)
lbajardsilogic@0 238 {
lbajardsilogic@0 239 if (sender() != m_client) return;
lbajardsilogic@0 240 repopulate();
lbajardsilogic@0 241 }
lbajardsilogic@0 242
lbajardsilogic@0 243 void
lbajardsilogic@0 244 PropertyStack::showLayer(bool show)
lbajardsilogic@0 245 {
lbajardsilogic@0 246 QObject *obj = sender();
lbajardsilogic@0 247
lbajardsilogic@0 248 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 249 if (obj == m_boxes[i]) {
lbajardsilogic@0 250 Layer *layer = dynamic_cast<Layer *>(m_boxes[i]->getContainer());
lbajardsilogic@0 251 if (layer) {
lbajardsilogic@0 252 layer->showLayer(m_client, show);
lbajardsilogic@0 253 return;
lbajardsilogic@0 254 }
lbajardsilogic@0 255 }
lbajardsilogic@0 256 }
lbajardsilogic@0 257 }
lbajardsilogic@0 258
lbajardsilogic@0 259 void
lbajardsilogic@0 260 PropertyStack::selectedContainerChanged(int n)
lbajardsilogic@0 261 {
lbajardsilogic@0 262 if (n >= int(m_boxes.size())) return;
lbajardsilogic@0 263 emit propertyContainerSelected(m_client, m_boxes[n]->getContainer());
lbajardsilogic@0 264 }
lbajardsilogic@0 265
lbajardsilogic@0 266 void
lbajardsilogic@0 267 PropertyStack::mouseEnteredTabBar()
lbajardsilogic@0 268 {
lbajardsilogic@0 269 emit contextHelpChanged(tr("Click to change the current active layer"));
lbajardsilogic@0 270 }
lbajardsilogic@0 271
lbajardsilogic@0 272 void
lbajardsilogic@0 273 PropertyStack::mouseLeftTabBar()
lbajardsilogic@0 274 {
lbajardsilogic@0 275 emit contextHelpChanged("");
lbajardsilogic@0 276 }
lbajardsilogic@0 277
lbajardsilogic@0 278 void
lbajardsilogic@0 279 PropertyStack::activeTabClicked()
lbajardsilogic@0 280 {
lbajardsilogic@0 281 emit viewSelected(m_client);
lbajardsilogic@0 282 }
lbajardsilogic@0 283
benoitrigolleau@56 284 void PropertyStack::removeSelectedItemRequested(){
benoitrigolleau@65 285 emit removeSelectedItem();
benoitrigolleau@56 286 }