[Sugar-devel] [PATCH toolkit-gtk3 1/2] Add new PaletteMenuItem widget for usage in mixed content Palettes
Manuel Quiñones
manuq at laptop.org
Thu Sep 13 11:40:26 EDT 2012
Thanks a lot Simon. Yes I think this is the right approach.
The only things I see are:
- a trailing whitespace that gives a warning when applied.
- add "Sugar" prefix to the type name of PaletteMenuItem
2012/9/13 Simon Schampijer <simon at schampijer.de>:
> From: Simon Schampijer <simon at laptop.org>
>
> As Palettes can either include a Gtk.Menu or a Gtk.Window we
> have to use a "false" menu when we want to have both
> functionality in a Palette. This is a new class PaletteMenuItem
> for those use cases.
>
> Code highly based on the work from Gonzalo Odiard. The API is
> based on the one from GtkImageMenuItem [1].
>
> [1] http://developer.gnome.org/gtk3/3.4/GtkImageMenuItem.html
>
> Signed-off-by: Simon Schampijer <simon at laptop.org>
> ---
> src/sugar3/graphics/Makefile.am | 1 +
> src/sugar3/graphics/palettemenuitem.py | 121 +++++++++++++++++++++++++++++++++
> 2 files changed, 122 insertions(+)
> create mode 100644 src/sugar3/graphics/palettemenuitem.py
>
> diff --git a/src/sugar3/graphics/Makefile.am b/src/sugar3/graphics/Makefile.am
> index 332060f..a298a32 100644
> --- a/src/sugar3/graphics/Makefile.am
> +++ b/src/sugar3/graphics/Makefile.am
> @@ -12,6 +12,7 @@ sugar_PYTHON = \
> objectchooser.py \
> palettegroup.py \
> palette.py \
> + palettemenuitem.py \
> palettewindow.py \
> panel.py \
> radiopalette.py \
> diff --git a/src/sugar3/graphics/palettemenuitem.py b/src/sugar3/graphics/palettemenuitem.py
> new file mode 100644
> index 0000000..5a8056d
> --- /dev/null
> +++ b/src/sugar3/graphics/palettemenuitem.py
> @@ -0,0 +1,121 @@
> +# Copyright 2012 One Laptop Per Child
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program 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 General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> +
> +import logging
> +
> +from gi.repository import GObject
> +from gi.repository import Gtk
> +
> +from sugar3.graphics.icon import Icon
> +from sugar3.graphics import style
> +
> +
> +class PaletteMenuItemSeparator(Gtk.HSeparator):
> + """A HSeparator that can be styled in the theme"""
> +
> + __gtype_name__ = 'SugarPaletteMenuItemSeparator'
> +
> + def __init__(self):
> + Gtk.HSeparator.__init__(self)
> +
> +
> +class PaletteMenuItem(Gtk.EventBox):
> +
> + __gtype_name__ = 'PaletteMenuItem'
> +
> + __gsignals__ = {
> + 'activate': (GObject.SignalFlags.RUN_FIRST, None, [])
> + }
> +
> + def __init__(self, text_label=None, icon_name=None, text_maxlen=60,
> + xo_color=None, file_name=None):
> + Gtk.EventBox.__init__(self)
> + self._sensitive = True
> + self.set_above_child(True)
> + self.icon = None
> +
> + vbox = Gtk.VBox()
> + vbox.set_border_width(style.DEFAULT_PADDING)
> + self._hbox = Gtk.HBox()
> + if icon_name is not None:
> + self.icon = Icon(icon_name=icon_name,
> + icon_size=Gtk.IconSize.SMALL_TOOLBAR)
> + if xo_color is not None:
> + self.icon.props.xo_color = xo_color
> + self._hbox.pack_start(self.icon, expand=False, fill=False,
> + padding=style.DEFAULT_PADDING)
> + elif file_name is not None:
> + self.icon = Icon(file=file_name,
> + icon_size=Gtk.IconSize.SMALL_TOOLBAR)
> + if xo_color is not None:
> + self.icon.props.xo_color = xo_color
> + self._hbox.pack_start(self.icon, expand=False, fill=False,
> + padding=style.DEFAULT_PADDING)
> +
> + align = Gtk.Alignment(xalign=0.0, yalign=0.5, xscale=0.0, yscale=0.0)
> + self.label = Gtk.Label(text_label)
> + align.add(self.label)
> + self._hbox.pack_start(align, expand=True, fill=True,
> + padding=style.DEFAULT_PADDING)
> + vbox.pack_start(self._hbox, expand=False, fill=False,
> + padding=style.DEFAULT_PADDING)
> + self.add(vbox)
> +
> + self.id_bt_release_cb = self.connect('button-release-event',
> + self.__button_release_cb)
> + self.id_enter_notify_cb = self.connect('enter-notify-event',
> + self.__enter_notify_cb)
> + self.id_leave_notify_cb = self.connect('leave-notify-event',
> + self.__leave_notify_cb)
> +
> + self.show_all()
> +
> + def __button_release_cb(self, widget, event):
> + self.emit('activate')
> +
> + def __enter_notify_cb(self, widget, event):
> + self.modify_bg(Gtk.StateType.NORMAL,
> + style.COLOR_BUTTON_GREY.get_gdk_color())
> +
> + def __leave_notify_cb(self, widget, event):
> + self.modify_bg(Gtk.StateType.NORMAL,
> + style.COLOR_BLACK.get_gdk_color())
> +
> + def set_label(self, text_label):
> + text = '<span foreground="%s">' % style.COLOR_WHITE.get_html() + \
> + text_label + '</span>'
> + self.label.set_markup(text)
> +
> + def set_image(self, icon):
> + self._hbox.pack_start(icon, expand=False, fill=False,
> + padding=style.DEFAULT_PADDING)
> + self._hbox.reorder_child(icon, 0)
> +
> + def set_sensitive(self, sensitive):
> + if self._sensitive == sensitive:
> + return
> +
> + self._sensitive = sensitive
> + if sensitive:
> + self.handler_unblock(self.id_bt_release_cb)
> + self.handler_unblock(self.id_enter_notify_cb)
> + self.handler_unblock(self.id_leave_notify_cb)
> + else:
> + self.handler_block(self.id_bt_release_cb)
> + self.handler_block(self.id_enter_notify_cb)
> + self.handler_block(self.id_leave_notify_cb)
> + self.modify_bg(Gtk.StateType.NORMAL,
> + style.COLOR_BLACK.get_gdk_color())
> --
> 1.7.11.4
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
--
.. manuq ..
More information about the Sugar-devel
mailing list