# HG changeset patch # User Chris Cannam # Date 1169830797 0 # Node ID 2678a1f132d2c82939f9ac9153646ab4f328952b # Parent 5828afd1d229de9a4f661f97a63e7e2f36314a45 * Add slice layers (so you can display a slice of a colour 3d plot as if it were a spectrum) * Make spectrum layer a subclass of slice layer diff -r 5828afd1d229 -r 2678a1f132d2 document/Document.cpp --- a/document/Document.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/document/Document.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -488,7 +488,8 @@ model != m_mainModel && m_models.find(model) == m_models.end()) { std::cerr << "ERROR: Document::setModel: Layer " << layer - << " is using unregistered model " << model + << " (\"" << layer->objectName().toStdString() + << "\") wants to use unregistered model " << model << ": register the layer's model before setting it!" << std::endl; return; diff -r 5828afd1d229 -r 2678a1f132d2 main/MainWindow.cpp --- a/main/MainWindow.cpp Thu Jan 25 17:41:00 2007 +0000 +++ b/main/MainWindow.cpp Fri Jan 26 16:59:57 2007 +0000 @@ -30,6 +30,8 @@ #include "layer/TimeInstantLayer.h" #include "layer/TimeValueLayer.h" #include "layer/Colour3DPlotLayer.h" +#include "layer/SliceLayer.h" +#include "layer/SliceableLayer.h" #include "widgets/Fader.h" #include "view/Overview.h" #include "widgets/PropertyBox.h" @@ -116,6 +118,7 @@ m_layerMenu(0), m_transformsMenu(0), m_existingLayersMenu(0), + m_sliceMenu(0), m_recentFilesMenu(0), m_recentTransformsMenu(0), m_rightButtonMenu(0), @@ -1048,7 +1051,11 @@ m_existingLayersMenu = menu->addMenu(tr("Add &Existing Layer")); m_rightButtonLayerMenu->addMenu(m_existingLayersMenu); - setupExistingLayersMenu(); + + m_sliceMenu = menu->addMenu(tr("Add S&lice of Layer")); + m_rightButtonLayerMenu->addMenu(m_sliceMenu); + + setupExistingLayersMenus(); m_rightButtonLayerMenu->addSeparator(); menu->addSeparator(); @@ -1327,7 +1334,7 @@ } void -MainWindow::setupExistingLayersMenu() +MainWindow::setupExistingLayersMenus() { if (!m_existingLayersMenu) return; // should have been created by setupMenus @@ -1336,8 +1343,14 @@ m_existingLayersMenu->clear(); m_existingLayerActions.clear(); + m_sliceMenu->clear(); + m_sliceActions.clear(); + vector orderedLayers; set observedLayers; + set sliceableLayers; + + LayerFactory *factory = LayerFactory::getInstance(); for (int i = 0; i < m_paneStack->getPaneCount(); ++i) { @@ -1358,6 +1371,10 @@ orderedLayers.push_back(layer); observedLayers.insert(layer); + + if (factory->isLayerSliceable(layer)) { + sliceableLayers.insert(layer); + } } } @@ -1365,17 +1382,33 @@ for (int i = 0; i < orderedLayers.size(); ++i) { - QString name = orderedLayers[i]->getLayerPresentationName(); + Layer *layer = orderedLayers[i]; + + QString name = layer->getLayerPresentationName(); int n = ++observedNames[name]; if (n > 1) name = QString("%1 <%2>").arg(name).arg(n); - QAction *action = new QAction(name, this); + QIcon icon = QIcon(QString(":/icons/%1.png") + .arg(factory->getLayerIconName + (factory->getLayerType(layer)))); + + QAction *action = new QAction(icon, name, this); connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); - m_existingLayerActions[action] = orderedLayers[i]; + m_existingLayerActions[action] = layer; m_existingLayersMenu->addAction(action); + + if (sliceableLayers.find(layer) != sliceableLayers.end()) { + action = new QAction(icon, name, this); + connect(action, SIGNAL(triggered()), this, SLOT(addLayer())); + connect(this, SIGNAL(canAddLayer(bool)), action, SLOT(setEnabled(bool))); + m_sliceActions[action] = layer; + m_sliceMenu->addAction(action); + } } + + m_sliceMenu->setEnabled(!m_sliceActions.empty()); } void @@ -3330,6 +3363,25 @@ return; } + ei = m_sliceActions.find(action); + + if (ei != m_sliceActions.end()) { + Layer *newLayer = m_document->createLayer(LayerFactory::Slice); +// document->setModel(newLayer, ei->second->getModel()); + SliceableLayer *source = dynamic_cast(ei->second); + SliceLayer *dest = dynamic_cast(newLayer); + if (source && dest) { + dest->setSliceableModel(source->getSliceableModel()); + connect(source, SIGNAL(sliceableModelReplaced(const Model *, const Model *)), + dest, SLOT(sliceableModelReplaced(const Model *, const Model *))); + connect(m_document, SIGNAL(modelAboutToBeDeleted(Model *)), + dest, SLOT(modelAboutToBeDeleted(Model *))); + } + m_document->addLayerToView(pane, newLayer); + m_paneStack->setCurrentLayer(pane, newLayer); + return; + } + TransformActionMap::iterator i = m_transformActions.find(action); if (i == m_transformActions.end()) { @@ -3466,7 +3518,7 @@ QLineEdit::Normal, layer->objectName(), &ok); if (ok) { layer->setObjectName(newName); - setupExistingLayersMenu(); + setupExistingLayersMenus(); } } } @@ -3575,7 +3627,7 @@ MainWindow::layerRemoved(Layer *layer) { // std::cerr << "MainWindow::layerRemoved(" << layer << ")" << std::endl; - setupExistingLayersMenu(); + setupExistingLayersMenus(); updateMenuStates(); } @@ -3617,7 +3669,7 @@ } } - setupExistingLayersMenu(); + setupExistingLayersMenus(); updateMenuStates(); } diff -r 5828afd1d229 -r 2678a1f132d2 main/MainWindow.h --- a/main/MainWindow.h Thu Jan 25 17:41:00 2007 +0000 +++ b/main/MainWindow.h Fri Jan 26 16:59:57 2007 +0000 @@ -257,6 +257,7 @@ QMenu *m_layerMenu; QMenu *m_transformsMenu; QMenu *m_existingLayersMenu; + QMenu *m_sliceMenu; QMenu *m_recentFilesMenu; QMenu *m_recentTransformsMenu; QMenu *m_rightButtonMenu; @@ -297,6 +298,7 @@ typedef std::map ExistingLayerActionMap; ExistingLayerActionMap m_existingLayerActions; + ExistingLayerActionMap m_sliceActions; typedef std::map ToolActionMap; ToolActionMap m_toolActions; @@ -308,7 +310,7 @@ void setupPaneAndLayerMenus(); void setupTransformsMenu(); void setupHelpMenu(); - void setupExistingLayersMenu(); + void setupExistingLayersMenus(); void setupToolbars(); Pane *addPaneToStack();