class TextRenderer(Gtk.CellRendererText): def __init__(self, tree_view): Gtk.CellRendererText.__init__(self) self._tree_view = tree_view screen = Gdk.Screen.get_default() self.props.font_desc = Pango.FontDescription('sans 16') self.props.wrap_width = screen.get_width() self.props.wrap_mode = Pango.WrapMode.WORD_CHAR if not NEW_INVOKER: self._invoker = CellRendererInvoker() self._invoker.attach_cell_renderer(tree_view, self) def create_palette(self): model = self._tree_view.get_model() row = list(model[self._invoker.path]) return ItemPalette(row, self._tree_view)
class CellRendererIcon(Gtk.CellRenderer): __gtype_name__ = 'SugarCellRendererIcon' __gsignals__ = { 'clicked': (GObject.SignalFlags.RUN_FIRST, None, [object]), } def __init__(self, tree_view): from sugar3.graphics.palette import CellRendererInvoker self._buffer = _IconBuffer() self._buffer.cache = True self._xo_color = None self._fill_color = None self._stroke_color = None self._prelit_fill_color = None self._prelit_stroke_color = None self._active_state = False self._palette_invoker = CellRendererInvoker() Gtk.CellRenderer.__init__(self) tree_view.connect('button-press-event', self.__button_press_event_cb) tree_view.connect('button-release-event', self.__button_release_event_cb) self._palette_invoker.attach_cell_renderer(tree_view, self) def __del__(self): self._palette_invoker.detach() def __button_press_event_cb(self, widget, event): if self._point_in_cell_renderer(widget, event.x, event.y): self._active_state = True def __button_release_event_cb(self, widget, event): self._active_state = False def create_palette(self): return None def get_palette_invoker(self): return self._palette_invoker palette_invoker = GObject.property(type=object, getter=get_palette_invoker) def set_file_name(self, value): if self._buffer.file_name != value: self._buffer.file_name = value file_name = GObject.property(type=str, setter=set_file_name) def set_icon_name(self, value): if self._buffer.icon_name != value: self._buffer.icon_name = value icon_name = GObject.property(type=str, setter=set_icon_name) def get_xo_color(self): return self._xo_color def set_xo_color(self, value): self._xo_color = value xo_color = GObject.property(type=object, getter=get_xo_color, setter=set_xo_color) def set_fill_color(self, value): if self._fill_color != value: self._fill_color = value fill_color = GObject.property(type=object, setter=set_fill_color) def set_stroke_color(self, value): if self._stroke_color != value: self._stroke_color = value stroke_color = GObject.property(type=object, setter=set_stroke_color) def set_prelit_fill_color(self, value): if self._prelit_fill_color != value: self._prelit_fill_color = value prelit_fill_color = GObject.property(type=object, setter=set_prelit_fill_color) def set_prelit_stroke_color(self, value): if self._prelit_stroke_color != value: self._prelit_stroke_color = value prelit_stroke_color = GObject.property(type=object, setter=set_prelit_stroke_color) def set_background_color(self, value): if self._buffer.background_color != value: self._buffer.background_color = value background_color = GObject.property(type=object, setter=set_background_color) def set_size(self, value): if self._buffer.width != value: self._buffer.width = value self._buffer.height = value size = GObject.property(type=object, setter=set_size) def do_get_size(self, widget, cell_area, x_offset=None, y_offset=None, width=None, height=None): width = self._buffer.width + self.props.xpad * 2 height = self._buffer.height + self.props.ypad * 2 xoffset = 0 yoffset = 0 if width > 0 and height > 0 and cell_area is not None: if widget.get_direction() == Gtk.TextDirection.RTL: xoffset = 1.0 - self.props.xalign else: xoffset = self.props.xalign xoffset = max(xoffset * (cell_area.width - width), 0) yoffset = max(self.props.yalign * (cell_area.height - height), 0) return xoffset, yoffset, width, height def do_activate(self, event, widget, path, background_area, cell_area, flags): pass def do_start_editing(self, event, widget, path, background_area, cell_area, flags): pass def _point_in_cell_renderer(self, tree_view, x=None, y=None): """Check if the point with coordinates x, y is inside this icon. If the x, y coordinates are not given, they are taken from the pointer current position. """ if x is None and y is None: x, y = tree_view.get_pointer() x, y = tree_view.convert_widget_to_bin_window_coords(x, y) pos = tree_view.get_path_at_pos(int(x), int(y)) if pos is None: return False path_, column, x, y_ = pos for cell_renderer in column.get_cells(): if cell_renderer == self: cell_x, cell_width = column.cell_get_position(cell_renderer) if x > cell_x and x < (cell_x + cell_width): return True return False return False def do_render(self, cr, widget, background_area, cell_area, flags): context = widget.get_style_context() context.save() context.add_class("sugar-icon-cell") pointer_inside = self._point_in_cell_renderer(widget) # The context will have prelight state if the mouse pointer is # in the entire row, but we want that state if the pointer is # in this cell only: if flags & Gtk.CellRendererState.PRELIT: if pointer_inside: if self._active_state: context.set_state(Gtk.StateFlags.ACTIVE) else: context.set_state(Gtk.StateFlags.NORMAL) Gtk.render_background( context, cr, background_area.x, background_area.y, background_area.width, background_area.height) Gtk.render_frame(context, cr, background_area.x, background_area.y, background_area.width, background_area.height) if self._xo_color is not None: stroke_color = self._xo_color.get_stroke_color() fill_color = self._xo_color.get_fill_color() prelit_fill_color = None prelit_stroke_color = None else: stroke_color = self._stroke_color fill_color = self._fill_color prelit_fill_color = self._prelit_fill_color prelit_stroke_color = self._prelit_stroke_color has_prelit_colors = None not in [prelit_fill_color, prelit_stroke_color] if flags & Gtk.CellRendererState.PRELIT and has_prelit_colors and \ pointer_inside: self._buffer.fill_color = prelit_fill_color self._buffer.stroke_color = prelit_stroke_color else: self._buffer.fill_color = fill_color self._buffer.stroke_color = stroke_color surface = self._buffer.get_surface() if surface is None: return xoffset, yoffset, width_, height_ = self.do_get_size(widget, cell_area) x = cell_area.x + xoffset y = cell_area.y + yoffset cr.set_source_surface(surface, math.floor(x), math.floor(y)) cr.rectangle(cell_area.x, cell_area.y, cell_area.width, cell_area.height) cr.clip() cr.paint()