annotate widgets/PropertyStack.cpp @ 46:b8d1d1f5d2c9

parameter set in the constructor
author lbajardsilogic
date Tue, 15 May 2007 15:04:32 +0000
parents fc9323a41f5a
children 8e5f9a9aa43f
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"
lbajardsilogic@0 23
lbajardsilogic@0 24 #include <QIcon>
lbajardsilogic@0 25 #include <QTabWidget>
lbajardsilogic@0 26
lbajardsilogic@0 27 #include <iostream>
lbajardsilogic@0 28
lbajardsilogic@0 29 //#define DEBUG_PROPERTY_STACK 1
lbajardsilogic@0 30
lbajardsilogic@0 31 PropertyStack::PropertyStack(QWidget *parent, View *client) :
lbajardsilogic@0 32 QTabWidget(parent),
lbajardsilogic@0 33 m_client(client)
lbajardsilogic@0 34 {
lbajardsilogic@0 35 NotifyingTabBar *bar = new NotifyingTabBar();
lbajardsilogic@0 36 bar->setDrawBase(false);
lbajardsilogic@0 37
lbajardsilogic@0 38 connect(bar, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredTabBar()));
lbajardsilogic@0 39 connect(bar, SIGNAL(mouseLeft()), this, SLOT(mouseLeftTabBar()));
lbajardsilogic@0 40 connect(bar, SIGNAL(activeTabClicked()), this, SLOT(activeTabClicked()));
lbajardsilogic@0 41
lbajardsilogic@0 42 setTabBar(bar);
lbajardsilogic@0 43
lbajardsilogic@0 44 #if (QT_VERSION >= 0x0402)
lbajardsilogic@0 45 setElideMode(Qt::ElideNone);
lbajardsilogic@0 46 tabBar()->setUsesScrollButtons(true);
lbajardsilogic@0 47 tabBar()->setIconSize(QSize(16, 16));
lbajardsilogic@0 48 #endif
lbajardsilogic@0 49
lbajardsilogic@0 50 repopulate();
lbajardsilogic@0 51
lbajardsilogic@0 52 connect(this, SIGNAL(currentChanged(int)),
lbajardsilogic@0 53 this, SLOT(selectedContainerChanged(int)));
lbajardsilogic@0 54
lbajardsilogic@0 55 connect(m_client, SIGNAL(propertyContainerAdded(PropertyContainer *)),
lbajardsilogic@0 56 this, SLOT(propertyContainerAdded(PropertyContainer *)));
lbajardsilogic@0 57
lbajardsilogic@0 58 connect(m_client, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
lbajardsilogic@0 59 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
lbajardsilogic@0 60
lbajardsilogic@0 61 connect(m_client, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)),
lbajardsilogic@0 62 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
lbajardsilogic@0 63
lbajardsilogic@0 64 connect(m_client, SIGNAL(propertyContainerPropertyRangeChanged(PropertyContainer *)),
lbajardsilogic@0 65 this, SLOT(propertyContainerPropertyRangeChanged(PropertyContainer *)));
lbajardsilogic@0 66
lbajardsilogic@0 67 connect(m_client, SIGNAL(propertyContainerNameChanged(PropertyContainer *)),
lbajardsilogic@0 68 this, SLOT(propertyContainerNameChanged(PropertyContainer *)));
lbajardsilogic@0 69
lbajardsilogic@0 70 connect(this, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)),
lbajardsilogic@0 71 m_client, SLOT(propertyContainerSelected(View *, PropertyContainer *)));
lbajardsilogic@0 72 }
lbajardsilogic@0 73
lbajardsilogic@0 74 void
lbajardsilogic@0 75 PropertyStack::repopulate()
lbajardsilogic@0 76 {
lbajardsilogic@0 77 blockSignals(true);
lbajardsilogic@0 78
lbajardsilogic@0 79 #ifdef DEBUG_PROPERTY_STACK
lbajardsilogic@0 80 std::cerr << "PropertyStack::repopulate" << std::endl;
lbajardsilogic@0 81 #endif
lbajardsilogic@0 82
lbajardsilogic@0 83 while (count() > 0) {
lbajardsilogic@0 84 removeTab(0);
lbajardsilogic@0 85 }
lbajardsilogic@0 86 for (size_t i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 87 delete m_boxes[i];
lbajardsilogic@0 88 }
lbajardsilogic@0 89 m_boxes.clear();
lbajardsilogic@0 90
lbajardsilogic@0 91 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 92
lbajardsilogic@0 93 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 94 QString name = container->getPropertyContainerName();
lbajardsilogic@0 95
lbajardsilogic@0 96 PropertyBox *box = new PropertyBox(container);
lbajardsilogic@0 97
lbajardsilogic@0 98 connect(box, SIGNAL(showLayer(bool)), this, SLOT(showLayer(bool)));
lbajardsilogic@0 99 connect(box, SIGNAL(contextHelpChanged(const QString &)),
lbajardsilogic@0 100 this, SIGNAL(contextHelpChanged(const QString &)));
lbajardsilogic@0 101
lbajardsilogic@0 102 Layer *layer = dynamic_cast<Layer *>(container);
lbajardsilogic@0 103 if (layer) {
lbajardsilogic@0 104 box->layerVisibilityChanged(!layer->isLayerDormant(m_client));
lbajardsilogic@0 105 }
lbajardsilogic@0 106
lbajardsilogic@0 107 QString shortName = name;
lbajardsilogic@0 108
lbajardsilogic@0 109 if (layer) {
lbajardsilogic@0 110 shortName = LayerFactory::getInstance()->getLayerPresentationName
lbajardsilogic@0 111 (LayerFactory::getInstance()->getLayerType(layer));
lbajardsilogic@0 112 }
lbajardsilogic@0 113
lbajardsilogic@0 114 shortName = QString("&%1 %2").arg(i + 1).arg(shortName);
lbajardsilogic@0 115
lbajardsilogic@0 116 #ifdef Q_WS_MAC
lbajardsilogic@0 117
lbajardsilogic@0 118 // Qt 4.2 on OS/X doesn't show the icons in the tab bar, and
lbajardsilogic@0 119 // I'm not sure why -- use labels instead
lbajardsilogic@0 120
lbajardsilogic@0 121 addTab(box, shortName);
lbajardsilogic@0 122
lbajardsilogic@0 123 #else
lbajardsilogic@0 124
lbajardsilogic@0 125 // Icons on other platforms
lbajardsilogic@0 126
lbajardsilogic@0 127 QString iconName = container->getPropertyContainerIconName();
lbajardsilogic@0 128
lbajardsilogic@0 129 QIcon icon(QString(":/icons/%1.png").arg(iconName));
lbajardsilogic@0 130 if (icon.isNull()) {
lbajardsilogic@0 131 addTab(box, shortName);
lbajardsilogic@0 132 } else {
lbajardsilogic@0 133 addTab(box, icon, QString("&%1").arg(i + 1));
lbajardsilogic@0 134 setTabToolTip(i, name);
lbajardsilogic@0 135 }
lbajardsilogic@0 136
lbajardsilogic@0 137 #endif
lbajardsilogic@0 138
lbajardsilogic@0 139 m_boxes.push_back(box);
lbajardsilogic@0 140 }
lbajardsilogic@0 141
lbajardsilogic@0 142 blockSignals(false);
lbajardsilogic@0 143 }
lbajardsilogic@0 144
lbajardsilogic@0 145 bool
lbajardsilogic@0 146 PropertyStack::containsContainer(PropertyContainer *pc) const
lbajardsilogic@0 147 {
lbajardsilogic@0 148 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 149 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 150 if (pc == container) return true;
lbajardsilogic@0 151 }
lbajardsilogic@0 152
lbajardsilogic@0 153 return false;
lbajardsilogic@0 154 }
lbajardsilogic@0 155
lbajardsilogic@0 156 int
lbajardsilogic@0 157 PropertyStack::getContainerIndex(PropertyContainer *pc) const
lbajardsilogic@0 158 {
lbajardsilogic@0 159 for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) {
lbajardsilogic@0 160 PropertyContainer *container = m_client->getPropertyContainer(i);
lbajardsilogic@0 161 if (pc == container) return i;
lbajardsilogic@0 162 }
lbajardsilogic@0 163
lbajardsilogic@0 164 return false;
lbajardsilogic@0 165 }
lbajardsilogic@0 166
lbajardsilogic@0 167 void
lbajardsilogic@0 168 PropertyStack::propertyContainerAdded(PropertyContainer *)
lbajardsilogic@0 169 {
lbajardsilogic@0 170 if (sender() != m_client) return;
lbajardsilogic@0 171 repopulate();
lbajardsilogic@0 172 }
lbajardsilogic@0 173
lbajardsilogic@0 174 void
lbajardsilogic@0 175 PropertyStack::propertyContainerRemoved(PropertyContainer *)
lbajardsilogic@0 176 {
lbajardsilogic@0 177 if (sender() != m_client) return;
lbajardsilogic@0 178 repopulate();
lbajardsilogic@0 179 }
lbajardsilogic@0 180
lbajardsilogic@0 181 void
lbajardsilogic@0 182 PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc)
lbajardsilogic@0 183 {
lbajardsilogic@0 184 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 185 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 186 m_boxes[i]->propertyContainerPropertyChanged(pc);
lbajardsilogic@0 187 }
lbajardsilogic@0 188 }
lbajardsilogic@0 189 }
lbajardsilogic@0 190
lbajardsilogic@0 191 void
lbajardsilogic@0 192 PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc)
lbajardsilogic@0 193 {
lbajardsilogic@0 194 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 195 if (pc == m_boxes[i]->getContainer()) {
lbajardsilogic@0 196 m_boxes[i]->propertyContainerPropertyRangeChanged(pc);
lbajardsilogic@0 197 }
lbajardsilogic@0 198 }
lbajardsilogic@0 199 }
lbajardsilogic@0 200
lbajardsilogic@0 201 void
lbajardsilogic@0 202 PropertyStack::propertyContainerNameChanged(PropertyContainer *)
lbajardsilogic@0 203 {
lbajardsilogic@0 204 if (sender() != m_client) return;
lbajardsilogic@0 205 repopulate();
lbajardsilogic@0 206 }
lbajardsilogic@0 207
lbajardsilogic@0 208 void
lbajardsilogic@0 209 PropertyStack::showLayer(bool show)
lbajardsilogic@0 210 {
lbajardsilogic@0 211 QObject *obj = sender();
lbajardsilogic@0 212
lbajardsilogic@0 213 for (unsigned int i = 0; i < m_boxes.size(); ++i) {
lbajardsilogic@0 214 if (obj == m_boxes[i]) {
lbajardsilogic@0 215 Layer *layer = dynamic_cast<Layer *>(m_boxes[i]->getContainer());
lbajardsilogic@0 216 if (layer) {
lbajardsilogic@0 217 layer->showLayer(m_client, show);
lbajardsilogic@0 218 return;
lbajardsilogic@0 219 }
lbajardsilogic@0 220 }
lbajardsilogic@0 221 }
lbajardsilogic@0 222 }
lbajardsilogic@0 223
lbajardsilogic@0 224 void
lbajardsilogic@0 225 PropertyStack::selectedContainerChanged(int n)
lbajardsilogic@0 226 {
lbajardsilogic@0 227 if (n >= int(m_boxes.size())) return;
lbajardsilogic@0 228 emit propertyContainerSelected(m_client, m_boxes[n]->getContainer());
lbajardsilogic@0 229 }
lbajardsilogic@0 230
lbajardsilogic@0 231 void
lbajardsilogic@0 232 PropertyStack::mouseEnteredTabBar()
lbajardsilogic@0 233 {
lbajardsilogic@0 234 emit contextHelpChanged(tr("Click to change the current active layer"));
lbajardsilogic@0 235 }
lbajardsilogic@0 236
lbajardsilogic@0 237 void
lbajardsilogic@0 238 PropertyStack::mouseLeftTabBar()
lbajardsilogic@0 239 {
lbajardsilogic@0 240 emit contextHelpChanged("");
lbajardsilogic@0 241 }
lbajardsilogic@0 242
lbajardsilogic@0 243 void
lbajardsilogic@0 244 PropertyStack::activeTabClicked()
lbajardsilogic@0 245 {
lbajardsilogic@0 246 emit viewSelected(m_client);
lbajardsilogic@0 247 }
lbajardsilogic@0 248