diff options
Diffstat (limited to 'widgets.py')
-rw-r--r-- | widgets.py | 249 |
1 files changed, 141 insertions, 108 deletions
@@ -2,12 +2,19 @@ from gettext import gettext as _ -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject +import math -from sugar.graphics import style -from sugar.graphics.palette import ToolInvoker -from sugar.graphics.colorbutton import _ColorButton +from sugar3.graphics import style +from sugar3.graphics.palette import ToolInvoker +from sugar3.graphics.colorbutton import _ColorButton +from sugar3.graphics.radiotoolbutton import RadioToolButton + +# this strings are here only to enable pootle to translate them +# and do not broke the old versions +_old_strings = [_('Size: '), _('Opacity: '), _('Circle'), _('Square')] class BrushButton(_ColorButton): @@ -22,7 +29,7 @@ class BrushButton(_ColorButton): def __init__(self, **kwargs): self._title = _('Choose brush properties') - self._color = gtk.gdk.Color(0, 0, 0) + self._color = Gdk.Color(0, 0, 0) self._has_palette = True self._has_invoker = True self._palette = None @@ -30,35 +37,30 @@ class BrushButton(_ColorButton): self._brush_size = 2 self._stamp_size = 20 self._brush_shape = 'circle' + self._alpha = 1.0 self._resized_stamp = None - self._preview = gtk.DrawingArea() + self._preview = Gtk.DrawingArea() self._preview.set_size_request(style.STANDARD_ICON_SIZE, style.STANDARD_ICON_SIZE) + self._ctx = None - gobject.GObject.__init__(self, **kwargs) - self._preview.set_events(gtk.gdk.BUTTON_PRESS_MASK) + GObject.GObject.__init__(self, **kwargs) + self._preview.set_events(Gdk.EventMask.BUTTON_PRESS_MASK) self._preview.connect('button_press_event', self.__mouse_down_cb) - self._preview.connect("expose_event", self.expose) + self._preview.connect("draw", self.draw) self.set_image(self._preview) - self._gc = None - if self._has_palette and self._has_invoker: self._invoker = WidgetInvoker(self) # FIXME: This is a hack. self._invoker.has_rectangle_gap = lambda: False self._invoker.palette = self._palette - def _setup(self): - if self.get_window() is not None: - self._preview.fill_color = '' - self._preview.show() - self.pixmap = gtk.gdk.Pixmap(self.get_window(), - style.STANDARD_ICON_SIZE, - style.STANDARD_ICON_SIZE, -1) - self._gc = self.get_window().new_gc() - self.show_all() +# def _setup(self): +# if self.get_window() is not None: +# self._preview.show() +# self.show_all() def get_brush_size(self): return self._brush_size @@ -67,7 +69,7 @@ class BrushButton(_ColorButton): self._brush_size = brush_size self._preview.queue_draw() - brush_size = gobject.property(type=int, getter=get_brush_size, + brush_size = GObject.property(type=int, getter=get_brush_size, setter=set_brush_size) def get_brush_shape(self): @@ -77,11 +79,13 @@ class BrushButton(_ColorButton): self._brush_shape = brush_shape self._preview.queue_draw() - brush_shape = gobject.property(type=str, getter=get_brush_shape, + brush_shape = GObject.property(type=str, getter=get_brush_shape, setter=set_brush_shape) def set_color(self, color): - # receive gtk.gdk.Color + """ + @ param color Gdk.Color + """ self._color = color self._preview.queue_draw() @@ -92,7 +96,7 @@ class BrushButton(_ColorButton): self._stamp_size = stamp_size self._preview.queue_draw() - stamp_size = gobject.property(type=int, getter=get_stamp_size, + stamp_size = GObject.property(type=int, getter=get_stamp_size, setter=set_stamp_size) def set_resized_stamp(self, resized_stamp): @@ -105,40 +109,47 @@ class BrushButton(_ColorButton): def is_stamping(self): return self._resized_stamp != None - def expose(self, widget, event): - if self._gc is None: - self._setup() + def set_alpha(self, alpha): + self._alpha = alpha + self._preview.queue_draw() + + def draw(self, widget, ctx): + #if self._ctx is None: + # self._setup() if self.get_window() is not None: center = style.STANDARD_ICON_SIZE / 2 - self.pixmap.draw_rectangle(self._preview.get_style().white_gc, - True, 0, 0, style.STANDARD_ICON_SIZE, style.STANDARD_ICON_SIZE) - self._gc.set_foreground(self._color) + ctx.rectangle(0, 0, style.STANDARD_ICON_SIZE, + style.STANDARD_ICON_SIZE) + ctx.set_source_rgb(1.0, 1.0, 1.0) + ctx.fill() if self.is_stamping(): width = self._resized_stamp.get_width() height = self._resized_stamp.get_height() dx = center - width / 2 dy = center - height / 2 - self.pixmap.draw_pixbuf(self._gc, self._resized_stamp, - 0, 0, dx, dy, width, height) + + ctx.rectangle(dx, dy, width, height) + Gdk.cairo_set_source_pixbuf(ctx, self._resized_stamp, 0, 0) + ctx.paint() else: + red = float(self._color.red) / 65535.0 + green = float(self._color.green) / 65535.0 + blue = float(self._color.blue) / 65535.0 + ctx.set_source_rgba(red, green, blue, self._alpha) if self._brush_shape == 'circle': - self.pixmap.draw_arc(self._gc, True, - center - self._brush_size / 2, - center - self._brush_size / 2, - self._brush_size, self._brush_size, 0, 360 * 64) + ctx.arc(center, center, self._brush_size / 2, 0., + 2 * math.pi) + ctx.fill() elif self._brush_shape == 'square': - self.pixmap.draw_rectangle(self._gc, True, - center - self._brush_size / 2, - center - self._brush_size / 2, - self._brush_size, self._brush_size) - - area = event.area - widget.window.draw_drawable(self._gc, self.pixmap, - area[0], area[1], area[0], area[1], area[2], area[3]) + ctx.rectangle(center - self._brush_size / 2, + center - self._brush_size / 2, self._brush_size, + self._brush_size) + ctx.fill() + return False def do_style_set(self, previous_style): @@ -166,11 +177,11 @@ class BrushButton(_ColorButton): return True -class ButtonStrokeColor(gtk.ToolItem): +class ButtonStrokeColor(Gtk.ToolItem): """Class to manage the Stroke Color of a Button""" __gtype_name__ = 'BrushColorToolButton' - __gsignals__ = {'color-set': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + __gsignals__ = {'color-set': (GObject.SignalFlags.RUN_FIRST, None, tuple())} def __init__(self, activity, **kwargs): @@ -181,9 +192,9 @@ class ButtonStrokeColor(gtk.ToolItem): self._palette_invoker = ToolInvoker() self._palette = None - gobject.GObject.__init__(self, **kwargs) + GObject.GObject.__init__(self, **kwargs) - # The gtk.ToolButton has already added a normal button. + # The Gtk.ToolButton has already added a normal button. # Replace it with a ColorButton self.color_button = BrushButton(has_invoker=False) self.add(self.color_button) @@ -192,7 +203,7 @@ class ButtonStrokeColor(gtk.ToolItem): self.color_button.set_stamp_size(20) # The following is so that the behaviour on the toolbar is correct. - self.color_button.set_relief(gtk.RELIEF_NONE) + self.color_button.set_relief(Gtk.ReliefStyle.NONE) self._palette_invoker.attach_tool(self) @@ -211,79 +222,92 @@ class ButtonStrokeColor(gtk.ToolItem): return True def __notify_change(self, widget, pspec): - new_color = self.alloc_color(self.get_color()) - self.color_button.set_color(new_color) + #new_color = self.alloc_color(self.get_color()) + #self.color_button.set_color(new_color) + self.color_button.set_color(self.get_color()) self.notify(pspec.name) def _color_button_cb(self, widget, pspec): color = self.get_color() self.set_stroke_color(color) - def alloc_color(self, color): - colormap = self._activity.area.get_colormap() - return colormap.alloc_color(color.red, color.green, color.blue) +# def alloc_color(self, color): +# colormap = self._activity.area.get_colormap() +# return colormap.alloc_color(color.red, color.green, color.blue) def create_palette(self): self._palette = self.get_child().create_palette() color_palette_hbox = self._palette._picker_hbox - content_box = gtk.VBox() - self.size_spinbutton = gtk.SpinButton() - # This is where we set restrictions for size: - # Initial value, minimum value, maximum value, step - adj = gtk.Adjustment(self.properties['line size'], 1.0, 100.0, 1.0) - self.size_spinbutton.set_adjustment(adj) - self.size_spinbutton.set_numeric(True) + content_box = Gtk.VBox() - label = gtk.Label(_('Size: ')) - hbox_size = gtk.HBox() - self.vbox_brush_options = gtk.VBox() - content_box.pack_start(hbox_size) - content_box.pack_start(self.vbox_brush_options) + self._brush_table = Gtk.Table(2, 2) + self._brush_table.set_col_spacing(0, style.DEFAULT_PADDING) - hbox_size.pack_start(label) - hbox_size.pack_start(self.size_spinbutton) - self.size_spinbutton.connect('value-changed', self._on_value_changed) + # This is where we set restrictions for size: + # Initial value, minimum value, maximum value, step + adj = Gtk.Adjustment(self.properties['line size'], 1.0, 100.0, 1.0) + self.size_scale = Gtk.HScale() + self.size_scale.set_adjustment(adj) + self.size_scale.set_value_pos(Gtk.PositionType.RIGHT) + self.size_scale.set_digits(0) + self.size_scale.set_size_request(style.zoom(150), -1) + label = Gtk.Label(label=_('Size')) + row = 0 + self._brush_table.attach(label, 0, 1, row, row + 1) + self._brush_table.attach(self.size_scale, 1, 2, row, row + 1) + + content_box.pack_start(self._brush_table, True, True, 0) + + self.size_scale.connect('value-changed', self._on_value_changed) + + # Control alpha + alpha = self.properties['alpha'] * 100 + adj_alpha = Gtk.Adjustment(alpha, 10.0, 100.0, 1.0) + self.alpha_scale = Gtk.HScale() + self.alpha_scale.set_adjustment(adj_alpha) + self.alpha_scale.set_value_pos(Gtk.PositionType.RIGHT) + self.alpha_scale.set_digits(0) + self.alpha_scale.set_size_request(style.zoom(150), -1) + self.alpha_label = Gtk.Label(label=_('Opacity')) + row = row + 1 + self._brush_table.attach(self.alpha_label, 0, 1, row, row + 1) + self._brush_table.attach(self.alpha_scale, 1, 2, row, row + 1) + + self.alpha_scale.connect('value-changed', self._on_alpha_changed) # User is able to choose Shapes for 'Brush' and 'Eraser' - item1 = gtk.RadioButton(None, _('Circle')) + self.vbox_brush_options = Gtk.VBox() + shape_box = Gtk.HBox() + content_box.pack_start(self.vbox_brush_options, True, True, 0) + item1 = RadioToolButton() + item1.set_icon_name('tool-shape-ellipse') item1.set_active(True) - image1 = gtk.Image() - pixbuf1 = gtk.gdk.pixbuf_new_from_file_at_size( - './icons/tool-shape-ellipse.svg', - style.SMALL_ICON_SIZE, - style.SMALL_ICON_SIZE) - image1.set_from_pixbuf(pixbuf1) - item1.set_image(image1) - - item2 = gtk.RadioButton(item1, _('Square')) - image2 = gtk.Image() - pixbuf2 = gtk.gdk.pixbuf_new_from_file_at_size( - './icons/tool-shape-rectangle.svg', - style.SMALL_ICON_SIZE, - style.SMALL_ICON_SIZE) - image2.set_from_pixbuf(pixbuf2) - item2.set_image(image2) + + item2 = RadioToolButton() + item2.set_icon_name('tool-shape-rectangle') + item2.props.group = item1 item1.connect('toggled', self._on_toggled, self.properties, 'circle') item2.connect('toggled', self._on_toggled, self.properties, 'square') - label = gtk.Label(_('Shape')) + shape_box.pack_start(Gtk.Label(_('Shape')), True, True, 0) + shape_box.pack_start(item1, True, True, 0) + shape_box.pack_start(item2, True, True, 0) - self.vbox_brush_options.pack_start(label) - self.vbox_brush_options.pack_start(item1) - self.vbox_brush_options.pack_start(item2) + self.vbox_brush_options.pack_start(shape_box, True, True, 0) - keep_aspect_checkbutton = gtk.CheckButton(_('Keep aspect')) + keep_aspect_checkbutton = Gtk.CheckButton(_('Keep aspect')) ratio = self._activity.area.keep_aspect_ratio keep_aspect_checkbutton.set_active(ratio) keep_aspect_checkbutton.connect('toggled', self._keep_aspect_checkbutton_toggled) - self.vbox_brush_options.pack_start(keep_aspect_checkbutton) + self.vbox_brush_options.pack_start(keep_aspect_checkbutton, True, True, + 0) - color_palette_hbox.pack_start(gtk.VSeparator(), + color_palette_hbox.pack_start(Gtk.VSeparator(), True, True, padding=style.DEFAULT_SPACING) - color_palette_hbox.pack_start(content_box) + color_palette_hbox.pack_start(content_box, True, True, 0) color_palette_hbox.show_all() self._update_palette() return self._palette @@ -296,9 +320,11 @@ class ButtonStrokeColor(gtk.ToolItem): if self.color_button.is_stamping(): # Hide palette color widgets: for ch in palette_children[:4]: - ch.hide_all() + ch.hide() # Hide brush options: - self.vbox_brush_options.hide_all() + self.vbox_brush_options.hide() + self.alpha_label.hide() + self.alpha_scale.hide() # Change title: self.set_title(_('Stamp properties')) else: @@ -307,6 +333,8 @@ class ButtonStrokeColor(gtk.ToolItem): ch.show_all() # Show brush options: self.vbox_brush_options.show_all() + self.alpha_label.show() + self.alpha_scale.show() # Change title: self.set_title(_('Brush properties')) @@ -315,13 +343,18 @@ class ButtonStrokeColor(gtk.ToolItem): def update_stamping(self): if self.color_button.is_stamping(): - self.size_spinbutton.set_value(self.color_button.stamp_size) + self.size_scale.set_value(self.color_button.stamp_size) else: - self.size_spinbutton.set_value(self.color_button.brush_size) + self.size_scale.set_value(self.color_button.brush_size) self._update_palette() - def _on_value_changed(self, spinbutton): - size = spinbutton.get_value_as_int() + def _on_alpha_changed(self, scale): + alpha = scale.get_value() / 100.0 + self._activity.area.set_alpha(alpha) + self.color_button.set_alpha(alpha) + + def _on_value_changed(self, scale): + size = int(scale.get_value()) if self.color_button.is_stamping(): self.properties['stamp size'] = size resized_stamp = self._activity.area.resize_stamp(size) @@ -345,7 +378,7 @@ class ButtonStrokeColor(gtk.ToolItem): self._palette_invoker.detach() self._palette_invoker = palette_invoker - palette_invoker = gobject.property( + palette_invoker = GObject.property( type=object, setter=set_palette_invoker, getter=get_palette_invoker) def set_color(self, color): @@ -354,7 +387,7 @@ class ButtonStrokeColor(gtk.ToolItem): def get_color(self): return self.get_child().props.color - color = gobject.property(type=object, getter=get_color, setter=set_color) + color = GObject.property(type=object, getter=get_color, setter=set_color) def set_title(self, title): self.get_child().props.title = title @@ -362,7 +395,7 @@ class ButtonStrokeColor(gtk.ToolItem): def get_title(self): return self.get_child().props.title - title = gobject.property(type=str, getter=get_title, setter=set_title) + title = GObject.property(type=str, getter=get_title, setter=set_title) def do_expose_event(self, event): child = self.get_child() @@ -370,11 +403,11 @@ class ButtonStrokeColor(gtk.ToolItem): if self._palette and self._palette.is_up(): invoker = self._palette.props.invoker invoker.draw_rectangle(event, self._palette) - elif child.state == gtk.STATE_PRELIGHT: - child.style.paint_box(event.window, gtk.STATE_PRELIGHT, - gtk.SHADOW_NONE, event.area, + elif child.state == Gtk.StateType.PRELIGHT: + child.style.paint_box(event.window, Gtk.StateType.PRELIGHT, + Gtk.ShadowType.NONE, event.area, child, 'toolbutton-prelight', allocation.x, allocation.y, allocation.width, allocation.height) - gtk.ToolButton.do_expose_event(self, event) + Gtk.ToolButton.do_expose_event(self, event) |