class ToolButton(Gtk.ToolButton): __gtype_name__ = 'SugarToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._hide_tooltip_on_click = True self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.get_child().connect('can-activate-accel', self.__button_can_activate_accel_cb) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def __button_can_activate_accel_cb(self, button, signal_id): # Accept activation via accelerators regardless of this widget's state return True def set_tooltip(self, tooltip): """ Set a simple palette with just a single label. """ if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.ToolButton.set_label(self, tooltip) def get_tooltip(self): return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property( type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def set_accelerator(self, accelerator): self._accelerator = accelerator setup_accelerator(self) def get_accelerator(self): return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): icon = Icon(icon_name=icon_name) self.set_icon_widget(icon) icon.show() def get_icon_name(self): if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property( type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property( type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): child = self.get_child() if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class RadioToolButton(Gtk.RadioToolButton): """An implementation of a "push" button.""" __gtype_name__ = "SugarRadioToolButton" def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._xo_color = None self._hide_tooltip_on_click = True self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.connect("destroy", self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def set_tooltip(self, tooltip): if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.RadioToolButton.set_label(self, tooltip) def get_tooltip(self): return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def set_accelerator(self, accelerator): self._accelerator = accelerator toolbutton.setup_accelerator(self) def get_accelerator(self): return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): icon = Icon(icon_name=icon_name, xo_color=self._xo_color) self.set_icon_widget(icon) icon.show() def get_icon_name(self): if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def set_xo_color(self, xo_color): if self._xo_color != xo_color: self._xo_color = xo_color if self.props.icon_widget is not None: self.props.icon_widget.props.xo_color = xo_color def get_xo_color(self): return self._xo_color xo_color = GObject.property(type=object, setter=set_xo_color, getter=get_xo_color) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.RadioToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property( type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click ) def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class ToolButton(Gtk.ToolButton): ''' The ToolButton class manages a Gtk.ToolButton styled for Sugar. Keyword Args: icon_name(string): name of themed icon. accelerator (string): keyboard shortcut to be used to activate this button. tooltip (string): tooltip to be displayed when user hovers over button. hide_tooltip_on_click (bool): Whether or not the tooltip is hidden when user clicks on button. ''' __gtype_name__ = 'SugarToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._hide_tooltip_on_click = True self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.get_child().connect('can-activate-accel', self.__button_can_activate_accel_cb) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def __button_can_activate_accel_cb(self, button, signal_id): # Accept activation via accelerators regardless of this widget's state return True def set_tooltip(self, tooltip): ''' Set the tooltip. Args: tooltip (string): tooltip to be set. ''' if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.ToolButton.set_label(self, tooltip) def get_tooltip(self): ''' Return the tooltip. ''' return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def get_hide_tooltip_on_click(self): ''' Return True if the tooltip is hidden when a user clicks on the button, otherwise return False. ''' return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): ''' Set whether or not the tooltip is hidden when a user clicks on the button. Args: hide_tooltip_on_click (bool): True if the tooltip is hidden on click, and False otherwise. ''' if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def set_accelerator(self, accelerator): ''' Set accelerator that activates the button. Args: accelerator(string): accelerator to be set. ''' self._accelerator = accelerator setup_accelerator(self) def get_accelerator(self): ''' Return accelerator that activates the button. ''' return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): ''' Set name of icon. Args: icon_name (string): name of icon ''' icon = Icon(icon_name=icon_name) self.set_icon_widget(icon) icon.show() def get_icon_name(self): ''' Return icon name, or None if there is no icon name. ''' if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): ''' Implementation method for drawing the button. ''' if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): ''' Implementation method for hiding the tooltip when the button is clicked. ''' if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class IntensitySelector(Gtk.ToolItem): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ([])), } def __init__(self, value_range, default_value, default_image): Gtk.ToolItem.__init__(self) self._palette_invoker = ToolInvoker() self.palette = None self._values = value_range self._palette_invoker.attach_tool(self) # theme the buttons, can be removed if add the style to the sugar css # these are the same values used in gtk-widgets.css.em if style.zoom(100) == 100: subcell_size = 15 default_padding = 6 else: subcell_size = 11 default_padding = 4 hbox = Gtk.HBox() vbox = Gtk.VBox() self.add(vbox) # add a vbox to set the padding up and down vbox.pack_start(hbox, True, True, default_padding) self._size_down = ToolButton('go-previous-paired') self._palette_invoker.attach_tool(self._size_down) self._size_down.set_can_focus(False) self._size_down.connect('clicked', self.__value_changed_cb, False) hbox.pack_start(self._size_down, False, False, 5) # TODO: default? self._default_value = default_value self._value = self._default_value self.image_wrapper = Gtk.EventBox() self._intensityImage = Gtk.Image() self.image_wrapper.add(self._intensityImage) self.image_wrapper.show() self._intensityImage.set_from_file(default_image) self._intensityImage.show() self._palette_invoker.attach_widget(self.image_wrapper) hbox.pack_start(self.image_wrapper, False, False, 10) self._size_up = ToolButton('go-next-paired') self._palette_invoker.attach_tool(self._size_up) self._size_up.set_can_focus(False) self._size_up.connect('clicked', self.__value_changed_cb, True) hbox.pack_start(self._size_up, False, False, 5) radius = 2 * subcell_size theme_up = "GtkButton {border-radius:0px %dpx %dpx 0px;}" % (radius, radius) css_provider_up = Gtk.CssProvider() css_provider_up.load_from_data(theme_up) style_context = self._size_up.get_style_context() style_context.add_provider(css_provider_up, Gtk.STYLE_PROVIDER_PRIORITY_USER) theme_down = "GtkButton {border-radius: %dpx 0px 0px %dpx;}" % (radius, radius) css_provider_down = Gtk.CssProvider() css_provider_down.load_from_data(theme_down) style_context = self._size_down.get_style_context() style_context.add_provider(css_provider_down, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.show_all() def __destroy_cb(self, **args): if self._palette_invoker is not None: self._palette_invoker.detach() def __value_changed_cb(self, button, increase): if self._value in self._values: i = self._values.index(self._value) if increase: if i < len(self._values) - 1: i += 1 else: if i > 0: i -= 1 else: i = self._values.index(self._default_value) self._value = self._values[i] self._size_down.set_sensitive(i != 0) self._size_up.set_sensitive(i < len(self._values) - 1) self.emit('changed') def set_value(self, val): if val not in self._values: # assure the val assigned is in the range # if not, assign one close. for v in self._values: if v > val: val = v break if val > self._values[-1]: size = self._values[-1] self._value = size self._size_label.set_text(str(self._value)) # update the buttons states i = self._values.index(self._value) self._size_down.set_sensitive(i != 0) self._size_up.set_sensitive(i < len(self._value) - 1) self.emit('changed') def set_tooltip(self, tooltip): """ Set a simple palette with just a single label. """ if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.Property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def get_tooltip(self): return self._tooltip def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.Property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.Property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True) def set_image(self, image): self._intensityImage.set_from_file(image) def get_value(self): return self._value
class ProgressToolButton(Gtk.ToolButton): """Display the progress filling the ToolButton icon. Call update(progress) with the new progress to update the ToolButton icon. The direction defaults to 'vertical', in which case the icon is filled from bottom to top. If direction is set to 'horizontal', it will be filled from right to left or from left to right, depending on the system's language RTL setting. """ __gtype_name__ = 'SugarProgressToolButton' def __init__(self, icon_name=None, pixel_size=None, direction='vertical', **kwargs): self._accelerator = None self._tooltip = None self._palette_invoker = ToolInvoker() self._progress = 0.0 self._icon_name = icon_name self._pixel_size = pixel_size self._direction = direction GObject.GObject.__init__(self, **kwargs) self._hide_tooltip_on_click = True self._palette_invoker.attach_tool(self) self._stroke = get_surface( icon_name=self._icon_name, width=self._pixel_size, height=self._pixel_size, stroke_color=style.COLOR_BUTTON_GREY.get_svg(), #stroke_color=style.COLOR_WHITE.get_svg(), fill_color=style.COLOR_TRANSPARENT.get_svg()) self._fill = get_surface( icon_name=self._icon_name, width=self._pixel_size, height=self._pixel_size, stroke_color=style.COLOR_TRANSPARENT.get_svg(), fill_color=style.COLOR_WHITE.get_svg()) self.get_child().connect('can-activate-accel', self.__button_can_activate_accel_cb) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def __button_can_activate_accel_cb(self, button, signal_id): # Accept activation via accelerators regardless of this widget's state return True def set_tooltip(self, tooltip): """ Set a simple palette with just a single label. """ if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.ToolButton.set_label(self, tooltip) def get_tooltip(self): return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def set_accelerator(self, accelerator): self._accelerator = accelerator setup_accelerator(self) def get_accelerator(self): return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): icon = Icon(icon_name=icon_name) self.set_icon_widget(icon) icon.show() def get_icon_name(self): if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): if self._progress > 0: self._stroke = get_surface( icon_name=self._icon_name, width=self._pixel_size, height=self._pixel_size, stroke_color=style.COLOR_WHITE.get_svg(), fill_color=style.COLOR_TRANSPARENT.get_svg()) else: self._stroke = get_surface( icon_name=self._icon_name, width=self._pixel_size, height=self._pixel_size, stroke_color=style.COLOR_BUTTON_GREY.get_svg(), fill_color=style.COLOR_TRANSPARENT.get_svg()) allocation = self.get_allocation() # Center the graphic in the allocated space. margin_x = (allocation.width - self._stroke.get_width()) / 2 margin_y = (allocation.height - self._stroke.get_height()) / 2 cr.translate(margin_x, margin_y) # Paint the fill, clipping it by the progress. x_, y_ = 0, 0 width, height = self._stroke.get_width(), self._stroke.get_height() if self._direction == 'vertical': # vertical direction, bottom to top y_ = self._stroke.get_height() height *= self._progress * -1 else: rtl_direction = \ Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL if rtl_direction: # horizontal direction, right to left x_ = self._stroke.get_width() width *= self._progress * -1 else: # horizontal direction, left to right width *= self._progress cr.rectangle(x_, y_, width, height) cr.clip() cr.set_source_surface(self._fill, 0, 0) cr.paint() # Paint the stroke over the fill. cr.reset_clip() cr.set_source_surface(self._stroke, 0, 0) cr.paint() return False def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True) def update(self, progress): self._progress = progress self.queue_draw()
class IntensitySelector(Gtk.ToolItem): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ([])), } def __init__(self, value_range, default_value, default_image): Gtk.ToolItem.__init__(self) self._palette_invoker = ToolInvoker() self.palette = None self._values = value_range self._palette_invoker.attach_tool(self) # theme the buttons, can be removed if add the style to the sugar css # these are the same values used in gtk-widgets.css.em if style.zoom(100) == 100: subcell_size = 15 default_padding = 6 else: subcell_size = 11 default_padding = 4 hbox = Gtk.HBox() vbox = Gtk.VBox() self.add(vbox) # add a vbox to set the padding up and down vbox.pack_start(hbox, True, True, default_padding) self._size_down = ToolButton('go-previous-paired') self._palette_invoker.attach_tool(self._size_down) self._size_down.set_can_focus(False) self._size_down.connect('clicked', self.__value_changed_cb, False) hbox.pack_start(self._size_down, False, False, 5) # TODO: default? self._default_value = default_value self._value = self._default_value self.image_wrapper = Gtk.EventBox() self._intensityImage = Gtk.Image() self.image_wrapper.add(self._intensityImage) self.image_wrapper.show() self._intensityImage.set_from_file(default_image) self._intensityImage.show() self._palette_invoker.attach_widget(self.image_wrapper) hbox.pack_start(self.image_wrapper, False, False, 10) self._size_up = ToolButton('go-next-paired') self._palette_invoker.attach_tool(self._size_up) self._size_up.set_can_focus(False) self._size_up.connect('clicked', self.__value_changed_cb, True) hbox.pack_start(self._size_up, False, False, 5) radius = 2 * subcell_size theme_up = "GtkButton {border-radius:0px %dpx %dpx 0px;}" % (radius, radius) css_provider_up = Gtk.CssProvider() css_provider_up.load_from_data(theme_up) style_context = self._size_up.get_style_context() style_context.add_provider(css_provider_up, Gtk.STYLE_PROVIDER_PRIORITY_USER) theme_down = "GtkButton {border-radius: %dpx 0px 0px %dpx;}" % (radius, radius) css_provider_down = Gtk.CssProvider() css_provider_down.load_from_data(theme_down) style_context = self._size_down.get_style_context() style_context.add_provider(css_provider_down, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.show_all() def __destroy_cb(self, **args): if self._palette_invoker is not None: self._palette_invoker.detach() def __value_changed_cb(self, button, increase): if self._value in self._values: i = self._values.index(self._value) if increase: if i < len(self._values) - 1: i += 1 else: if i > 0: i -= 1 else: i = self._values.index(self._default_value) self._value = self._values[i] self._size_down.set_sensitive(i != 0) self._size_up.set_sensitive(i < len(self._values) - 1) self.emit('changed') def set_value(self, val): if val not in self._values: # assure the val assigned is in the range # if not, assign one close. for v in self._values: if v > val: val = v break if val > self._values[-1]: size = self._values[-1] self._value = size self._size_label.set_text(str(self._value)) # update the buttons states i = self._values.index(self._value) self._size_down.set_sensitive(i != 0) self._size_up.set_sensitive(i < len(self._value) - 1) self.emit('changed') def set_tooltip(self, tooltip): """ Set a simple palette with just a single label. """ if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.Property( type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def get_tooltip(self): return self._tooltip def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.Property( type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.Property( type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True) def set_image(self, image): self._intensityImage.set_from_file(image) def get_value(self): return self._value
class ToolButton(Gtk.ToolButton): ''' The ToolButton class manages a Gtk.ToolButton styled for Sugar. Keyword Args: icon_name(string): name of themed icon. accelerator (string): keyboard shortcut to be used to activate this button. tooltip (string): tooltip to be displayed when user hovers over button. hide_tooltip_on_click (bool): Whether or not the tooltip is hidden when user clicks on button. ''' __gtype_name__ = 'SugarToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._hide_tooltip_on_click = True self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.get_child().connect('can-activate-accel', self.__button_can_activate_accel_cb) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def __button_can_activate_accel_cb(self, button, signal_id): # Accept activation via accelerators regardless of this widget's state return True def set_tooltip(self, tooltip): ''' Set the tooltip. Args: tooltip (string): tooltip to be set. ''' if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.ToolButton.set_label(self, tooltip) def get_tooltip(self): ''' Return the tooltip. ''' return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def get_hide_tooltip_on_click(self): ''' Return True if the tooltip is hidden when a user clicks on the button, otherwise return False. ''' return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): ''' Set whether or not the tooltip is hidden when a user clicks on the button. Args: hide_tooltip_on_click (bool): True if the tooltip is hidden on click, and False otherwise. ''' if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property( type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def set_accelerator(self, accelerator): ''' Set accelerator that activates the button. Args: accelerator(string): accelerator to be set. ''' self._accelerator = accelerator setup_accelerator(self) def get_accelerator(self): ''' Return accelerator that activates the button. ''' return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): ''' Set name of icon. Args: icon_name (string): name of icon ''' icon = Icon(icon_name=icon_name) self.set_icon_widget(icon) icon.show() def get_icon_name(self): ''' Return icon name, or None if there is no icon name. ''' if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property( type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property( type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): ''' Implementation method for drawing the button. ''' if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): ''' Implementation method for hiding the tooltip when the button is clicked. ''' if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class RadioToolButton(Gtk.RadioToolButton): ''' The RadioToolButton class manages a Gtk.RadioToolButton styled for Sugar. Args: icon_name (string): name of icon to be used. Keyword Args: accelerator (string): keyboard shortcut to be used to activate this button. tooltip (string): tooltip to be displayed when user hovers over button. xo_color (sugar3.graphics.xocolor.XoColor): XoColor of button. hide_tooltip_on_click (bool): Whether or not the tooltip is hidden when user clicks on button. ''' __gtype_name__ = 'SugarRadioToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._xo_color = None self._hide_tooltip_on_click = True self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) # HACK: stop Gtk from adding a label and expanding the size of # the button. This happen when set_icon_widget is called # if label_widget is None self.props.label_widget = Gtk.Box() self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def set_tooltip(self, tooltip): ''' Set the tooltip. Args: tooltip (string): tooltip to be set. ''' if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.RadioToolButton.set_label(self, tooltip) def get_tooltip(self): ''' Return the tooltip. ''' return self._tooltip tooltip = GObject.Property(type=str, setter=set_tooltip, getter=get_tooltip) def set_accelerator(self, accelerator): ''' Set keyboard shortcut that activates this button. Args: accelerator (string): accelerator to be set. Should be in form <modifier>Letter. ''' self._accelerator = accelerator toolbutton.setup_accelerator(self) def get_accelerator(self): ''' Return accelerator string. ''' return self._accelerator accelerator = GObject.Property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): ''' Set name of icon. Args: icon_name (string): name of icon ''' icon = Icon(icon_name=icon_name, xo_color=self._xo_color) self.set_icon_widget(icon) icon.show() def get_icon_name(self): ''' Return icon name, or None if there is no icon name. ''' if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.Property(type=str, setter=set_icon_name, getter=get_icon_name) def set_xo_color(self, xo_color): ''' Set XoColor of button icon. Args: xo_color (sugar3.graphics.xocolor.XoColor): xocolor to be set. ''' if self._xo_color != xo_color: self._xo_color = xo_color if self.props.icon_widget is not None: self.props.icon_widget.props.xo_color = xo_color def get_xo_color(self): ''' Return xocolor. ''' return self._xo_color xo_color = GObject.Property(type=object, setter=set_xo_color, getter=get_xo_color) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.Property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.Property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): ''' Implementation method for drawing the button. ''' if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.RadioToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def get_hide_tooltip_on_click(self): ''' Return True if the tooltip is hidden when a user clicks on the button, otherwise return False. ''' return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): ''' Set whether or not the tooltip is hidden when a user clicks on the button. Args: hide_tooltip_on_click (bool): True if the tooltip is hidden on click, and False otherwise. ''' if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.Property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def do_clicked(self): ''' Implementation method for hiding the tooltip when the button is clicked. ''' if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class ToolButton(Gtk.ToolButton): __gtype_name__ = 'SugarToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._hide_tooltip_on_click = True self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.get_child().connect('can-activate-accel', self.__button_can_activate_accel_cb) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def __button_can_activate_accel_cb(self, button, signal_id): # Accept activation via accelerators regardless of this widget's state return True def set_tooltip(self, tooltip): """ Set a simple palette with just a single label. """ if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.ToolButton.set_label(self, tooltip) def get_tooltip(self): return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def set_accelerator(self, accelerator): self._accelerator = accelerator setup_accelerator(self) def get_accelerator(self): return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): icon = Icon(icon_name=icon_name) self.set_icon_widget(icon) icon.show() def get_icon_name(self): if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.ToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class RadioToolButton(Gtk.RadioToolButton): ''' The RadioToolButton class manages a Gtk.RadioToolButton styled for Sugar. Args: icon_name (string): name of icon to be used. Keyword Args: accelerator (string): keyboard shortcut to be used to activate this button. tooltip (string): tooltip to be displayed when user hovers over button. xo_color (sugar3.graphics.xocolor.XoColor): XoColor of button. hide_tooltip_on_click (bool): Whether or not the tooltip is hidden when user clicks on button. ''' __gtype_name__ = 'SugarRadioToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._xo_color = None self._hide_tooltip_on_click = True self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) # HACK: stop Gtk from adding a label and expanding the size of # the button. This happen when set_icon_widget is called # if label_widget is None self.props.label_widget = Gtk.Box() self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def set_tooltip(self, tooltip): ''' Set the tooltip. Args: tooltip (string): tooltip to be set. ''' if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.RadioToolButton.set_label(self, tooltip) def get_tooltip(self): ''' Return the tooltip. ''' return self._tooltip tooltip = GObject.Property(type=str, setter=set_tooltip, getter=get_tooltip) def set_accelerator(self, accelerator): ''' Set keyboard shortcut that activates this button. Args: accelerator (string): accelerator to be set. Should be in form <modifier>Letter. ''' self._accelerator = accelerator toolbutton.setup_accelerator(self) def get_accelerator(self): ''' Return accelerator string. ''' return self._accelerator accelerator = GObject.Property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): ''' Set name of icon. Args: icon_name (string): name of icon ''' icon = Icon(icon_name=icon_name, xo_color=self._xo_color) self.set_icon_widget(icon) icon.show() def get_icon_name(self): ''' Return icon name, or None if there is no icon name. ''' if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.Property(type=str, setter=set_icon_name, getter=get_icon_name) def set_xo_color(self, xo_color): ''' Set XoColor of button icon. Args: xo_color (sugar3.graphics.xocolor.XoColor): xocolor to be set. ''' if self._xo_color != xo_color: self._xo_color = xo_color if self.props.icon_widget is not None: self.props.icon_widget.props.xo_color = xo_color def get_xo_color(self): ''' Return xocolor. ''' return self._xo_color xo_color = GObject.Property(type=object, setter=set_xo_color, getter=get_xo_color) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.Property( type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.Property( type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): ''' Implementation method for drawing the button. ''' if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.RadioToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def get_hide_tooltip_on_click(self): ''' Return True if the tooltip is hidden when a user clicks on the button, otherwise return False. ''' return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): ''' Set whether or not the tooltip is hidden when a user clicks on the button. Args: hide_tooltip_on_click (bool): True if the tooltip is hidden on click, and False otherwise. ''' if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.Property( type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def do_clicked(self): ''' Implementation method for hiding the tooltip when the button is clicked. ''' if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)
class RadioToolButton(Gtk.RadioToolButton): """An implementation of a "push" button.""" __gtype_name__ = 'SugarRadioToolButton' def __init__(self, icon_name=None, **kwargs): self._accelerator = None self._tooltip = None self._xo_color = None self._hide_tooltip_on_click = True self._palette_invoker = ToolInvoker() GObject.GObject.__init__(self, **kwargs) self._palette_invoker.attach_tool(self) if icon_name: self.set_icon_name(icon_name) self.connect('destroy', self.__destroy_cb) def __destroy_cb(self, icon): if self._palette_invoker is not None: self._palette_invoker.detach() def set_tooltip(self, tooltip): if self.palette is None or self._tooltip is None: self.palette = Palette(tooltip) elif self.palette is not None: self.palette.set_primary_text(tooltip) self._tooltip = tooltip # Set label, shows up when toolbar overflows Gtk.RadioToolButton.set_label(self, tooltip) def get_tooltip(self): return self._tooltip tooltip = GObject.property(type=str, setter=set_tooltip, getter=get_tooltip) def set_accelerator(self, accelerator): self._accelerator = accelerator toolbutton.setup_accelerator(self) def get_accelerator(self): return self._accelerator accelerator = GObject.property(type=str, setter=set_accelerator, getter=get_accelerator) def set_icon_name(self, icon_name): icon = Icon(icon_name=icon_name, xo_color=self._xo_color) self.set_icon_widget(icon) icon.show() def get_icon_name(self): if self.props.icon_widget is not None: return self.props.icon_widget.props.icon_name else: return None icon_name = GObject.property(type=str, setter=set_icon_name, getter=get_icon_name) def set_xo_color(self, xo_color): if self._xo_color != xo_color: self._xo_color = xo_color if self.props.icon_widget is not None: self.props.icon_widget.props.xo_color = xo_color def get_xo_color(self): return self._xo_color xo_color = GObject.property(type=object, setter=set_xo_color, getter=get_xo_color) def create_palette(self): return None def get_palette(self): return self._palette_invoker.palette def set_palette(self, palette): self._palette_invoker.palette = palette palette = GObject.property(type=object, setter=set_palette, getter=get_palette) def get_palette_invoker(self): return self._palette_invoker def set_palette_invoker(self, palette_invoker): self._palette_invoker.detach() self._palette_invoker = palette_invoker palette_invoker = GObject.property(type=object, setter=set_palette_invoker, getter=get_palette_invoker) def do_draw(self, cr): if self.palette and self.palette.is_up(): allocation = self.get_allocation() # draw a black background, has been done by the engine before cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, allocation.width, allocation.height) cr.paint() Gtk.RadioToolButton.do_draw(self, cr) if self.palette and self.palette.is_up(): invoker = self.palette.props.invoker invoker.draw_rectangle(cr, self.palette) return False def get_hide_tooltip_on_click(self): return self._hide_tooltip_on_click def set_hide_tooltip_on_click(self, hide_tooltip_on_click): if self._hide_tooltip_on_click != hide_tooltip_on_click: self._hide_tooltip_on_click = hide_tooltip_on_click hide_tooltip_on_click = GObject.property(type=bool, default=True, getter=get_hide_tooltip_on_click, setter=set_hide_tooltip_on_click) def do_clicked(self): if self._hide_tooltip_on_click and self.palette: self.palette.popdown(True)