fix: clicking buttons in the toolbar was crashing (#189)
This commit is contained in:
parent
977d015c35
commit
311975cadc
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"davidanson.vscode-markdownlint",
|
||||||
|
"mesonbuild.mesonbuild",
|
||||||
|
"ms-python.python",
|
||||||
|
"redhat.vscode-yaml"
|
||||||
|
]
|
||||||
|
}
|
|
@ -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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue