From 258f190d5f8e9bd3283f377e784fe1f6ca2d8136 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Mon, 19 Apr 2010 09:33:20 +0000
Subject: [PATCH] Added tmalign Action to SceneWin context menu

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2043 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gui/pymod/CMakeLists.txt       |  1 +
 modules/gui/pymod/export_scene_win.cc  | 58 ++++++++++++++++++++++++++
 modules/gui/pymod/init_context_menu.py | 37 ++++++++++++++++
 modules/gui/pymod/init_spacenav.py     |  7 +---
 modules/gui/pymod/scene_win_proxy.hh   |  5 +++
 modules/gui/src/scene_win/scene_win.cc |  3 ++
 modules/gui/src/scene_win/scene_win.hh |  2 +
 scripts/init.py                        |  2 +
 8 files changed, 110 insertions(+), 5 deletions(-)
 create mode 100644 modules/gui/pymod/init_context_menu.py

diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt
index 986a40130..d47435b61 100644
--- a/modules/gui/pymod/CMakeLists.txt
+++ b/modules/gui/pymod/CMakeLists.txt
@@ -74,6 +74,7 @@ endif()
 
 set(OST_GUI_PYMOD_MODULES
   __init__.py
+  init_context_menu.py
   init_menubar.py
   init_spacenav.py
 )
diff --git a/modules/gui/pymod/export_scene_win.cc b/modules/gui/pymod/export_scene_win.cc
index 1f32c836b..f9d344bf5 100644
--- a/modules/gui/pymod/export_scene_win.cc
+++ b/modules/gui/pymod/export_scene_win.cc
@@ -16,20 +16,78 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+#include <QAction>
+
 #include <boost/python.hpp>
 
 #include "scene_win_proxy.hh"
 
+#include <ost/gui/scene_win/context_menu.hh>
+
 using namespace boost::python;
 using namespace ost;
 using namespace ost::gui;
 
+namespace {
+
+void context_menu_add_action(ContextMenu* cm, object action, int types)
+{
+  static object sip_module=import("sip");
+  static object gui_module=import("ost.gui");
+  static object pyqt4_module=import("PyQt4.QtCore");
+
+  unsigned long addr = extract<unsigned long>(sip_module.attr("unwrapinstance")(action));
+  QAction* act = reinterpret_cast<QAction*>(addr);
+  if(act){
+    ContextActionTypes type = ContextActionTypes(types);
+    cm->AddAction(act,type);
+  }
+}
+
+object context_menu_get_qobject(ContextMenu* cm)
+{
+  static object sip_module=import("sip");
+  static object pyqt4_module=import("PyQt4.QtCore");
+  size_t addr = reinterpret_cast<size_t>(cm);
+  object obj(addr);
+  object sip_handle=obj;
+  object qobject = pyqt4_module.attr("QObject");
+  object object = sip_module.attr("wrapinstance")(sip_handle, qobject);
+
+  return object;
+}
+
+
+}
 
 void export_SceneWin()
 {
+  enum_<ContextActionType>("ContextActionType")
+      .value("GFX_OBJECT", GFX_OBJECT)
+      .value("ENTITY", ENTITY)
+      .value("ENTITY_VIEW", ENTITY_VIEW)
+      .value("CUSTOM_VIEW", CUSTOM_VIEW)
+      .value("NOT_VISIBLE", NOT_VISIBLE)
+      .value("NOT_HIDDEN", NOT_HIDDEN)
+      .value("NOT_SCENE", NOT_SCENE)
+      .value("SINGLE", SINGLE)
+#if OST_IMG_ENABLED
+      .value("MAP", MAP)
+#endif
+      .export_values()
+      ;
+
+  class_<ContextMenu, boost::noncopyable>("ContextMenu", no_init)
+    .def("AddAction", &context_menu_add_action)
+    .def("GetQObject", &context_menu_get_qobject)
+    .add_property("qobject",&context_menu_get_qobject)
+  ;
+
   class_<SceneWinProxy, bases<SipHandlerBase> >("SceneWin")
     .def("Show", &SceneWinProxy::Show)
     .def("Hide", &SceneWinProxy::Hide)
+    .def("GetContextMenu", &SceneWinProxy::GetContextMenu, return_value_policy<reference_existing_object>())
   ;
+
 }
 
