fix: clicking buttons in the toolbar was crashing (#189)

This commit is contained in:
Creak 2023-01-22 16:11:37 -05:00 committed by GitHub
parent 977d015c35
commit 311975cadc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 60 deletions

8
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"recommendations": [
"davidanson.vscode-markdownlint",
"mesonbuild.mesonbuild",
"ms-python.python",
"redhat.vscode-yaml"
]
}

View File

@ -401,7 +401,7 @@ class FileDiffViewerBase(Gtk.Grid):
self.first_difference() self.first_difference()
# callback for most menu items and buttons # callback for most menu items and buttons
def button_cb(self, widget, data): def button_cb(self, widget: Gtk.Widget, data: str) -> None:
self.openUndoBlock() self.openUndoBlock()
self._button_actions[data]() self._button_actions[data]()
self.closeUndoBlock() self.closeUndoBlock()

View File

@ -123,18 +123,20 @@ class PaneHeader(Gtk.Box):
def __init__(self) -> None: def __init__(self) -> None:
Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=0) Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
_append_buttons(self, Gtk.IconSize.MENU, [ button_specs = [
[Gtk.STOCK_OPEN, self.button_cb, 'open', _('Open File...')], [Gtk.STOCK_OPEN, self.button_cb, 'open', _('Open File...')],
[Gtk.STOCK_REFRESH, self.button_cb, 'reload', _('Reload File')], [Gtk.STOCK_REFRESH, self.button_cb, 'reload', _('Reload File')],
[Gtk.STOCK_SAVE, self.button_cb, 'save', _('Save File')], [Gtk.STOCK_SAVE, self.button_cb, 'save', _('Save File')],
[Gtk.STOCK_SAVE_AS, self.button_cb, 'save_as', _('Save File As...')]]) [Gtk.STOCK_SAVE_AS, self.button_cb, 'save_as', _('Save File As...')]
]
_append_buttons(self, Gtk.IconSize.MENU, button_specs)
self.label = label = Gtk.Label() self.label = Gtk.Label()
label.set_selectable(True) self.label.set_selectable(True)
label.set_ellipsize(Pango.EllipsizeMode.START) self.label.set_ellipsize(Pango.EllipsizeMode.START)
label.set_max_width_chars(1) self.label.set_max_width_chars(1)
self.pack_start(label, True, True, 0) self.pack_start(self.label, True, True, 0)
# file's name and information about how to retrieve it from a # file's name and information about how to retrieve it from a
# VCS # VCS
@ -774,8 +776,8 @@ class DiffuseWindow(Gtk.ApplicationWindow):
# make the icons available for use # make the icons available for use
factory.add_default() factory.add_default()
menuspecs = [] menu_specs = []
menuspecs.append([_('_File'), [ menu_specs.append([_('_File'), [
[ [
[_('_Open File...'), self.open_file_cb, None, 'open_file'], [_('_Open File...'), self.open_file_cb, None, 'open_file'],
[_('Open File In New _Tab...'), self.open_file_in_new_tab_cb, None, 'open_file_in_new_tab'], # noqa: E501 [_('Open File In New _Tab...'), self.open_file_in_new_tab_cb, None, 'open_file_in_new_tab'], # noqa: E501
@ -797,18 +799,18 @@ class DiffuseWindow(Gtk.ApplicationWindow):
] ]
]]) ]])
menuspecs.append([_('_Edit'), [ menu_specs.append([_('_Edit'), [
[ [
[_('_Undo'), self.button_cb, 'undo', 'undo'], [_('_Undo'), self.menuitem_cb, 'undo', 'undo'],
[_('_Redo'), self.button_cb, 'redo', 'redo'], [_('_Redo'), self.menuitem_cb, 'redo', 'redo'],
], [ ], [
[_('Cu_t'), self.button_cb, 'cut', 'cut'], [_('Cu_t'), self.menuitem_cb, 'cut', 'cut'],
[_('_Copy'), self.button_cb, 'copy', 'copy'], [_('_Copy'), self.menuitem_cb, 'copy', 'copy'],
[_('_Paste'), self.button_cb, 'paste', 'paste'], [_('_Paste'), self.menuitem_cb, 'paste', 'paste'],
], [ ], [
[_('Select _All'), self.button_cb, 'select_all', 'select_all'], [_('Select _All'), self.menuitem_cb, 'select_all', 'select_all'],
[_('C_lear Edits'), self.button_cb, 'clear_edits', 'clear_edits'], [_('C_lear Edits'), self.menuitem_cb, 'clear_edits', 'clear_edits'],
[_('_Dismiss All Edits'), self.button_cb, 'dismiss_all_edits', 'dismiss_all_edits'], [_('_Dismiss All Edits'), self.menuitem_cb, 'dismiss_all_edits', 'dismiss_all_edits'], # noqa: E501
], [ ], [
[_('_Find...'), self.find_cb, None, 'find'], [_('_Find...'), self.find_cb, None, 'find'],
[_('Find _Next'), self.find_next_cb, None, 'find_next'], [_('Find _Next'), self.find_next_cb, None, 'find_next'],
@ -841,62 +843,62 @@ class DiffuseWindow(Gtk.ApplicationWindow):
) )
syntax_menu.append(syntax_section) syntax_menu.append(syntax_section)
menuspecs.append([_('_View'), [ menu_specs.append([_('_View'), [
[ [
[_('_Syntax Highlighting'), None, None, None, syntax_menu] [_('_Syntax Highlighting'), None, None, None, syntax_menu]
], [ ], [
[_('Re_align All'), self.button_cb, 'realign_all', 'realign_all'], [_('Re_align All'), self.menuitem_cb, 'realign_all', 'realign_all'],
[_('_Isolate'), self.button_cb, 'isolate', 'isolate'], [_('_Isolate'), self.menuitem_cb, 'isolate', 'isolate'],
], [ ], [
[_('_First Difference'), self.button_cb, 'first_difference', 'first_difference'], [_('_First Difference'), self.menuitem_cb, 'first_difference', 'first_difference'],
[_('_Previous Difference'), self.button_cb, 'previous_difference', 'previous_difference'], # noqa: E501 [_('_Previous Difference'), self.menuitem_cb, 'previous_difference', 'previous_difference'], # noqa: E501
[_('_Next Difference'), self.button_cb, 'next_difference', 'next_difference'], [_('_Next Difference'), self.menuitem_cb, 'next_difference', 'next_difference'],
[_('_Last Difference'), self.button_cb, 'last_difference', 'last_difference'], [_('_Last Difference'), self.menuitem_cb, 'last_difference', 'last_difference'],
], [ ], [
[_('Fir_st Tab'), self.first_tab_cb, None, 'first_tab'], [_('Fir_st Tab'), self.first_tab_cb, None, 'first_tab'],
[_('Pre_vious Tab'), self.previous_tab_cb, None, 'previous_tab'], [_('Pre_vious Tab'), self.previous_tab_cb, None, 'previous_tab'],
[_('Next _Tab'), self.next_tab_cb, None, 'next_tab'], [_('Next _Tab'), self.next_tab_cb, None, 'next_tab'],
[_('Las_t Tab'), self.last_tab_cb, None, 'last_tab'], [_('Las_t Tab'), self.last_tab_cb, None, 'last_tab'],
], [ ], [
[_('Shift Pane _Right'), self.button_cb, 'shift_pane_right', 'shift_pane_right'], [_('Shift Pane _Right'), self.menuitem_cb, 'shift_pane_right', 'shift_pane_right'],
[_('Shift Pane _Left'), self.button_cb, 'shift_pane_left', 'shift_pane_left'] [_('Shift Pane _Left'), self.menuitem_cb, 'shift_pane_left', 'shift_pane_left']
] ]
]]) ]])
menuspecs.append([_('F_ormat'), [ menu_specs.append([_('F_ormat'), [
[ [
[_('Convert To _Upper Case'), self.button_cb, 'convert_to_upper_case', 'convert_to_upper_case'], # noqa: E501 [_('Convert To _Upper Case'), self.menuitem_cb, 'convert_to_upper_case', 'convert_to_upper_case'], # noqa: E501
[_('Convert To _Lower Case'), self.button_cb, 'convert_to_lower_case', 'convert_to_lower_case'], # noqa: E501 [_('Convert To _Lower Case'), self.menuitem_cb, 'convert_to_lower_case', 'convert_to_lower_case'], # noqa: E501
], [ ], [
[_('Sort Lines In _Ascending Order'), self.button_cb, 'sort_lines_in_ascending_order', 'sort_lines_in_ascending_order'], # noqa: E501 [_('Sort Lines In _Ascending Order'), self.menuitem_cb, 'sort_lines_in_ascending_order', 'sort_lines_in_ascending_order'], # noqa: E501
[_('Sort Lines In D_escending Order'), self.button_cb, 'sort_lines_in_descending_order', 'sort_lines_in_descending_order'], # noqa: E501 [_('Sort Lines In D_escending Order'), self.menuitem_cb, 'sort_lines_in_descending_order', 'sort_lines_in_descending_order'], # noqa: E501
], [ ], [
[_('Remove Trailing _White Space'), self.button_cb, 'remove_trailing_white_space', 'remove_trailing_white_space'], # noqa: E501 [_('Remove Trailing _White Space'), self.menuitem_cb, 'remove_trailing_white_space', 'remove_trailing_white_space'], # noqa: E501
[_('Convert Tabs To _Spaces'), self.button_cb, 'convert_tabs_to_spaces', 'convert_tabs_to_spaces'], # noqa: E501 [_('Convert Tabs To _Spaces'), self.menuitem_cb, 'convert_tabs_to_spaces', 'convert_tabs_to_spaces'], # noqa: E501
[_('Convert Leading Spaces To _Tabs'), self.button_cb, 'convert_leading_spaces_to_tabs', 'convert_leading_spaces_to_tabs'], # noqa: E501 [_('Convert Leading Spaces To _Tabs'), self.menuitem_cb, 'convert_leading_spaces_to_tabs', 'convert_leading_spaces_to_tabs'], # noqa: E501
], [ ], [
[_('_Increase Indenting'), self.button_cb, 'increase_indenting', 'increase_indenting'], # noqa: E501 [_('_Increase Indenting'), self.menuitem_cb, 'increase_indenting', 'increase_indenting'], # noqa: E501
[_('De_crease Indenting'), self.button_cb, 'decrease_indenting', 'decrease_indenting'], # noqa: E501 [_('De_crease Indenting'), self.menuitem_cb, 'decrease_indenting', 'decrease_indenting'], # noqa: E501
], [ ], [
[_('Convert To _DOS Format'), self.button_cb, 'convert_to_dos', 'convert_to_dos'], [_('Convert To _DOS Format'), self.menuitem_cb, 'convert_to_dos', 'convert_to_dos'],
[_('Convert To _Mac Format'), self.button_cb, 'convert_to_mac', 'convert_to_mac'], [_('Convert To _Mac Format'), self.menuitem_cb, 'convert_to_mac', 'convert_to_mac'],
[_('Convert To Uni_x Format'), self.button_cb, 'convert_to_unix', 'convert_to_unix'] [_('Convert To Uni_x Format'), self.menuitem_cb, 'convert_to_unix', 'convert_to_unix'] # noqa: E501
] ]
]]) ]])
menuspecs.append([_('_Merge'), [ menu_specs.append([_('_Merge'), [
[ [
[_('Copy Selection _Right'), self.button_cb, 'copy_selection_right', 'copy_selection_right'], # noqa: E501 [_('Copy Selection _Right'), self.menuitem_cb, 'copy_selection_right', 'copy_selection_right'], # noqa: E501
[_('Copy Selection _Left'), self.button_cb, 'copy_selection_left', 'copy_selection_left'], # noqa: E501 [_('Copy Selection _Left'), self.menuitem_cb, 'copy_selection_left', 'copy_selection_left'], # noqa: E501
], [ ], [
[_('Copy Left _Into Selection'), self.button_cb, 'copy_left_into_selection', 'copy_left_into_selection'], # noqa: E501 [_('Copy Left _Into Selection'), self.menuitem_cb, 'copy_left_into_selection', 'copy_left_into_selection'], # noqa: E501
[_('Copy Right I_nto Selection'), self.button_cb, 'copy_right_into_selection', 'copy_right_into_selection'], # noqa: E501 [_('Copy Right I_nto Selection'), self.menuitem_cb, 'copy_right_into_selection', 'copy_right_into_selection'], # noqa: E501
[_('_Merge From Left Then Right'), self.button_cb, 'merge_from_left_then_right', 'merge_from_left_then_right'], # noqa: E501 [_('_Merge From Left Then Right'), self.menuitem_cb, 'merge_from_left_then_right', 'merge_from_left_then_right'], # noqa: E501
[_('M_erge From Right Then Left'), self.button_cb, 'merge_from_right_then_left', 'merge_from_right_then_left'] # noqa: E501 [_('M_erge From Right Then Left'), self.menuitem_cb, 'merge_from_right_then_left', 'merge_from_right_then_left'] # noqa: E501
] ]
]]) ]])
menuspecs.append([_('_Help'), [ menu_specs.append([_('_Help'), [
[ [
[_('_Help Contents...'), self.help_contents_cb, None, 'help_contents'], [_('_Help Contents...'), self.help_contents_cb, None, 'help_contents'],
], [ ], [
@ -908,13 +910,13 @@ class DiffuseWindow(Gtk.ApplicationWindow):
self.menu_update_depth = 0 self.menu_update_depth = 0
menubar = Gio.Menu() menubar = Gio.Menu()
for label, sections in menuspecs: for label, sections in menu_specs:
menubar.append_submenu(label, self._create_menu(sections)) menubar.append_submenu(label, self._create_menu(sections))
self.get_application().set_menubar(menubar) self.get_application().set_menubar(menubar)
# create button bar # create toolbar
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
_append_buttons(hbox, Gtk.IconSize.LARGE_TOOLBAR, [ button_specs = [
[DIFFUSE_STOCK_NEW_2WAY_MERGE, self.new_2_way_file_merge_cb, None, _('New 2-Way File Merge')], # noqa: E501 [DIFFUSE_STOCK_NEW_2WAY_MERGE, self.new_2_way_file_merge_cb, None, _('New 2-Way File Merge')], # noqa: E501
[DIFFUSE_STOCK_NEW_3WAY_MERGE, self.new_3_way_file_merge_cb, None, _('New 3-Way File Merge')], # noqa: E501 [DIFFUSE_STOCK_NEW_3WAY_MERGE, self.new_3_way_file_merge_cb, None, _('New 3-Way File Merge')], # noqa: E501
[], [],
@ -937,7 +939,8 @@ class DiffuseWindow(Gtk.ApplicationWindow):
[Gtk.STOCK_COPY, self.button_cb, 'copy', _('Copy')], [Gtk.STOCK_COPY, self.button_cb, 'copy', _('Copy')],
[Gtk.STOCK_PASTE, self.button_cb, 'paste', _('Paste')], [Gtk.STOCK_PASTE, self.button_cb, 'paste', _('Paste')],
[Gtk.STOCK_CLEAR, self.button_cb, 'clear_edits', _('Clear Edits')] [Gtk.STOCK_CLEAR, self.button_cb, 'clear_edits', _('Clear Edits')]
]) ]
_append_buttons(hbox, Gtk.IconSize.LARGE_TOOLBAR, button_specs)
# avoid the button bar from dictating the minimum window size # avoid the button bar from dictating the minimum window size
hbox.set_size_request(0, hbox.get_size_request()[1]) hbox.set_size_request(0, hbox.get_size_request()[1])
vbox.pack_start(hbox, False, False, 0) vbox.pack_start(hbox, False, False, 0)
@ -1700,10 +1703,14 @@ class DiffuseWindow(Gtk.ApplicationWindow):
def last_tab_cb(self, widget, data): def last_tab_cb(self, widget, data):
self.notebook.set_current_page(self.notebook.get_n_pages() - 1) self.notebook.set_current_page(self.notebook.get_n_pages() - 1)
# callback for most menu items and buttons # callback for menu items
def button_cb(self, widget, data): def menuitem_cb(self, widget: Gtk.Widget, data: GLib.Variant) -> None:
self.getCurrentViewer().button_cb(widget, data.get_string()) self.getCurrentViewer().button_cb(widget, data.get_string())
# callback for buttons
def button_cb(self, widget: Gtk.Widget, data: str) -> None:
self.getCurrentViewer().button_cb(widget, data)
# display help documentation # display help documentation
def help_contents_cb(self, widget, data): def help_contents_cb(self, widget, data):
help_url = None help_url = None
@ -1793,17 +1800,16 @@ def _append_buttons(box, size, specs):
"""Convenience method for packing buttons into a container.""" """Convenience method for packing buttons into a container."""
for spec in specs: for spec in specs:
if len(spec) > 0: if len(spec) > 0:
(stock_id, cb, cb_data, label) = spec
button = Gtk.Button() button = Gtk.Button()
button.set_relief(Gtk.ReliefStyle.NONE) button.set_relief(Gtk.ReliefStyle.NONE)
button.set_can_focus(False) button.set_can_focus(False)
image = Gtk.Image() image = Gtk.Image()
image.set_from_stock(spec[0], size) image.set_from_stock(stock_id, size)
button.add(image) button.add(image)
image.show() image.show()
if len(spec) > 2: button.connect('clicked', cb, cb_data)
button.connect('clicked', spec[1], spec[2]) button.set_tooltip_text(label)
if len(spec) > 3:
button.set_tooltip_text(spec[3])
box.pack_start(button, False, False, 0) box.pack_start(button, False, False, 0)
button.show() button.show()
else: else: