def __init__(self): super().__init__() # Manually handle GAction additions actions = ( ("close", self.action_close), ("new-tab", self.action_new_tab), ("stop", self.action_stop), ) for name, callback in actions: action = Gio.SimpleAction.new(name, None) action.connect('activate', callback) self.add_action(action) state_actions = ( ( "fullscreen", self.action_fullscreen_change, GLib.Variant.new_boolean(False), ), ( "gear-menu", None, GLib.Variant.new_boolean(False), ), ) for (name, callback, state) in state_actions: action = Gio.SimpleAction.new_stateful(name, None, state) if callback: action.connect('change-state', callback) self.add_action(action) # Initialise sensitivity for important actions self.lookup_action('stop').set_enabled(False) # Fake out the spinner on Windows. See Gitlab issue #133. if os.name == 'nt': for attr in ('stop', 'hide', 'show', 'start'): setattr(self.spinner, attr, lambda *args: True) self.drag_dest_set( Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, None, Gdk.DragAction.COPY) self.drag_dest_add_uri_targets() self.connect("drag_data_received", self.on_widget_drag_data_received) self.window_state = SavedWindowState() self.window_state.bind(self) self.should_close = False self.idle_hooked = 0 self.scheduler = LifoScheduler() self.scheduler.connect("runnable", self.on_scheduler_runnable) if PROFILE != '': style_context = self.get_style_context() style_context.add_class("devel")
def __init__(self): super().__init__("meldapp.ui", "meldapp") self.widget.set_name("meldapp") actions = ( ("FileMenu", None, _("_File")), ("New", Gtk.STOCK_NEW, _("_New Comparison…"), "<Primary>N", _("Start a new comparison"), self.on_menu_file_new_activate), ("Save", Gtk.STOCK_SAVE, None, None, _("Save the current file"), self.on_menu_save_activate), ("SaveAs", Gtk.STOCK_SAVE_AS, _("Save As…"), "<Primary><shift>S", _("Save the current file with a different name"), self.on_menu_save_as_activate), ("Close", Gtk.STOCK_CLOSE, None, None, _("Close the current file"), self.on_menu_close_activate), ("EditMenu", None, _("_Edit")), ("Undo", Gtk.STOCK_UNDO, None, "<Primary>Z", _("Undo the last action"), self.on_menu_undo_activate), ("Redo", Gtk.STOCK_REDO, None, "<Primary><shift>Z", _("Redo the last undone action"), self.on_menu_redo_activate), ("Cut", Gtk.STOCK_CUT, None, None, _("Cut the selection"), self.on_menu_cut_activate), ("Copy", Gtk.STOCK_COPY, None, None, _("Copy the selection"), self.on_menu_copy_activate), ("Paste", Gtk.STOCK_PASTE, None, None, _("Paste the clipboard"), self.on_menu_paste_activate), ("Find", Gtk.STOCK_FIND, _("Find…"), None, _("Search for text"), self.on_menu_find_activate), ("FindNext", None, _("Find Ne_xt"), "<Primary>G", _("Search forwards for the same text"), self.on_menu_find_next_activate), ("FindPrevious", None, _("Find _Previous"), "<Primary><shift>G", _("Search backwards for the same text"), self.on_menu_find_previous_activate), ("Replace", Gtk.STOCK_FIND_AND_REPLACE, _("_Replace…"), "<Primary>H", _("Find and replace text"), self.on_menu_replace_activate), ("GoToLine", None, _("Go to _Line"), "<Primary>I", _("Go to a specific line"), self.on_menu_go_to_line_activate), ("ChangesMenu", None, _("_Changes")), ("NextChange", Gtk.STOCK_GO_DOWN, _("Next Change"), "<Alt>Down", _("Go to the next change"), self.on_menu_edit_down_activate), ("PrevChange", Gtk.STOCK_GO_UP, _("Previous Change"), "<Alt>Up", _("Go to the previous change"), self.on_menu_edit_up_activate), ("OpenExternal", None, _("Open Externally"), None, _("Open selected file or directory in the default external " "application"), self.on_open_external), ("ViewMenu", None, _("_View")), ("FileStatus", None, _("File Status")), ("VcStatus", None, _("Version Status")), ("FileFilters", None, _("File Filters")), ("Stop", Gtk.STOCK_STOP, None, "Escape", _("Stop the current action"), self.on_toolbar_stop_clicked), ("Refresh", Gtk.STOCK_REFRESH, None, "<Primary>R", _("Refresh the view"), self.on_menu_refresh_activate), ) toggleactions = ( ("Fullscreen", None, _("Fullscreen"), "F11", _("View the comparison in fullscreen"), self.on_action_fullscreen_toggled, False), ("ToolbarVisible", None, _("_Toolbar"), None, _("Show or hide the toolbar"), None, True), ) self.actiongroup = Gtk.ActionGroup(name='MainActions') self.actiongroup.set_translation_domain("meld") self.actiongroup.add_actions(actions) self.actiongroup.add_toggle_actions(toggleactions) recent_action = Gtk.RecentAction(name="Recent", label=_("Open Recent"), tooltip=_("Open recent files"), stock_id=None) recent_action.set_show_private(True) recent_action.set_filter(recent_comparisons.recent_filter) recent_action.set_sort_type(Gtk.RecentSortType.MRU) recent_action.connect("item-activated", self.on_action_recent) self.actiongroup.add_action(recent_action) self.ui = Gtk.UIManager() self.ui.insert_action_group(self.actiongroup, 0) self.ui.add_ui_from_file(ui_file("meldapp-ui.xml")) # Manually handle shells that don't show an application menu gtk_settings = Gtk.Settings.get_default() if not gtk_settings.props.gtk_shell_shows_app_menu: from meld.meldapp import app def make_app_action(name): def app_action(*args): app.lookup_action(name).activate(None) return app_action app_actions = ( ("AppMenu", None, _("_Meld")), ("Quit", Gtk.STOCK_QUIT, None, None, _("Quit the program"), make_app_action('quit')), ("Preferences", Gtk.STOCK_PREFERENCES, _("Prefere_nces"), None, _("Configure the application"), make_app_action('preferences')), ("Help", Gtk.STOCK_HELP, _("_Contents"), "F1", _("Open the Meld manual"), make_app_action('help')), ("About", Gtk.STOCK_ABOUT, None, None, _("About this application"), make_app_action('about')), ) app_actiongroup = Gtk.ActionGroup(name="AppActions") app_actiongroup.set_translation_domain("meld") app_actiongroup.add_actions(app_actions) self.ui.insert_action_group(app_actiongroup, 0) self.ui.add_ui_from_file(ui_file("appmenu-fallback.xml")) self.widget.set_show_menubar(False) for menuitem in ("Save", "Undo"): self.actiongroup.get_action(menuitem).props.is_important = True self.widget.add_accel_group(self.ui.get_accel_group()) self.menubar = self.ui.get_widget('/Menubar') self.toolbar = self.ui.get_widget('/Toolbar') self.toolbar.get_style_context().add_class( Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) settings.bind('toolbar-visible', self.actiongroup.get_action('ToolbarVisible'), 'active', Gio.SettingsBindFlags.DEFAULT) settings.bind('toolbar-visible', self.toolbar, 'visible', Gio.SettingsBindFlags.DEFAULT) interface_settings.bind('toolbar-style', self.toolbar, 'toolbar-style', Gio.SettingsBindFlags.DEFAULT) # Alternate keybindings for a few commands. extra_accels = ( ("<Primary>D", self.on_menu_edit_down_activate), ("<Primary>E", self.on_menu_edit_up_activate), ("<Alt>KP_Down", self.on_menu_edit_down_activate), ("<Alt>KP_Up", self.on_menu_edit_up_activate), ("F5", self.on_menu_refresh_activate), ) accel_group = self.ui.get_accel_group() for accel, callback in extra_accels: keyval, mask = Gtk.accelerator_parse(accel) accel_group.connect(keyval, mask, 0, callback) # Initialise sensitivity for important actions self.actiongroup.get_action("Stop").set_sensitive(False) self._update_page_action_sensitivity() self.appvbox.pack_start(self.menubar, False, True, 0) self.toolbar_holder.pack_start(self.toolbar, True, True, 0) # Double toolbars to work around UIManager integration issues self.secondary_toolbar = Gtk.Toolbar() self.secondary_toolbar.get_style_context().add_class( Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) self.toolbar_holder.pack_end(self.secondary_toolbar, False, True, 0) # Manually handle GAction additions actions = (("close", self.on_menu_close_activate, None), ) for (name, callback, accel) in actions: action = Gio.SimpleAction.new(name, None) action.connect('activate', callback) self.widget.add_action(action) # Create a secondary toolbar, just to hold our progress spinner toolbutton = Gtk.ToolItem() self.spinner = Gtk.Spinner() # Fake out the spinner on Windows. See Gitlab issue #133. if os.name == 'nt': for attr in ('stop', 'hide', 'show', 'start'): setattr(self.spinner, attr, lambda *args: True) toolbutton.add(self.spinner) self.secondary_toolbar.insert(toolbutton, -1) # Set a minimum size because the spinner requests nothing self.secondary_toolbar.set_size_request(30, -1) self.secondary_toolbar.show_all() self.widget.drag_dest_set( Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, None, Gdk.DragAction.COPY) self.widget.drag_dest_add_uri_targets() self.widget.connect("drag_data_received", self.on_widget_drag_data_received) self.window_state = SavedWindowState() self.window_state.bind(self.widget) self.should_close = False self.idle_hooked = 0 self.scheduler = LifoScheduler() self.scheduler.connect("runnable", self.on_scheduler_runnable) self.ui.ensure_update() self.diff_handler = None self.undo_handlers = tuple() self.widget.connect('focus_in_event', self.on_focus_change) self.widget.connect('focus_out_event', self.on_focus_change) # Set tooltip on map because the recentmenu is lazily created rmenu = self.ui.get_widget('/Menubar/FileMenu/Recent').get_submenu() rmenu.connect("map", self._on_recentmenu_map) builder = meld.ui.util.get_builder("shortcuts.ui") shortcut_window = builder.get_object("shortcuts-meld") self.widget.set_help_overlay(shortcut_window)
def __init__(self): super().__init__() self.init_template() actions = ( ("FileMenu", None, _("_File")), ("New", Gtk.STOCK_NEW, _("_New Comparison…"), "<Primary>N", _("Start a new comparison"), self.on_menu_file_new_activate), ("Save", Gtk.STOCK_SAVE, None, None, _("Save the current file"), self.on_menu_save_activate), ("SaveAs", Gtk.STOCK_SAVE_AS, _("Save As…"), "<Primary><shift>S", _("Save the current file with a different name"), self.on_menu_save_as_activate), ("Close", Gtk.STOCK_CLOSE, None, None, _("Close the current file"), self.on_menu_close_activate), ("EditMenu", None, _("_Edit")), ("Undo", Gtk.STOCK_UNDO, None, "<Primary>Z", _("Undo the last action"), self.on_menu_undo_activate), ("Redo", Gtk.STOCK_REDO, None, "<Primary><shift>Z", _("Redo the last undone action"), self.on_menu_redo_activate), ("Cut", Gtk.STOCK_CUT, None, None, _("Cut the selection"), self.on_menu_cut_activate), ("Copy", Gtk.STOCK_COPY, None, None, _("Copy the selection"), self.on_menu_copy_activate), ("Paste", Gtk.STOCK_PASTE, None, None, _("Paste the clipboard"), self.on_menu_paste_activate), ("Find", Gtk.STOCK_FIND, _("Find…"), None, _("Search for text"), self.on_menu_find_activate), ("FindNext", None, _("Find Ne_xt"), "<Primary>G", _("Search forwards for the same text"), self.on_menu_find_next_activate), ("FindPrevious", None, _("Find _Previous"), "<Primary><shift>G", _("Search backwards for the same text"), self.on_menu_find_previous_activate), ("Replace", Gtk.STOCK_FIND_AND_REPLACE, _("_Replace…"), "<Primary>H", _("Find and replace text"), self.on_menu_replace_activate), ("GoToLine", None, _("Go to _Line"), "<Primary>I", _("Go to a specific line"), self.on_menu_go_to_line_activate), ("ChangesMenu", None, _("_Changes")), ("NextChange", Gtk.STOCK_GO_DOWN, _("Next Change"), "<Alt>Down", _("Go to the next change"), self.on_menu_edit_down_activate), ("PrevChange", Gtk.STOCK_GO_UP, _("Previous Change"), "<Alt>Up", _("Go to the previous change"), self.on_menu_edit_up_activate), ("OpenExternal", None, _("Open Externally"), None, _("Open selected file or directory in the default external " "application"), self.on_open_external), ("ViewMenu", None, _("_View")), ("FileStatus", None, _("File Status")), ("VcStatus", None, _("Version Status")), ("FileFilters", None, _("File Filters")), ("Stop", Gtk.STOCK_STOP, None, "Escape", _("Stop the current action"), self.on_toolbar_stop_clicked), ("Refresh", Gtk.STOCK_REFRESH, None, "<Primary>R", _("Refresh the view"), self.on_menu_refresh_activate), ) toggleactions = (("Fullscreen", None, _("Fullscreen"), "F11", _("View the comparison in fullscreen"), self.on_action_fullscreen_toggled, False), ) self.actiongroup = Gtk.ActionGroup(name='MainActions') self.actiongroup.set_translation_domain("meld") self.actiongroup.add_actions(actions) self.actiongroup.add_toggle_actions(toggleactions) recent_action = Gtk.RecentAction(name="Recent", label=_("Open Recent"), tooltip=_("Open recent files"), stock_id=None) recent_action.set_show_private(True) recent_action.set_filter(recent_comparisons.recent_filter) recent_action.set_sort_type(Gtk.RecentSortType.MRU) recent_action.connect("item-activated", self.on_action_recent) self.actiongroup.add_action(recent_action) self.ui = Gtk.UIManager() self.ui.insert_action_group(self.actiongroup, 0) self.ui.add_ui_from_file(ui_file("meldapp-ui.xml")) for menuitem in ("Save", "Undo"): self.actiongroup.get_action(menuitem).props.is_important = True self.add_accel_group(self.ui.get_accel_group()) self.menubar = self.ui.get_widget('/Menubar') self.toolbar = self.ui.get_widget('/Toolbar') self.toolbar.get_style_context().add_class( Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) # Alternate keybindings for a few commands. extra_accels = ( ("<Primary>D", self.on_menu_edit_down_activate), ("<Primary>E", self.on_menu_edit_up_activate), ("<Alt>KP_Down", self.on_menu_edit_down_activate), ("<Alt>KP_Up", self.on_menu_edit_up_activate), ("F5", self.on_menu_refresh_activate), ) accel_group = self.ui.get_accel_group() for accel, callback in extra_accels: keyval, mask = Gtk.accelerator_parse(accel) accel_group.connect(keyval, mask, 0, callback) # Initialise sensitivity for important actions self.actiongroup.get_action("Stop").set_sensitive(False) self._update_page_action_sensitivity() self.appvbox.pack_start(self.menubar, False, True, 0) self.toolbar_holder.pack_start(self.toolbar, True, True, 0) # This double toolbar works around integrating non-UIManager widgets # into the toolbar. It's no longer used, but kept as a possible # GAction porting helper. self.secondary_toolbar = Gtk.Toolbar() self.secondary_toolbar.get_style_context().add_class( Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) self.toolbar_holder.pack_end(self.secondary_toolbar, False, True, 0) self.secondary_toolbar.show_all() # Manually handle GAction additions actions = (("close", self.on_menu_close_activate, None), ) for (name, callback, accel) in actions: action = Gio.SimpleAction.new(name, None) action.connect('activate', callback) self.add_action(action) # Fake out the spinner on Windows. See Gitlab issue #133. if os.name == 'nt': for attr in ('stop', 'hide', 'show', 'start'): setattr(self.spinner, attr, lambda *args: True) self.drag_dest_set( Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, None, Gdk.DragAction.COPY) self.drag_dest_add_uri_targets() self.connect("drag_data_received", self.on_widget_drag_data_received) self.window_state = SavedWindowState() self.window_state.bind(self) self.should_close = False self.idle_hooked = 0 self.scheduler = LifoScheduler() self.scheduler.connect("runnable", self.on_scheduler_runnable) self.ui.ensure_update() self.diff_handler = None self.undo_handlers = tuple() # Set tooltip on map because the recentmenu is lazily created rmenu = self.ui.get_widget('/Menubar/FileMenu/Recent').get_submenu() rmenu.connect("map", self._on_recentmenu_map)