def __init__(self): gnomeglade.Component.__init__(self, "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), ("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), ) ui_file = gnomeglade.ui_file("meldapp-ui.xml") 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) # 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 or is_darwin(): 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) ui_file = gnomeglade.ui_file("appmenu-fallback.xml") self.ui.add_ui_from_file(ui_file) 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) # Add alternate keybindings for Prev/Next Change accels = self.ui.get_accel_group() (keyval, mask) = Gtk.accelerator_parse("<Primary>D") accels.connect(keyval, mask, 0, self.on_menu_edit_down_activate) (keyval, mask) = Gtk.accelerator_parse("<Primary>E") accels.connect(keyval, mask, 0, self.on_menu_edit_up_activate) (keyval, mask) = Gtk.accelerator_parse("F5") accels.connect(keyval, mask, 0, self.on_menu_refresh_activate) # 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) toolbutton = Gtk.ToolItem() self.spinner = Gtk.Spinner() 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 = task.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) if is_darwin(): self.osx_ready = False self.widget.connect('window_state_event', self.osx_menu_setup) # 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) try: builder = meld.ui.util.get_builder("shortcuts.ui") shortcut_window = builder.get_object("shortcuts-meld") self.widget.set_help_overlay(shortcut_window) except GLib.Error: # GtkShortcutsWindow is new in GTK+ 3.20 pass
def __init__(self): gnomeglade.Component.__init__(self, "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), ("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), ("TabMenu", None, _("_Tabs")), ("PrevTab", None, _("_Previous Tab"), "<Ctrl><Alt>Page_Up", _("Activate previous tab"), self.on_prev_tab), ("NextTab", None, _("_Next Tab"), "<Ctrl><Alt>Page_Down", _("Activate next tab"), self.on_next_tab), ("MoveTabPrev", None, _("Move Tab _Left"), "<Ctrl><Alt><Shift>Page_Up", _("Move current tab to left"), self.on_move_tab_prev), ("MoveTabNext", None, _("Move Tab _Right"), "<Ctrl><Alt><Shift>Page_Down", _("Move current tab to right"), self.on_move_tab_next), ) 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), ) ui_file = gnomeglade.ui_file("meldapp-ui.xml") 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) # 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 or is_darwin(): from 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) ui_file = gnomeglade.ui_file("appmenu-fallback.xml") self.ui.add_ui_from_file(ui_file) self.widget.set_show_menubar(False) self.tab_switch_actiongroup = None self.tab_switch_merge_id = None 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) # Add alternate keybindings for Prev/Next Change accels = self.ui.get_accel_group() (keyval, mask) = Gtk.accelerator_parse("<Primary>D") accels.connect(keyval, mask, 0, self.on_menu_edit_down_activate) (keyval, mask) = Gtk.accelerator_parse("<Primary>E") accels.connect(keyval, mask, 0, self.on_menu_edit_up_activate) (keyval, mask) = Gtk.accelerator_parse("F5") accels.connect(keyval, mask, 0, self.on_menu_refresh_activate) # 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) toolbutton = Gtk.ToolItem() self.spinner = Gtk.Spinner() 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.should_close = False self.idle_hooked = 0 self.scheduler = task.LifoScheduler() self.scheduler.connect("runnable", self.on_scheduler_runnable) window_size = settings.get_value('window-size') self.widget.set_default_size(window_size[0], window_size[1]) window_state = settings.get_string('window-state') if window_state == 'maximized': self.widget.maximize() 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) if is_darwin(): self.osx_ready = False self.widget.connect('window_state_event', self.osx_menu_setup) # 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) try: builder = meld.ui.util.get_builder("shortcuts.ui") shortcut_window = builder.get_object("shortcuts-meld") self.widget.set_help_overlay(shortcut_window) except GLib.Error: # GtkShortcutsWindow is new in GTK+ 3.20 pass