diff --git a/modules/gui/pymod/init_context_menu.py b/modules/gui/pymod/init_context_menu.py
new file mode 100644
index 000000000..b77fbe142
--- /dev/null
+++ b/modules/gui/pymod/init_context_menu.py
@@ -0,0 +1,37 @@
+from PyQt4 import QtCore, QtGui
+
+from ost import geom, gfx, gui
+from ost import settings
+from ost.bindings import tmtools
+  
+class AlignmentContextMenu(QtCore.QObject):
+  def __init__(self, context_menu):
+    try:
+      settings.Locate('tmalign')
+      QtCore.QObject.__init__(self, context_menu.qobject)
+
+      self.action = QtGui.QAction("Align", self)
+      QtCore.QObject.connect(self.action,QtCore.SIGNAL("triggered()"), self.Align)
+      context_menu.AddAction(self.action, gui.ContextActionType.ENTITY)
+    except FileNotFound:
+      return
+    
+  def Align(self):
+    scene_selection = gui.SceneSelection.Instance()
+    if scene_selection.GetActiveNodeCount() >= 2:
+      node = scene_selection.GetActiveNode(0)
+      if isinstance(node, gfx.Entity):
+        ref = node.view.handle
+        for i in range(1,scene_selection.GetActiveNodeCount()):
+          node = scene_selection.GetActiveNode(i)
+          if isinstance(node, gfx.Entity):
+            print tmtools.TMAlign(node.view.handle, ref)
+            node.UpdatePositions()
+          
+      
+      
+      
+
+def _InitContextMenu():
+  cm=gui.GostyApp.Instance().GetSceneWin().GetContextMenu()
+  AlignmentContextMenu(cm)
\ No newline at end of file
diff --git a/modules/gui/pymod/init_spacenav.py b/modules/gui/pymod/init_spacenav.py
index 870d7aace..5ca0f3083 100644
--- a/modules/gui/pymod/init_spacenav.py
+++ b/modules/gui/pymod/init_spacenav.py
@@ -1,9 +1,6 @@
-from PyQt4 import QtCore, QtGui
+from PyQt4 import QtCore
 
-from ost import geom, gfx, gui
-
-import sys, random
-import sip
+from ost import gfx, gui
 
 class SpacenavControl(QtCore.QObject):
   def __init__(self, spnav,
diff --git a/modules/gui/pymod/scene_win_proxy.hh b/modules/gui/pymod/scene_win_proxy.hh
index 5ef13f63d..58c5d5a3f 100644
--- a/modules/gui/pymod/scene_win_proxy.hh
+++ b/modules/gui/pymod/scene_win_proxy.hh
@@ -40,6 +40,11 @@ public:
   {
     return Me()->hide();
   }
+
+  ContextMenu* GetContextMenu()
+  {
+    return Me()->GetContextMenu();
+  }
 };
 
 }}
diff --git a/modules/gui/src/scene_win/scene_win.cc b/modules/gui/src/scene_win/scene_win.cc
index fb9045bab..213582ff6 100644
--- a/modules/gui/src/scene_win/scene_win.cc
+++ b/modules/gui/src/scene_win/scene_win.cc
@@ -122,6 +122,9 @@ void SceneWin::AddView(gfx::EntityP entity, mol::EntityView view){
 
 }
 
+ContextMenu* SceneWin::GetContextMenu(){
+  return context_menu_;
+}
 
 SceneWin::~SceneWin() {
 }
diff --git a/modules/gui/src/scene_win/scene_win.hh b/modules/gui/src/scene_win/scene_win.hh
index 05706c5b6..9761bb1f1 100644
--- a/modules/gui/src/scene_win/scene_win.hh
+++ b/modules/gui/src/scene_win/scene_win.hh
@@ -55,6 +55,8 @@ public:
 
   void AddView(gfx::EntityP entity, mol::EntityView view);
 
+  ContextMenu* GetContextMenu();
+
 public slots:
   void OnSelectionChange(const QItemSelection& sel, const QItemSelection& desel);
 
diff --git a/scripts/init.py b/scripts/init.py
index f3549c69a..2856501fd 100644
--- a/scripts/init.py
+++ b/scripts/init.py
@@ -17,6 +17,7 @@ from PyQt4 import QtGui, QtCore
 from ost.gui.scene.init_inspector import _InitInspector
 from ost.gui.init_menubar import _InitMenuBar
 from ost.gui.init_spacenav import _InitSpaceNav
+from ost.gui.init_context_menu import _InitContextMenu
 
 def _InitRuleBasedBuilder():
   compound_lib_path=os.path.join(ost.GetSharedDataPath(), 'compounds.chemlib')
@@ -51,6 +52,7 @@ def _InitFrontEnd():
   _InitPanels(app, app.perspective.panels)
   _InitMenuBar(app.perspective.GetMenuBar())
   _InitSpaceNav(app.perspective.panels.qwidget)
+  _InitContextMenu()
   main_area.AddPersistentWidget("3D Scene", "gl_win" , app.gl_win, int(QtCore.Qt.WindowMaximized))
   app.perspective.Restore()
   additional_modules=getattr(__main__, 'ADDITIONAL_GUI_MODULES', [])
-- 
GitLab