Browse Source

Make `SurfaceStack` a singleton and adjust `SurfaceManager`

master
Krisjanis Rijnieks 9 years ago
parent
commit
20efd8ebc6
  1. 78
      src/Surfaces/SurfaceManager.cpp
  2. 1
      src/Surfaces/SurfaceManager.h
  3. 13
      src/Surfaces/SurfaceStack.cpp
  4. 11
      src/Surfaces/SurfaceStack.h

78
src/Surfaces/SurfaceManager.cpp

@ -6,17 +6,23 @@ namespace piMapper {
SurfaceManager::SurfaceManager(){ SurfaceManager::SurfaceManager(){
mediaServer = 0; mediaServer = 0;
selectedSurface = 0; selectedSurface = 0;
ofAddListener(_surfaces.vertexChangedEvent, this, &SurfaceManager::onVertexChanged); ofAddListener(
ofAddListener(_surfaces.verticesChangedEvent, this, &SurfaceManager::onVerticesChanged); SurfaceStack::instance()->vertexChangedEvent,
this,
&SurfaceManager::onVertexChanged);
ofAddListener(
SurfaceStack::instance()->verticesChangedEvent,
this,
&SurfaceManager::onVerticesChanged);
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
} }
void SurfaceManager::draw(){ void SurfaceManager::draw(){
_surfaces.draw(); SurfaceStack::instance()->draw();
} }
void SurfaceManager::addSurface(BaseSurface * surface){ void SurfaceManager::addSurface(BaseSurface * surface){
_surfaces.push_back(surface); SurfaceStack::instance()->push_back(surface);
} }
void SurfaceManager::removeSelectedSurface(){ void SurfaceManager::removeSelectedSurface(){
@ -24,9 +30,9 @@ void SurfaceManager::removeSelectedSurface(){
return; return;
} }
for(int i = 0; i < _surfaces.size(); i++){ for(int i = 0; i < SurfaceStack::instance()->size(); i++){
if(_surfaces[i] == selectedSurface){ if(SurfaceStack::instance()->at(i) == selectedSurface){
_surfaces.erase(i); SurfaceStack::instance()->erase(i);
selectedSurface = 0; selectedSurface = 0;
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
break; break;
@ -35,27 +41,27 @@ void SurfaceManager::removeSelectedSurface(){
} }
void SurfaceManager::removeSurface(){ void SurfaceManager::removeSurface(){
if(_surfaces.size() <= 0){ if(SurfaceStack::instance()->size() <= 0){
return; return;
} }
BaseSurface * s = _surfaces.back(); BaseSurface * s = SurfaceStack::instance()->back();
_surfaces.pop_back(); SurfaceStack::instance()->pop_back();
delete s; delete s;
} }
void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){ void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){
for(int i = 0; i < _surfaces.size(); ++i){ for(int i = 0; i < SurfaceStack::instance()->size(); ++i){
if(_surfaces[i] == surface){ if(SurfaceStack::instance()->at(i) == surface){
_surfaces.erase(i); SurfaceStack::instance()->erase(i);
break; break;
} }
} }
} }
void SurfaceManager::clear(){ void SurfaceManager::clear(){
while(_surfaces.size()){ while(SurfaceStack::instance()->size()){
delete _surfaces.back(); delete SurfaceStack::instance()->back();
_surfaces.pop_back(); SurfaceStack::instance()->pop_back();
} }
} }
@ -65,7 +71,7 @@ void SurfaceManager::saveXmlSettings(string fileName){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
SettingsLoader::instance()->save(_surfaces, fileName); SettingsLoader::instance()->save(*SurfaceStack::instance(), fileName);
} }
bool SurfaceManager::loadXmlSettings(string fileName){ bool SurfaceManager::loadXmlSettings(string fileName){
@ -74,7 +80,7 @@ bool SurfaceManager::loadXmlSettings(string fileName){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return SettingsLoader::instance()->load(_surfaces, *mediaServer, fileName); return SettingsLoader::instance()->load(*SurfaceStack::instance(), *mediaServer, fileName);
} }
void SurfaceManager::setMediaServer(MediaServer * newMediaServer){ void SurfaceManager::setMediaServer(MediaServer * newMediaServer){
@ -82,19 +88,19 @@ void SurfaceManager::setMediaServer(MediaServer * newMediaServer){
} }
BaseSurface * SurfaceManager::selectSurface(int index){ BaseSurface * SurfaceManager::selectSurface(int index){
if(index >= _surfaces.size()){ if(index >= SurfaceStack::instance()->size()){
throw runtime_error("Surface index out of bounds."); throw runtime_error("Surface index out of bounds.");
} }
selectedSurface = _surfaces[index]; selectedSurface = SurfaceStack::instance()->at(index);
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
ofSendMessage("surfaceSelected"); ofSendMessage("surfaceSelected");
return selectedSurface; return selectedSurface;
} }
BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){ BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){
for(int i = 0; i < _surfaces.size(); i++){ for(int i = 0; i < SurfaceStack::instance()->size(); i++){
if(_surfaces[i] == surface){ if(SurfaceStack::instance()->at(i) == surface){
selectedSurface = surface; selectedSurface = surface;
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
ofSendMessage("surfaceSelected"); ofSendMessage("surfaceSelected");
@ -118,15 +124,15 @@ BaseSurface * SurfaceManager::selectNextSurface(){
return selectedSurface; return selectedSurface;
} }
for(int i = 0; i < _surfaces.size(); ++i){ for(int i = 0; i < SurfaceStack::instance()->size(); ++i){
if(_surfaces[i] == selectedSurface){ if(SurfaceStack::instance()->at(i) == selectedSurface){
if(i < _surfaces.size() - 1){ if(i < SurfaceStack::instance()->size() - 1){
next = i + 1; next = i + 1;
}else{ }else{
next = 0; next = 0;
} }
selectedSurface = _surfaces[next]; selectedSurface = SurfaceStack::instance()->at(next);
ofNotifyEvent(surfaceSelectedEvent, next, this); ofNotifyEvent(surfaceSelectedEvent, next, this);
return selectedSurface; return selectedSurface;
} }
@ -140,21 +146,21 @@ BaseSurface * SurfaceManager::selectPrevSurface(){
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
if(selectedSurface == 0){ if(selectedSurface == 0){
prev = _surfaces.size() - 1; prev = SurfaceStack::instance()->size() - 1;
selectedSurface = selectSurface(prev); selectedSurface = selectSurface(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this); ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface; return selectedSurface;
} }
for(int i = 0; i < _surfaces.size(); ++i){ for(int i = 0; i < SurfaceStack::instance()->size(); ++i){
if(_surfaces[i] == selectedSurface){ if(SurfaceStack::instance()->at(i) == selectedSurface){
if(i > 0){ if(i > 0){
prev = i - 1; prev = i - 1;
}else{ }else{
prev = _surfaces.size() - 1; prev = SurfaceStack::instance()->size() - 1;
} }
selectedSurface = _surfaces[prev]; selectedSurface = SurfaceStack::instance()->at(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this); ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface; return selectedSurface;
} }
@ -239,8 +245,8 @@ void SurfaceManager::moveSelectionBy(ofVec2f v){
} }
void SurfaceManager::moveAllSurfacesBy(ofVec2f v){ void SurfaceManager::moveAllSurfacesBy(ofVec2f v){
for(int i = 0; i < _surfaces.size(); ++i){ for(int i = 0; i < SurfaceStack::instance()->size(); ++i){
_surfaces[i]->moveBy(v); SurfaceStack::instance()->at(i)->moveBy(v);
} }
} }
@ -250,16 +256,16 @@ void SurfaceManager::deselectSurface(){
} }
BaseSurface * SurfaceManager::getSurface(int index){ BaseSurface * SurfaceManager::getSurface(int index){
if(index >= _surfaces.size()){ if(index >= SurfaceStack::instance()->size()){
throw runtime_error("Surface index out of bounds."); throw runtime_error("Surface index out of bounds.");
return 0; return 0;
} }
return _surfaces[index]; return SurfaceStack::instance()->at(index);
} }
int SurfaceManager::size(){ int SurfaceManager::size(){
return _surfaces.size(); return SurfaceStack::instance()->size();
} }
int SurfaceManager::getSelectedVertexIndex(){ int SurfaceManager::getSelectedVertexIndex(){

1
src/Surfaces/SurfaceManager.h

@ -68,7 +68,6 @@ class SurfaceManager {
BaseSurface * selectedSurface; BaseSurface * selectedSurface;
ofxXmlSettings xmlSettings; ofxXmlSettings xmlSettings;
MediaServer * mediaServer; MediaServer * mediaServer;
SurfaceStack _surfaces;
int _selectedVertexIndex; int _selectedVertexIndex;
}; };

13
src/Surfaces/SurfaceStack.cpp

@ -3,7 +3,14 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
SurfaceStack::SurfaceStack(){} SurfaceStack * SurfaceStack::_instance = 0;
SurfaceStack * SurfaceStack::instance(){
if(_instance == 0){
_instance = new ofx::piMapper::SurfaceStack();
}
return _instance;
}
void SurfaceStack::push_back(BaseSurface * s){ void SurfaceStack::push_back(BaseSurface * s){
ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged);
@ -38,6 +45,10 @@ int SurfaceStack::size(){
} }
BaseSurface * SurfaceStack::operator[](int i){ BaseSurface * SurfaceStack::operator[](int i){
return at(i);
}
BaseSurface * SurfaceStack::at(int i){
if(i >= _surfaces.size()){ if(i >= _surfaces.size()){
throw runtime_error("SurfaceStack index out of bounds"); throw runtime_error("SurfaceStack index out of bounds");
} }

11
src/Surfaces/SurfaceStack.h

@ -6,10 +6,12 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
// One can imagine this as a layers panel in an image editor // One can imagine this as a layers panel in an image editor.
// TODO: Make it singleton for easy access from commands.
// And refactor rest of the code to use it this way.
class SurfaceStack { class SurfaceStack {
public: public:
SurfaceStack(); static SurfaceStack * instance();
void push_back(BaseSurface * s); void push_back(BaseSurface * s);
void pop_back(); void pop_back();
@ -20,6 +22,7 @@ class SurfaceStack {
int size(); int size();
BaseSurface * operator[](int i); BaseSurface * operator[](int i);
BaseSurface * at(int i);
BaseSurface * back(); BaseSurface * back();
ofEvent <vector<ofVec3f>> verticesChangedEvent; ofEvent <vector<ofVec3f>> verticesChangedEvent;
@ -29,6 +32,10 @@ class SurfaceStack {
void onVertexChanged(int & i); void onVertexChanged(int & i);
private: private:
SurfaceStack(){}
static SurfaceStack * _instance;
vector<BaseSurface *> _surfaces; vector<BaseSurface *> _surfaces;
}; };

Loading…
Cancel
Save