From a23d25957949a0403807f4eb10e481de7211de0e Mon Sep 17 00:00:00 2001 From: Gonzalo Odiard Date: Tue, 14 May 2013 20:38:10 +0000 Subject: Change buttons used to select aligment by a single RadioMenuButton This is one of the changes needed to reorganize the toolbar to use Write with screen rotated. Signed-off-by: Gonzalo Odiard --- diff --git a/toolbar.py b/toolbar.py index 7f69bf7..93a2432 100644 --- a/toolbar.py +++ b/toolbar.py @@ -32,6 +32,7 @@ from sugar3.graphics.toolbutton import ToolButton from sugar3.graphics.toolcombobox import ToolComboBox from sugar3.graphics.colorbutton import ColorToolButton from sugar3.graphics.toggletoolbutton import ToggleToolButton +from sugar3.graphics.radiopalette import RadioMenuButton from sugar3.graphics import iconentry from sugar3.graphics import style from sugar3.activity.widgets import CopyButton @@ -40,6 +41,7 @@ from sugar3.activity.widgets import UndoButton from sugar3.activity.widgets import RedoButton from widgets import AbiButton +from widgets import AbiMenuItem from widgets import FontSizeCombo from fontcombobox import FontComboBox from gridcreate import GridCreateWidget @@ -552,27 +554,28 @@ class ParagraphToolbar(Gtk.Toolbar): self.insert(Gtk.SeparatorToolItem(), -1) - def append_align(icon_name, tooltip, do_abi_cb, style_name): - button = AbiButton(abi, style_name, do_abi_cb) - button.props.icon_name = icon_name - button.props.group = group - button.props.tooltip = tooltip - self.insert(button, -1) - return button + def append_align(icon_name, tooltip, do_abi_cb, style_name, button): + menu_item = AbiMenuItem(abi, style_name, do_abi_cb, icon_name, + tooltip, button) + button.props.palette.menu.append(menu_item) + menu_item.show() - group = None + self._aligment_btn = RadioMenuButton(icon_name='format-justify-left') + self._aligment_btn.props.tooltip = _('Choose aligment') - group = append_align('format-justify-left', _('Left justify'), - abi.align_left, 'left-align') + append_align('format-justify-left', _('Left justify'), + abi.align_left, 'left-align', self._aligment_btn) append_align('format-justify-center', _('Center justify'), - abi.align_center, 'center-align') + abi.align_center, 'center-align', self._aligment_btn) append_align('format-justify-right', _('Right justify'), - abi.align_right, 'right-align') + abi.align_right, 'right-align', self._aligment_btn) append_align('format-justify-fill', _('Fill justify'), - abi.align_justify, 'justify-align') + abi.align_justify, 'justify-align', self._aligment_btn) + + self.insert(self._aligment_btn, -1) self.show_all() diff --git a/widgets.py b/widgets.py index 38d062b..987b11d 100644 --- a/widgets.py +++ b/widgets.py @@ -168,6 +168,40 @@ class AbiButton(RadioToolButton): self.handler_unblock(self._toggled_handler) +class AbiMenuItem(MenuItem): + + def __init__(self, abi, abi_signal, do_abi_cb, icon_name, label, + button, on_abi_cb=None): + self._icon_name = icon_name + self._button = button + MenuItem.__init__(self, icon_name=icon_name, text_label=label) + + self._abi_handler = abi.connect(abi_signal, self.__abi_cb, + abi_signal, on_abi_cb) + self.connect('activate', self.__activated_cb, + abi, do_abi_cb) + + def __activated_cb(self, button, abi, do_abi_cb): + if self._button.get_icon_name() == self._icon_name: + return + + abi.handler_block(self._abi_handler) + try: + logging.debug('Do abi %s' % do_abi_cb) + do_abi_cb() + self._button.set_icon_name(self._icon_name) + finally: + abi.handler_unblock(self._abi_handler) + + def __abi_cb(self, abi, prop, abi_signal, on_abi_cb): + if (on_abi_cb is None and not prop) or \ + (on_abi_cb is not None and not on_abi_cb(abi, prop)): + return + + logging.debug('On abi %s prop=%r' % (abi_signal, prop)) + self._button.set_icon_name(self._icon_name) + + class ExportButtonFactory(): _EXPORT_FORMATS = [{'mime_type': 'application/rtf', -- cgit v0.9.1