From 698a9d000811663ed526b165ae006ec1c0af9a42 Mon Sep 17 00:00:00 2001 From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Tue, 9 Mar 2010 13:52:36 +0000 Subject: [PATCH] scene win, added some options to context menu git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1797 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/gui/src/scene_selection.cc | 41 +++++++++++++++++++++- modules/gui/src/scene_selection.hh | 4 +++ modules/gui/src/scene_win/context_menu.cc | 42 ++++++++++++++++++++++- modules/gui/src/scene_win/context_menu.hh | 1 + modules/gui/src/scene_win/entity_node.cc | 3 ++ 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/modules/gui/src/scene_selection.cc b/modules/gui/src/scene_selection.cc index f8aa76bb4..9210d561a 100644 --- a/modules/gui/src/scene_selection.cc +++ b/modules/gui/src/scene_selection.cc @@ -30,7 +30,6 @@ #include <ost/gui/gosty_app.hh> #include <ost/gui/scene_win/scene_win.hh> #include <ost/gui/query_dialog.hh> -#include <ost/gui/query_dialog.hh> #include "scene_selection.hh" @@ -147,6 +146,18 @@ void SceneSelection::Select() { } } +void SceneSelection::Deselect(){ + for(unsigned int i = 0; i < nodes_.size(); i++){ + gfx::GfxNodeP node = nodes_[i]; + if (node) { + gfx::Entity* obj = dynamic_cast<gfx::Entity*> (node.get()); + if (obj) { + obj->SetSelection(obj->GetView().CreateEmptyView()); + } + } + } +} + void SceneSelection::CopyViews() { QueryDialog d; QList<gfx::GfxObjP> objects_to_add; @@ -227,6 +238,34 @@ void SceneSelection::MakeHidden(){ } } +void SceneSelection::SelectAllViews(){ + mol::EntityView union_view = this->GetViewUnion(); + if(union_view.IsValid()){ + view_entity_->SetSelection(union_view); + } +} + +void SceneSelection::DeselectAllViews(){ + mol::EntityView sel = view_entity_->GetSelection(); + if(sel.IsValid()){ + for(unsigned int i= 0; i < views_.size(); i++){ + sel = mol::Difference(sel, views_[i].GetEntityView()); + } + } +} + +void SceneSelection::SelectViews(){ + QueryDialog d; + if (d.exec() == QDialog::Accepted) { + QString query = d.GetQueryString(); + mol::Query q(query.toStdString()); + mol::EntityView union_view = this->GetViewUnion(); + if(union_view.IsValid() && q.IsValid()){ + view_entity_->SetSelection(union_view.Select(q)); + } + } +} + gfx::EntityP SceneSelection::GetViewEntity() const{ return view_entity_; } diff --git a/modules/gui/src/scene_selection.hh b/modules/gui/src/scene_selection.hh index 079b25a96..f6c7c84c8 100644 --- a/modules/gui/src/scene_selection.hh +++ b/modules/gui/src/scene_selection.hh @@ -46,8 +46,12 @@ public slots: void Delete(); void CopyViews(); void Select(); + void Deselect(); void Show(); void Hide(); + void SelectAllViews(); + void DeselectAllViews(); + void SelectViews(); void MakeVisible(); void MakeHidden(); void ShowExclusive(); diff --git a/modules/gui/src/scene_win/context_menu.cc b/modules/gui/src/scene_win/context_menu.cc index a43816cd1..748d194bd 100644 --- a/modules/gui/src/scene_win/context_menu.cc +++ b/modules/gui/src/scene_win/context_menu.cc @@ -19,12 +19,15 @@ /* Authors: Stefan Scheuber */ +#include <boost/pointer_cast.hpp> + #include <QAction> #include <QMenu> #include <QItemSelection> #include <QItemSelectionModel> #include <ost/gui/scene_selection.hh> +#include <ost/gui/query_dialog.hh> #include "custom_part_node.hh" #include "entity_node.hh" @@ -95,8 +98,12 @@ void ContextMenu::ShowMenu(const QPoint& pos) if(all_entities){ action = menu->addAction("Copy"); connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(CopyViews())); - action = menu->addAction("Select"); + action = menu->addAction("Create Custom View"); + connect(action, SIGNAL(triggered()), this, SLOT(AddViewFromEntity())); + action = menu->addAction("Select.."); connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(Select())); + action = menu->addAction("Deselect"); + connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(Deselect())); } if(all_not_scene){ @@ -127,6 +134,15 @@ void ContextMenu::ShowMenu(const QPoint& pos) action = menu->addAction("Hide Exclusive"); connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(HideExclusive())); + action = menu->addAction("Select All"); + connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(SelectAllViews())); + + action = menu->addAction("Deselect All"); + connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(DeselectAllViews())); + + action = menu->addAction("Select.."); + connect(action, SIGNAL(triggered()), SceneSelection::Instance(), SLOT(SelectViews())); + action = menu->addAction("Create Custom View"); connect(action, SIGNAL(triggered()), this, SLOT(AddView())); @@ -150,6 +166,30 @@ void ContextMenu::ShowMenu(const QPoint& pos) } } +void ContextMenu::AddViewFromEntity() { + QueryDialog d; + if (d.exec() == QDialog::Accepted) { + QString query = d.GetQueryString(); + int node_count = SceneSelection::Instance()->GetActiveNodeCount(); + for(int i = 0; i < node_count; i++){ + gfx::GfxNodeP node = SceneSelection::Instance()->GetActiveNode(i); + if (node) { + EntityNode* ent_node = qobject_cast<EntityNode*>(model_->FindGfxNode(node)); + if (ent_node) { + mol::Query q(query.toStdString()); + if (q.IsValid()) { + gfx::EntityP entity = boost::dynamic_pointer_cast<gfx::Entity>(ent_node->GetGfxNode()); + if(entity){ + CustomPartNode* child_node = new CustomPartNode("New View", entity, mol::QueryViewWrapper(q,entity->GetView()),ent_node->GetCustomViewNode()); + model_->AddNode(ent_node->GetCustomViewNode(),child_node); + } + } + } + } + } + } +} + void ContextMenu::AddView(){ gfx::EntityP entity = SceneSelection::Instance()->GetViewEntity(); diff --git a/modules/gui/src/scene_win/context_menu.hh b/modules/gui/src/scene_win/context_menu.hh index 28a1dab0f..953cdf5a7 100644 --- a/modules/gui/src/scene_win/context_menu.hh +++ b/modules/gui/src/scene_win/context_menu.hh @@ -42,6 +42,7 @@ public: void Rename(QModelIndex index); private slots: + void AddViewFromEntity(); void AddView(); void Rename(); void DeleteView(); diff --git a/modules/gui/src/scene_win/entity_node.cc b/modules/gui/src/scene_win/entity_node.cc index a133a67b2..56d238430 100644 --- a/modules/gui/src/scene_win/entity_node.cc +++ b/modules/gui/src/scene_win/entity_node.cc @@ -48,9 +48,12 @@ EntityNode::EntityNode(gfx::EntityP& entity, SceneNode* parent): SceneNode* node = new EntityPartNode("Backbone", entity, mol::QueryViewWrapper(entity->GetView().Select("aname=CA,C,N,O and peptide=true")), quick_selection); model->AddNode(quick_selection, node); + node = new EntityPartNode("Sidechains", entity, mol::QueryViewWrapper(entity->GetView().Select("aname!=CA,C,N,O and peptide=true")), quick_selection); + model->AddNode(quick_selection, node); node = new EntityPartNode("Ligands", entity, mol::QueryViewWrapper(entity->GetView().Select("ishetatm=1 and ele=C")), quick_selection); model->AddNode(quick_selection, node); + custom_view_ = new LabelNode("Custom Views", this); model->AddNode(this, custom_view_); -- GitLab