diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt index b39ad8df5680223ca81c28f708ac623d42dcdbbd..c3836e575cdd0eeff8f7cd3192e559e6ce68aa37 100644 --- a/modules/gui/pymod/CMakeLists.txt +++ b/modules/gui/pymod/CMakeLists.txt @@ -40,6 +40,7 @@ preset_editor_widget.py preset_info_handler.py preset_list_model.py preset_widget.py +render_mode_widget.py render_options_widget.py scene_observer_impl.py simple_widget.py diff --git a/modules/gui/pymod/export_scene_selection.cc b/modules/gui/pymod/export_scene_selection.cc index 239826abaf0f2a2d4e0708274d7415d1dba586bb..c44a0d4db9dba2f3747ace70afbc887b06383484 100644 --- a/modules/gui/pymod/export_scene_selection.cc +++ b/modules/gui/pymod/export_scene_selection.cc @@ -32,6 +32,7 @@ void export_SceneSelection() return_value_policy<reference_existing_object>()).staticmethod("Instance") .def("GetActiveNodeCount",&SceneSelection::GetActiveNodeCount) .def("GetActiveNode",&SceneSelection::GetActiveNode) + .def("GetViewEntity", &SceneSelection::GetViewEntity) .def("GetActiveViewCount", &SceneSelection::GetActiveViewCount) .def("GetActiveView", &SceneSelection::GetActiveView) ; diff --git a/modules/gui/pymod/scene/color_options_widget.py b/modules/gui/pymod/scene/color_options_widget.py index 94256db1b16c199fbff8f335f3fb0be604a4a83e..0e165a237006e5398c87e1110848416a1ff67778 100644 --- a/modules/gui/pymod/scene/color_options_widget.py +++ b/modules/gui/pymod/scene/color_options_widget.py @@ -37,7 +37,7 @@ class ColorOptionsWidget(ComboOptionsWidget): #Add options to menu options = { "Color by Property":GradientEditor(self), - "Color by Element":LabelWithMode("Color by Element"), + "Color by Element":ByElementWidget("Color by Element"), "Uniform":UniformColorWidget(self), "Presets":PresetWidget(self) } @@ -48,27 +48,31 @@ class ColorOptionsWidget(ComboOptionsWidget): self.setMinimumSize(250,200) def DoSomething(self, item): - if hasattr(self, "entities_") and isinstance(self.entities_, list): - item.ChangeColor() + scene_selection = gui.SceneSelection.Instance() + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + item.ChangeColor(node) self.DoResize() def Update(self): - enable = False - if hasattr(self, "entities_") and isinstance(self.entities_, list): - for entity in self.entities_: - if isinstance(entity, gfx.Entity) or isinstance(entity, gfx.Surface): - enable = True - else: - enable = False - break - ComboOptionsWidget.setEnabled(self,enable) + ComboOptionsWidget.setEnabled(self,True) + scene_selection = gui.SceneSelection.Instance() + if scene_selection.GetActiveNodeCount() == 0: + ComboOptionsWidget.setEnabled(self,False) + return + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + if not isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface): + ComboOptionsWidget.setEnabled(self,False) + return + def GetText(self): return self.text_ -#Helper Class which contains the rendering mode -class LabelWithMode(QtGui.QWidget): + +class ByElementWidget(QtGui.QWidget): def __init__(self, text, parent=None): QtGui.QLabel.__init__(self, parent) @@ -88,17 +92,12 @@ class LabelWithMode(QtGui.QWidget): self.setMinimumSize(250,60) def Update(self): - True #Do Nothing + pass #Do Nothing - def SetEntities(self,entities): - self.entities_ = entities - - def ChangeColor(self): - if self.text_ == "Color by Element": - for entity in self.entities_: - if isinstance(entity, gfx.Entity): - entity.CleanColorOps() - entity.ColorByElement() + def ChangeColor(self, node): + if isinstance(node, gfx.Entity): + node.CleanColorOps() + node.ColorByElement() def GetText(self): return self.text_ diff --git a/modules/gui/pymod/scene/combo_options_widget.py b/modules/gui/pymod/scene/combo_options_widget.py index 1794a70622f9c527a7391614008d6b66a20401a3..251861d6a2f75bb75effc3e8299e72a851a8de8a 100644 --- a/modules/gui/pymod/scene/combo_options_widget.py +++ b/modules/gui/pymod/scene/combo_options_widget.py @@ -76,16 +76,19 @@ class ComboOptionsWidget(QtGui.QWidget): else: string = QtCore.QString(ident) - index = self.__GetIndex(ident) - if(index >= 0): - self.stacked_widget_.removeWidget(self.combo_box_.itemData(index).toPyObject()[1]) - self.combo_box_.removeItem(index) + self.RemoveWidget(ident) self.stacked_widget_.addWidget(widget) qpair = ident, widget self.combo_box_.addItem(string, QtCore.QVariant(qpair)) return True return False + def RemoveWidget(self,ident): + index = self.__GetIndex(ident) + if(index >= 0): + self.stacked_widget_.removeWidget(self.combo_box_.itemData().toPyObject()[1]) + self.combo_box_.removeItem(index) + def DoSomething(self, item): """This abstract method is called whenever the View is updated. @@ -93,16 +96,7 @@ class ComboOptionsWidget(QtGui.QWidget): It can be used to do something ;-) whenever the combobox changes its value. """ raise NotImplementedError, "Subclasses must define DoSomething()" - - def SetEntities(self, entities): - """Set entity. - This method sets the given entity as current entity. If no entity is set, the Options Widget is disabled. - """ - self.entities_ = entities - for i in range(self.combo_box_.count()): - self.combo_box_.itemData(i).toPyObject()[1].SetEntities(self.entities_) - def ChangeSelectedItem(self, ident): """Change Current Selected Item. diff --git a/modules/gui/pymod/scene/cpk_widget.py b/modules/gui/pymod/scene/cpk_widget.py index 678bc6ff25464f3d166076a2015fbc0474fdc659..5f6c7de3c5206bed6490293133b8b6ac69f14221 100644 --- a/modules/gui/pymod/scene/cpk_widget.py +++ b/modules/gui/pymod/scene/cpk_widget.py @@ -21,11 +21,12 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget #CPK Render Options -class CPKWidget(QtGui.QWidget): +class CPKWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Spheres" @@ -35,7 +36,7 @@ class CPKWidget(QtGui.QWidget): max_sphere_detail = 20 #Set Render Mode - self.mode = gfx.RenderMode.CPK + self.mode_ = gfx.RenderMode.CPK #Create Ui elements @@ -54,22 +55,18 @@ class CPKWidget(QtGui.QWidget): grid.setRowStretch(2,1) self.setLayout(grid) - self.options_ = gfx.CPKRenderOptions() QtCore.QObject.connect(self.sphere_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSphereDetail) self.setMinimumSize(250,60) def UpdateSphereDetail(self, value): - self.options_.SetSphereDetail(value) + self.GetOptions().SetSphereDetail(value) - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.CPK) - if self.options_ != new_options: - self.options_ = new_options - self.sphere_spinbox_.setValue(self.options_.GetSphereDetail()) - - def SetEntities(self, entities): - self.entities_ = entities + def UpdateGui(self,options): + self.sphere_spinbox_.setValue(options.GetSphereDetail()) def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/custom_widget.py b/modules/gui/pymod/scene/custom_widget.py index 2a7adc59bfd27e6ec54beabee728ef77bd6b2f4b..5699c4ea940ca6e2499e24241d0c7c64daeb3020 100644 --- a/modules/gui/pymod/scene/custom_widget.py +++ b/modules/gui/pymod/scene/custom_widget.py @@ -21,11 +21,12 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget #Custom Render Options -class CustomWidget(QtGui.QWidget): +class CustomWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Ball & Stick" @@ -38,7 +39,7 @@ class CustomWidget(QtGui.QWidget): max_arc_detail = 20 #Set Render Mode - self.mode = gfx.RenderMode.CUSTOM + self.mode_ = gfx.RenderMode.CUSTOM #Create Ui elements @@ -63,27 +64,25 @@ class CustomWidget(QtGui.QWidget): grid.setRowStretch(3,1) self.setLayout(grid) - self.options_ = gfx.CustomRenderOptions() QtCore.QObject.connect(self.sphere_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSphereDetail) QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail) self.setMinimumSize(250,90) def UpdateSphereDetail(self, value): - self.options_.SetSphereDetail(value) + self.GetOptions().SetSphereDetail(value) + self.ApplyOptions() def UpdateArcDetail(self, value): - self.options_.SetArcDetail(value) + self.GetOptions().SetArcDetail(value) + self.ApplyOptions() - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.CUSTOM) - if self.options_ != new_options: - self.options_ = new_options - self.sphere_spinbox_.setValue(self.options_.GetSphereDetail()) - self.arc_spinbox_.setValue(self.options_.GetArcDetail()) - - def SetEntities(self, entities): - self.entities_ = entities + def UpdateGui(self,options): + self.sphere_spinbox_.setValue(options.GetSphereDetail()) + self.arc_spinbox_.setValue(options.GetArcDetail()) def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/gradient_editor_widget.py b/modules/gui/pymod/scene/gradient_editor_widget.py index 9197725023eb9d6aab2fbf9fe45fd7e169b8e80e..2653f22f52d41ef46a1fdab7a6f8a3573d223ed4 100644 --- a/modules/gui/pymod/scene/gradient_editor_widget.py +++ b/modules/gui/pymod/scene/gradient_editor_widget.py @@ -66,21 +66,17 @@ class GradientEditor(QtGui.QWidget): self.setMinimumSize(250,300) def Update(self): - if hasattr(self, "entities_") and isinstance(self.entities_, list): - for entity in self.entities_: - if isinstance(entity, gfx.Entity) or isinstance(entity, gfx.Surface): - entity.CleanColorOps() - entity.ColorBy(self.props[self.prop_combo_box_.currentIndex()], - self.gradient_edit_.GetGfxGradient()) + scene_selection = gui.SceneSelection.Instance() + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + self.ChangeColor(node) - def ChangeColor(self): - self.Update() + def ChangeColor(self,node): + if isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface): + node.CleanColorOps() + node.ColorBy(self.props[self.prop_combo_box_.currentIndex()], + self.gradient_edit_.GetGfxGradient()) - def SetEntities(self, entities): - self.entities_ = entities - - - #Gradient Preview class GradientPreview(QtGui.QWidget): def __init__(self, parent=None): @@ -112,9 +108,6 @@ class GradientPreview(QtGui.QWidget): size.width() - 2 * self.border_offset_, self.preview_height_) paint.end() - - def __del__(self): - print "Deconstruct Preview" #Gradient Edit class GradientEdit(QtGui.QWidget): @@ -220,9 +213,6 @@ class GradientEdit(QtGui.QWidget): s.SetPos(s.GetPos() * factor) self.UpdateGradient() self.width_ = event.size().width() - - def __del__(self): - print "Deconstruct Edit" #Gradient Stop class GradientStop(ColorSelectWidget): diff --git a/modules/gui/pymod/scene/hsc_widget.py b/modules/gui/pymod/scene/hsc_widget.py index 57e83dd2b32761948818ed90aa0a8cc6c8d42321..814cf9ef637a9b6567c0c91d22bd8cd941fb3ee6 100644 --- a/modules/gui/pymod/scene/hsc_widget.py +++ b/modules/gui/pymod/scene/hsc_widget.py @@ -21,18 +21,18 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui - +from render_mode_widget import RenderModeWidget #Tube Render Options -class HSCWidget(QtGui.QWidget): +class HSCWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Helix & Strand Cartoon" #Set Render Mode - self.mode = gfx.RenderMode.HSC + self.mode_ = gfx.RenderMode.HSC #Defaults min_spline_detail = 1 @@ -240,7 +240,6 @@ class HSCWidget(QtGui.QWidget): grid.setRowStretch(15,1) self.setLayout(grid) - self.options_ = gfx.CartoonRenderOptions() QtCore.QObject.connect(self.spline_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSplineDetail) QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail) QtCore.QObject.connect(self.poly_mode_cb_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdatePolyMode) @@ -266,83 +265,77 @@ class HSCWidget(QtGui.QWidget): self.setMinimumSize(250,420) #14*30 ########/UI######## - - def SetEntities(self, entities): - self.entities_ = entities - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.HSC) - if self.options_ != new_options: - self.options_ = new_options - self.poly_mode_cb_.setCurrentIndex(self.options_.GetPolyMode()) - self.spline_spinbox_.setValue(self.options_.GetSplineDetail()) - self.arc_spinbox_.setValue(self.options_.GetArcDetail()) - - self.UpdateTubeRadiusGui(self.options_.GetTubeRadius()) - self.UpdateTubeRatioGui(self.options_.GetTubeRatio()) - self.UpdateHelixWidthGui(self.options_.GetHelixWidth()) - self.UpdateHelixThicknessGui(self.options_.GetHelixThickness()) - self.UpdateHelixEccGui(self.options_.GetHelixEcc()) - self.UpdateStrandWidthGui(self.options_.GetStrandWidth()) - self.UpdateStrandThicknessGui(self.options_.GetStrandThickness()) - self.UpdateStrandEccGui(self.options_.GetStrandEcc()) + def UpdateGui(self,options): + self.poly_mode_cb_.setCurrentIndex(options.GetPolyMode()) + self.spline_spinbox_.setValue(options.GetSplineDetail()) + self.arc_spinbox_.setValue(options.GetArcDetail()) + + self.UpdateTubeRadiusGui(options.GetTubeRadius()) + self.UpdateTubeRatioGui(options.GetTubeRatio()) + self.UpdateHelixWidthGui(options.GetHelixWidth()) + self.UpdateHelixThicknessGui(options.GetHelixThickness()) + self.UpdateHelixEccGui(options.GetHelixEcc()) + self.UpdateStrandWidthGui(options.GetStrandWidth()) + self.UpdateStrandThicknessGui(options.GetStrandThickness()) + self.UpdateStrandEccGui(options.GetStrandEcc()) def UpdatePolyMode(self, value): - self.options_.SetPolyMode(value) + self.GetOptions().SetPolyMode(value) def UpdateSplineDetail(self, value): - self.options_.SetSplineDetail(value) + self.GetOptions().SetSplineDetail(value) def UpdateArcDetail(self, value): - self.options_.SetArcDetail(value) + self.GetOptions().SetArcDetail(value) def UpdateTubeRadius(self, value): - self.options_.SetTubeRadius(value) + self.GetOptions().SetTubeRadius(value) def UpdateSliderTubeRadius(self, value): - self.options_.SetTubeRadius(value/10.0) + self.GetOptions().SetTubeRadius(value/10.0) def UpdateTubeRatio(self, value): - self.options_.SetTubeRatio(value) + self.GetOptions().SetTubeRatio(value) def UpdateSliderTubeRatio(self, value): - self.options_.SetTubeRatio(value/10.0) + self.GetOptions().SetTubeRatio(value/10.0) def UpdateHelixWidth(self, value): - self.options_.SetHelixWidth(value) + self.GetOptions().SetHelixWidth(value) def UpdateSliderHelixWidth(self, value): - self.options_.SetHelixWidth(value/10.0) + self.GetOptions().SetHelixWidth(value/10.0) def UpdateHelixThickness(self, value): - self.options_.SetHelixThickness(value) + self.GetOptions().SetHelixThickness(value) def UpdateSliderHelixThickness(self, value): - self.options_.SetHelixThickness(value/10.0) + self.GetOptions().SetHelixThickness(value/10.0) def UpdateHelixEcc(self, value): - self.options_.SetHelixEcc(value) + self.GetOptions().SetHelixEcc(value) def UpdateSliderHelixEcc(self, value): - self.options_.SetHelixEcc(value/10.0) + self.GetOptions().SetHelixEcc(value/10.0) def UpdateStrandWidth(self, value): - self.options_.SetStrandWidth(value) + self.GetOptions().SetStrandWidth(value) def UpdateSliderStrandWidth(self, value): - self.options_.SetStrandWidth(value/10.0) + self.GetOptions().SetStrandWidth(value/10.0) def UpdateStrandThickness(self, value): - self.options_.SetStrandThickness(value) + self.GetOptions().SetStrandThickness(value) def UpdateSliderStrandThickness(self, value): - self.options_.SetStrandThickness(value/10.0) + self.GetOptions().SetStrandThickness(value/10.0) def UpdateStrandEcc(self, value): - self.options_.SetStrandEcc(value) + self.GetOptions().SetStrandEcc(value) def UpdateSliderStrandEcc(self, value): - self.options_.SetStrandEcc(value/10.0) + self.GetOptions().SetStrandEcc(value/10.0) def UpdateTubeRadiusGui(self,value): if(abs(value*10.0 - self.width_tube_slider_.value())>=self.width_tube_spinbox_.singleStep()): @@ -385,4 +378,7 @@ class HSCWidget(QtGui.QWidget): self.ecc_strand_spinbox_.setValue(value) def GetText(self): - return self.text_ \ No newline at end of file + return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/inspector_widget.py b/modules/gui/pymod/scene/inspector_widget.py index 1969d02ee6df4863f95a67b92b96a2fa9507d01f..9f9efb1e42b5df50c933b3e5e9ecdb142ae261cc 100644 --- a/modules/gui/pymod/scene/inspector_widget.py +++ b/modules/gui/pymod/scene/inspector_widget.py @@ -49,7 +49,7 @@ class InspectorWidget(ToolBarOptionsWidget): self.scene_selection_ = gui.SceneSelection.Instance() scenewin = sip.wrapinstance(app.GetSceneWin().GetSipHandle(),QtGui.QWidget) QtCore.QObject.connect(scenewin,QtCore.SIGNAL("ActiveNodesChanged()"), - self.EntitySelectionChanged) + self.ActiveNodesChanged) self.setMinimumSize(250,215) #ToolBarOptionsWidget Method @@ -67,14 +67,8 @@ class InspectorWidget(ToolBarOptionsWidget): def NodeChanged(self, node): ToolBarOptionsWidget.Update(self) - def EntitySelectionChanged(self): - node_count = self.scene_selection_.GetActiveNodeCount() - if(node_count > 0): - entities = list(); - for i in range(node_count): - entities.append(self.scene_selection_.GetActiveNode(i)) - self.SetEntities(entities) - ToolBarOptionsWidget.Update(self) + def ActiveNodesChanged(self): + ToolBarOptionsWidget.Update(self) class InspectorDialog(QtGui.QDialog): def __init__(self, parent=None): diff --git a/modules/gui/pymod/scene/line_trace_widget.py b/modules/gui/pymod/scene/line_trace_widget.py index 8a10a5534f628a6eeca8e9313ac09b13bd012555..1b06bb96d3e2447f9000a04852b85a32eb61ddbd 100644 --- a/modules/gui/pymod/scene/line_trace_widget.py +++ b/modules/gui/pymod/scene/line_trace_widget.py @@ -21,17 +21,18 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget #Simple Render Options -class LineTraceWidget(QtGui.QWidget): +class LineTraceWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Fast Trace" #Set Render Mode - self.mode = gfx.RenderMode.LINE_TRACE + self.mode_ = gfx.RenderMode.LINE_TRACE #Defaults min_line_width = 0.01 @@ -60,7 +61,6 @@ class LineTraceWidget(QtGui.QWidget): grid.setRowStretch(3,1) self.setLayout(grid) - self.options_ = gfx.LineTraceRenderOptions() QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth) @@ -71,20 +71,17 @@ class LineTraceWidget(QtGui.QWidget): self.setMinimumSize(250,90) def UpdateAA(self, value): - self.options_.SetAALines(value) + self.GetOptions().SetAALines(value) def UpdateLineWidth(self, value): - self.options_.SetLineWidth(value) + self.GetOptions().SetLineWidth(value) - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.LINE_TRACE) - if self.options_ != new_options: - self.options_ = new_options - self.aa_rendering_cb_.setChecked(self.options_.GetAALines()) - self.radius_spinbox_.setValue(self.options_.GetLineWidth()) - - def SetEntities(self, entities): - self.entities_ = entities + def UpdateGui(self,options): + self.aa_rendering_cb_.setChecked(options.GetAALines()) + self.radius_spinbox_.setValue(options.GetLineWidth()) def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/preset_widget.py b/modules/gui/pymod/scene/preset_widget.py index 3790ded45d1a121de14ff318bb375b36983c5a4f..590772c2832a0dbf45d2f3623abdd2249c886fbd 100644 --- a/modules/gui/pymod/scene/preset_widget.py +++ b/modules/gui/pymod/scene/preset_widget.py @@ -132,17 +132,17 @@ class PresetWidget(QtGui.QWidget): def Load(self, index): if(index.isValid()): + scene_selection = gui.SceneSelection.Instance() preset=self.list_model_.GetPreset(index) - for entity in self.entities_: - if isinstance(entity, gfx.Entity): - entity.CleanColorOps() - preset.ApplyOn(entity) - - def ChangeColor(self): + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + if isinstance(node, gfx.Entity): + node.CleanColorOps() + preset.ApplyOn(node) + + def ChangeColor(self,node): self.LoadCurrentIndex() - def SetEntities(self, entities): - self.entities_ = entities def Rename(self): if(self.list_view_.currentIndex().isValid()): diff --git a/modules/gui/pymod/scene/render_mode_widget.py b/modules/gui/pymod/scene/render_mode_widget.py new file mode 100644 index 0000000000000000000000000000000000000000..68150543a8e39cea5203021e4977590c3c8a99fe --- /dev/null +++ b/modules/gui/pymod/scene/render_mode_widget.py @@ -0,0 +1,76 @@ +#------------------------------------------------------------------------------ +# This file is part of the OpenStructure project <www.openstructure.org> +# +# Copyright (C) 2008-2010 by the OpenStructure authors +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 3.0 of the License, or (at your option) +# any later version. +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#------------------------------------------------------------------------------ +# -*- coding: utf-8 -*- + +from ost import gui +from ost import gfx +from PyQt4 import QtCore, QtGui + + +#Tube Render Options +class RenderModeWidget(QtGui.QWidget): + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + self.options_ = None + self.entities_ = set() + + def GetText(self): + raise NotImplementedError, "Subclasses must define GetText()" + + def GetRenderMode(self): + raise NotImplementedError, "Subclasses must define GetRenderMode()" + + def UpdateGui(self, options): + pass + + def Update(self): + self.entities_.clear() + + scene_selection = gui.SceneSelection.Instance() + if scene_selection.GetActiveNodeCount() == 0 and scene_selection.GetActiveViewCount() == 0: + ComboOptionsWidget.setEnabled(self,False) + return + + if scene_selection.GetActiveNodeCount() > 0 : + for i in range(0,scene_selection.GetActiveNodeCount()): + entity = scene_selection.GetActiveNode(i) + if isinstance(entity, gfx.Entity): + self.entities_.add(entity) + else: + ComboOptionsWidget.setEnabled(self,False) + return + + if scene_selection.GetActiveViewCount() > 0 : + entity = scene_selection.GetViewEntity() + self.entities_.add(entity) + + for entity in self.entities_: + self.options_=entity.GetOptions(self.GetRenderMode()) + self.entities_.remove(entity) + break + self.UpdateGui(self.options_) + + QtGui.QWidget.setEnabled(self,True) + + def ApplyOptions(self): + for entity in self.entities_: + entity.SetOptions(self.GetRenderMode(),self.options_) + + def GetOptions(self): + return self.options_ \ No newline at end of file diff --git a/modules/gui/pymod/scene/render_options_widget.py b/modules/gui/pymod/scene/render_options_widget.py index 705df4c10e810e295392f7e087a44b74f909f5d4..e7476e5c085b069d14e5c0a398dab1dfe6d34aca 100644 --- a/modules/gui/pymod/scene/render_options_widget.py +++ b/modules/gui/pymod/scene/render_options_widget.py @@ -31,6 +31,7 @@ from sline_widget import SlineWidget from hsc_widget import HSCWidget from trace_widget import TraceWidget from line_trace_widget import LineTraceWidget + class RenderOptionsWidget(ComboOptionsWidget): def __init__(self, parent=None): ComboOptionsWidget.__init__(self, parent) @@ -39,6 +40,7 @@ class RenderOptionsWidget(ComboOptionsWidget): self.text_ = "Render Options" #Add options to menu + ComboOptionsWidget.AddWidget(self, "", EmptyMode()) ComboOptionsWidget.AddWidget(self, gfx.RenderMode.SIMPLE, SimpleWidget(self)) ComboOptionsWidget.AddWidget(self, gfx.RenderMode.CUSTOM, CustomWidget(self)) ComboOptionsWidget.AddWidget(self, gfx.RenderMode.CPK, CPKWidget(self)) @@ -49,60 +51,69 @@ class RenderOptionsWidget(ComboOptionsWidget): ComboOptionsWidget.AddWidget(self, gfx.RenderMode.HSC, HSCWidget(self)) self.setMinimumSize(250,200) + def DoSomething(self, item): - if hasattr(self, "entities_") and isinstance(self.entities_, list): - for entity in self.entities_: - if isinstance(entity, gfx.Entity): - entity.SetRenderMode(item.mode) + scene_selection = gui.SceneSelection.Instance() + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + if isinstance(node, gfx.Entity): + render_mode = item.GetRenderMode() + if render_mode is not None: + node.SetRenderMode(render_mode) + + if(scene_selection.GetActiveViewCount() > 0): + entity = scene_selection.GetViewEntity() + for i in range(0,scene_selection.GetActiveViewCount()): + view = scene_selection.GetActiveView(i) + render_mode = item.GetRenderMode() + if render_mode is not None: + entity.SetRenderMode(item.GetRenderMode(),view,False) + + item.Update() self.DoResize() def Update(self): - enable = False - if hasattr(self, "entities_") and isinstance(self.entities_, list): - entity = self.entities_[0]; - if isinstance(entity, gfx.Entity): - mode = entity.GetRenderMode() - ComboOptionsWidget.ChangeSelectedItem(self,mode) - self.GetCurrentWidget().Update() - for entity in self.entities_: - if isinstance(entity, gfx.Entity): - enable = True + scene_selection = gui.SceneSelection.Instance() + if scene_selection.GetActiveNodeCount() == 0 and scene_selection.GetActiveViewCount() == 0: + ComboOptionsWidget.setEnabled(self,False) + return + + if scene_selection.GetActiveNodeCount() > 0 : + render_mode_valid = True + render_mode = None + for i in range(0,scene_selection.GetActiveNodeCount()): + entity = scene_selection.GetActiveNode(i) + if isinstance(scene_selection.GetActiveNode(i), gfx.Entity): + if render_mode is None: + render_mode = entity.GetRenderMode() + elif render_mode != entity.GetRenderMode(): + render_mode_valid = False + break else: - enable = False - break - ComboOptionsWidget.setEnabled(self,enable) + ComboOptionsWidget.setEnabled(self,False) + return + if(render_mode_valid): + ComboOptionsWidget.ChangeSelectedItem(self,render_mode) + else: + ComboOptionsWidget.ChangeSelectedItem(self,"") + + self.GetCurrentWidget().Update() + + ComboOptionsWidget.setEnabled(self,True) def GetText(self): return self.text_ -#Helper Class which contains the rendering mode and a beautiful label -class LabelWithMode(QtGui.QWidget): - def __init__(self, text, mode, parent=None): +class EmptyMode(QtGui.QWidget): + def __init__(self, parent=None): QtGui.QLabel.__init__(self, parent) - - #Title - self.text_ = text - - #Mode - self.mode = mode - - #UI - textLabel = QtGui.QLabel(text) - font = textLabel.font() - font.setBold(True) - - grid = QtGui.QGridLayout() - grid.addWidget(textLabel,0,0,1,1) - grid.addWidget(QtGui.QLabel("No Settings available"), 1, 0, 1, 3) - grid.setRowStretch(2,1) - self.setLayout(grid) - - def SetEntities(self, entities): - self.entities_ = entities - + self.setMinimumSize(250,30) + def Update(self): True #Do Nothing def GetText(self): - return self.text_ + return "" + def GetRenderMode(self): + return None diff --git a/modules/gui/pymod/scene/simple_widget.py b/modules/gui/pymod/scene/simple_widget.py index c4fbbcb13fbd8963f37d194a55b29083157a6729..958d8bdc746817ace26df5f2507e2a009f0cdf19 100644 --- a/modules/gui/pymod/scene/simple_widget.py +++ b/modules/gui/pymod/scene/simple_widget.py @@ -21,15 +21,16 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget #Simple Render Options -class SimpleWidget(QtGui.QWidget): +class SimpleWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Fast Bonds" - + #Defaults min_line_width = 0.01 max_line_width = 20 @@ -37,7 +38,7 @@ class SimpleWidget(QtGui.QWidget): max_bo_dist = 0.20 #Set Render Mode - self.mode = gfx.RenderMode.SIMPLE + self.mode_ = gfx.RenderMode.SIMPLE #Create Ui elements self.aa_rendering_cb_ = QtGui.QCheckBox() @@ -75,8 +76,7 @@ class SimpleWidget(QtGui.QWidget): grid.addWidget(self.bo_distance_spinbox_, 4,2,1,1) grid.setRowStretch(5,1) self.setLayout(grid) - - self.options_ = gfx.SimpleRenderOptions() + QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth) QtCore.QObject.connect(self.aa_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateAA) QtCore.QObject.connect(self.bo_distance_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateBODistance) @@ -86,28 +86,29 @@ class SimpleWidget(QtGui.QWidget): self.setMinimumSize(250,140) def UpdateAA(self, value): - self.options_.SetAALines(value) + self.GetOptions().SetAALines(value) + self.ApplyOptions() + def UpdateLineWidth(self, value): - self.options_.SetLineWidth(value) + self.GetOptions().SetLineWidth(value) + self.ApplyOptions() def UpdateBO(self, value): - self.options_.SetBondOrderFlag(value) + self.GetOptions().SetBondOrderFlag(value) + self.ApplyOptions() def UpdateBODistance(self, value): - self.options_.SetBondOrderDistance(value) - - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.SIMPLE) - if self.options_ != new_options: - self.options_ = new_options - self.aa_rendering_cb_.setChecked(self.options_.GetAALines()) - self.radius_spinbox_.setValue(self.options_.GetLineWidth()) - self.bo_rendering_cb_.setChecked(self.options_.GetBondOrderFlag()) - self.bo_distance_spinbox_.setValue(self.options_.GetBondOrderDistance()) - - def SetEntities(self, entities): - self.entities_ = entities + self.GetOptions().SetBondOrderDistance(value) + self.ApplyOptions() + def UpdateGui(self,options): + self.aa_rendering_cb_.setChecked(options.GetAALines()) + self.radius_spinbox_.setValue(options.GetLineWidth()) + self.bo_rendering_cb_.setChecked(options.GetBondOrderFlag()) + self.bo_distance_spinbox_.setValue(options.GetBondOrderDistance()) def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ \ No newline at end of file diff --git a/modules/gui/pymod/scene/sline_widget.py b/modules/gui/pymod/scene/sline_widget.py index 9346c203e2d88b75c01a80b4822b44639d9b32c1..e4bffa439c94536081b653b36d09ede09e7eb554 100644 --- a/modules/gui/pymod/scene/sline_widget.py +++ b/modules/gui/pymod/scene/sline_widget.py @@ -21,17 +21,18 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget #Simple Render Options -class SlineWidget(QtGui.QWidget): +class SlineWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Fast Spline" #Set Render Mode - self.mode = gfx.RenderMode.SLINE + self.mode_ = gfx.RenderMode.SLINE #Defaults min_detail = 1 @@ -70,7 +71,6 @@ class SlineWidget(QtGui.QWidget): grid.setRowStretch(4,1) self.setLayout(grid) - self.options_ = gfx.SlineRenderOptions() QtCore.QObject.connect(self.detail_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateDetail) QtCore.QObject.connect(self.aa_rendering_cb_, QtCore.SIGNAL("stateChanged(int)"), self.UpdateAA) QtCore.QObject.connect(self.radius_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLineWidth) @@ -78,25 +78,21 @@ class SlineWidget(QtGui.QWidget): self.setMinimumSize(250,120) def UpdateDetail(self, value): - self.options_.SetSplineDetail(value) + self.GetOptions().SetSplineDetail(value) def UpdateAA(self, value): - self.options_.SetAALines(value) + self.GetOptions().SetAALines(value) def UpdateLineWidth(self, value): - self.options_.SetLineWidth(value) + self.GetOptions().SetLineWidth(value) - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.SLINE) - if self.options_ != new_options: - self.options_ = new_options - self.detail_spinbox_.setValue(self.options_.GetSplineDetail()) - self.aa_rendering_cb_.setChecked(self.options_.GetAALines()) - self.radius_spinbox_.setValue(self.options_.GetLineWidth()) - - - def SetEntities(self, entities): - self.entities_ = entities + def UpdateGui(self,options): + self.detail_spinbox_.setValue(options.GetSplineDetail()) + self.aa_rendering_cb_.setChecked(options.GetAALines()) + self.radius_spinbox_.setValue(options.GetLineWidth()) def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/toolbar_options_widget.py b/modules/gui/pymod/scene/toolbar_options_widget.py index c587e5b2ac8d8d637e5896b2054e43cef69b673b..37c967e0c335cfe9f30ee8b8b5884069d203a4f4 100644 --- a/modules/gui/pymod/scene/toolbar_options_widget.py +++ b/modules/gui/pymod/scene/toolbar_options_widget.py @@ -53,25 +53,19 @@ class ToolBarOptionsWidget(QtGui.QWidget): QtCore.QObject.connect(self.tool_bar_, QtCore.SIGNAL("actionTriggered(QAction*)"), self.ChangeSelectedItem) self.setEnabled(False) - - #Entities - self.entities_ = None - + self.Update() def Update(self): - """Updates the ToolBarOptionsWidget and the active widget of the show area. + """Updates the active widget of the show area. - This method calls the Update method of the active widget. - If no entity is set, the ToolBarOptionsWidget will be disabled + This method calls the Update method of the active widget. """ - if hasattr(self, "entities_") and isinstance(self.entities_, list): - widget = self.__GetCurrentWidget() - if hasattr(widget, "Update"): - self.__GetCurrentWidget().Update() - self.setEnabled(True) - else: - self.setEnabled(False) + self.setEnabled(True) + widget = self.__GetCurrentWidget() + if hasattr(widget, "Update"): + widget.Update() + def AddWidget(self, ident, widget): """Adds a Widget to this Options Widget. @@ -118,17 +112,6 @@ class ToolBarOptionsWidget(QtGui.QWidget): if(hasattr(self.parent_,"DoResize")): self.parent_.DoResize() - def SetEntities(self, entities): - """Set entities. - - This method sets the given entity as current entity. If no entity is set, the Options Widget is disabled. - """ - self.entities_ = entities - for a in self.actions_: - widget = a.data().toPyObject()[1] - if hasattr(widget, "SetEntities"): - widget.SetEntities(self.entities_) - def ChangeSelectedItem(self, action): """Change Current Selected Item. diff --git a/modules/gui/pymod/scene/trace_widget.py b/modules/gui/pymod/scene/trace_widget.py index 30041449bbd96bd2d8b43ebf248b763359e6e335..8fd8a0c16ac09899b8f49ac4fa38e76ba393eeec 100644 --- a/modules/gui/pymod/scene/trace_widget.py +++ b/modules/gui/pymod/scene/trace_widget.py @@ -21,18 +21,18 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui +from render_mode_widget import RenderModeWidget - -#Tube Render Options -class TraceWidget(QtGui.QWidget): +#Trace Render Options +class TraceWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Trace" #Set Render Mode - self.mode = gfx.RenderMode.TRACE + self.mode_ = gfx.RenderMode.TRACE min_arc_detail = 1 max_arc_detail = 20 @@ -73,7 +73,6 @@ class TraceWidget(QtGui.QWidget): grid.setRowStretch(15,1) self.setLayout(grid) - self.options_ = gfx.CartoonRenderOptions() QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail) @@ -84,36 +83,33 @@ class TraceWidget(QtGui.QWidget): QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderTubeRadius) - self.setMinimumSize(250,420) #14*30 + self.setMinimumSize(250,60) #2*30 ########/UI######## + def UpdateGui(self,options): + self.arc_spinbox_.setValue(options.GetArcDetail()) - def SetEntities(self, entities): - self.entities_ = entities - - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.TRACE) - if self.options_ != new_options: - self.options_ = new_options - self.arc_spinbox_.setValue(self.options_.GetArcDetail()) - - self.UpdateTubeRadiusGui(self.options_.GetTubeRadius()) + self.UpdateTubeRadiusGui(options.GetTubeRadius()) def UpdatePolyMode(self, value): - self.options_.SetPolyMode(value) + self.GetOptions().SetPolyMode(value) def UpdateArcDetail(self, value): - self.options_.SetArcDetail(value) + self.GetOptions().SetArcDetail(value) def UpdateTubeRadius(self, value): - self.options_.SetTubeRadius(value) + self.GetOptions().SetTubeRadius(value) def UpdateSliderTubeRadius(self, value): - self.options_.SetTubeRadius(value/10.0) + self.GetOptions().SetTubeRadius(value/10.0) def UpdateTubeRadiusGui(self,value): if(abs(value*10.0 - self.width_tube_slider_.value())>=self.width_tube_spinbox_.singleStep()): self.width_tube_slider_.setValue(value*10.0) self.width_tube_spinbox_.setValue(value) + def GetText(self): - return self.text_ \ No newline at end of file + return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/tube_widget.py b/modules/gui/pymod/scene/tube_widget.py index b70a511d13a820c1d628ed8b349540ca32611785..033d09ea76a74ce255740cb5a95d7c96a219b5fe 100644 --- a/modules/gui/pymod/scene/tube_widget.py +++ b/modules/gui/pymod/scene/tube_widget.py @@ -21,18 +21,18 @@ from ost import gui from ost import gfx from PyQt4 import QtCore, QtGui - +from render_mode_widget import RenderModeWidget #Tube Render Options -class TubeWidget(QtGui.QWidget): +class TubeWidget(RenderModeWidget): def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + RenderModeWidget.__init__(self, parent) #Title self.text_ = "Smooth Tube" #Set Render Mode - self.mode = gfx.RenderMode.TUBE + self.mode_ = gfx.RenderMode.TUBE #Defaults min_spline_detail = 1 @@ -115,7 +115,6 @@ class TubeWidget(QtGui.QWidget): grid.setRowStretch(6,1) self.setLayout(grid) - self.options_ = gfx.CartoonRenderOptions() QtCore.QObject.connect(self.spline_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSplineDetail) QtCore.QObject.connect(self.arc_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateArcDetail) QtCore.QObject.connect(self.poly_mode_cb_, QtCore.SIGNAL("currentIndexChanged(int)"), self.UpdatePolyMode) @@ -125,40 +124,34 @@ class TubeWidget(QtGui.QWidget): QtCore.QObject.connect(self.ratio_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderRatio) self.setMinimumSize(250,200) - - def SetEntities(self, entities): - self.entities_ = entities - def Update(self): - new_options = self.entities_[0].GetOptions(gfx.TUBE) - if self.options_ != new_options: - self.options_ = new_options - self.poly_mode_cb_.setCurrentIndex(self.options_.GetPolyMode()) - self.spline_spinbox_.setValue(self.options_.GetSplineDetail()) - self.arc_spinbox_.setValue(self.options_.GetArcDetail()) - self.UpdateRadiusGui(self.options_.GetTubeRadius()) - self.UpdateRatioGui(self.options_.GetTubeRatio()) + def UpdateGui(self,options): + self.poly_mode_cb_.setCurrentIndex(options.GetPolyMode()) + self.spline_spinbox_.setValue(options.GetSplineDetail()) + self.arc_spinbox_.setValue(options.GetArcDetail()) + self.UpdateRadiusGui(options.GetTubeRadius()) + self.UpdateRatioGui(options.GetTubeRatio()) def UpdatePolyMode(self, value): - self.options_.SetPolyMode(value) + self.GetOptions().SetPolyMode(value) def UpdateSplineDetail(self, value): - self.options_.SetSplineDetail(value) + self.GetOptions().SetSplineDetail(value) def UpdateArcDetail(self, value): - self.options_.SetArcDetail(value) + self.GetOptions().SetArcDetail(value) def UpdateRadius(self, value): - self.options_.SetTubeRadius(value) + self.GetOptions().SetTubeRadius(value) def UpdateSliderRadius(self, value): - self.options_.SetTubeRadius(value/10.0) + self.GetOptions().SetTubeRadius(value/10.0) def UpdateRatio(self, value): - self.options_.SetTubeRatio(value) + self.GetOptions().SetTubeRatio(value) def UpdateSliderRatio(self, value): - self.options_.SetTubeRatio(value/10.0) + self.GetOptions().SetTubeRatio(value/10.0) def UpdateRadiusGui(self,value): if(abs(value*10.0 - self.radius_slider_.value())>=self.radius_spinbox_.singleStep()): @@ -172,3 +165,6 @@ class TubeWidget(QtGui.QWidget): def GetText(self): return self.text_ + + def GetRenderMode(self): + return self.mode_ diff --git a/modules/gui/pymod/scene/uniform_color_widget.py b/modules/gui/pymod/scene/uniform_color_widget.py index a9ab857aa956d2a4918a906be48504f3f42c08a5..15a85313c5853586817115ead3a295f15fcf88c5 100644 --- a/modules/gui/pymod/scene/uniform_color_widget.py +++ b/modules/gui/pymod/scene/uniform_color_widget.py @@ -54,24 +54,22 @@ class UniformColorWidget(QtGui.QWidget): QtCore.QObject.connect(self.color_select_widget_, QtCore.SIGNAL("colorChanged"), self.Update) self.setMinimumSize(250,150) - - def ChangeColor(self): - self.Update() - + def Update(self): - if hasattr(self, "entities_") and isinstance(self.entities_, list): - color = self.color_select_widget_.GetColor() - gfxColor = gfx.Color(color.redF(), - color.greenF(), - color.blueF()) - for entity in self.entities_: - if isinstance(entity, gfx.Entity) or isinstance(entity, gfx.Surface): - entity.CleanColorOps() - entity.SetColor(gfxColor,"") - - def SetEntities(self, entities): - self.entities_ = entities + scene_selection = gui.SceneSelection.Instance() + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + self.ChangeColor(node) + def ChangeColor(self, node): + color = self.color_select_widget_.GetColor() + gfxColor = gfx.Color(color.redF(), + color.greenF(), + color.blueF()) + if isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface): + node.CleanColorOps() + node.SetColor(gfxColor,"") + def resizeEvent(self, event): self.color_select_widget_.SetSize(self.width()/2,self.height()/2)