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