lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "PropertyStack.h" lbajardsilogic@0: #include "PropertyBox.h" lbajardsilogic@0: #include "base/PropertyContainer.h" lbajardsilogic@0: #include "view/View.h" lbajardsilogic@0: #include "layer/Layer.h" lbajardsilogic@0: #include "layer/LayerFactory.h" lbajardsilogic@0: #include "widgets/NotifyingTabBar.h" benoitrigolleau@56: #include "ItemLayerList.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: //#define DEBUG_PROPERTY_STACK 1 lbajardsilogic@0: lbajardsilogic@0: PropertyStack::PropertyStack(QWidget *parent, View *client) : benoitrigolleau@56: LayerViewerWidget(parent), lbajardsilogic@0: m_client(client) lbajardsilogic@0: { lbajardsilogic@0: NotifyingTabBar *bar = new NotifyingTabBar(); lbajardsilogic@0: bar->setDrawBase(false); lbajardsilogic@0: lbajardsilogic@0: connect(bar, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredTabBar())); lbajardsilogic@0: connect(bar, SIGNAL(mouseLeft()), this, SLOT(mouseLeftTabBar())); lbajardsilogic@0: connect(bar, SIGNAL(activeTabClicked()), this, SLOT(activeTabClicked())); lbajardsilogic@0: benoitrigolleau@56: //setTabBar(bar); lbajardsilogic@0: benoitrigolleau@56: /*#if (QT_VERSION >= 0x0402) lbajardsilogic@0: setElideMode(Qt::ElideNone); lbajardsilogic@0: tabBar()->setUsesScrollButtons(true); lbajardsilogic@0: tabBar()->setIconSize(QSize(16, 16)); benoitrigolleau@56: #endif*/ lbajardsilogic@0: lbajardsilogic@0: repopulate(); lbajardsilogic@0: lbajardsilogic@0: connect(this, SIGNAL(currentChanged(int)), lbajardsilogic@0: this, SLOT(selectedContainerChanged(int))); lbajardsilogic@0: lbajardsilogic@0: connect(m_client, SIGNAL(propertyContainerAdded(PropertyContainer *)), lbajardsilogic@0: this, SLOT(propertyContainerAdded(PropertyContainer *))); lbajardsilogic@0: lbajardsilogic@0: connect(m_client, SIGNAL(propertyContainerRemoved(PropertyContainer *)), lbajardsilogic@0: this, SLOT(propertyContainerRemoved(PropertyContainer *))); lbajardsilogic@0: lbajardsilogic@0: connect(m_client, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), lbajardsilogic@0: this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); lbajardsilogic@0: lbajardsilogic@0: connect(m_client, SIGNAL(propertyContainerPropertyRangeChanged(PropertyContainer *)), lbajardsilogic@0: this, SLOT(propertyContainerPropertyRangeChanged(PropertyContainer *))); lbajardsilogic@0: lbajardsilogic@0: connect(m_client, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), lbajardsilogic@0: this, SLOT(propertyContainerNameChanged(PropertyContainer *))); lbajardsilogic@0: lbajardsilogic@0: connect(this, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)), lbajardsilogic@0: m_client, SLOT(propertyContainerSelected(View *, PropertyContainer *))); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@51: PropertyStack::~PropertyStack() lbajardsilogic@51: { lbajardsilogic@51: blockSignals(true); lbajardsilogic@51: benoitrigolleau@56: /*while (count() > 0) lbajardsilogic@51: { lbajardsilogic@51: removeTab(0); benoitrigolleau@56: }*/ benoitrigolleau@56: removeAllItems(); lbajardsilogic@51: lbajardsilogic@51: for (size_t i = 0; i < m_boxes.size(); ++i) lbajardsilogic@51: { lbajardsilogic@51: delete m_boxes[i]; lbajardsilogic@51: } lbajardsilogic@51: m_boxes.clear(); lbajardsilogic@51: m_client = 0; lbajardsilogic@51: } lbajardsilogic@51: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::repopulate() lbajardsilogic@0: { lbajardsilogic@0: blockSignals(true); lbajardsilogic@0: lbajardsilogic@0: #ifdef DEBUG_PROPERTY_STACK lbajardsilogic@0: std::cerr << "PropertyStack::repopulate" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: benoitrigolleau@56: /*while (count() > 0) { lbajardsilogic@0: removeTab(0); benoitrigolleau@56: }*/ benoitrigolleau@56: removeAllItems(); benoitrigolleau@56: lbajardsilogic@0: for (size_t i = 0; i < m_boxes.size(); ++i) { benoitrigolleau@56: delete m_boxes[i]; lbajardsilogic@0: } lbajardsilogic@0: m_boxes.clear(); lbajardsilogic@0: lbajardsilogic@0: for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { lbajardsilogic@0: lbajardsilogic@0: PropertyContainer *container = m_client->getPropertyContainer(i); lbajardsilogic@0: QString name = container->getPropertyContainerName(); lbajardsilogic@0: lbajardsilogic@0: PropertyBox *box = new PropertyBox(container); lbajardsilogic@0: connect(box, SIGNAL(showLayer(bool)), this, SLOT(showLayer(bool))); lbajardsilogic@206: lbajardsilogic@206: connect(box, SIGNAL(contextHelpChanged(const QString &)), lbajardsilogic@0: this, SIGNAL(contextHelpChanged(const QString &))); lbajardsilogic@0: lbajardsilogic@0: Layer *layer = dynamic_cast(container); lbajardsilogic@0: if (layer) { lbajardsilogic@0: box->layerVisibilityChanged(!layer->isLayerDormant(m_client)); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString shortName = name; lbajardsilogic@0: lbajardsilogic@0: if (layer) { lbajardsilogic@0: shortName = LayerFactory::getInstance()->getLayerPresentationName lbajardsilogic@0: (LayerFactory::getInstance()->getLayerType(layer)); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: shortName = QString("&%1 %2").arg(i + 1).arg(shortName); lbajardsilogic@0: benoitrigolleau@56: /*#ifdef Q_WS_MAC lbajardsilogic@0: lbajardsilogic@0: // Qt 4.2 on OS/X doesn't show the icons in the tab bar, and lbajardsilogic@0: // I'm not sure why -- use labels instead lbajardsilogic@0: lbajardsilogic@0: addTab(box, shortName); lbajardsilogic@0: benoitrigolleau@56: #else*/ lbajardsilogic@0: lbajardsilogic@0: // Icons on other platforms lbajardsilogic@0: lbajardsilogic@0: QString iconName = container->getPropertyContainerIconName(); lbajardsilogic@0: lbajardsilogic@0: QIcon icon(QString(":/icons/%1.png").arg(iconName)); benoitrigolleau@56: benoitrigolleau@56: ItemLayerList *item = new ItemLayerList(); lbajardsilogic@0: benoitrigolleau@56: //if (icon.isNull()) { benoitrigolleau@56: //addTab(box, shortName); benoitrigolleau@56: //} else { benoitrigolleau@56: benoitrigolleau@56: //item->setColor(QColor ( 100, 60, 20)); benoitrigolleau@56: //addTab(box, icon, QString("&%1").arg(i + 1)); benoitrigolleau@56: //setTabToolTip(i, name); benoitrigolleau@56: //} benoitrigolleau@56: benoitrigolleau@56: item->setToolTip(name); lbajardsilogic@191: QString iconDir = ":/icons/" + iconName + ".png"; lbajardsilogic@191: item->setIcon(iconDir); benoitrigolleau@56: item->setName(name); benoitrigolleau@56: item->setPropertyBox(box); benoitrigolleau@56: addItem(item); benoitrigolleau@56: benoitrigolleau@56: //#endif lbajardsilogic@0: lbajardsilogic@0: m_boxes.push_back(box); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: blockSignals(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool lbajardsilogic@0: PropertyStack::containsContainer(PropertyContainer *pc) const lbajardsilogic@0: { lbajardsilogic@0: for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { lbajardsilogic@0: PropertyContainer *container = m_client->getPropertyContainer(i); lbajardsilogic@0: if (pc == container) return true; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return false; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: PropertyStack::getContainerIndex(PropertyContainer *pc) const lbajardsilogic@0: { lbajardsilogic@0: for (size_t i = 0; i < m_client->getPropertyContainerCount(); ++i) { lbajardsilogic@0: PropertyContainer *container = m_client->getPropertyContainer(i); lbajardsilogic@0: if (pc == container) return i; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return false; lbajardsilogic@0: } lbajardsilogic@0: benoitrigolleau@56: benoitrigolleau@56: /*** SLOTs ************/ lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::propertyContainerAdded(PropertyContainer *) lbajardsilogic@0: { lbajardsilogic@0: if (sender() != m_client) return; lbajardsilogic@0: repopulate(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::propertyContainerRemoved(PropertyContainer *) lbajardsilogic@0: { lbajardsilogic@0: if (sender() != m_client) return; lbajardsilogic@0: repopulate(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::propertyContainerPropertyChanged(PropertyContainer *pc) lbajardsilogic@0: { lbajardsilogic@0: for (unsigned int i = 0; i < m_boxes.size(); ++i) { lbajardsilogic@0: if (pc == m_boxes[i]->getContainer()) { lbajardsilogic@0: m_boxes[i]->propertyContainerPropertyChanged(pc); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::propertyContainerPropertyRangeChanged(PropertyContainer *pc) lbajardsilogic@0: { lbajardsilogic@0: for (unsigned int i = 0; i < m_boxes.size(); ++i) { lbajardsilogic@0: if (pc == m_boxes[i]->getContainer()) { lbajardsilogic@0: m_boxes[i]->propertyContainerPropertyRangeChanged(pc); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::propertyContainerNameChanged(PropertyContainer *) lbajardsilogic@0: { lbajardsilogic@0: if (sender() != m_client) return; lbajardsilogic@0: repopulate(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::showLayer(bool show) lbajardsilogic@0: { lbajardsilogic@0: QObject *obj = sender(); lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_boxes.size(); ++i) { lbajardsilogic@0: if (obj == m_boxes[i]) { lbajardsilogic@0: Layer *layer = dynamic_cast(m_boxes[i]->getContainer()); lbajardsilogic@0: if (layer) { lbajardsilogic@0: layer->showLayer(m_client, show); lbajardsilogic@0: return; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::selectedContainerChanged(int n) lbajardsilogic@0: { lbajardsilogic@0: if (n >= int(m_boxes.size())) return; lbajardsilogic@0: emit propertyContainerSelected(m_client, m_boxes[n]->getContainer()); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::mouseEnteredTabBar() lbajardsilogic@0: { lbajardsilogic@0: emit contextHelpChanged(tr("Click to change the current active layer")); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::mouseLeftTabBar() lbajardsilogic@0: { lbajardsilogic@0: emit contextHelpChanged(""); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: PropertyStack::activeTabClicked() lbajardsilogic@0: { lbajardsilogic@0: emit viewSelected(m_client); lbajardsilogic@0: } lbajardsilogic@0: benoitrigolleau@56: void PropertyStack::removeSelectedItemRequested(){ benoitrigolleau@65: emit removeSelectedItem(); benoitrigolleau@56: }