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