Line 57: |
Line 57: |
| style.COLOR_SELECTION_GREY.get_gdk_color()) | | style.COLOR_SELECTION_GREY.get_gdk_color()) |
| </pre> | | </pre> |
| + | |
| + | === Palettes can't include menu and widgets at the same time === |
| + | |
| + | We can use anything like this: |
| + | |
| + | <pre> |
| + | |
| + | class SugarMenuItem(gtk.EventBox): |
| + | |
| + | __gsignals__ = { |
| + | 'clicked': (gobject.SIGNAL_RUN_FIRST, None, []) |
| + | } |
| + | |
| + | def __init__(self, icon_name, label_text): |
| + | gtk.EventBox.__init__(self) |
| + | self._sensitive = True |
| + | vbox = gtk.VBox() |
| + | hbox = gtk.HBox() |
| + | vbox.set_border_width(style.DEFAULT_PADDING) |
| + | self.icon = Icon() |
| + | self.icon.props.icon_name = icon_name |
| + | 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) |
| + | text = '<span foreground="%s">' % style.COLOR_WHITE.get_html() + \ |
| + | label_text + '</span>' |
| + | self.label = gtk.Label() |
| + | self.label.set_use_markup(True) |
| + | self.label.set_markup(text) |
| + | align.add(self.label) |
| + | hbox.pack_start(align, expand=True, fill=True, |
| + | padding=style.DEFAULT_PADDING) |
| + | vbox.pack_start(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.modify_bg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color()) |
| + | self.show_all() |
| + | self.set_above_child(True) |
| + | |
| + | def __button_release_cb(self, widget, event): |
| + | self.emit('clicked') |
| + | |
| + | def __enter_notify_cb(self, widget, event): |
| + | self.modify_bg(gtk.STATE_NORMAL, |
| + | style.COLOR_BUTTON_GREY.get_gdk_color()) |
| + | |
| + | def __leave_notify_cb(self, widget, event): |
| + | self.modify_bg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color()) |
| + | |
| + | def set_icon(self, icon_name): |
| + | self.icon.props.icon_name = icon_name |
| + | |
| + | def set_label(self, label_text): |
| + | text = '<span foreground="%s">' % style.COLOR_WHITE.get_html() + \ |
| + | label_text + '</span>' |
| + | self.label.set_markup(text) |
| + | |
| + | 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.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color()) |
| + | |
| + | </pre> |
| + | |
| + | And add them to a vbox: |
| + | |
| + | <pre> |
| + | |
| + | # TODO: private!!! |
| + | self._content.set_border_width(0) |
| + | |
| + | self._play_pause_button = SugarMenuItem('player_play', |
| + | _('Say selected text')) |
| + | self._play_pause_button.connect('clicked', self.__play_clicked_cb) |
| + | vbox_menu.add(self._play_pause_button) |
| + | |
| + | </pre> |
| + | |
| + | To do the SegurMenuItem take all the width in the palette, we need set the border_width in _content to zero, |
| + | but that is a private member. Then we need to look if we add a method to set the it, |
| + | or change the api to make the first container (where is the menu today) useful for other type of widgets. |