def _create_header_context_menu(self, menu, idx): if idx == self.idx_staged: menu.addAction(qtutils.remove_icon(), N_('Unstage All'), cmds.run(cmds.UnstageAll)) return menu elif idx == self.idx_unmerged: action = menu.addAction(qtutils.add_icon(), cmds.StageUnmerged.name(), cmds.run(cmds.StageUnmerged)) action.setShortcut(hotkeys.STAGE_SELECTION) return menu elif idx == self.idx_modified: action = menu.addAction(qtutils.add_icon(), cmds.StageModified.name(), cmds.run(cmds.StageModified)) action.setShortcut(hotkeys.STAGE_SELECTION) return menu elif idx == self.idx_untracked: action = menu.addAction(qtutils.add_icon(), cmds.StageUntracked.name(), cmds.run(cmds.StageUntracked)) action.setShortcut(hotkeys.STAGE_SELECTION) return menu
def _create_header_context_menu(self, menu, idx): if idx == self.idx_staged: menu.addAction(qtutils.remove_icon(), N_('Unstage All'), cmds.run(cmds.UnstageAll)) return menu elif idx == self.idx_unmerged: action = menu.addAction(qtutils.add_icon(), cmds.StageUnmerged.name(), cmds.run(cmds.StageUnmerged)) action.setShortcut(cmds.StageUnmerged.SHORTCUT) return menu elif idx == self.idx_modified: action = menu.addAction(qtutils.add_icon(), cmds.StageModified.name(), cmds.run(cmds.StageModified)) action.setShortcut(cmds.StageModified.SHORTCUT) return menu elif idx == self.idx_untracked: action = menu.addAction(qtutils.add_icon(), cmds.StageUntracked.name(), cmds.run(cmds.StageUntracked)) action.setShortcut(cmds.StageUntracked.SHORTCUT) return menu
def _create_staged_context_menu(self, menu, s): if s.staged[0] in self.m.submodules: return self._create_staged_submodule_context_menu(menu, s) if self.m.unstageable(): action = menu.addAction( qtutils.remove_icon(), N_("Unstage Selected"), cmds.run(cmds.Unstage, self.staged()) ) action.setShortcut(cmds.Unstage.SHORTCUT) # Do all of the selected items exist? all_exist = all(not i in self.m.staged_deleted and core.exists(i) for i in self.staged()) if all_exist: menu.addAction(self.launch_editor_action) menu.addAction(self.launch_difftool_action) if all_exist and not utils.is_win32(): menu.addSeparator() action = menu.addAction( qtutils.file_icon(), cmds.OpenDefaultApp.name(), cmds.run(cmds.OpenDefaultApp, self.staged()) ) action.setShortcut(cmds.OpenDefaultApp.SHORTCUT) action = menu.addAction(qtutils.open_file_icon(), cmds.OpenParentDir.name(), self._open_parent_dir) action.setShortcut(cmds.OpenParentDir.SHORTCUT) if self.m.undoable(): menu.addSeparator() menu.addAction(self.revert_unstaged_edits_action) menu.addSeparator() menu.addAction(self.copy_path_action) menu.addAction(self.copy_relpath_action) return menu
def _create_staged_submodule_context_menu(self, menu, s): menu.addAction(qtutils.git_icon(), N_("Launch git-cola"), cmds.run(cmds.OpenRepo, core.abspath(s.staged[0]))) menu.addAction(self.launch_editor_action) menu.addSeparator() action = menu.addAction(qtutils.remove_icon(), N_("Unstage Selected"), cmds.run(cmds.Unstage, self.staged())) action.setShortcut(cmds.Unstage.SHORTCUT) menu.addSeparator() menu.addAction(self.copy_path_action) menu.addAction(self.copy_relpath_action) return menu
def __init__(self, style=BOOKMARKS, parent=None): QtGui.QWidget.__init__(self, parent) self.style = style self.settings = Settings() self.tree = BookmarksTreeWidget(style, self.settings, parent=self) self.add_button = qtutils.create_action_button( tooltip=N_('Add'), icon=qtutils.add_icon()) self.delete_button = qtutils.create_action_button( tooltip=N_('Delete'), icon=qtutils.remove_icon()) self.delete_button.setEnabled(False) self.open_button = qtutils.create_action_button( tooltip=N_('Open'), icon=qtutils.open_icon()) self.open_button.setEnabled(False) self.button_layout = QtGui.QHBoxLayout() self.button_layout.setMargin(defs.no_margin) self.button_layout.setSpacing(defs.spacing) self.button_layout.addWidget(self.open_button) self.button_layout.addWidget(self.add_button) self.button_layout.addWidget(self.delete_button) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.no_margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addWidget(self.tree) self.setLayout(self.main_layout) self.corner_widget = QtGui.QWidget(self) self.corner_widget.setLayout(self.button_layout) titlebar = parent.titleBarWidget() titlebar.add_corner_widget(self.corner_widget) self.setFocusProxy(self.tree) if style == BOOKMARKS: self.setToolTip(N_('Bookmarked repositories')) elif style == RECENT_REPOS: self.setToolTip(N_('Recent repositories')) self.add_button.hide() qtutils.connect_button(self.add_button, self.tree.add_bookmark) qtutils.connect_button(self.delete_button, self.tree.delete_bookmark) qtutils.connect_button(self.open_button, self.tree.open_repo) self.connect(self.tree, SIGNAL('itemSelectionChanged()'), self.tree_item_selection_changed) QtCore.QTimer.singleShot(0, self.reload_bookmarks)
def __init__(self, style=BOOKMARKS, parent=None): QtGui.QWidget.__init__(self, parent) self.style = style self.settings = Settings() self.tree = BookmarksTreeWidget(style, self.settings, parent=self) self.add_button = qtutils.create_action_button(tooltip=N_('Add'), icon=qtutils.add_icon()) self.delete_button = qtutils.create_action_button( tooltip=N_('Delete'), icon=qtutils.remove_icon()) self.delete_button.setEnabled(False) self.open_button = qtutils.create_action_button( tooltip=N_('Open'), icon=qtutils.open_icon()) self.open_button.setEnabled(False) self.setFocusProxy(self.tree) if style == BOOKMARKS: self.setToolTip(N_('Bookmarked repositories')) elif style == RECENT_REPOS: self.setToolTip(N_('Recent repositories')) self.add_button.hide() self.button_layout = qtutils.hbox(defs.no_margin, defs.spacing, self.open_button, self.add_button, self.delete_button) self.main_layout = qtutils.vbox(defs.no_margin, defs.spacing, self.tree) self.setLayout(self.main_layout) self.corner_widget = QtGui.QWidget(self) self.corner_widget.setLayout(self.button_layout) titlebar = parent.titleBarWidget() titlebar.add_corner_widget(self.corner_widget) qtutils.connect_button(self.add_button, self.tree.add_bookmark) qtutils.connect_button(self.delete_button, self.tree.delete_bookmark) qtutils.connect_button(self.open_button, self.tree.open_repo) self.connect(self.tree, SIGNAL('itemSelectionChanged()'), self.tree_item_selection_changed) QtCore.QTimer.singleShot(0, self.reload_bookmarks)
def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.settings = Settings() self.tree = BookmarksTreeWidget(self.settings, parent=self) self.add_button = qtutils.create_action_button(tooltip=N_('Add'), icon=qtutils.add_icon()) self.delete_button = qtutils.create_action_button( tooltip=N_('Delete'), icon=qtutils.remove_icon()) self.delete_button.setEnabled(False) self.open_button = qtutils.create_action_button( tooltip=N_('Open'), icon=qtutils.open_icon()) self.open_button.setEnabled(False) qtutils.connect_button(self.add_button, self.tree.add_bookmark) qtutils.connect_button(self.delete_button, self.tree.delete_bookmark) qtutils.connect_button(self.open_button, self.tree.open_repo) self.connect(self.tree, SIGNAL('itemSelectionChanged()'), self.tree_item_selection_changed) self.button_layout = QtGui.QHBoxLayout() self.button_layout.setMargin(defs.no_margin) self.button_layout.setSpacing(defs.spacing) self.button_layout.addWidget(self.open_button) self.button_layout.addWidget(self.add_button) self.button_layout.addWidget(self.delete_button) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.no_margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addWidget(self.tree) self.setLayout(self.main_layout) self.corner_widget = QtGui.QWidget(self) self.corner_widget.setLayout(self.button_layout) titlebar = parent.titleBarWidget() titlebar.add_corner_widget(self.corner_widget) self.setFocusProxy(self.tree) QtCore.QTimer.singleShot(0, self.reload_bookmarks)
def _create_staged_submodule_context_menu(self, menu, s): menu.addAction(qtutils.git_icon(), N_('Launch git-cola'), cmds.run(cmds.OpenRepo, core.abspath(s.staged[0]))) menu.addAction(self.launch_editor_action) menu.addSeparator() action = menu.addAction(qtutils.remove_icon(), N_('Unstage Selected'), cmds.run(cmds.Unstage, self.staged())) action.setShortcut(hotkeys.STAGE_SELECTION) menu.addSeparator() menu.addAction(self.copy_path_action) menu.addAction(self.copy_relpath_action) menu.addAction(self.view_history_action) return menu
def _create_staged_context_menu(self, menu, s): if s.staged[0] in self.m.submodules: return self._create_staged_submodule_context_menu(menu, s) if self.m.unstageable(): action = menu.addAction(qtutils.remove_icon(), N_('Unstage Selected'), cmds.run(cmds.Unstage, self.staged())) action.setShortcut(hotkeys.STAGE_SELECTION) # Do all of the selected items exist? all_exist = all(not i in self.m.staged_deleted and core.exists(i) for i in self.staged()) if all_exist: menu.addAction(self.launch_editor_action) menu.addAction(self.launch_difftool_action) if all_exist and not utils.is_win32(): menu.addSeparator() action = menu.addAction(qtutils.file_icon(), cmds.OpenDefaultApp.name(), cmds.run(cmds.OpenDefaultApp, self.staged())) action.setShortcut(hotkeys.PRIMARY_ACTION) action = menu.addAction(qtutils.open_file_icon(), cmds.OpenParentDir.name(), self._open_parent_dir) action.setShortcut(hotkeys.SECONDARY_ACTION) if self.m.undoable(): menu.addSeparator() menu.addAction(self.revert_unstaged_edits_action) menu.addSeparator() menu.addAction(self.copy_path_action) menu.addAction(self.copy_relpath_action) menu.addAction(self.view_history_action) return menu
def __init__(self, parent=None): super(ApplyPatches, self).__init__(parent=parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Apply Patches')) self.setAcceptDrops(True) if parent is not None: self.setWindowModality(Qt.WindowModal) self.curdir = os.getcwd() self.inner_drag = False self.usage = QtGui.QLabel() self.usage.setText(N_(""" <p> Drag and drop or use the <strong>Add</strong> button to add patches to the list </p> """)) self.tree = PatchTreeWidget(parent=self) self.tree.setHeaderHidden(True) self.add_button = qtutils.create_toolbutton( text=N_('Add'), icon=qtutils.add_icon(), tooltip=N_('Add patches (+)')) self.remove_button = qtutils.create_toolbutton( text=N_('Remove'), icon=qtutils.remove_icon(), tooltip=N_('Remove selected (Delete)')) self.apply_button = qtutils.create_button( text=N_('Apply'), icon=qtutils.apply_icon()) self.close_button = qtutils.create_button( text=N_('Close'), icon=qtutils.close_icon()) self.add_action = qtutils.add_action(self, N_('Add'), self.add_files, Qt.Key_Plus) self.remove_action = qtutils.add_action(self, N_('Remove'), self.tree.remove_selected, QtGui.QKeySequence.Delete, Qt.Key_Backspace, Qt.Key_Minus) layout = QtGui.QVBoxLayout() layout.setMargin(defs.margin) layout.setSpacing(defs.spacing) top = QtGui.QHBoxLayout() top.setMargin(defs.no_margin) top.setSpacing(defs.button_spacing) top.addWidget(self.add_button) top.addWidget(self.remove_button) top.addStretch() top.addWidget(self.usage) bottom = QtGui.QHBoxLayout() bottom.setMargin(defs.no_margin) bottom.setSpacing(defs.button_spacing) bottom.addWidget(self.apply_button) bottom.addStretch() bottom.addWidget(self.close_button) layout.addLayout(top) layout.addWidget(self.tree) layout.addLayout(bottom) self.setLayout(layout) qtutils.connect_button(self.add_button, self.add_files) qtutils.connect_button(self.remove_button, self.tree.remove_selected) qtutils.connect_button(self.apply_button, self.apply_patches) qtutils.connect_button(self.close_button, self.close) if not self.restore_state(): self.resize(666, 420)
def contextMenuEvent(self, event): """Create the context menu for the diff display.""" menu = QtGui.QMenu(self) s = selection.selection() filename = selection.filename() if self.model.stageable() or self.model.unstageable(): if self.model.stageable(): self.stage_or_unstage.setText(N_('Stage')) else: self.stage_or_unstage.setText(N_('Unstage')) menu.addAction(self.stage_or_unstage) if s.modified and self.model.stageable(): if s.modified[0] in main.model().submodules: action = menu.addAction(qtutils.add_icon(), cmds.Stage.name(), cmds.run(cmds.Stage, s.modified)) action.setShortcut(cmds.Stage.SHORTCUT) menu.addAction(qtutils.git_icon(), N_('Launch git-cola'), cmds.run(cmds.OpenRepo, core.abspath(s.modified[0]))) elif s.modified[0] not in main.model().unstaged_deleted: if self.has_selection(): apply_text = N_('Stage Selected Lines') revert_text = N_('Revert Selected Lines...') else: apply_text = N_('Stage Diff Hunk') revert_text = N_('Revert Diff Hunk...') self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.add_icon()) self.action_revert_selection.setText(revert_text) menu.addAction(self.action_apply_selection) menu.addAction(self.action_revert_selection) if s.staged and self.model.unstageable(): if s.staged[0] in main.model().submodules: action = menu.addAction(qtutils.remove_icon(), cmds.Unstage.name(), cmds.do(cmds.Unstage, s.staged)) action.setShortcut(cmds.Unstage.SHORTCUT) menu.addAction(qtutils.git_icon(), N_('Launch git-cola'), cmds.do(cmds.OpenRepo, core.abspath(s.staged[0]))) elif s.staged[0] not in main.model().staged_deleted: if self.has_selection(): apply_text = N_('Unstage Selected Lines') else: apply_text = N_('Unstage Diff Hunk') self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.remove_icon()) menu.addAction(self.action_apply_selection) if self.model.stageable() or self.model.unstageable(): # Do not show the "edit" action when the file does not exist. # Untracked files exist by definition. if filename and core.exists(filename): menu.addSeparator() menu.addAction(self.launch_editor) # Removed files can still be diffed. menu.addAction(self.launch_difftool) # Add the Previous/Next File actions, which improves discoverability # of their associated shortcuts menu.addSeparator() menu.addAction(self.move_up) menu.addAction(self.move_down) menu.addSeparator() action = menu.addAction(qtutils.theme_icon('edit-copy.svg'), N_('Copy'), self.copy) action.setShortcut(QtGui.QKeySequence.Copy) action = menu.addAction(qtutils.theme_icon('edit-select-all.svg'), N_('Select All'), self.selectAll) action.setShortcut(QtGui.QKeySequence.SelectAll) menu.exec_(self.mapToGlobal(event.pos()))
def __init__(self, model, parent=None, settings=None): standard.MainWindow.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) # Default size; this is thrown out when save/restore is used self.model = model self.settings = settings self.prefs_model = prefs_model = prefs.PreferencesModel() # The widget version is used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 2 # Runs asynchronous tasks self.task_runner = TaskRunner(self) self.progress = standard.ProgressDialog('', '', self) cfg = gitcfg.current() self.browser_dockable = (cfg.get('cola.browserdockable') or cfg.get('cola.classicdockable')) if self.browser_dockable: self.browserdockwidget = create_dock(N_('Browser'), self) self.browserwidget = browse.worktree_browser_widget(self) self.browserdockwidget.setWidget(self.browserwidget) # "Actions" widget self.actionsdockwidget = create_dock(N_('Actions'), self) self.actionsdockwidgetcontents = action.ActionButtons(self) self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) self.actionsdockwidget.toggleViewAction().setChecked(False) self.actionsdockwidget.hide() # "Repository Status" widget self.statusdockwidget = create_dock(N_('Status'), self) titlebar = self.statusdockwidget.titleBarWidget() self.statuswidget = status.StatusWidget(titlebar, parent=self.statusdockwidget) self.statusdockwidget.setWidget(self.statuswidget) # "Switch Repository" widgets self.bookmarksdockwidget = create_dock(N_('Favorites'), self) self.bookmarkswidget = bookmarks.BookmarksWidget( bookmarks.BOOKMARKS, parent=self.bookmarksdockwidget) self.bookmarksdockwidget.setWidget(self.bookmarkswidget) self.recentdockwidget = create_dock(N_('Recent'), self) self.recentwidget = bookmarks.BookmarksWidget( bookmarks.RECENT_REPOS, parent=self.recentdockwidget) self.recentdockwidget.setWidget(self.recentwidget) self.recentdockwidget.hide() # "Commit Message Editor" widget self.position_label = QtGui.QLabel() font = qtutils.default_monospace_font() font.setPointSize(int(font.pointSize() * 0.8)) self.position_label.setFont(font) # make the position label fixed size to avoid layout issues fm = self.position_label.fontMetrics() width = fm.width('999:999') height = self.position_label.sizeHint().height() self.position_label.setFixedSize(width, height) self.commitdockwidget = create_dock(N_('Commit'), self) titlebar = self.commitdockwidget.titleBarWidget() titlebar.add_corner_widget(self.position_label) self.commitmsgeditor = commitmsg.CommitMessageEditor(model, self) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Console" widget self.logwidget = log.LogWidget() self.logdockwidget = create_dock(N_('Console'), self) self.logdockwidget.setWidget(self.logwidget) self.logdockwidget.toggleViewAction().setChecked(False) self.logdockwidget.hide() # "Diff Viewer" widget self.diffdockwidget = create_dock(N_('Diff'), self) self.diffeditorwidget = diff.DiffEditorWidget(self.diffdockwidget) self.diffeditor = self.diffeditorwidget.editor self.diffdockwidget.setWidget(self.diffeditorwidget) # All Actions self.unstage_all_action = add_action(self, N_('Unstage All'), cmds.run(cmds.UnstageAll)) self.unstage_all_action.setIcon(qtutils.remove_icon()) self.unstage_selected_action = add_action(self, N_('Unstage From Commit'), cmds.run(cmds.UnstageSelected)) self.unstage_selected_action.setIcon(qtutils.remove_icon()) self.show_diffstat_action = add_action(self, N_('Diffstat'), cmds.run(cmds.Diffstat), hotkeys.DIFFSTAT) self.stage_modified_action = add_action(self, N_('Stage Changed Files To Commit'), cmds.run(cmds.StageModified), hotkeys.STAGE_MODIFIED) self.stage_modified_action.setIcon(qtutils.add_icon()) self.stage_untracked_action = add_action(self, N_('Stage All Untracked'), cmds.run(cmds.StageUntracked), hotkeys.STAGE_UNTRACKED) self.stage_untracked_action.setIcon(qtutils.add_icon()) self.apply_patches_action = add_action(self, N_('Apply Patches...'), patch.apply_patches) self.export_patches_action = add_action(self, N_('Export Patches...'), guicmds.export_patches, hotkeys.EXPORT) self.new_repository_action = add_action(self, N_('New Repository...'), guicmds.open_new_repo) self.new_repository_action.setIcon(qtutils.new_icon()) self.preferences_action = add_action(self, N_('Preferences'), self.preferences, QtGui.QKeySequence.Preferences) self.edit_remotes_action = add_action(self, N_('Edit Remotes...'), lambda: editremotes.remote_editor().exec_()) self.rescan_action = add_action(self, cmds.Refresh.name(), cmds.run(cmds.Refresh), *hotkeys.REFRESH_HOTKEYS) self.rescan_action.setIcon(qtutils.reload_icon()) self.find_files_action = add_action(self, N_('Find Files'), finder.finder, hotkeys.FINDER, hotkeys.FINDER_SECONDARY) self.find_files_action.setIcon(qtutils.theme_icon('zoom-in.png')) self.browse_recently_modified_action = add_action(self, N_('Recently Modified Files...'), recent.browse_recent_files, hotkeys.EDIT_SECONDARY) self.cherry_pick_action = add_action(self, N_('Cherry-Pick...'), guicmds.cherry_pick, hotkeys.CHERRY_PICK) self.load_commitmsg_action = add_action(self, N_('Load Commit Message...'), guicmds.load_commitmsg) self.save_tarball_action = add_action(self, N_('Save As Tarball/Zip...'), self.save_archive) self.quit_action = add_action(self, N_('Quit'), self.close, hotkeys.QUIT) self.grep_action = add_action(self, N_('Grep'), grep.grep, hotkeys.GREP) self.merge_local_action = add_action(self, N_('Merge...'), merge.local_merge, hotkeys.MERGE) self.merge_abort_action = add_action(self, N_('Abort Merge...'), merge.abort_merge) self.fetch_action = add_action(self, N_('Fetch...'), remote.fetch, hotkeys.FETCH) self.push_action = add_action(self, N_('Push...'), remote.push, hotkeys.PUSH) self.pull_action = add_action(self, N_('Pull...'), remote.pull, hotkeys.PULL) self.open_repo_action = add_action(self, N_('Open...'), guicmds.open_repo) self.open_repo_action.setIcon(qtutils.open_icon()) self.open_repo_new_action = add_action(self, N_('Open in New Window...'), guicmds.open_repo_in_new_window) self.open_repo_new_action.setIcon(qtutils.open_icon()) self.stash_action = add_action(self, N_('Stash...'), stash.stash, hotkeys.STASH) self.clone_repo_action = add_action(self, N_('Clone...'), self.clone_repo) self.clone_repo_action.setIcon(qtutils.git_icon()) self.help_docs_action = add_action(self, N_('Documentation'), resources.show_html_docs, QtGui.QKeySequence.HelpContents) self.help_shortcuts_action = add_action(self, N_('Keyboard Shortcuts'), about.show_shortcuts, hotkeys.QUESTION) self.visualize_current_action = add_action(self, N_('Visualize Current Branch...'), cmds.run(cmds.VisualizeCurrent)) self.visualize_all_action = add_action(self, N_('Visualize All Branches...'), cmds.run(cmds.VisualizeAll)) self.search_commits_action = add_action(self, N_('Search...'), search.search) self.browse_branch_action = add_action(self, N_('Browse Current Branch...'), guicmds.browse_current) self.browse_other_branch_action = add_action(self, N_('Browse Other Branch...'), guicmds.browse_other) self.load_commitmsg_template_action = add_action(self, N_('Get Commit Message Template'), cmds.run(cmds.LoadCommitMessageFromTemplate)) self.help_about_action = add_action(self, N_('About'), about.launch_about_dialog) self.diff_expression_action = add_action(self, N_('Expression...'), guicmds.diff_expression) self.branch_compare_action = add_action(self, N_('Branches...'), compare.compare_branches) self.create_tag_action = add_action(self, N_('Create Tag...'), createtag.create_tag) self.create_branch_action = add_action(self, N_('Create...'), createbranch.create_new_branch, hotkeys.BRANCH) self.delete_branch_action = add_action(self, N_('Delete...'), guicmds.delete_branch) self.delete_remote_branch_action = add_action(self, N_('Delete Remote Branch...'), guicmds.delete_remote_branch) self.rename_branch_action = add_action(self, N_('Rename Branch...'), guicmds.rename_branch) self.checkout_branch_action = add_action(self, N_('Checkout...'), guicmds.checkout_branch, hotkeys.CHECKOUT) self.branch_review_action = add_action(self, N_('Review...'), guicmds.review_branch) self.browse_action = add_action(self, N_('File Browser...'), browse.worktree_browser) self.browse_action.setIcon(qtutils.git_icon()) self.dag_action = add_action(self, N_('DAG...'), self.git_dag) self.dag_action.setIcon(qtutils.git_icon()) self.rebase_start_action = add_action(self, N_('Start Interactive Rebase...'), self.rebase_start) self.rebase_edit_todo_action = add_action(self, N_('Edit...'), self.rebase_edit_todo) self.rebase_continue_action = add_action(self, N_('Continue'), self.rebase_continue) self.rebase_skip_action = add_action(self, N_('Skip Current Patch'), self.rebase_skip) self.rebase_abort_action = add_action(self, N_('Abort'), self.rebase_abort) # For "Start Rebase" only, reverse the first argument to setEnabled() # so that we can operate on it as a group. # We can do this because can_rebase == not is_rebasing set_disabled = lambda x: self.rebase_start_action.setEnabled(not x) self.rebase_start_action_proxy = utils.Proxy(self.rebase_start_action, setEnabled=set_disabled) self.rebase_group = utils.Group(self.rebase_start_action_proxy, self.rebase_edit_todo_action, self.rebase_continue_action, self.rebase_skip_action, self.rebase_abort_action) self.lock_layout_action = add_action_bool(self, N_('Lock Layout'), self.set_lock_layout, False) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu(N_('File'), self.menubar) self.file_menu.addAction(self.new_repository_action) self.open_recent_menu = self.file_menu.addMenu(N_('Open Recent')) self.open_recent_menu.setIcon(qtutils.open_icon()) self.file_menu.addAction(self.open_repo_action) self.file_menu.addAction(self.open_repo_new_action) self.file_menu.addAction(self.clone_repo_action) self.file_menu.addSeparator() self.file_menu.addAction(self.rescan_action) self.file_menu.addAction(self.find_files_action) self.file_menu.addAction(self.edit_remotes_action) self.file_menu.addAction(self.browse_recently_modified_action) self.file_menu.addSeparator() self.file_menu.addAction(self.load_commitmsg_action) self.file_menu.addAction(self.load_commitmsg_template_action) self.file_menu.addSeparator() self.file_menu.addAction(self.apply_patches_action) self.file_menu.addAction(self.export_patches_action) self.file_menu.addAction(self.save_tarball_action) self.file_menu.addSeparator() self.file_menu.addAction(self.preferences_action) self.file_menu.addAction(self.quit_action) self.menubar.addAction(self.file_menu.menuAction()) # Actions menu self.actions_menu = create_menu(N_('Actions'), self.menubar) self.actions_menu.addAction(self.fetch_action) self.actions_menu.addAction(self.push_action) self.actions_menu.addAction(self.pull_action) self.actions_menu.addAction(self.stash_action) self.actions_menu.addSeparator() self.actions_menu.addAction(self.create_tag_action) self.actions_menu.addAction(self.cherry_pick_action) self.actions_menu.addAction(self.merge_local_action) self.actions_menu.addAction(self.merge_abort_action) self.actions_menu.addSeparator() self.actions_menu.addAction(self.grep_action) self.actions_menu.addAction(self.search_commits_action) self.menubar.addAction(self.actions_menu.menuAction()) # Staging Area Menu self.commit_menu = create_menu(N_('Staging Area'), self.menubar) self.commit_menu.setTitle(N_('Staging Area')) self.commit_menu.addAction(self.stage_modified_action) self.commit_menu.addAction(self.stage_untracked_action) self.commit_menu.addSeparator() self.commit_menu.addAction(self.unstage_all_action) self.commit_menu.addAction(self.unstage_selected_action) self.menubar.addAction(self.commit_menu.menuAction()) # Diff Menu self.diff_menu = create_menu(N_('Diff'), self.menubar) self.diff_menu.addAction(self.diff_expression_action) self.diff_menu.addAction(self.branch_compare_action) self.diff_menu.addSeparator() self.diff_menu.addAction(self.show_diffstat_action) self.menubar.addAction(self.diff_menu.menuAction()) # Branch Menu self.branch_menu = create_menu(N_('Branch'), self.menubar) self.branch_menu.addAction(self.branch_review_action) self.branch_menu.addSeparator() self.branch_menu.addAction(self.create_branch_action) self.branch_menu.addAction(self.checkout_branch_action) self.branch_menu.addAction(self.delete_branch_action) self.branch_menu.addAction(self.delete_remote_branch_action) self.branch_menu.addAction(self.rename_branch_action) self.branch_menu.addSeparator() self.branch_menu.addAction(self.browse_branch_action) self.branch_menu.addAction(self.browse_other_branch_action) self.branch_menu.addSeparator() self.branch_menu.addAction(self.visualize_current_action) self.branch_menu.addAction(self.visualize_all_action) self.menubar.addAction(self.branch_menu.menuAction()) # Rebase menu self.rebase_menu = create_menu(N_('Rebase'), self.actions_menu) self.rebase_menu.addAction(self.rebase_start_action) self.rebase_menu.addAction(self.rebase_edit_todo_action) self.rebase_menu.addSeparator() self.rebase_menu.addAction(self.rebase_continue_action) self.rebase_menu.addAction(self.rebase_skip_action) self.rebase_menu.addSeparator() self.rebase_menu.addAction(self.rebase_abort_action) self.menubar.addAction(self.rebase_menu.menuAction()) # View Menu self.view_menu = create_menu(N_('View'), self.menubar) self.view_menu.addAction(self.browse_action) self.view_menu.addAction(self.dag_action) self.view_menu.addSeparator() if self.browser_dockable: self.view_menu.addAction(self.browserdockwidget.toggleViewAction()) self.setup_dockwidget_view_menu() self.view_menu.addSeparator() self.view_menu.addAction(self.lock_layout_action) self.menubar.addAction(self.view_menu.menuAction()) # Help Menu self.help_menu = create_menu(N_('Help'), self.menubar) self.help_menu.addAction(self.help_docs_action) self.help_menu.addAction(self.help_shortcuts_action) self.help_menu.addAction(self.help_about_action) self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets left = Qt.LeftDockWidgetArea right = Qt.RightDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(left, self.commitdockwidget) if self.browser_dockable: self.addDockWidget(left, self.browserdockwidget) self.tabifyDockWidget(self.browserdockwidget, self.commitdockwidget) self.addDockWidget(left, self.diffdockwidget) self.addDockWidget(right, self.statusdockwidget) self.addDockWidget(right, self.bookmarksdockwidget) self.addDockWidget(right, self.recentdockwidget) self.addDockWidget(bottom, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) self.tabifyDockWidget(self.actionsdockwidget, self.logdockwidget) # Listen for model notifications model.add_observer(model.message_updated, self._update) model.add_observer(model.message_mode_changed, lambda x: self._update()) prefs_model.add_observer(prefs_model.message_config_updated, self._config_updated) # Set a default value self.show_cursor_position(1, 0) self.connect(self.open_recent_menu, SIGNAL('aboutToShow()'), self.build_recent_menu) self.connect(self.commitmsgeditor, SIGNAL('cursorPosition(int,int)'), self.show_cursor_position) self.connect(self.diffeditor, SIGNAL('diff_options_updated()'), self.statuswidget.refresh) self.connect(self.diffeditor, SIGNAL('move_down()'), self.statuswidget.move_down) self.connect(self.diffeditor, SIGNAL('move_up()'), self.statuswidget.move_up) self.connect(self.commitmsgeditor, SIGNAL('move_down()'), self.statuswidget.move_down) self.connect(self.commitmsgeditor, SIGNAL('move_up()'), self.statuswidget.move_up) self.connect(self, SIGNAL('update()'), self._update_callback, Qt.QueuedConnection) self.connect(self, SIGNAL('install_cfg_actions(PyQt_PyObject)'), self._install_config_actions, Qt.QueuedConnection) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings if not self.restore_state(settings=settings): self.resize(987, 610) self.set_initial_size() self.statusdockwidget.widget().setFocus() # Route command output here Interaction.log_status = self.logwidget.log_status Interaction.log = self.logwidget.log Interaction.log(version.git_version_str() + '\n' + N_('git cola version %s') % version.version())
def contextMenuEvent(self, event): """Create the context menu for the diff display.""" menu = QtGui.QMenu(self) s = selection.selection() filename = selection.filename() if self.model.stageable() or self.model.unstageable(): if self.model.stageable(): self.stage_or_unstage.setText(N_('Stage')) else: self.stage_or_unstage.setText(N_('Unstage')) menu.addAction(self.stage_or_unstage) if s.modified and self.model.stageable(): if s.modified[0] in main.model().submodules: action = menu.addAction(qtutils.add_icon(), cmds.Stage.name(), cmds.run(cmds.Stage, s.modified)) action.setShortcut(hotkeys.STAGE_SELECTION) menu.addAction( qtutils.git_icon(), N_('Launch git-cola'), cmds.run(cmds.OpenRepo, core.abspath(s.modified[0]))) elif s.modified[0] not in main.model().unstaged_deleted: if self.has_selection(): apply_text = N_('Stage Selected Lines') revert_text = N_('Revert Selected Lines...') else: apply_text = N_('Stage Diff Hunk') revert_text = N_('Revert Diff Hunk...') self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.add_icon()) self.action_revert_selection.setText(revert_text) menu.addAction(self.action_apply_selection) menu.addAction(self.action_revert_selection) if s.staged and self.model.unstageable(): if s.staged[0] in main.model().submodules: action = menu.addAction(qtutils.remove_icon(), cmds.Unstage.name(), cmds.do(cmds.Unstage, s.staged)) action.setShortcut(hotkeys.STAGE_SELECTION) menu.addAction( qtutils.git_icon(), N_('Launch git-cola'), cmds.do(cmds.OpenRepo, core.abspath(s.staged[0]))) elif s.staged[0] not in main.model().staged_deleted: if self.has_selection(): apply_text = N_('Unstage Selected Lines') else: apply_text = N_('Unstage Diff Hunk') self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.remove_icon()) menu.addAction(self.action_apply_selection) if self.model.stageable() or self.model.unstageable(): # Do not show the "edit" action when the file does not exist. # Untracked files exist by definition. if filename and core.exists(filename): menu.addSeparator() menu.addAction(self.launch_editor) # Removed files can still be diffed. menu.addAction(self.launch_difftool) # Add the Previous/Next File actions, which improves discoverability # of their associated shortcuts menu.addSeparator() menu.addAction(self.move_up) menu.addAction(self.move_down) menu.addSeparator() action = menu.addAction(qtutils.theme_icon('edit-copy.svg'), N_('Copy'), self.copy) action.setShortcut(QtGui.QKeySequence.Copy) action = menu.addAction(qtutils.theme_icon('edit-select-all.svg'), N_('Select All'), self.selectAll) action.setShortcut(QtGui.QKeySequence.SelectAll) menu.exec_(self.mapToGlobal(event.pos()))
def contextMenuEvent(self, event): """Create the context menu for the diff display.""" menu = QtGui.QMenu(self) s = selection.selection() filename = selection.filename() if s.modified and self.model.stageable(): if s.modified[0] in main.model().submodules: action = menu.addAction(qtutils.add_icon(), cmds.Stage.name(), cmds.run(cmds.Stage, s.modified)) action.setShortcut(cmds.Stage.SHORTCUT) menu.addAction( qtutils.git_icon(), N_("Launch git-cola"), cmds.run(cmds.OpenRepo, core.abspath(s.modified[0])) ) elif s.modified[0] not in main.model().unstaged_deleted: if self.has_selection(): apply_text = N_("Stage Selected Lines") revert_text = N_("Revert Selected Lines...") else: apply_text = N_("Stage Diff Hunk") revert_text = N_("Revert Diff Hunk...") self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.add_icon()) self.action_revert_selection.setText(revert_text) menu.addAction(self.action_apply_selection) menu.addAction(self.action_revert_selection) if s.staged and self.model.unstageable(): if s.staged[0] in main.model().submodules: action = menu.addAction(qtutils.remove_icon(), cmds.Unstage.name(), cmds.do(cmds.Unstage, s.staged)) action.setShortcut(cmds.Unstage.SHORTCUT) menu.addAction( qtutils.git_icon(), N_("Launch git-cola"), cmds.do(cmds.OpenRepo, core.abspath(s.staged[0])) ) elif s.staged[0] not in main.model().staged_deleted: if self.has_selection(): apply_text = N_("Unstage Selected Lines") else: apply_text = N_("Unstage Diff Hunk") self.action_apply_selection.setText(apply_text) self.action_apply_selection.setIcon(qtutils.remove_icon()) menu.addAction(self.action_apply_selection) if self.model.stageable() or self.model.unstageable(): # Do not show the "edit" action when the file does not exist. # Untracked files exist by definition. if filename and core.exists(filename): menu.addSeparator() menu.addAction(self.launch_editor) # Removed files can still be diffed. menu.addAction(self.launch_difftool) menu.addSeparator() action = menu.addAction(qtutils.theme_icon("edit-copy.svg"), N_("Copy"), self.copy) action.setShortcut(QtGui.QKeySequence.Copy) action = menu.addAction(qtutils.theme_icon("edit-select-all.svg"), N_("Select All"), self.selectAll) action.setShortcut(QtGui.QKeySequence.SelectAll) menu.exec_(self.mapToGlobal(event.pos()))
def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle(N_('Edit Remotes')) if parent is not None: self.setWindowModality(Qt.WindowModal) self.default_hint = N_('' 'Add and remove remote repositories using the \n' 'Add(+) and Delete(-) buttons on the left-hand side.\n' '\n' 'Remotes can be renamed by selecting one from the list\n' 'and pressing "enter", or by double-clicking.') self.remote_list = [] self.remotes = QtGui.QListWidget() self.remotes.setToolTip(N_( 'Remote git repositories - double-click to rename')) self.info = text.HintedTextView(self.default_hint, self) font = self.info.font() metrics = QtGui.QFontMetrics(font) width = metrics.width('_' * 72) height = metrics.height() * 13 self.info.setMinimumWidth(width) self.info.setMinimumHeight(height) self.info_thread = RemoteInfoThread(self) self.add_btn = QtGui.QToolButton() self.add_btn.setIcon(qtutils.add_icon()) self.add_btn.setToolTip(N_('Add new remote git repository')) self.refresh_btn = QtGui.QToolButton() self.refresh_btn.setIcon(qtutils.reload_icon()) self.refresh_btn.setToolTip(N_('Refresh')) self.delete_btn = QtGui.QToolButton() self.delete_btn.setIcon(qtutils.remove_icon()) self.delete_btn.setToolTip(N_('Delete remote')) self.close_btn = QtGui.QPushButton(N_('Close')) self._top_layout = QtGui.QSplitter() self._top_layout.setOrientation(Qt.Horizontal) self._top_layout.setHandleWidth(defs.handle_width) self._top_layout.addWidget(self.remotes) self._top_layout.addWidget(self.info) width = self._top_layout.width() self._top_layout.setSizes([width//4, width*3//4]) self._button_layout = QtGui.QHBoxLayout() self._button_layout.addWidget(self.add_btn) self._button_layout.addWidget(self.delete_btn) self._button_layout.addWidget(self.refresh_btn) self._button_layout.addStretch() self._button_layout.addWidget(self.close_btn) self._layout = QtGui.QVBoxLayout() self._layout.setMargin(defs.margin) self._layout.setSpacing(defs.spacing) self._layout.addWidget(self._top_layout) self._layout.addLayout(self._button_layout) self.setLayout(self._layout) self.refresh() qtutils.connect_button(self.add_btn, self.add) qtutils.connect_button(self.delete_btn, self.delete) qtutils.connect_button(self.refresh_btn, self.refresh) qtutils.connect_button(self.close_btn, self.close) self.connect(self.info_thread, SIGNAL('info'), self.info.set_value) self.connect(self.remotes, SIGNAL('itemChanged(QListWidgetItem*)'), self.remote_renamed) self.connect(self.remotes, SIGNAL('itemSelectionChanged()'), self.selection_changed)
def __init__(self, parent=None): super(ApplyPatches, self).__init__(parent=parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Apply Patches')) self.setAcceptDrops(True) if parent is not None: self.setWindowModality(Qt.WindowModal) self.curdir = core.getcwd() self.inner_drag = False self.usage = QtGui.QLabel() self.usage.setText( N_(""" <p> Drag and drop or use the <strong>Add</strong> button to add patches to the list </p> """)) self.tree = PatchTreeWidget(parent=self) self.tree.setHeaderHidden(True) self.add_button = qtutils.create_toolbutton( text=N_('Add'), icon=qtutils.add_icon(), tooltip=N_('Add patches (+)')) self.remove_button = qtutils.create_toolbutton( text=N_('Remove'), icon=qtutils.remove_icon(), tooltip=N_('Remove selected (Delete)')) self.apply_button = qtutils.create_button(text=N_('Apply'), icon=qtutils.apply_icon()) self.close_button = qtutils.create_button(text=N_('Close'), icon=qtutils.close_icon()) self.add_action = qtutils.add_action(self, N_('Add'), self.add_files, Qt.Key_Plus) self.remove_action = qtutils.add_action(self, N_('Remove'), self.tree.remove_selected, QtGui.QKeySequence.Delete, Qt.Key_Backspace, Qt.Key_Minus) self.top_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.add_button, self.remove_button, qtutils.STRETCH, self.usage) self.bottom_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.apply_button, qtutils.STRETCH, self.close_button) self.main_layout = qtutils.vbox(defs.margin, defs.spacing, self.top_layout, self.tree, self.bottom_layout) self.setLayout(self.main_layout) qtutils.connect_button(self.add_button, self.add_files) qtutils.connect_button(self.remove_button, self.tree.remove_selected) qtutils.connect_button(self.apply_button, self.apply_patches) qtutils.connect_button(self.close_button, self.close) if not self.restore_state(): self.resize(666, 420)
def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle(N_('Edit Remotes')) if parent is not None: self.setWindowModality(Qt.WindowModal) width = max(640, parent.width()) height = max(480, parent.height()) self.resize(width, height) else: self.resize(720, 300) self.default_hint = N_( '' 'Add and remove remote repositories using the \n' 'Add(+) and Delete(-) buttons on the left-hand side.\n' '\n' 'Remotes can be renamed by selecting one from the list\n' 'and pressing "enter", or by double-clicking.') self.remote_list = [] self.remotes = QtGui.QListWidget() self.remotes.setToolTip( N_('Remote git repositories - double-click to rename')) self.info = text.HintedTextView(self.default_hint, self) font = self.info.font() metrics = QtGui.QFontMetrics(font) width = metrics.width('_' * 42) height = metrics.height() * 13 self.info.setMinimumWidth(width) self.info.setMinimumHeight(height) self.info_thread = RemoteInfoThread(self) self.add_btn = QtGui.QToolButton() self.add_btn.setIcon(qtutils.add_icon()) self.add_btn.setToolTip(N_('Add new remote git repository')) self.refresh_btn = QtGui.QToolButton() self.refresh_btn.setIcon(qtutils.reload_icon()) self.refresh_btn.setToolTip(N_('Refresh')) self.delete_btn = QtGui.QToolButton() self.delete_btn.setIcon(qtutils.remove_icon()) self.delete_btn.setToolTip(N_('Delete remote')) self.close_btn = QtGui.QPushButton(N_('Close')) self._top_layout = qtutils.splitter(Qt.Horizontal, self.remotes, self.info) width = self._top_layout.width() self._top_layout.setSizes([width // 4, width * 3 // 4]) self._button_layout = qtutils.hbox(defs.margin, defs.spacing, self.add_btn, self.delete_btn, self.refresh_btn, qtutils.STRETCH, self.close_btn) self._layout = qtutils.vbox(defs.margin, defs.spacing, self._top_layout, self._button_layout) self.setLayout(self._layout) self.refresh() qtutils.connect_button(self.add_btn, self.add) qtutils.connect_button(self.delete_btn, self.delete) qtutils.connect_button(self.refresh_btn, self.refresh) qtutils.connect_button(self.close_btn, self.close) self.connect(self.info_thread, SIGNAL('info'), self.info.set_value) self.connect(self.remotes, SIGNAL('itemChanged(QListWidgetItem*)'), self.remote_renamed) self.connect(self.remotes, SIGNAL('itemSelectionChanged()'), self.selection_changed)