From f8aed776c3fff6bb87f054a3dcf24518fba2b518 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Wed, 3 Mar 2010 15:50:22 +0000
Subject: [PATCH] SceneWin: -Display only RenderModes which contain data to
 render

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1762 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gfx/pymod/export_entity.cc             |  2 +-
 modules/gfx/src/entity.cc                      | 10 ++++++----
 modules/gfx/src/entity.hh                      |  2 +-
 modules/gui/src/scene_win/render_modes_node.cc | 18 ++++++++++++++++--
 modules/gui/src/scene_win/render_modes_node.hh |  4 +++-
 modules/gui/src/scene_win/scene_win_model.cc   | 18 +++++++++++++++++-
 modules/gui/src/scene_win/scene_win_model.hh   |  1 +
 7 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/modules/gfx/pymod/export_entity.cc b/modules/gfx/pymod/export_entity.cc
index 4e555d2b8..f12b54c88 100644
--- a/modules/gfx/pymod/export_entity.cc
+++ b/modules/gfx/pymod/export_entity.cc
@@ -238,7 +238,7 @@ void export_Entity()
                   &Entity::SetSelection)
     .def("GetView", &Entity::GetView)
     .def("GetRenderModeName", &Entity::GetRenderModeName)
-    .def("GetLoadedRenderModes", &Entity::GetLoadedRenderModes)
+    .def("GetNotEmptyRenderModes", &Entity::GetNotEmptyRenderModes)
     .def("SetRenderMode", set_rm1, arg("keep")=false)
     .def("SetRenderMode", set_rm2)
     .def("SetEnableRenderMode", &Entity::SetEnableRenderMode)
diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc
index 5f5695de2..a352ad32d 100644
--- a/modules/gfx/src/entity.cc
+++ b/modules/gfx/src/entity.cc
@@ -534,7 +534,7 @@ void Entity::ApplyRenderOptions(RenderMode::Type render_mode,
 
 void Entity::OptionsChanged(RenderMode::Type render_mode)
 {
-  impl::EntityRenderer* entity_renderer=this->GetOrCreateRenderer(render_mode_);
+  impl::EntityRenderer* entity_renderer=this->GetOrCreateRenderer(render_mode);
   entity_renderer->RenderOptionsChanged();
   FlagRebuild();
   Scene::Instance().ObjectChanged(this->GetName());
@@ -542,7 +542,6 @@ void Entity::OptionsChanged(RenderMode::Type render_mode)
 
 void Entity::OnRenderModeChange()
 {
-  GfxObj::OnRenderModeChange();
   for (RendererMap::iterator i=renderer_.begin(), 
        e=renderer_.end(); i!=e; ++i) {
     i->second->ClearViews();
@@ -559,6 +558,7 @@ void Entity::OnRenderModeChange()
   }  
   this->ReapplyColorOps();
   this->FlagRebuild();
+  GfxObj::OnRenderModeChange();
 }
 
 const String Entity::GetRenderModeName(RenderMode::Type mode){
@@ -592,11 +592,13 @@ bool Entity::IsRenderModeEnabled(RenderMode::Type mode){
 }
 
 
-RenderModeTypes Entity::GetLoadedRenderModes(){
+RenderModeTypes Entity::GetNotEmptyRenderModes(){
   std::vector<RenderMode::Type> render_modes;
   for (RendererMap::iterator i=renderer_.begin(),
          e=renderer_.end(); i!=e; ++i) {
-       render_modes.push_back(i->first);
+    if(i->second->HasDataToRender()){
+      render_modes.push_back(i->first);
+    }
   }
   return render_modes;
 }
diff --git a/modules/gfx/src/entity.hh b/modules/gfx/src/entity.hh
index 5a62719ae..6a84f8c9e 100644
--- a/modules/gfx/src/entity.hh
+++ b/modules/gfx/src/entity.hh
@@ -124,7 +124,7 @@ public:
 
   bool IsRenderModeEnabled(RenderMode::Type mode);
 
-  RenderModeTypes GetLoadedRenderModes();
+  RenderModeTypes GetNotEmptyRenderModes();
 
   void SetRenderMode(RenderMode::Type mode, const mol::EntityView& view, 
                      bool keep=false);
diff --git a/modules/gui/src/scene_win/render_modes_node.cc b/modules/gui/src/scene_win/render_modes_node.cc
index 434d0f3b0..02cfae68a 100644
--- a/modules/gui/src/scene_win/render_modes_node.cc
+++ b/modules/gui/src/scene_win/render_modes_node.cc
@@ -47,14 +47,28 @@ void RenderModesNode::RenderModeChanged(){
 void RenderModesNode::Update(){
   SceneWinModel* model = GostyApp::Instance()->GetSceneWin()->GetModel();
   gfx::EntityP entity = boost::dynamic_pointer_cast<gfx::Entity>(this->GetGfxNode());
-  gfx::RenderModeTypes render_modes =  entity->GetLoadedRenderModes();
+  gfx::RenderModeTypes render_modes =  entity->GetNotEmptyRenderModes();
   for(unsigned int i=0; i<render_modes.size();i++){
     if(!render_types_.contains(render_modes[i])){
       RenderModeNode* node = new RenderModeNode(entity, render_modes[i],this);
       model->AddNode(this, node);
-      render_types_.insert(render_modes[i]);
+      render_types_.insert(render_modes[i],node);
     }
   }
+  QSet<gfx::RenderMode::Type> types_to_delete;
+  QMap<gfx::RenderMode::Type,RenderModeNode*>::iterator type;
+  for (type = render_types_.begin(); type != render_types_.end(); ++type){
+    if(find(render_modes.begin(), render_modes.end(), type.key()) == render_modes.end()){
+      model->RemoveNode(type.value());
+      types_to_delete.insert(type.key());
+    }
+  }
+
+  QSet<gfx::RenderMode::Type>::iterator to_delete;
+  for(to_delete = types_to_delete.begin(); to_delete != types_to_delete.end(); ++to_delete){
+    render_types_.remove(*to_delete);
+  }
+
 }
 
 gfx::GfxNodeP RenderModesNode::GetGfxNode(){
diff --git a/modules/gui/src/scene_win/render_modes_node.hh b/modules/gui/src/scene_win/render_modes_node.hh
index 6fc631ea9..691f0d094 100644
--- a/modules/gui/src/scene_win/render_modes_node.hh
+++ b/modules/gui/src/scene_win/render_modes_node.hh
@@ -34,6 +34,8 @@
 #include <ost/gui/module_config.hh>
 #include <ost/gui/scene_win/label_node.hh>
 
+#include "render_mode_node.hh"
+
 /*
   Author: Stefan Scheuber
  */
@@ -52,7 +54,7 @@ private:
   void Update();
 
   gfx::GfxNodeP node_;
-  QSet<gfx::RenderMode::Type> render_types_;
+  QMap<gfx::RenderMode::Type,RenderModeNode*> render_types_;
 };
 
 }}
diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc
index e65b75379..c08830f6d 100644
--- a/modules/gui/src/scene_win/scene_win_model.cc
+++ b/modules/gui/src/scene_win/scene_win_model.cc
@@ -220,7 +220,8 @@ SceneNode* SceneWinModel::GetItem(const QModelIndex &index) const
 bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child){
   QModelIndex parent_index = GetIndexOf(parent);
   if(parent_index.isValid()){
-    this->beginInsertRows(parent_index,0,0);
+    int row = parent->GetChildCount();
+    this->beginInsertRows(parent_index,row,row);
     parent->AddChild(child);
     this->endInsertRows();
     return true;
@@ -228,6 +229,21 @@ bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child){
   return false;
 }
 
+bool SceneWinModel::RemoveNode(SceneNode* node){
+  QModelIndex index = GetIndexOf(node);
+  SceneNode* parent = node->GetParent();
+  if(parent && index.isValid()){
+    QModelIndex parent_index = GetIndexOf(parent);
+    int row = node->GetRow();
+    this->beginRemoveRows(parent_index,row,row);
+    parent->RemoveChild(node);
+    this->endRemoveRows();
+    return true;
+  }
+  return false;
+}
+
+
 void SceneWinModel::AttachRenderModeObserver(RenderModesNode* node){
   render_observers_.insert(node->GetGfxNode(),node);
 }
diff --git a/modules/gui/src/scene_win/scene_win_model.hh b/modules/gui/src/scene_win/scene_win_model.hh
index b0a29dfe5..258e798bd 100644
--- a/modules/gui/src/scene_win/scene_win_model.hh
+++ b/modules/gui/src/scene_win/scene_win_model.hh
@@ -51,6 +51,7 @@ public:
   virtual void Update();
 
   bool AddNode(SceneNode* parent, SceneNode* child);
+  bool RemoveNode(SceneNode* node);
 
   void AttachRenderModeObserver(RenderModesNode* node);
   void DetachRenderModeObserver(RenderModesNode* node);
-- 
GitLab