From 5076b39c893ea807e3ac9efd9f56d3fc7673ee14 Mon Sep 17 00:00:00 2001 From: Krisjanis Rijnieks Date: Sun, 2 Oct 2016 12:49:55 +0200 Subject: [PATCH] Make SurfaceStack not a singleton --- src/Application/Application.cpp | 2 +- .../Modes/ProjectionMappingMode.cpp | 7 +- src/Commands/ClearSurfacesCmd.cpp | 6 +- src/Commands/MvLayerDnCmd.cpp | 13 +-- src/Commands/MvLayerDnCmd.h | 4 +- src/Commands/MvLayerUpCmd.cpp | 15 ++-- src/Commands/MvLayerUpCmd.h | 3 +- src/Surfaces/SurfaceManager.cpp | 83 +++++++++++-------- src/Surfaces/SurfaceManager.h | 4 + src/Surfaces/SurfaceStack.cpp | 11 +-- src/Surfaces/SurfaceStack.h | 12 +-- 11 files changed, 82 insertions(+), 78 deletions(-) diff --git a/src/Application/Application.cpp b/src/Application/Application.cpp index 9d7e792..f8efea3 100644 --- a/src/Application/Application.cpp +++ b/src/Application/Application.cpp @@ -73,7 +73,7 @@ void Application::onKeyPressed(ofKeyEventArgs & args){ if(_keySequence.size() >= 3){ _keySequence = _keySequence.substr(_keySequence.size() - 3, 3); if(_keySequence == "new"){ - if(SurfaceStack::instance()->size()){ + if(_surfaceManager.getActivePreset()->size()){ _cmdManager.exec(new ClearSurfacesCmd(getSurfaceManager())); } return; diff --git a/src/Application/Modes/ProjectionMappingMode.cpp b/src/Application/Modes/ProjectionMappingMode.cpp index dd1f644..22cba71 100644 --- a/src/Application/Modes/ProjectionMappingMode.cpp +++ b/src/Application/Modes/ProjectionMappingMode.cpp @@ -234,12 +234,14 @@ void ProjectionMappingMode::onKeyPressed(Application * app, ofKeyEventArgs & arg case '0': // Move selected surface up the layer stack if(app->getSurfaceManager()->getSelectedSurface() != 0){ if(app->getSurfaceManager()->getSelectedSurface() == - SurfaceStack::instance()->at(SurfaceStack::instance()->size() - 1)){ + app->getSurfaceManager()->getActivePreset()->at( + app->getSurfaceManager()->getActivePreset()->size() - 1)){ return; } app->getCmdManager()->exec( new MvLayerUpCmd( + app->getSurfaceManager()->getActivePreset(), app->getSurfaceManager()->getSelectedSurface()) ); } @@ -248,12 +250,13 @@ void ProjectionMappingMode::onKeyPressed(Application * app, ofKeyEventArgs & arg case '9': // Move selected surface down the layer stack if(app->getSurfaceManager()->getSelectedSurface() != 0){ if(app->getSurfaceManager()->getSelectedSurface() == - SurfaceStack::instance()->at(0)){ + app->getSurfaceManager()->getActivePreset()->at(0)){ return; } app->getCmdManager()->exec( new MvLayerDnCmd( + app->getSurfaceManager()->getActivePreset(), app->getSurfaceManager()->getSelectedSurface()) ); } diff --git a/src/Commands/ClearSurfacesCmd.cpp b/src/Commands/ClearSurfacesCmd.cpp index 1aad483..a8753b8 100644 --- a/src/Commands/ClearSurfacesCmd.cpp +++ b/src/Commands/ClearSurfacesCmd.cpp @@ -6,18 +6,18 @@ namespace piMapper { ClearSurfacesCmd::ClearSurfacesCmd(SurfaceManager * sm){ _surfaceManager = sm; _selectedSurface = _surfaceManager->getSelectedSurface(); - _surfaces = SurfaceStack::instance()->getSurfaces(); + _surfaces = sm->getActivePreset()->getSurfaces(); } void ClearSurfacesCmd::exec(){ _surfaceManager->deselectSurface(); - SurfaceStack::instance()->clear(); + _surfaceManager->getActivePreset()->clear(); } void ClearSurfacesCmd::undo(){ ofLogNotice("ClearSurfacesCmd", "undo"); for(unsigned int i = 0; i < _surfaces.size(); ++i){ - SurfaceStack::instance()->push_back(_surfaces[i]); + _surfaceManager->getActivePreset()->push_back(_surfaces[i]); } _surfaceManager->selectSurface(_selectedSurface); } diff --git a/src/Commands/MvLayerDnCmd.cpp b/src/Commands/MvLayerDnCmd.cpp index 278fa67..4360fdc 100644 --- a/src/Commands/MvLayerDnCmd.cpp +++ b/src/Commands/MvLayerDnCmd.cpp @@ -3,7 +3,8 @@ namespace ofx { namespace piMapper { -MvLayerDnCmd::MvLayerDnCmd(BaseSurface * selectedSurface){ +MvLayerDnCmd::MvLayerDnCmd(SurfaceStack * stack, BaseSurface * selectedSurface){ + _stack = stack; _selectedSurface = selectedSurface; _selectedSurfaceIndex = -1; } @@ -12,8 +13,8 @@ void MvLayerDnCmd::exec(){ ofLogNotice("MvLayerDnCmd", "exec"); // Find selected surface index in SurfaceStack. - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - if(_selectedSurface == SurfaceStack::instance()->at(i)){ + for(int i = 0; i < _stack->size(); ++i){ + if(_selectedSurface == _stack->at(i)){ _selectedSurfaceIndex = i; break; } @@ -27,17 +28,17 @@ void MvLayerDnCmd::exec(){ throw runtime_error("Check if selected surface is not bottom before using MvLayerUpCmd"); } - if(SurfaceStack::instance()->size() <= 1){ + if(_stack->size() <= 1){ throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd"); } // Swap it with the previous surface - SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); + _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); } void MvLayerDnCmd::undo(){ ofLogNotice("MvLayerDnCmd", "undo"); - SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); + _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); } } // namespace piMapper diff --git a/src/Commands/MvLayerDnCmd.h b/src/Commands/MvLayerDnCmd.h index a475998..9280da6 100644 --- a/src/Commands/MvLayerDnCmd.h +++ b/src/Commands/MvLayerDnCmd.h @@ -10,11 +10,13 @@ namespace piMapper { class MvLayerDnCmd : public BaseUndoCmd { public: - MvLayerDnCmd(BaseSurface * selectedSurface); + MvLayerDnCmd(SurfaceStack * stack, BaseSurface * selectedSurface); void exec(); void undo(); private: + SurfaceStack * _stack; + BaseSurface * _selectedSurface; int _selectedSurfaceIndex; diff --git a/src/Commands/MvLayerUpCmd.cpp b/src/Commands/MvLayerUpCmd.cpp index 1b2182c..ef0e31d 100644 --- a/src/Commands/MvLayerUpCmd.cpp +++ b/src/Commands/MvLayerUpCmd.cpp @@ -3,7 +3,8 @@ namespace ofx { namespace piMapper { -MvLayerUpCmd::MvLayerUpCmd(BaseSurface * selectedSurface){ +MvLayerUpCmd::MvLayerUpCmd(SurfaceStack * stack, BaseSurface * selectedSurface){ + _stack = stack; _selectedSurface = selectedSurface; _selectedSurfaceIndex = -1; } @@ -12,8 +13,8 @@ void MvLayerUpCmd::exec(){ ofLogNotice("MvLayerUpCmd", "exec"); // Find selected surface index in SurfaceStack. - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - if(_selectedSurface == SurfaceStack::instance()->at(i)){ + for(int i = 0; i < _stack->size(); ++i){ + if(_selectedSurface == _stack->at(i)){ _selectedSurfaceIndex = i; break; } @@ -23,21 +24,21 @@ void MvLayerUpCmd::exec(){ throw runtime_error("MvLayerUpCmd used with no surface selected"); } - if(_selectedSurfaceIndex == SurfaceStack::instance()->size() - 1){ + if(_selectedSurfaceIndex == _stack->size() - 1){ throw runtime_error("Check if selected surface is not top before using MvLayerUpCmd"); } - if(SurfaceStack::instance()->size() <= 1){ + if(_stack->size() <= 1){ throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd"); } // Swap it with the next surface - SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); + _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); } void MvLayerUpCmd::undo(){ ofLogNotice("MvLayerUoCmd", "undo"); - SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); + _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); } } // namespace piMapper diff --git a/src/Commands/MvLayerUpCmd.h b/src/Commands/MvLayerUpCmd.h index 91d41ed..5f15608 100644 --- a/src/Commands/MvLayerUpCmd.h +++ b/src/Commands/MvLayerUpCmd.h @@ -10,11 +10,12 @@ namespace piMapper { class MvLayerUpCmd : public BaseUndoCmd { public: - MvLayerUpCmd(BaseSurface * selectedSurface); + MvLayerUpCmd(SurfaceStack * stack, BaseSurface * selectedSurface); void exec(); void undo(); private: + SurfaceStack * _stack; BaseSurface * _selectedSurface; int _selectedSurfaceIndex; diff --git a/src/Surfaces/SurfaceManager.cpp b/src/Surfaces/SurfaceManager.cpp index da1ca41..db846d6 100644 --- a/src/Surfaces/SurfaceManager.cpp +++ b/src/Surfaces/SurfaceManager.cpp @@ -6,23 +6,30 @@ namespace piMapper { SurfaceManager::SurfaceManager(){ mediaServer = 0; selectedSurface = 0; + + // Create one SurfaceStack instance in the beginning as interphase towards full + // preset functionality. + + SurfaceStack * preset = new SurfaceStack(); + _presets.push_back(preset); + ofAddListener( - SurfaceStack::instance()->vertexChangedEvent, + _presets[0]->vertexChangedEvent, this, &SurfaceManager::onVertexChanged); ofAddListener( - SurfaceStack::instance()->verticesChangedEvent, + _presets[0]->verticesChangedEvent, this, &SurfaceManager::onVerticesChanged); _selectedVertexIndex = -1; } void SurfaceManager::draw(){ - SurfaceStack::instance()->draw(); + _presets[0]->draw(); } void SurfaceManager::addSurface(BaseSurface * surface){ - SurfaceStack::instance()->push_back(surface); + _presets[0]->push_back(surface); } void SurfaceManager::removeSelectedSurface(){ @@ -30,9 +37,9 @@ void SurfaceManager::removeSelectedSurface(){ return; } - for(int i = 0; i < SurfaceStack::instance()->size(); i++){ - if(SurfaceStack::instance()->at(i) == selectedSurface){ - SurfaceStack::instance()->erase(i); + for(int i = 0; i < _presets[0]->size(); i++){ + if(_presets[0]->at(i) == selectedSurface){ + _presets[0]->erase(i); selectedSurface = 0; _selectedVertexIndex = -1; break; @@ -41,27 +48,27 @@ void SurfaceManager::removeSelectedSurface(){ } void SurfaceManager::removeSurface(){ - if(SurfaceStack::instance()->size() <= 0){ + if(_presets[0]->size() <= 0){ return; } - BaseSurface * s = SurfaceStack::instance()->back(); - SurfaceStack::instance()->pop_back(); + BaseSurface * s = _presets[0]->back(); + _presets[0]->pop_back(); delete s; } void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){ - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - if(SurfaceStack::instance()->at(i) == surface){ - SurfaceStack::instance()->erase(i); + for(int i = 0; i < _presets[0]->size(); ++i){ + if(_presets[0]->at(i) == surface){ + _presets[0]->erase(i); break; } } } void SurfaceManager::clear(){ - while(SurfaceStack::instance()->size()){ - delete SurfaceStack::instance()->back(); - SurfaceStack::instance()->pop_back(); + while(_presets[0]->size()){ + delete _presets[0]->back(); + _presets[0]->pop_back(); } } @@ -71,7 +78,7 @@ void SurfaceManager::saveXmlSettings(string fileName){ exit(EXIT_FAILURE); } - SettingsLoader::instance()->save(*SurfaceStack::instance(), fileName); + SettingsLoader::instance()->save(*_presets[0], fileName); } bool SurfaceManager::loadXmlSettings(string fileName){ @@ -80,7 +87,7 @@ bool SurfaceManager::loadXmlSettings(string fileName){ exit(EXIT_FAILURE); } - return SettingsLoader::instance()->load(*SurfaceStack::instance(), *mediaServer, fileName); + return SettingsLoader::instance()->load(*_presets[0], *mediaServer, fileName); } void SurfaceManager::setMediaServer(MediaServer * newMediaServer){ @@ -88,11 +95,11 @@ void SurfaceManager::setMediaServer(MediaServer * newMediaServer){ } BaseSurface * SurfaceManager::selectSurface(int index){ - if(index >= SurfaceStack::instance()->size()){ + if(index >= _presets[0]->size()){ throw runtime_error("Surface index out of bounds."); } - selectedSurface = SurfaceStack::instance()->at(index); + selectedSurface = _presets[0]->at(index); _selectedVertexIndex = -1; ofSendMessage("surfaceSelected"); return selectedSurface; @@ -101,8 +108,8 @@ BaseSurface * SurfaceManager::selectSurface(int index){ BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){ cout << "SurfaceManager::selectSurface()" << endl; - for(int i = 0; i < SurfaceStack::instance()->size(); i++){ - if(SurfaceStack::instance()->at(i) == surface){ + for(int i = 0; i < _presets[0]->size(); i++){ + if(_presets[0]->at(i) == surface){ selectedSurface = surface; _selectedVertexIndex = -1; ofSendMessage("surfaceSelected"); @@ -126,15 +133,15 @@ BaseSurface * SurfaceManager::selectNextSurface(){ return selectedSurface; } - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - if(SurfaceStack::instance()->at(i) == selectedSurface){ - if(i < SurfaceStack::instance()->size() - 1){ + for(int i = 0; i < _presets[0]->size(); ++i){ + if(_presets[0]->at(i) == selectedSurface){ + if(i < _presets[0]->size() - 1){ next = i + 1; }else{ next = 0; } - selectedSurface = SurfaceStack::instance()->at(next); + selectedSurface = _presets[0]->at(next); ofNotifyEvent(surfaceSelectedEvent, next, this); return selectedSurface; } @@ -148,21 +155,21 @@ BaseSurface * SurfaceManager::selectPrevSurface(){ _selectedVertexIndex = -1; if(selectedSurface == 0){ - prev = SurfaceStack::instance()->size() - 1; + prev = _presets[0]->size() - 1; selectedSurface = selectSurface(prev); ofNotifyEvent(surfaceSelectedEvent, prev, this); return selectedSurface; } - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - if(SurfaceStack::instance()->at(i) == selectedSurface){ + for(int i = 0; i < _presets[0]->size(); ++i){ + if(_presets[0]->at(i) == selectedSurface){ if(i > 0){ prev = i - 1; }else{ - prev = SurfaceStack::instance()->size() - 1; + prev = _presets[0]->size() - 1; } - selectedSurface = SurfaceStack::instance()->at(prev); + selectedSurface = _presets[0]->at(prev); ofNotifyEvent(surfaceSelectedEvent, prev, this); return selectedSurface; } @@ -247,8 +254,8 @@ void SurfaceManager::moveSelectionBy(ofVec2f v){ } void SurfaceManager::moveAllSurfacesBy(ofVec2f v){ - for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ - SurfaceStack::instance()->at(i)->moveBy(v); + for(int i = 0; i < _presets[0]->size(); ++i){ + _presets[0]->at(i)->moveBy(v); } } @@ -258,16 +265,16 @@ void SurfaceManager::deselectSurface(){ } BaseSurface * SurfaceManager::getSurface(int index){ - if(index >= SurfaceStack::instance()->size()){ + if(index >= _presets[0]->size()){ throw runtime_error("Surface index out of bounds."); return 0; } - return SurfaceStack::instance()->at(index); + return _presets[0]->at(index); } int SurfaceManager::size(){ - return SurfaceStack::instance()->size(); + return _presets[0]->size(); } int SurfaceManager::getSelectedVertexIndex(){ @@ -282,5 +289,9 @@ void SurfaceManager::onVerticesChanged(vector & vertices){ ofNotifyEvent(verticesChangedEvent, vertices, this); } +SurfaceStack * SurfaceManager::getActivePreset(){ + return _presets[0]; +} + } // namespace piMapper } // namespace ofx diff --git a/src/Surfaces/SurfaceManager.h b/src/Surfaces/SurfaceManager.h index 98903ca..7d47821 100644 --- a/src/Surfaces/SurfaceManager.h +++ b/src/Surfaces/SurfaceManager.h @@ -70,12 +70,16 @@ class SurfaceManager { void onVertexChanged(int & i); void onVerticesChanged(vector & vertices); + SurfaceStack * getActivePreset(); + private: BaseSurface * selectedSurface; ofxXmlSettings xmlSettings; MediaServer * mediaServer; int _selectedVertexIndex; + + vector _presets; }; } // namespace piMapper diff --git a/src/Surfaces/SurfaceStack.cpp b/src/Surfaces/SurfaceStack.cpp index 5618e9a..ca26b9b 100644 --- a/src/Surfaces/SurfaceStack.cpp +++ b/src/Surfaces/SurfaceStack.cpp @@ -3,15 +3,6 @@ namespace ofx { namespace piMapper { -SurfaceStack * SurfaceStack::_instance = 0; - -SurfaceStack * SurfaceStack::instance(){ - if(_instance == 0){ - _instance = new ofx::piMapper::SurfaceStack(); - } - return _instance; -} - void SurfaceStack::push_back(BaseSurface * s){ ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); ofAddListener(s->vertexChangedEvent, this, &SurfaceStack::onVertexChanged); @@ -77,4 +68,4 @@ void SurfaceStack::onVertexChanged(int & i){ } } // namespace piMapper -} // namespace ofx \ No newline at end of file +} // namespace ofx diff --git a/src/Surfaces/SurfaceStack.h b/src/Surfaces/SurfaceStack.h index 94f5d86..702c15f 100644 --- a/src/Surfaces/SurfaceStack.h +++ b/src/Surfaces/SurfaceStack.h @@ -6,14 +6,8 @@ namespace ofx { namespace piMapper { -/* TODO: Do not use singleton here. - * For presets we need multiple instances of surface stacks. - */ - class SurfaceStack { public: - static SurfaceStack * instance(); - void push_back(BaseSurface * s); void pop_back(); void erase(int i); @@ -36,12 +30,8 @@ class SurfaceStack { vector & getSurfaces(){ return _surfaces; }; private: - SurfaceStack(){} - - static SurfaceStack * _instance; - vector _surfaces; }; } // namespace piMapper -} // namespace ofx \ No newline at end of file +} // namespace ofx