]> Creatis software - bbtkGEditor.git/blobdiff - lib/EditorGraphicBBS/bbsKernelEditorGraphic/wxVtkSceneManager.cxx
Added the possibility to delete all the boxes in the scene
[bbtkGEditor.git] / lib / EditorGraphicBBS / bbsKernelEditorGraphic / wxVtkSceneManager.cxx
index 77da812bdd22ef2b73ce6aadc0f0b39db3733761..1e325329ed126f41586323d971cd538c3ca15307 100644 (file)
@@ -47,7 +47,6 @@ namespace bbtk
                _numBoxes=0;
                _idManager=idManager;
                _baseView=baseView;
-               _idLastController=0;
                _startDragging=false;
 
                if( _baseView!=NULL )
@@ -308,6 +307,7 @@ namespace bbtk
                connectorModel->setManualContourModel(manContourModel);
                connectorView->setManualContourView(manContourView);
                connectorView->setModel(connectorModel);
+               connectorView->setBaseView(_baseView);
                connectorcontroller->setModelAndView(connectorModel,connectorView);
 
                int newId = _controllers.size();
@@ -515,6 +515,42 @@ namespace bbtk
        
        bool wxVtkSceneManager::OnLeftButtonDown()
        {
+               if(_worldState==INIT_CREATION_CONTOUR)
+               {
+                       bool isOverPort=false;
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end() && isOverPort==false; ++it)
+                       {
+                               GObjectController *desc = it->second;
+                               if(desc->getGObjectType()==GPORT)
+                               {
+                                       GPortModel* portmod=(GPortModel*)desc->getModel();
+                                       vtkGObjectView* portView=desc->getView();
+                                       if(portmod->getPortType()==GINPUTPORT && portView->getState()==HIGHLIGHTED)
+                                       {
+                                               isOverPort=true;
+                                       }
+                               }
+                       }
+                       
+                       if(isOverPort==false)
+                       {
+                               _worldState=NOTHING_HAPPENS;
+                               int lastId = _controllers.size()-1;
+                               GConnectorController *connector = (GConnectorController*)_controllers[lastId];
+                               connector->removeFromScene();
+                               unregisterController(connector);
+                               _controllers.erase(lastId);                     
+
+                               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+                               {
+                                       GObjectController *desc = it->second;
+                                       desc->SetActive(true);
+                                       desc->getView()->setState(NOTHING_HAPPENS);
+                                       desc->getModel()->notifyObservers(_idManager);
+                               }
+                       }
+               }
                
                if(_selectedObjects.size()!=0)
                {
@@ -558,6 +594,26 @@ namespace bbtk
 
        bool wxVtkSceneManager::OnRightButtonUp()
        {
+               if(_worldState==INIT_CREATION_CONTOUR)
+               {
+                       _worldState=NOTHING_HAPPENS;
+                       int lastId = _controllers.size()-1;
+                       GConnectorController *connector = (GConnectorController*)_controllers[lastId];
+                       connector->removeFromScene();
+                       unregisterController(connector);
+                       _controllers.erase(lastId);                     
+
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
+                       {
+                               GObjectController *desc = it->second;
+                               desc->SetActive(true);
+                               desc->getView()->setState(NOTHING_HAPPENS);
+                               desc->getModel()->notifyObservers(_idManager);
+                       }
+               }
+
+                       
                for (int i = 0; i < _selectedObjects.size(); i++)
                {
                        int id = _selectedObjects[i];
@@ -611,7 +667,7 @@ namespace bbtk
 
                if(clickOnObject==false)
                {
-                       _parent->editDiagramParameters(this);
+                       //_parent->editDiagramParameters(this);
                }
 
                return true;
@@ -632,7 +688,7 @@ namespace bbtk
                                for(int i=0;i<_selectedObjects.size();i++)
                                {
                                        int id = _selectedObjects[i];
-                                       removeObject(id);
+                                       deleteObject(id);
                                }
                                _selectedObjects.clear();
                        }
@@ -643,7 +699,7 @@ namespace bbtk
 
        //=========================================================================
 
-       void wxVtkSceneManager::removeObject(int id)
+       void wxVtkSceneManager::deleteObject(int id)
        {
                GObjectController *control = _controllers[id];
                std::vector<int> controllersToRemove;
@@ -653,18 +709,51 @@ namespace bbtk
                        GBlackBoxModel *bbmod = (GBlackBoxModel*)control->getModel();
                        std::vector<GPortModel*> inputs = bbmod->getInputPorts();
                        
+                       bool boxConnected = false;
+
+                       // Add box input controllers to be removed
                        for(int i = 0;i<inputs.size();i++)
                        {
-                               controllersToRemove.push_back(inputs[i]->getObjectId());                                
+                               controllersToRemove.push_back(inputs[i]->getObjectId());
+                               if(inputs[i]->isConnected())
+                               {
+                                       boxConnected = true;
+                               }
                        }
 
                        std::vector<GPortModel*> outputs = bbmod->getOutputPorts();
 
+                       // Add box output controllers to be removed
                        for(int i = 0;i<outputs.size();i++)
                        {
                                controllersToRemove.push_back(outputs[i]->getObjectId());
+                               if(outputs[i]->isConnected())
+                               {
+                                       boxConnected = true;
+                               }
                        }
 
+                       // Add connection controllers to be removed
+                       std::map<int, GObjectController*>::iterator it;
+                       for(it = _controllers.begin(); it != _controllers.end(); ++it)
+                       {
+                               GObjectController *cont = it->second;
+                               int type = cont->getGObjectType();
+                               if(type==GCONNECTOR)
+                               {
+                                       GConnectorModel *conMod = (GConnectorModel*)cont->getModel();
+                                       if(conMod->getStartPort()!=NULL && conMod->getStartPort()->getParentBox()->getObjectId() == bbmod->getObjectId())
+                                       {
+                                               controllersToRemove.push_back(conMod->getObjectId());
+                                       }
+                                       if(conMod->getEndPort()!=NULL && conMod->getEndPort()->getParentBox()->getObjectId() == bbmod->getObjectId())
+                                       {
+                                               controllersToRemove.push_back(conMod->getObjectId());
+                                       }
+                               }
+                       }
+
+                       // Add box controller to be removed
                        controllersToRemove.push_back(bbmod->getObjectId());
                }
 
@@ -831,6 +920,29 @@ namespace bbtk
 
        //=========================================================================
 
+       void wxVtkSceneManager::deleteAllBoxes()
+       {
+               std::map<int, GObjectController*>::iterator it;
+               for(it = _controllers.begin(); it != _controllers.end(); ++it)
+               {
+                       GObjectController *cont = it->second;           
+                       cont->removeFromScene();
+                       unregisterController((InteractorStyleMaracas*)cont);
+               }
+               _selectedObjects.clear();
+               _controllers.clear();   
+               refreshScene();
+       }
+
+       //=========================================================================
+
+       void wxVtkSceneManager::refreshScene()
+       {
+               _baseView->RefreshView();
+       }
+
+       //=========================================================================
+
 }  // EO namespace bbtk
 
 // EOF