diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt index 986a401304d365177c0cf4aebd59c833bf7caa65..d47435b61c29e2728be44b670a1bc839f3b0432e 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 1f32c836b226ba3801da183d6bd4cba726c413f5..f9d344bf5fc51cce35df1734e8337f83975f4ddc 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 0000000000000000000000000000000000000000..b77fbe1421961bb2dca6c9470b024ddbee5f1705 --- /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 870d7aaceb3e87feb41f8793648e63ab9e2cc7ea..5ca0f30835508dedbedad77c9b2e482937abf255 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 5ef13f63da16b0e07869d9af8379ce4ecd8d5511..58c5d5a3f8463ef3f982da121641e9f8a90b6e51 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 fb9045babfade67498a804cf8d8e58dcd2f895c5..213582ff632aa1e697fbd193e528a1caccfbf7b3 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 05706c5b676bc1029b973ad0a3f800bd1c6de1c6..9761bb1f1924d01adafc8862c7b1fb0c7566bf2e 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 f3549c69a6898944f6cafdb2f175972594c13e12..2856501fddd9196e19cfe97eaae5d9d148557d83 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', [])