Ejemplo n.º 1
0
 def __init__(self, parent, getter, setter, emitter=None, lightness=1,
              saturation=1, dialog_title='Select hue', size=(25, 10)):
     
     wx.Window.__init__(self, parent, size=size, style=wx.SIMPLE_BORDER)
     
     self.getter = getter
     
     self.setter = setter
             
     
     
     self.lightness = lightness
     
     self.saturation = saturation
     
     self.dialog_title = dialog_title
     
     
     self._pen = wx.Pen(wx.Colour(0, 0, 0), width=0, style=wx.TRANSPARENT)
     
     self.Bind(wx.EVT_PAINT, self.on_paint)
     self.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_left_down)
     
     if emitter:
         assert isinstance(emitter, Emitter)
         self.emitter = emitter
         self.emitter.add_output(self.update)
     else:
         assert emitter is None
         self.emitter = Emitter(
             outputs=(self.update,),
             name='hue_modified'
         )
         old_setter = self.setter
         def new_setter(value):
             old_setter(value)
             self.emitter.emit()
         self.setter = new_setter
Ejemplo n.º 2
0
class HueControl(wx.Window):
    '''
    Widget for displaying (and possibly modifying) a hue.
    
    Clicking on the hue will open a dialog for changing it.
    '''
    def __init__(self, parent, getter, setter, emitter=None, lightness=1,
                 saturation=1, dialog_title='Select hue', size=(25, 10)):
        
        wx.Window.__init__(self, parent, size=size, style=wx.SIMPLE_BORDER)
        
        self.getter = getter
        
        self.setter = setter
                
        
        
        self.lightness = lightness
        
        self.saturation = saturation
        
        self.dialog_title = dialog_title
        
        
        self._pen = wx.Pen(wx.Colour(0, 0, 0), width=0, style=wx.TRANSPARENT)
        
        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_left_down)
        
        if emitter:
            assert isinstance(emitter, Emitter)
            self.emitter = emitter
            self.emitter.add_output(self.update)
        else:
            assert emitter is None
            self.emitter = Emitter(
                outputs=(self.update,),
                name='hue_modified'
            )
            old_setter = self.setter
            def new_setter(value):
                old_setter(value)
                self.emitter.emit()
            self.setter = new_setter
            
        
    
    def on_paint(self, event):
        dc = wx.PaintDC(self)
        color = wx_tools.hls_to_wx_color(
            (
                self.getter(),
                self.lightness,
                self.saturation
            )
        )
        dc.SetBrush(wx.Brush(color))
        dc.SetPen(self._pen)
        width, height = self.GetSize()
        dc.DrawRectangle(-5, -5, width+10, height+10)
                
    
    def on_mouse_left_down(self, event):
        self.open_editing_dialog()
      
        
    def open_editing_dialog(self):
        '''Open a dialog to edit the hue.'''
        old_hue = self.getter()
        
        with wx_tools.CursorChanger(self, wx.CURSOR_WAIT):
            hue_selection_dialog = HueSelectionDialog(
                self.GetTopLevelParent(), self.getter, self.setter,
                self.emitter,
                lightness=self.lightness, saturation=self.saturation,
                title=self.dialog_title
            )
        
        try:
            hue_selection_dialog.ShowModal()
        finally:
            hue_selection_dialog.Destroy()

            
    def update(self):
        if self: # Protecting from dead object
            self.Refresh()

        
    def Destroy(self):
        self.emitter.remove_output(self.update)
        super(HueControl, self).Destroy()