diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt index dabc1930a21bf2ce3b00d52eba3f2508be7a7371..9b1353330c31cd0ca23136381ae83aba2ac43001 100644 --- a/modules/gui/pymod/CMakeLists.txt +++ b/modules/gui/pymod/CMakeLists.txt @@ -45,6 +45,7 @@ render_mode_widget.py render_op.py render_options_widget.py scene_observer_impl.py +scene_selection_helper.py simple_widget.py sline_widget.py toolbar_options_widget.py diff --git a/modules/gui/pymod/scene/color_options_widget.py b/modules/gui/pymod/scene/color_options_widget.py index 11ce3fe29eb3edc70ba5e26c85e21ce1211777d4..36ee59c57e0dae8b28b77f6c5459e10f9cbc7e6f 100644 --- a/modules/gui/pymod/scene/color_options_widget.py +++ b/modules/gui/pymod/scene/color_options_widget.py @@ -30,6 +30,7 @@ except ImportError: pass from PyQt4 import QtCore, QtGui +from scene_selection_helper import SelHelper from gradient_editor_widget import GradientEditor from uniform_color_widget import UniformColorWidget from combo_options_widget import ComboOptionsWidget @@ -70,9 +71,8 @@ class ColorOptionsWidget(ComboOptionsWidget): def Update(self): ComboOptionsWidget.setEnabled(self,True) - scene_selection = gui.SceneSelection.Instance() - if scene_selection.GetActiveNodeCount() == 0 and scene_selection.GetActiveViewCount() == 0: + if SelHelper().CheckAllFlags(SelHelper.NO_SELECTION): ComboOptionsWidget.setEnabled(self,False) return @@ -81,19 +81,11 @@ class ColorOptionsWidget(ComboOptionsWidget): for w in self.img_widgets_: self.RemoveWidget(w[0]) - all_entity = True - all_img = True - for i in range(0,scene_selection.GetActiveNodeCount()): - node = scene_selection.GetActiveNode(i) - if not (isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface)): - all_entity = False - if (not _img_present) or (not isinstance(node, gfx.MapIso)): - all_img = False - if all_img and (not all_entity): + if SelHelper().CheckAllFlags(SelHelper.HAS_IMG | SelHelper.IS_SINGLE): for w in self.img_widgets_: self.AddWidget(w[0], w[1]) - elif all_entity and (not all_img): + elif SelHelper().CheckMinOneFlag(SelHelper.HAS_ENTITY| SelHelper.HAS_VIEW| SelHelper.HAS_SURFACE) and SelHelper().CheckNotFlags(SelHelper.HAS_IMG): for w in self.entity_widgets_: self.AddWidget(w[0], w[1]) else: diff --git a/modules/gui/pymod/scene/color_select_widget.py b/modules/gui/pymod/scene/color_select_widget.py index a02986b7b92d1a6ab4684ff5689a2a8f447169b5..b8de8bf042bf8dc048c9f0ac02406f2734bba49e 100644 --- a/modules/gui/pymod/scene/color_select_widget.py +++ b/modules/gui/pymod/scene/color_select_widget.py @@ -59,11 +59,19 @@ class ColorSelectWidget(QtGui.QWidget): def GetColor(self): return self.color_ + def GetGfxColor(self): + color = self.GetColor() + return gfx.Color(color.redF(), color.greenF(), color.blueF()) + def SetColor(self, color): if(self.color_ != color): self.color_ = color self.emit(QtCore.SIGNAL("colorChanged")) self.update() + + def SetGfxColor(self, color): + qcolor= QtGui.QColor(color.Red()*255,color.Green()*255,color.Blue()*255,color.Alpha()*255) + self.SetColor(qcolor) def paintEvent(self, event): if self.isEnabled(): diff --git a/modules/gui/pymod/scene/combo_options_widget.py b/modules/gui/pymod/scene/combo_options_widget.py index 7fc554da76aa35973f5af9599ca11dc7315d6c96..b84630cc1bfd94f42b15d5f09904e73fada359d1 100644 --- a/modules/gui/pymod/scene/combo_options_widget.py +++ b/modules/gui/pymod/scene/combo_options_widget.py @@ -103,7 +103,9 @@ class ComboOptionsWidget(QtGui.QWidget): self.__UpdateView(None) def GetCurrentWidget(self): - return self.__GetCurrentPair()[1] + if(self.combo_box_.currentIndex() >= 0): + return self.__GetCurrentPair()[1] + return None def DoResize(self): item = self.GetCurrentWidget() diff --git a/modules/gui/pymod/scene/inspector_widget.py b/modules/gui/pymod/scene/inspector_widget.py index 057a9c6b8d8efed0eabccb2fb2302c6ddcb4b989..da6cf265a4a9bf6d6a1e53a7dcccb07151cc1f79 100644 --- a/modules/gui/pymod/scene/inspector_widget.py +++ b/modules/gui/pymod/scene/inspector_widget.py @@ -29,6 +29,7 @@ from render_options_widget import RenderOptionsWidget from color_options_widget import ColorOptionsWidget from ost.gui.scene.scene_observer_impl import SceneObserverImpl from map_level_widget import AdditionalSettingsWidget +from scene_selection_helper import SelHelper class InspectorWidget(ToolBarOptionsWidget): ICONS_PATH = os.path.join(ost.GetSharedDataPath(), "scene", "icons/") @@ -58,15 +59,19 @@ class InspectorWidget(ToolBarOptionsWidget): #Observer Methods def NodeRemoved(self, node): + SelHelper().Update() ToolBarOptionsWidget.Update(self) def RenderModeChanged(self, node): + SelHelper().Update() ToolBarOptionsWidget.Update(self) def NodeChanged(self, node): + SelHelper().Update() ToolBarOptionsWidget.Update(self) def ActiveNodesChanged(self): + SelHelper().Update() ToolBarOptionsWidget.Update(self) class InspectorDialog(QtGui.QDialog): diff --git a/modules/gui/pymod/scene/render_options_widget.py b/modules/gui/pymod/scene/render_options_widget.py index 1d65fc87500addfb0757d5babfa28a786ef66b4e..105fcb0963b25b094c1f70b162273a4b8b0a989a 100644 --- a/modules/gui/pymod/scene/render_options_widget.py +++ b/modules/gui/pymod/scene/render_options_widget.py @@ -29,6 +29,7 @@ except ImportError: _img_present=False pass from PyQt4 import QtCore, QtGui +from scene_selection_helper import SelHelper from combo_options_widget import ComboOptionsWidget from custom_widget import CustomWidget from cpk_widget import CPKWidget @@ -73,6 +74,7 @@ class RenderOptionsWidget(ComboOptionsWidget): self.img_widgets_.append([gfx.RenderMode.SIMPLE, WireframeWidget()]) self.img_widgets_.append([gfx.RenderMode.FILL, EmptyMode("Fill",gfx.RenderMode.FILL)]) + self._in_view_method = False self.setMinimumSize(250,200) def DoSomething(self, item): @@ -86,11 +88,10 @@ class RenderOptionsWidget(ComboOptionsWidget): 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,self.keep_action_.isChecked()) + view = scene_selection.GetViewUnion() + render_mode = item.GetRenderMode() + if render_mode is not None: + entity.SetRenderMode(item.GetRenderMode(),view,self.keep_action_.isChecked()) item.Update() self.DoResize() @@ -98,47 +99,60 @@ class RenderOptionsWidget(ComboOptionsWidget): def Update(self): if hasattr(self, "keep_button_"): self.keep_button_.setEnabled(True) - scene_selection = gui.SceneSelection.Instance() - if scene_selection.GetActiveNodeCount() == 0 and scene_selection.GetActiveViewCount() == 0: + + ComboOptionsWidget.setEnabled(self,True) + + cur_widget = self.GetCurrentWidget() + new_render_mode = None + if cur_widget is not None: + new_render_mode = cur_widget.GetRenderMode() + + if SelHelper().CheckAllFlags(SelHelper.NO_SELECTION): ComboOptionsWidget.setEnabled(self,False) return + if not self._in_view_method: + for w in self.entity_widgets_: + self.RemoveWidget(w[0]) + for w in self.img_widgets_: + self.RemoveWidget(w[0]) + + scene_selection = gui.SceneSelection.Instance() if scene_selection.GetActiveNodeCount() > 0 : if hasattr(self, "keep_button_"): self.keep_button_.setEnabled(False) render_mode_valid = True - all_entity = True - all_img = True render_mode = None for i in range(0,scene_selection.GetActiveNodeCount()): node = scene_selection.GetActiveNode(i) - if not isinstance(node, gfx.Entity): - all_entity = False - if (not _img_present) or (not isinstance(node, gfx.MapIso)): - all_img = False if isinstance(scene_selection.GetActiveNode(i), gfx.GfxObj): if render_mode is None: render_mode = node.GetRenderMode() elif render_mode != node.GetRenderMode(): render_mode_valid = False - if all_img and (not all_entity): - for w in self.img_widgets_: - self.AddWidget(w[0], w[1]) - elif all_entity and (not all_img): + + if SelHelper().CheckFlags(SelHelper.HAS_IMG | SelHelper.IS_SINGLE): + for w in self.img_widgets_: + self.AddWidget(w[0], w[1]) + elif SelHelper().CheckMinOneFlag(SelHelper.HAS_ENTITY| SelHelper.HAS_VIEW) and SelHelper().CheckNotFlags(SelHelper.HAS_IMG): + if not self._in_view_method: for w in self.entity_widgets_: self.AddWidget(w[0], w[1]) - else: - ComboOptionsWidget.setEnabled(self,False) - return + else: + ComboOptionsWidget.setEnabled(self,False) + return + + if SelHelper().CheckMinOneFlag(SelHelper.HAS_ENTITY| SelHelper.HAS_IMG) and SelHelper().CheckNotFlags(SelHelper.HAS_VIEW): if(render_mode_valid): ComboOptionsWidget.ChangeSelectedItem(self,render_mode) else: ComboOptionsWidget.ChangeSelectedItem(self,"") - + else: + if not self._in_view_method: + self._in_view_method = True + ComboOptionsWidget.ChangeSelectedItem(self,new_render_mode) self.GetCurrentWidget().Update() - - ComboOptionsWidget.setEnabled(self,True) - + def GetText(self): return self.text_ diff --git a/modules/gui/pymod/scene/scene_selection_helper.py b/modules/gui/pymod/scene/scene_selection_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..43b0584264acb22ef8820f0a29316625a32efc50 --- /dev/null +++ b/modules/gui/pymod/scene/scene_selection_helper.py @@ -0,0 +1,99 @@ +#------------------------------------------------------------------------------ +# 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 +#------------------------------------------------------------------------------ + +import sys +from ost import gui +import sip +from ost import gfx +import ost +import os +try: + from ost import img + _img_present=True +except ImportError: + _img_present=False + pass + +class SelHelper(): + __shared_state = {} + + NO_SELECTION = 0 + HAS_ENTITY = 1 + HAS_VIEW = 2 + HAS_IMG = 4 + HAS_SURFACE = 8 + IS_SINGLE = 16 + IS_MULTI = 32 + + def __init__(self): + self.__dict__ = self.__shared_state + if not '_ready' in dir(self): + self.scene_sel_ = gui.SceneSelection.Instance() + self.current_flags_ = 0 + self._ready = True + + def Update(self): + self.current_flags_ = 0 + if self.scene_sel_.GetActiveNodeCount() == 0 and self.scene_sel_.GetActiveViewCount() == 0: + return + + for i in range(0,self.scene_sel_.GetActiveNodeCount()): + node = self.scene_sel_.GetActiveNode(i) + if isinstance(node, gfx.Entity): + self.current_flags_ = self.current_flags_ | SelHelper.HAS_ENTITY + if isinstance(node, gfx.Surface): + self.current_flags_ = self.current_flags_ | SelHelper.HAS_SURFACE + if (_img_present) and isinstance(node, gfx.MapIso): + self.current_flags_ = self.current_flags_ | SelHelper.HAS_IMG + + if self.scene_sel_.GetActiveViewCount() > 0: + self.current_flags_ = self.current_flags_ | SelHelper.HAS_VIEW + + cnt = 0 + if self.current_flags_ & SelHelper.HAS_ENTITY: + cnt += 1 + if self.current_flags_ & SelHelper.HAS_SURFACE: + cnt += 1 + if self.current_flags_ & SelHelper.HAS_IMG: + cnt += 1 + if self.current_flags_ & SelHelper.HAS_VIEW: + cnt += 1 + + if cnt == 1: + self.current_flags_ = self.current_flags_ | SelHelper.IS_SINGLE + elif cnt > 1: + self.current_flags_ = self.current_flags_ | SelHelper.IS_MULTI + + def CheckAllFlags(self, flags): + if(flags == self.current_flags_ & flags) and (flags == self.current_flags_ | flags): + return True + return False + + def CheckNotFlags(self, flags): + return not self.CheckFlags(flags) + + def CheckFlags(self, flags): + if(flags == self.current_flags_ & flags): + return True + return False + + def CheckMinOneFlag(self, flags): + if((self.current_flags_ - (self.current_flags_ & flags)) < self.current_flags_): + return True + return False \ No newline at end of file diff --git a/modules/gui/pymod/scene/uniform_color_widget.py b/modules/gui/pymod/scene/uniform_color_widget.py index 96cc8373aad5d395b40e536c7384a5e987cf164f..b5c074c9c89d70aaa5ed9b5eaa582a171b3da672 100644 --- a/modules/gui/pymod/scene/uniform_color_widget.py +++ b/modules/gui/pymod/scene/uniform_color_widget.py @@ -58,39 +58,45 @@ class UniformColorWidget(QtGui.QWidget): top_layout.addLayout(grid) self.setLayout(top_layout) - QtCore.QObject.connect(self.color_select_widget_, QtCore.SIGNAL("colorChanged"), self.Update) + QtCore.QObject.connect(self.color_select_widget_, QtCore.SIGNAL("colorChanged"), self.ChangeColors) self.setMinimumSize(250,150) def Update(self): + scene_selection = gui.SceneSelection.Instance() + for i in range(0,scene_selection.GetActiveNodeCount()): + node = scene_selection.GetActiveNode(i) + if _img_present and isinstance(node, gfx.MapIso): + if self.color_select_widget_.GetGfxColor() != node.GetColor(): + self.color_select_widget_.SetGfxColor(node.GetColor()) + else: + self.ChangeColors() + + def ChangeColors(self): scene_selection = gui.SceneSelection.Instance() for i in range(0,scene_selection.GetActiveNodeCount()): node = scene_selection.GetActiveNode(i) self.ChangeColor(node) - + if(scene_selection.GetActiveViewCount() > 0): entity = scene_selection.GetViewEntity() view = scene_selection.GetViewUnion() self.ChangeViewColor(entity,view) - + def ChangeColor(self, node): - gfx_color = self.GetGfxColor() + gfx_color = self.color_select_widget_.GetGfxColor() if isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface): - node.CleanColorOps() - node.SetColor(gfx_color,"") + node.CleanColorOps() + node.SetColor(gfx_color,"") elif _img_present and isinstance(node, gfx.MapIso): - node.SetColor(gfx_color) + node.SetColor(gfx_color) def ChangeViewColor(self, entity, view): if isinstance(entity, gfx.Entity) and isinstance(view, mol.EntityView): - gfx_color = self.GetGfxColor() + gfx_color = self.color_select_widget_.GetGfxColor() ufco=gfx.UniformColorOp(mol.QueryViewWrapper(view),gfx_color) entity.Apply(ufco) - - def GetGfxColor(self): - color = self.color_select_widget_.GetColor() - return gfx.Color(color.redF(), color.greenF(), color.blueF()) - + def resizeEvent(self, event): self.color_select_widget_.SetSize(self.width()/2,self.height()/2)