annotate widgets/PropertyStack.cpp @ 284:1284955856ab

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