diff options
Diffstat (limited to 'toolbar.py')
-rw-r--r-- | toolbar.py | 312 |
1 files changed, 202 insertions, 110 deletions
@@ -22,33 +22,76 @@ import logging import abiword import gtk -from sugar.graphics.radiopalette import RadioMenuButton -from sugar.graphics.icon import Icon from sugar.graphics.toolbutton import ToolButton -from sugar.graphics.toggletoolbutton import ToggleToolButton -from sugar.graphics.colorbutton import ColorToolButton from sugar.graphics.toolcombobox import ToolComboBox -from sugar.graphics.objectchooser import ObjectChooser from sugar.graphics import iconentry -from sugar.activity import activity -from sugar.activity.widgets import * -from sugar.graphics.palette import Palette -from sugar import mime +from sugar.graphics import style +from sugar.activity.widgets import CopyButton +from sugar.activity.widgets import PasteButton +from sugar.activity.widgets import UndoButton +from sugar.activity.widgets import RedoButton from port import chooser -import sugar.profile -import widgets +from widgets import AbiButton +from widgets import FontCombo +from widgets import FontSizeCombo logger = logging.getLogger('write-activity') -class SearchToolbar(gtk.Toolbar): +class EditToolbar(gtk.Toolbar): + def __init__(self, pc, toolbar_box): + + gtk.Toolbar.__init__(self) - def __init__(self, abiword_canvas, text_toolbar): + self._abiword_canvas = pc.abiword_canvas - gtk.Toolbar.__init__(self) + copy = CopyButton() + copy.props.accelerator = '<Ctrl>C' + copy.connect('clicked', lambda button: pc.abiword_canvas.copy()) + self.insert(copy, -1) + copy.show() - self._abiword_canvas = abiword_canvas - self._text_toolbar = text_toolbar + paste = PasteButton() + paste.props.accelerator = '<Ctrl>V' + paste.connect('clicked', lambda button: pc.abiword_canvas.paste()) + self.insert(paste, -1) + paste.show() + + separator = gtk.SeparatorToolItem() + self.insert(separator, -1) + separator.show() + + undo = UndoButton(sensitive=False) + undo.connect('clicked', lambda button: pc.abiword_canvas.undo()) + pc.abiword_canvas.connect("can-undo", lambda abi, can_undo: + undo.set_sensitive(can_undo)) + self.insert(undo, -1) + undo.show() + + redo = RedoButton(sensitive=False) + redo.connect('clicked', lambda button: pc.abiword_canvas.redo()) + pc.abiword_canvas.connect("can-redo", lambda abi, can_redo: + redo.set_sensitive(can_redo)) + self.insert(redo, -1) + redo.show() + + pc.abiword_canvas.connect('text-selected', lambda abi, b: + copy.set_sensitive(True)) + pc.abiword_canvas.connect('image-selected', lambda abi, b: + copy.set_sensitive(True)) + pc.abiword_canvas.connect('selection-cleared', lambda abi, b: + copy.set_sensitive(False)) + + separator = gtk.SeparatorToolItem() + self.insert(separator, -1) + separator.show() + + search_label = gtk.Label(_("Search") + ": ") + search_label.show() + search_item_page_label = gtk.ToolItem() + search_item_page_label.add(search_label) + self.insert(search_item_page_label, -1) + search_item_page_label.show() # setup the search options self._search_entry = iconentry.IconEntry() @@ -56,20 +99,20 @@ class SearchToolbar(gtk.Toolbar): 'system-search') self._search_entry.connect('activate', self._search_entry_activated_cb) self._search_entry.connect('changed', self._search_entry_changed_cb) - self._search_entry.add_clear_button(); + self._search_entry.add_clear_button() self._add_widget(self._search_entry, expand=True) - self._findprev = ToolButton('go-previous') + self._findprev = ToolButton('go-previous-paired') self._findprev.set_tooltip(_('Find previous')) self.insert(self._findprev, -1) self._findprev.show() - self._findprev.connect('clicked', self._findprev_cb); + self._findprev.connect('clicked', self._findprev_cb) - self._findnext = ToolButton('go-next') + self._findnext = ToolButton('go-next-paired') self._findnext.set_tooltip(_('Find next')) self.insert(self._findnext, -1) self._findnext.show() - self._findnext.connect('clicked', self._findnext_cb); + self._findnext.connect('clicked', self._findnext_cb) # set the initial state of the search controls # note: we won't simple call self._search_entry_changed_cb @@ -141,6 +184,10 @@ class InsertToolbar(gtk.Toolbar): self._table = abiword.TableCreator() self._table.set_labels(_('Table'), _('Cancel')) self._table_id = self._table.connect('selected', self._table_cb) + image = gtk.Image() + image.set_from_icon_name('insert-table', -1) + self._table.set_image(image) + self._table.set_relief(gtk.RELIEF_NONE) tool_item = gtk.ToolItem() tool_item.add(self._table) self.insert(tool_item, -1) @@ -148,28 +195,32 @@ class InsertToolbar(gtk.Toolbar): self._table_rows_after = ToolButton('row-insert') self._table_rows_after.set_tooltip(_('Insert Row')) - self._table_rows_after_id = self._table_rows_after.connect('clicked', self._table_rows_after_cb) + self._table_rows_after_id = self._table_rows_after.connect( \ + 'clicked', self._table_rows_after_cb) self.insert(self._table_rows_after, -1) self._table_delete_rows = ToolButton('row-remove') self._table_delete_rows.set_tooltip(_('Delete Row')) - self._table_delete_rows_id = self._table_delete_rows.connect('clicked', self._table_delete_rows_cb) + self._table_delete_rows_id = self._table_delete_rows.connect( \ + 'clicked', self._table_delete_rows_cb) self.insert(self._table_delete_rows, -1) self._table_cols_after = ToolButton('column-insert') self._table_cols_after.set_tooltip(_('Insert Column')) - self._table_cols_after_id = self._table_cols_after.connect('clicked', self._table_cols_after_cb) + self._table_cols_after_id = self._table_cols_after.connect( \ + 'clicked', self._table_cols_after_cb) self.insert(self._table_cols_after, -1) self._table_delete_cols = ToolButton('column-remove') self._table_delete_cols.set_tooltip(_('Delete Column')) - self._table_delete_cols_id = self._table_delete_cols.connect('clicked', self._table_delete_cols_cb) + self._table_delete_cols_id = self._table_delete_cols.connect( \ + 'clicked', self._table_delete_cols_cb) self.insert(self._table_delete_cols, -1) separator = gtk.SeparatorToolItem() self.insert(separator, -1) - image = ToolButton('insert-image') + image = ToolButton('insert-picture') image.set_tooltip(_('Insert Image')) self._image_id = image.connect('clicked', self._image_cb) self.insert(image, -1) @@ -186,7 +237,7 @@ class InsertToolbar(gtk.Toolbar): chooser.pick(what=chooser.IMAGE, cb=cb) def _table_cb(self, abi, rows, cols): - self._abiword_canvas.insert_table(rows,cols) + self._abiword_canvas.insert_table(rows, cols) def _table_rows_after_cb(self, button): self._abiword_canvas.invoke_cmd('insertRowsAfter', '', 0, 0) @@ -211,7 +262,7 @@ class ViewToolbar(gtk.Toolbar): gtk.Toolbar.__init__(self) self._abiword_canvas = abiword_canvas - self._zoom_percentage = 0; + self._zoom_percentage = 0 self._zoom_out = ToolButton('zoom-out') self._zoom_out.set_tooltip(_('Zoom Out')) @@ -228,7 +279,8 @@ class ViewToolbar(gtk.Toolbar): # TODO: fix the initial value self._zoom_spin_adj = gtk.Adjustment(0, 25, 400, 25, 50, 0) self._zoom_spin = gtk.SpinButton(self._zoom_spin_adj, 0, 0) - self._zoom_spin_id = self._zoom_spin.connect('value-changed', self._zoom_spin_cb) + self._zoom_spin_id = self._zoom_spin.connect('value-changed', + self._zoom_spin_cb) self._zoom_spin.set_numeric(True) self._zoom_spin.show() tool_item_zoom = gtk.ToolItem() @@ -255,9 +307,10 @@ class ViewToolbar(gtk.Toolbar): self.insert(tool_item_page_label, -1) tool_item_page_label.show() - self._page_spin_adj = gtk.Adjustment(0, 1, 0, 1, 1, 0) + self._page_spin_adj = gtk.Adjustment(0, 1, 0, -1, -1, 0) self._page_spin = gtk.SpinButton(self._page_spin_adj, 0, 0) - self._page_spin_id = self._page_spin.connect('value-changed', self._page_spin_cb) + self._page_spin_id = self._page_spin.connect('value-changed', + self._page_spin_cb) self._page_spin.set_numeric(True) self._page_spin.show() tool_item_page = gtk.ToolItem() @@ -304,12 +357,12 @@ class ViewToolbar(gtk.Toolbar): self._abiword_canvas.set_zoom_percentage(self._zoom_percentage) def _page_spin_cb(self, button): - self._page_num = self._page_spin.get_value_as_int() - self._abiword_canvas.set_current_page(self._page_num) + page_num = self._page_spin.get_value_as_int() + self._abiword_canvas.set_current_page(page_num) def _page_count_cb(self, canvas, count): current_page = canvas.get_current_page_num() - self._page_spin_adj.set_all(current_page, 1, count, 1, 1, 0) + self._page_spin_adj.set_all(current_page, 1, count, -1, -1, 0) self._total_page_label.props.label = \ ' / ' + str(count) @@ -324,95 +377,134 @@ class TextToolbar(gtk.Toolbar): def __init__(self, abiword_canvas): gtk.Toolbar.__init__(self) - font_name = ToolComboBox(widgets.FontCombo(abiword_canvas)) + font_name = ToolComboBox(FontCombo(abiword_canvas)) self.insert(font_name, -1) - font_size = ToolComboBox(widgets.FontSizeCombo(abiword_canvas)) + font_size = ToolComboBox(FontSizeCombo(abiword_canvas)) self.insert(font_size, -1) - separator = gtk.SeparatorToolItem() - self.insert(separator, -1) - - bold = ToggleToolButton('format-text-bold') - bold.set_tooltip(_('Bold')) - bold_id = bold.connect('clicked', lambda sender: - abiword_canvas.toggle_bold()) - abiword_canvas.connect('bold', lambda abi, b: - self._setToggleButtonState(bold, b, bold_id)) - self.insert(bold, -1) - - italic = ToggleToolButton('format-text-italic') - italic.set_tooltip(_('Italic')) - italic_id = italic.connect('clicked', lambda sender: - abiword_canvas.toggle_italic()) - abiword_canvas.connect('italic', lambda abi, b: - self._setToggleButtonState(italic, b, italic_id)) - self.insert(italic, -1) - - underline = ToggleToolButton('format-text-underline') - underline.set_tooltip(_('Underline')) - underline_id = underline.connect('clicked', lambda sender: - abiword_canvas.toggle_underline()) - abiword_canvas.connect('underline', lambda abi, b: - self._setToggleButtonState(underline, b, underline_id)) - self.insert(underline, -1) - - separator = gtk.SeparatorToolItem() - self.insert(separator, -1) - - color = ColorToolButton() - color.connect('color-set', self._text_color_cb, abiword_canvas) - tool_item = gtk.ToolItem() - tool_item.add(color) - self.insert(tool_item, -1) - abiword_canvas.connect('color', lambda abi, r, g, b: - color.set_color(gtk.gdk.Color(r * 256, g * 256, b * 256))) + # MAGIC NUMBER WARNING: Secondary toolbars are not a standard height? + self.set_size_request(-1, style.GRID_CELL_SIZE) self.show_all() - def _text_color_cb(self, button, abiword_canvas): - newcolor = button.get_color() - abiword_canvas.set_text_color(int(newcolor.red / 256.0), - int(newcolor.green / 256.0), - int(newcolor.blue / 256.0)) - - def _setToggleButtonState(self,button,b,id): - button.handler_block(id) - button.set_active(b) - button.handler_unblock(id) - class ParagraphToolbar(gtk.Toolbar): def __init__(self, abi): gtk.Toolbar.__init__(self) - self.insert(ToolComboBox(widgets.StyleCombo(abi)), -1) + def append_style(icon_name, tooltip, do_abi_cb, on_abi_cb): + button = AbiButton(abi, 'style-name', do_abi_cb, on_abi_cb) + button.props.icon_name = icon_name + button.props.group = group + button.props.tooltip = tooltip + self.insert(button, -1) + return button + + group = None + + group = append_style('list-none', _('Normal'), + lambda: + abi.set_style('Normal'), + lambda abi, style: + style not in ['Heading 1', + 'Heading 2', + 'Heading 3', + 'Heading 4', + 'Block Text', + 'Plain Text']) + + append_style('paragraph-h1', _('Heading 1'), + lambda: abi.set_style('Heading 1'), + lambda abi, style: style == 'Heading 1') + + append_style('paragraph-h2', _('Heading 2'), + lambda: abi.set_style('Heading 2'), + lambda abi, style: style == 'Heading 2') + + append_style('paragraph-h3', _('Heading 3'), + lambda: abi.set_style('Heading 3'), + lambda abi, style: style == 'Heading 3') + + append_style('paragraph-h4', _('Heading 4'), + lambda: abi.set_style('Heading 4'), + lambda abi, style: style == 'Heading 4') + + append_style('paragraph-blocktext', _('Block Text'), + lambda: abi.set_style('Block Text'), + lambda abi, style: style == 'Block Text') + + append_style('paragraph-plaintext', _('Plain Text'), + lambda: abi.set_style('Plain Text'), + lambda abi, style: style == 'Plain Text') + self.insert(gtk.SeparatorToolItem(), -1) - group = widgets.AbiButton(abi, 'left-align', abi.align_left) - group.props.named_icon = 'format-justify-left' - group.props.tooltip = _('Left justify') - self.insert(group, -1) - - button = widgets.AbiButton(abi, 'center-align', abi.align_center) - button.props.group = group - button.props.named_icon = 'format-justify-center' - button.props.tooltip = _('Center justify') - self.insert(button, -1) - - button = widgets.AbiButton(abi, 'right-align', abi.align_right) - button.props.group = group - button.props.named_icon = 'format-justify-right' - button.props.tooltip = _('Right justify') - self.insert(button, -1) - - button = widgets.AbiButton(abi, 'justify-align', abi.align_justify) - button.props.group = group - button.props.named_icon = 'format-justify-fill' - button.props.tooltip = _('Fill justify') - self.insert(button, -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 - self.insert(gtk.SeparatorToolItem(), -1) - lists = RadioMenuButton(palette=widgets.ListsPalette(abi)) - self.insert(lists, -1) + group = None + + group = append_align('format-justify-left', _('Left justify'), + abi.align_left, 'left-align') + + append_align('format-justify-center', _('Center justify'), + abi.align_center, 'center-align') + + append_align('format-justify-right', _('Right justify'), + abi.align_right, 'right-align') + + append_align('format-justify-fill', _('Fill justify'), + abi.align_justify, 'justify-align') + + self.show_all() + +class ListToolbar(gtk.Toolbar): + def __init__(self, abi): + gtk.Toolbar.__init__(self) + + def append(icon_name, tooltip, do_abi_cb, on_abi_cb): + button = AbiButton(abi, 'style-name', do_abi_cb, on_abi_cb) + button.props.icon_name = icon_name + button.props.group = group + button.props.tooltip = tooltip + self.insert(button, -1) + return button + + group = None + + group = append('list-none', _('Normal'), + lambda: + abi.set_style('Normal'), + lambda abi, style: + style not in ['Bullet List', + 'Dashed List', + 'Numbered List', + 'Lower Case List', + 'Upper Case List']) + + append('list-bullet', _('Bullet List'), + lambda: abi.set_style('Bullet List'), + lambda abi, style: style == 'Bullet List') + + append('list-dashed', _('Dashed List'), + lambda: abi.set_style('Dashed List'), + lambda abi, style: style == 'Dashed List') + + append('list-numbered', _('Numbered List'), + lambda: abi.set_style('Numbered List'), + lambda abi, style: style == 'Numbered List') + + append('list-lower-case', _('Lower Case List'), + lambda: abi.set_style('Lower Case List'), + lambda abi, style: style == 'Lower Case List') + + append('list-upper-case', _('Upper Case List'), + lambda: abi.set_style('Upper Case List'), + lambda abi, style: style == 'Upper Case List') self.show_all() |