From 5e4c55f8150c44a1bb9ab70a827658b7b890c0c4 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Tue, 9 Mar 2010 08:57:11 +0000
Subject: [PATCH] Inspector Gadget, change rendermode of mol::entityviews

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1792 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gui/pymod/CMakeLists.txt              |  1 +
 modules/gui/pymod/export_scene_selection.cc   |  1 +
 .../gui/pymod/scene/color_options_widget.py   | 47 +++++----
 .../gui/pymod/scene/combo_options_widget.py   | 20 ++--
 modules/gui/pymod/scene/cpk_widget.py         | 23 ++---
 modules/gui/pymod/scene/custom_widget.py      | 29 +++---
 .../gui/pymod/scene/gradient_editor_widget.py | 28 ++----
 modules/gui/pymod/scene/hsc_widget.py         | 84 ++++++++--------
 modules/gui/pymod/scene/inspector_widget.py   | 12 +--
 modules/gui/pymod/scene/line_trace_widget.py  | 27 +++---
 modules/gui/pymod/scene/preset_widget.py      | 16 ++--
 modules/gui/pymod/scene/render_mode_widget.py | 76 +++++++++++++++
 .../gui/pymod/scene/render_options_widget.py  | 95 +++++++++++--------
 modules/gui/pymod/scene/simple_widget.py      | 45 ++++-----
 modules/gui/pymod/scene/sline_widget.py       | 32 +++----
 .../gui/pymod/scene/toolbar_options_widget.py | 33 ++-----
 modules/gui/pymod/scene/trace_widget.py       | 40 ++++----
 modules/gui/pymod/scene/tube_widget.py        | 44 ++++-----
 .../gui/pymod/scene/uniform_color_widget.py   | 30 +++---
 19 files changed, 354 insertions(+), 329 deletions(-)
 create mode 100644 modules/gui/pymod/scene/render_mode_widget.py

diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt
index b39ad8df5..c3836e575 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 239826aba..c44a0d4db 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 94256db1b..0e165a237 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 1794a7062..251861d6a 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 678bc6ff2..5f6c7de3c 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 2a7adc59b..5699c4ea9 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 919772502..2653f22f5 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 57e83dd2b..814cf9ef6 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 1969d02ee..9f9efb1e4 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 8a10a5534..1b06bb96d 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 3790ded45..590772c28 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 000000000..68150543a
--- /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 705df4c10..e7476e5c0 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 c4fbbcb13..958d8bdc7 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 9346c203e..e4bffa439 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 c587e5b2a..37c967e0c 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 30041449b..8fd8a0c16 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 b70a511d1..033d09ea7 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 a9ab857aa..15a85313c 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)
     
-- 
GitLab