def status(self): """Return the status for the entry's path.""" model = cola.model() unmerged = utils.add_parents(set(model.unmerged)) modified = utils.add_parents(set(model.modified)) staged = utils.add_parents(set(model.staged)) untracked = utils.add_parents(set(model.untracked)) upstream_changed = utils.add_parents(set(model.upstream_changed)) if self.path in unmerged: return (resources.icon('sigil-unmerged.png'), qtutils.tr('Unmerged')) if self.path in modified and self.path in staged: return (resources.icon('sigil-partial.png'), qtutils.tr('Partially Staged')) if self.path in modified: return (resources.icon('sigil-modified.png'), qtutils.tr('Modified')) if self.path in staged: return (resources.icon('sigil-staged.png'), qtutils.tr('Staged')) if self.path in upstream_changed: return (resources.icon('sigil-upstream.png'), qtutils.tr('Changed Upstream')) if self.path in untracked: return (None, '?') return (None, '')
def status(self): """Return the status for the entry's path.""" model = cola.model() unmerged = utils.add_parents(set(model.unmerged)) modified = utils.add_parents(set(model.modified)) staged = utils.add_parents(set(model.staged)) untracked = utils.add_parents(set(model.untracked)) upstream_changed = utils.add_parents(set(model.upstream_changed)) if self.path in unmerged: return (resources.icon('modified.png'), qtutils.tr('Unmerged')) if self.path in modified and self.path in staged: return (resources.icon('partial.png'), qtutils.tr('Partially Staged')) if self.path in modified: return (resources.icon('modified.png'), qtutils.tr('Modified')) if self.path in staged: return (resources.icon('staged.png'), qtutils.tr('Staged')) if self.path in upstream_changed: return (resources.icon('upstream.png'), qtutils.tr('Changed Upstream')) if self.path in untracked: return (None, '?') return (None, '')
def update_title(self, dummy_txt=None): branch = self.model.currentbranch revision = unicode(self.revision.text()) if revision: txt = unicode(tr('Merge "%s" into "%s"')) % (revision, branch) else: txt = unicode(tr('Merge into "%s"')) % branch self.title_label.setText(txt) self.setWindowTitle(txt)
def commit(self): """Attempt to create a commit from the index and commit message.""" if not bool(self.summary.value()): # Describe a good commit message error_msg = tr( "" "Please supply a commit message.\n\n" "A good commit message has the following format:\n\n" "- First line: Describe in one sentence what you did.\n" "- Second line: Blank\n" "- Remaining lines: Describe why this change is good.\n" ) Interaction.log(error_msg) Interaction.information("Missing Commit Message", error_msg) return msg = self.commit_message(raw=False) if not self.model.staged: error_msg = tr("" "No changes to commit.\n\n" "You must stage at least 1 file before you can commit.") if self.model.modified: informative_text = tr("Would you like to stage and " "commit all modified files?") if not confirm( "Stage and commit?", error_msg, informative_text, "Stage and Commit", default=False, icon=save_icon(), ): return else: Interaction.information("Nothing to commit", error_msg) return cmds.do(cmds.StageModified) # Warn that amending published commits is generally bad amend = self.amend_action.isChecked() if ( amend and self.model.is_commit_published() and not confirm( "Rewrite Published Commit?", "This commit has already been published.\n" "This operation will rewrite published history.\n" "You probably don't want to do this.", "Amend the published commit?", "Amend Commit", default=False, icon=save_icon(), ) ): return cmds.do(cmds.Commit, amend, msg)
def commit(self): """Attempt to create a commit from the index and commit message.""" if not bool(self.summary.value()): # Describe a good commit message error_msg = tr( '' 'Please supply a commit message.\n\n' 'A good commit message has the following format:\n\n' '- First line: Describe in one sentence what you did.\n' '- Second line: Blank\n' '- Remaining lines: Describe why this change is good.\n') log(1, error_msg) cola.notifier().broadcast(signals.information, 'Missing Commit Message', error_msg) return msg = self.commit_message(raw=False) if not self.model.staged: error_msg = tr( '' 'No changes to commit.\n\n' 'You must stage at least 1 file before you can commit.') if self.model.modified: informative_text = tr('Would you like to stage and ' 'commit all modified files?') if not confirm('Stage and commit?', error_msg, informative_text, 'Stage and Commit', default=False, icon=save_icon()): return else: cola.notifier().broadcast(signals.information, 'Nothing to commit', error_msg) return cola.notifier().broadcast(signals.stage_modified) # Warn that amending published commits is generally bad amend = self.amend_action.isChecked() if (amend and self.model.is_commit_published() and not confirm('Rewrite Published Commit?', 'This commit has already been published.\n' 'This operation will rewrite published history.\n' 'You probably don\'t want to do this.', 'Amend the published commit?', 'Amend Commit', default=False, icon=save_icon())): return # Perform the commit cola.notifier().broadcast(signals.commit, amend, msg)
def commit(self): """Attempt to create a commit from the index and commit message.""" if not bool(self.summary.value()): # Describe a good commit message error_msg = tr('' 'Please supply a commit message.\n\n' 'A good commit message has the following format:\n\n' '- First line: Describe in one sentence what you did.\n' '- Second line: Blank\n' '- Remaining lines: Describe why this change is good.\n') log(1, error_msg) cola.notifier().broadcast(signals.information, 'Missing Commit Message', error_msg) return msg = self.commit_message() if not self.model.staged: error_msg = tr('' 'No changes to commit.\n\n' 'You must stage at least 1 file before you can commit.') if self.model.modified: informative_text = tr('Would you like to stage and ' 'commit all modified files?') if not confirm('Stage and commit?', error_msg, informative_text, 'Stage and Commit', default=False, icon=save_icon()): return else: cola.notifier().broadcast(signals.information, 'Nothing to commit', error_msg) return cola.notifier().broadcast(signals.stage_modified) # Warn that amending published commits is generally bad amend = self.amend_action.isChecked() if (amend and self.model.is_commit_published() and not confirm('Rewrite Published Commit?', 'This commit has already been published.\n' 'This operation will rewrite published history.\n' 'You probably don\'t want to do this.', 'Amend the published commit?', 'Amend Commit', default=False, icon=save_icon())): return # Perform the commit cola.notifier().broadcast(signals.commit, amend, msg)
def commit(self): """Attempt to create a commit from the index and commit message.""" if not bool(self.summary.value()): # Describe a good commit message error_msg = tr('' 'Please supply a commit message.\n\n' 'A good commit message has the following format:\n\n' '- First line: Describe in one sentence what you did.\n' '- Second line: Blank\n' '- Remaining lines: Describe why this change is good.\n') Interaction.log(error_msg) Interaction.information('Missing Commit Message', error_msg) return msg = self.commit_message(raw=False) if not self.model.staged: error_msg = tr('' 'No changes to commit.\n\n' 'You must stage at least 1 file before you can commit.') if self.model.modified: informative_text = tr('Would you like to stage and ' 'commit all modified files?') if not confirm('Stage and commit?', error_msg, informative_text, 'Stage and Commit', default=False, icon=save_icon()): return else: Interaction.information('Nothing to commit', error_msg) return cmds.do(cmds.StageModified) # Warn that amending published commits is generally bad amend = self.amend_action.isChecked() if (amend and self.model.is_commit_published() and not confirm('Rewrite Published Commit?', 'This commit has already been published.\n' 'This operation will rewrite published history.\n' 'You probably don\'t want to do this.', 'Amend the published commit?', 'Amend Commit', default=False, icon=save_icon())): return status, output = cmds.do(cmds.Commit, amend, msg) if status != 0: Interaction.critical(N_('Commit failed'), N_('"git commit" returned exit code %s') % (status,), output)
def create_toolbutton(text=None, layout=None, tooltip=None, icon=None): button = QtGui.QToolButton() button.setAutoRaise(True) button.setAutoFillBackground(True) if icon: button.setIcon(icon) if text: button.setText(tr(text)) button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) if tooltip: button.setToolTip(tr(tooltip)) if layout is not None: layout.addWidget(button) return button
def create_action(self, title, local=False): """Create an action and set its title.""" action = QtGui.QAction(self) action.setText(tr(title)) if local and hasattr(Qt, 'WidgetWithChildrenShortcut'): action.setShortcutContext(Qt.WidgetWithChildrenShortcut) return action
def create_button(self, text, layout=None): """Create a button, set its title, and add it to the parent.""" button = QtGui.QPushButton() button.setText(tr(text)) if layout: layout.addWidget(button) return button
def select_commits(title, revs, summaries, multiselect=True): """Use the SelectCommitsView to select commits from a list.""" model = MainModel() parent = qtutils.active_window() view = SelectCommitsView(parent, qtutils.tr(title), multiselect=multiselect) ctl = SelectCommitsController(model, view, revs, summaries) return ctl.select_commits()
def select_commits(title, revs, summaries, multiselect=True): """Use the SelectCommitsDialog to select commits from a list.""" model = Model(revs, summaries) parent = qtutils.active_window() dialog = SelectCommitsDialog(model, parent, qtutils.tr(title), multiselect=multiselect) return dialog.select_commits()
def create_dock(title, parent): """Create a dock widget and set it up accordingly.""" dock = QtGui.QDockWidget(parent) dock.setWindowTitle(tr(title)) dock.setObjectName(title) titlebar = DockTitleBarWidget(dock, title) dock.setTitleBarWidget(titlebar) return dock
def create_button(text, layout=None, tooltip=None, icon=None): """Create a button, set its title, and add it to the parent.""" button = QtGui.QPushButton() button.setText(tr(text)) if icon: button.setIcon(icon) if layout is not None: layout.addWidget(button) return button
def __init__(self, model, parent=None): standard.Dialog.__init__(self, parent=parent) self.setWindowTitle(self.tr('Preferences')) self.resize(600, 360) self._tabbar = QtGui.QTabBar() self._tabbar.setDrawBase(False) self._tabbar.addTab('All Repositories') self._tabbar.addTab('Current Repository') self._tabbar.addTab('Settings') self._user_form = RepoFormWidget(model, self, source='user') self._repo_form = RepoFormWidget(model, self, source='all') self._options_form = SettingsFormWidget(model, self) relay_signal(self, self._user_form, SIGNAL(model.message_set_config)) relay_signal(self, self._repo_form, SIGNAL(model.message_set_config)) relay_signal(self, self._options_form, SIGNAL(model.message_set_config)) self._stackedwidget = QtGui.QStackedWidget() self._stackedwidget.addWidget(self._user_form) self._stackedwidget.addWidget(self._repo_form) self._stackedwidget.addWidget(self._options_form) self.close_button = QtGui.QPushButton(self) self.close_button.setText(qtutils.tr('Close')) self.close_button.setIcon(qtutils.close_icon()) self._button_layt = QtGui.QHBoxLayout() self._button_layt.setMargin(0) self._button_layt.setSpacing(defs.spacing) self._button_layt.addStretch() self._button_layt.addWidget(self.close_button) self._layt = QtGui.QVBoxLayout() self._layt.setMargin(defs.margin) self._layt.setSpacing(defs.spacing) self._layt.addWidget(self._tabbar) self._layt.addWidget(self._stackedwidget) self._layt.addLayout(self._button_layt) self.setLayout(self._layt) self.connect(self._tabbar, SIGNAL('currentChanged(int)'), self._stackedwidget.setCurrentIndex) self.connect(self._stackedwidget, SIGNAL('currentChanged(int)'), self.update_widget) self.connect(self.close_button, SIGNAL('clicked()'), self.accept) qtutils.add_close_action(self) self.update_widget(0)
def __init__(self, model, parent=None): standard.Dialog.__init__(self, parent=parent) self.setWindowTitle(self.tr('Preferences')) self.resize(600, 360) self._tabbar = QtGui.QTabBar() self._tabbar.setDrawBase(False) self._tabbar.addTab('All Repositories') self._tabbar.addTab('Current Repository') self._tabbar.addTab('Settings') self._user_form = RepoFormWidget(model, self, source='user') self._repo_form = RepoFormWidget(model, self, source='all') self._options_form = SettingsFormWidget(model, self) relay_signal(self, self._user_form, SIGNAL(model.message_set_config)) relay_signal(self, self._repo_form, SIGNAL(model.message_set_config)) relay_signal(self, self._options_form, SIGNAL(model.message_set_config)) self._stackedwidget = QtGui.QStackedWidget() self._stackedwidget.addWidget(self._user_form) self._stackedwidget.addWidget(self._repo_form) self._stackedwidget.addWidget(self._options_form) self.close_button = QtGui.QPushButton(self) self.close_button.setText(qtutils.tr('Close')) self.close_button.setIcon(qtutils.close_icon()) self._button_layt = QtGui.QHBoxLayout() self._button_layt.setMargin(0) self._button_layt.setSpacing(defs.spacing) self._button_layt.addStretch() self._button_layt.addWidget(self.close_button) self._layt = QtGui.QVBoxLayout() self._layt.setMargin(defs.margin) self._layt.setSpacing(defs.spacing) self._layt.addWidget(self._tabbar) self._layt.addWidget(self._stackedwidget) self._layt.addLayout(self._button_layt) self.setLayout(self._layt) self.connect(self._tabbar, SIGNAL('currentChanged(int)'), self._stackedwidget.setCurrentIndex) self.connect(self._stackedwidget, SIGNAL('currentChanged(int)'), self.update_widget) qtutils.connect_button(self.close_button, self.accept) qtutils.add_close_action(self) self.update_widget(0)
def abort_merge(): """Prompts before aborting a merge in progress """ title = qtutils.tr('Abort Merge...') txt = ('Aborting the current merge will cause ' '*ALL* uncommitted changes to be lost.\n' 'Recovering uncommitted changes is not possible.') info_txt = 'Aborting the current merge?' ok_txt = 'Abort Merge' if qtutils.confirm(title, txt, info_txt, ok_txt, default=False, icon=qtutils.icon('undo.svg')): gitcmds.abort_merge()
def create_button(text='', layout=None, tooltip=None, icon=None): """Create a button, set its title, and add it to the parent.""" button = QtGui.QPushButton() if text: button.setText(tr(text)) if icon: button.setIcon(icon) if tooltip is not None: button.setToolTip(tooltip) if layout is not None: layout.addWidget(button) return button
def create_button(text='', layout=None, tooltip=None, icon=None): """Create a button, set its title, and add it to the parent.""" button = QtGui.QPushButton() button.setCursor(Qt.PointingHandCursor) if text: button.setText(tr(text)) if icon: button.setIcon(icon) if tooltip is not None: button.setToolTip(tooltip) if layout is not None: layout.addWidget(button) return button
def abort_merge(): """Prompts before aborting a merge in progress """ title = qtutils.tr("Abort Merge...") txt = ( "Aborting the current merge will cause " "*ALL* uncommitted changes to be lost.\n" "Recovering uncommitted changes is not possible." ) info_txt = "Aborting the current merge?" ok_txt = "Abort Merge" if qtutils.confirm(title, txt, info_txt, ok_txt, default=False, icon=qtutils.icon("undo.svg")): gitcmds.abort_merge()
def abort_merge(): """Prompts before aborting a merge in progress """ title = 'Abort Merge...' txt = ('Abort merge?\n\n' 'Aborting the current merge will cause ' '*ALL* uncommitted changes to be lost.\n\n' 'Continue with aborting the current merge?') info = 'Recovering uncommitted changes will not be possible' parent = QtGui.QApplication.instance().activeWindow() ok_text = qtutils.tr('Abort Merge...') if ok_text.endswith(unichr(0x2026)): ok_text = ok_text[:-1] elif ok_text.endswith('...'): ok_text = ok_text[:-3] answer = qtutils.confirm(parent, title, txt, info, ok_text) if answer: gitcmds.abort_merge()
def status(self): """Return the status for the entry's path.""" model = cola.model() unmerged = utils.add_parents(set(model.unmerged)) modified = utils.add_parents(set(model.modified)) staged = utils.add_parents(set(model.staged)) untracked = utils.add_parents(set(model.untracked)) upstream_changed = utils.add_parents(set(model.upstream_changed)) if self.path in unmerged: return qtutils.tr('Unmerged') if self.path in modified and self.path in staged: return qtutils.tr('Partially Staged') if self.path in modified: return qtutils.tr('Modified') if self.path in staged: return qtutils.tr('Staged') if self.path in untracked: return qtutils.tr('Untracked') if self.path in upstream_changed: return qtutils.tr('Changed Upstream') return '-'
def create_menu(title, parent): """Create a menu and set its title.""" qmenu = QtGui.QMenu(parent) qmenu.setTitle(tr(title)) return qmenu
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self._linebreak = None self._textwidth = None self._tabwidth = None # Actions self.signoff_action = add_action(self, cmds.SignOff.NAME, cmds.run(cmds.SignOff), cmds.SignOff.SHORTCUT) self.signoff_action.setToolTip('Sign off on this commit') self.commit_action = add_action(self, 'Commit@@verb', self.commit, 'Ctrl+Return') self.commit_action.setToolTip(tr('Commit staged changes')) # Widgets self.summary = CommitSummaryLineEdit() self.summary.extra_actions.append(self.signoff_action) self.summary.extra_actions.append(self.commit_action) self.description = CommitMessageTextEdit() self.description.extra_actions.append(self.signoff_action) self.description.extra_actions.append(self.commit_action) commit_button_tooltip = 'Commit staged changes\nShortcut: Ctrl+Enter' self.commit_button = create_toolbutton(text='Commit@@verb', tooltip=commit_button_tooltip, icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip='Actions...') self.actions_button.setMenu(self.actions_menu) self.actions_button.setPopupMode(QtGui.QToolButton.InstantPopup) self.actions_menu.addAction(self.signoff_action) self.actions_menu.addAction(self.commit_action) self.actions_menu.addSeparator() # Amend checkbox self.amend_action = self.actions_menu.addAction( tr('Amend Last Commit')) self.amend_action.setCheckable(True) # Line wrapping self.actions_menu.addSeparator() self.autowrap_action = self.actions_menu.addAction( tr('Auto-Wrap Lines')) self.autowrap_action.setCheckable(True) self.autowrap_action.setChecked(linebreak()) self.prev_commits_menu = self.actions_menu.addMenu( tr('Load Previous Commit Message')) self.connect(self.prev_commits_menu, SIGNAL('aboutToShow()'), self.build_prev_commits_menu) self.toplayout = QtGui.QHBoxLayout() self.toplayout.setMargin(0) self.toplayout.setSpacing(defs.spacing) self.toplayout.addWidget(self.actions_button) self.toplayout.addWidget(self.summary) self.toplayout.addWidget(self.commit_button) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.mainlayout.addLayout(self.toplayout) self.mainlayout.addWidget(self.description) self.setLayout(self.mainlayout) connect_button(self.commit_button, self.commit) notifier = cola.notifier() notifier.connect(notifier.AMEND, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, cmds.run(cmds.AmendMode)) # Handle the one-off autowrapping connect_action_bool(self.autowrap_action, self.set_linebreak) self.model.add_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL('returnPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('downPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('cursorPosition(int,int)'), self.emit_position) self.connect( self.description, SIGNAL('cursorPosition(int,int)'), # description starts at line 2 lambda row, col: self.emit_position(row + 2, col)) # Keep model informed of changes self.connect(self.summary, SIGNAL('textChanged(QString)'), self.commit_message_changed) self.connect(self.description, SIGNAL('textChanged()'), self.commit_message_changed) self.connect(self.description, SIGNAL('shiftTab()'), self.focus_summary) self.setFont(diff_font()) self.summary.enable_hint(True) self.description.enable_hint(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False) self.setFocusProxy(self.summary) self.set_tabwidth(tabwidth()) self.set_textwidth(textwidth()) self.set_linebreak(linebreak()) # Allow tab to jump from the summary to the description self.setTabOrder(self.summary, self.description)
def set_branch(self, branch): """Set the branch name for the window title and label.""" txt = unicode(tr("Merge into %s")) % branch self.merge_target_label.setText(txt)
def __init__(self, model, parent): standard.MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = "" self.setAcceptDrops(True) # Dockwidget options qtcompat.set_common_dock_options(self) self.classic_dockable = gitcfg.instance().get("cola.classicdockable") if self.classic_dockable: self.classicdockwidget = create_dock("Cola Classic", self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock("Actions", self) self.actionsdockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actionsdockwidgetcontents.layout() self.stage_button = create_button(text="Stage", layout=layout) self.unstage_button = create_button(text="Unstage", layout=layout) self.rescan_button = create_button(text="Rescan", layout=layout) self.fetch_button = create_button(text="Fetch...", layout=layout) self.push_button = create_button(text="Push...", layout=layout) self.pull_button = create_button(text="Pull...", layout=layout) self.stash_button = create_button(text="Stash...", layout=layout) self.alt_button = create_button(text="Exit Diff Mode", layout=layout) self.alt_button.hide() layout.addStretch() self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock("Repository Status", self) self.statusdockwidget.setWidget(StatusWidget(self)) # "Commit Message Editor" widget self.commitdockwidget = create_dock("Commit Message Editor", self) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Command Output" widget logwidget = qtutils.logger() logwidget.setFont(diff_font()) self.logdockwidget = create_dock("Command Output", self) self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = create_dock("Diff Viewer", self) self.diff_viewer = DiffTextEdit(self.diffdockwidget) self.diffdockwidget.setWidget(self.diff_viewer) # All Actions self.menu_unstage_all = add_action(self, "Unstage All", emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon("remove.svg")) self.menu_unstage_selected = add_action(self, "Unstage From Commit", emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon("remove.svg")) self.menu_show_diffstat = add_action(self, "Diffstat", emit(self, signals.diffstat), "Alt+D") self.menu_stage_modified = add_action( self, "Stage Changed Files To Commit", emit(self, signals.stage_modified), "Alt+A" ) self.menu_stage_modified.setIcon(qtutils.icon("add.svg")) self.menu_stage_untracked = add_action( self, "Stage All Untracked", emit(self, signals.stage_untracked), "Alt+U" ) self.menu_stage_untracked.setIcon(qtutils.icon("add.svg")) self.menu_export_patches = add_action(self, "Export Patches...", guicmds.export_patches, "Alt+E") self.menu_preferences = add_action( self, "Preferences", lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, "Ctrl+O" ) self.menu_rescan = add_action(self, "Rescan", emit(self, signals.rescan_and_refresh), "Ctrl+R") self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, "Recently Modified Files...", browse_recent, "Shift+Ctrl+E") self.menu_cherry_pick = add_action(self, "Cherry-Pick...", guicmds.cherry_pick, "Ctrl+P") self.menu_load_commitmsg = add_action(self, "Load Commit Message...", guicmds.load_commitmsg) self.menu_quit = add_action(self, "Quit", self.close, "Ctrl+Q") self.menu_manage_bookmarks = add_action(self, "Bookmarks...", manage_bookmarks) self.menu_grep = add_action(self, "Grep", guicmds.grep) self.menu_merge_local = add_action(self, "Merge...", merge.local_merge) self.menu_merge_abort = add_action(self, "Abort Merge...", merge.abort_merge) self.menu_fetch = add_action(self, "Fetch...", guicmds.fetch) self.menu_push = add_action(self, "Push...", guicmds.push) self.menu_pull = add_action(self, "Pull...", guicmds.pull) self.menu_open_repo = add_action(self, "Open...", guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, "Stash...", stash.stash, "Alt+Shift+S") self.menu_diff_branch = add_action(self, "Apply Changes From Branch...", guicmds.diff_branch) self.menu_branch_compare = add_action(self, "Branches...", compare.branch_compare) self.menu_clone_repo = add_action(self, "Clone...", guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action( self, "Documentation", resources.show_html_docs, QtGui.QKeySequence.HelpContents ) self.menu_help_shortcuts = add_action(self, "Keyboard Shortcuts", show_shortcuts, QtCore.Qt.Key_Question) self.menu_commit_compare = add_action(self, "Commits...", compare.compare) self.menu_commit_compare_file = add_action(self, "Commits Touching File...", compare.compare_file) self.menu_visualize_current = add_action( self, "Visualize Current Branch...", emit(self, signals.visualize_current) ) self.menu_visualize_all = add_action(self, "Visualize All Branches...", emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, "Search...", search.search) self.menu_browse_branch = add_action(self, "Browse Current Branch...", guicmds.browse_current) self.menu_browse_other_branch = add_action(self, "Browse Other Branch...", guicmds.browse_other) self.menu_load_commitmsg_template = add_action( self, "Get Commit Message Template", emit(self, signals.load_commit_template) ) self.menu_help_about = add_action(self, "About", launch_about_dialog) self.menu_branch_diff = add_action(self, "SHA-1...", guicmds.branch_diff) self.menu_diff_expression = add_action(self, "Expression...", guicmds.diff_expression) self.menu_create_tag = add_action(self, "Create Tag...", createtag.create_tag) self.menu_create_branch = add_action(self, "Create...", create_new_branch, "Ctrl+B") self.menu_delete_branch = add_action(self, "Delete...", guicmds.branch_delete) self.menu_checkout_branch = add_action(self, "Checkout...", guicmds.checkout_branch, "Alt+B") self.menu_rebase_branch = add_action(self, "Rebase...", guicmds.rebase) self.menu_branch_review = add_action(self, "Review...", guicmds.review_branch) self.menu_classic = add_action(self, "Cola Classic...", cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, "DAG...", lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Relayed actions status_tree = self.statusdockwidget.widget().tree self.addAction(status_tree.up) self.addAction(status_tree.down) self.addAction(status_tree.process_selection) self.addAction(status_tree.launch_difftool) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu("&File", self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_browse_recent) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu("Co&mmit", self.menubar) self.commit_menu.setTitle(tr("Commit@@verb")) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu("B&ranch", self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_diff_branch) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu("Act&ions", self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu("&Diff", self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addAction(self.menu_commit_compare) self.diff_menu.addAction(self.menu_commit_compare_file) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu("&Tools", self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.setup_dockwidget_tools_menu() self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu("&Help", self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_shortcuts) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_message_observer(model.message_mode_changed, self._mode_changed) model.add_message_observer(model.message_updated, self._update_view) prefs_model.add_message_observer(prefs_model.message_config_updated, self._config_updated) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan_and_refresh)) connect_button(self.alt_button, emit(self, signals.reset_mode)) connect_button(self.fetch_button, guicmds.fetch) connect_button(self.push_button, guicmds.push) connect_button(self.pull_button, guicmds.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self, SIGNAL("update"), self._update_callback) self.connect(self, SIGNAL("apply_state"), self.apply_state) self.connect(self, SIGNAL("install_config_actions"), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings self._gui_state_task = None self._load_gui_state() log(0, self.model.git_version + "\ncola version " + version.version())
def __init__(self, parent, name, opts): standard.Dialog.__init__(self, parent) self.setWindowModality(QtCore.Qt.ApplicationModal) self.name = name self.opts = opts self.layt = QtGui.QVBoxLayout() self.layt.setMargin(10) self.setLayout(self.layt) title = opts.get('title') if title: self.setWindowTitle(os.path.expandvars(title)) self.prompt = QtGui.QLabel() prompt = opts.get('prompt') if prompt: self.prompt.setText(os.path.expandvars(prompt)) self.layt.addWidget(self.prompt) self.argslabel = QtGui.QLabel() if 'argprompt' not in opts or opts.get('argprompt') is True: argprompt = qtutils.tr('Arguments') else: argprompt = opts.get('argprompt') self.argslabel.setText(argprompt) self.argstxt = QtGui.QLineEdit() self.argslayt = QtGui.QHBoxLayout() self.argslayt.addWidget(self.argslabel) self.argslayt.addWidget(self.argstxt) self.layt.addLayout(self.argslayt) if not self.opts.get('argprompt'): self.argslabel.setMinimumSize(1, 1) self.argstxt.setMinimumSize(1, 1) self.argstxt.hide() self.argslabel.hide() revs = ( ('Local Branch', gitcmds.branch_list(remote=False)), ('Tracking Branch', gitcmds.branch_list(remote=True)), ('Tag', gitcmds.tag_list()), ) if 'revprompt' not in opts or opts.get('revprompt') is True: revprompt = qtutils.tr('Revision') else: revprompt = opts.get('revprompt') self.revselect = RevisionSelector(self, revs) self.revselect.set_revision_label(revprompt) self.layt.addWidget(self.revselect) if not opts.get('revprompt'): self.revselect.hide() # Close/Run buttons self.btnlayt = QtGui.QHBoxLayout() self.btnlayt.addStretch() self.closebtn = qt.create_button(self.tr('Close'), self.btnlayt) self.runbtn = qt.create_button(self.tr('Run'), self.btnlayt) self.runbtn.setDefault(True) self.layt.addLayout(self.btnlayt) self.connect(self.closebtn, SIGNAL('clicked()'), self.reject) self.connect(self.runbtn, SIGNAL('clicked()'), self.accept) # Widen the dialog by default self.resize(666, self.height())
def __init__(self, model, parent): standard.MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = '' self.setAcceptDrops(True) # Dockwidget options qtcompat.set_common_dock_options(self) self.classic_dockable = gitcfg.instance().get('cola.classicdockable') if self.classic_dockable: self.classicdockwidget = create_dock('Cola Classic', self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actiondockwidget = create_dock('Actions', self) self.actiondockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actiondockwidgetcontents.layout() self.stage_button = create_button('Stage', layout) self.unstage_button = create_button('Unstage', layout) self.rescan_button = create_button('Rescan', layout) self.fetch_button = create_button('Fetch...', layout) self.push_button = create_button('Push...', layout) self.pull_button = create_button('Pull...', layout) self.stash_button = create_button('Stash...', layout) self.alt_button = create_button('Exit Diff Mode', layout) self.alt_button.hide() layout.addStretch() self.actiondockwidget.setWidget(self.actiondockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock('Repository Status', self) self.statusdockwidget.setWidget(StatusWidget(self)) # "Commit Message Editor" widget self.commitdockwidget = create_dock('Commit Message Editor', self) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Command Output" widget logwidget = qtutils.logger() logwidget.setFont(diff_font()) self.logdockwidget = create_dock('Command Output', self) self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = create_dock('Diff Viewer', self) self.diff_viewer = DiffTextEdit(self.diffdockwidget) self.diffdockwidget.setWidget(self.diff_viewer) # All Actions self.menu_unstage_all = add_action(self, 'Unstage All', emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, 'Unstage From Commit', emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, 'Diffstat', emit(self, signals.diffstat), 'Ctrl+D') self.menu_stage_modified = add_action(self, 'Stage Changed Files To Commit', emit(self, signals.stage_modified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, 'Stage All Untracked', emit(self, signals.stage_untracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, 'Export Patches...', guicmds.export_patches, 'Ctrl+E') self.menu_preferences = add_action(self, 'Preferences', lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_rescan = add_action(self, 'Rescan', emit(self, signals.rescan), 'Ctrl+R') self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_cherry_pick = add_action(self, 'Cherry-Pick...', guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, 'Load Commit Message...', guicmds.load_commitmsg) self.menu_quit = add_action(self, 'Quit', self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, 'Bookmarks...', manage_bookmarks) self.menu_grep = add_action(self, 'Grep', guicmds.grep) self.menu_merge_local = add_action(self, 'Merge...', merge.local_merge) self.menu_merge_abort = add_action(self, 'Abort Merge...', merge.abort_merge) self.menu_fetch = add_action(self, 'Fetch...', guicmds.fetch) self.menu_push = add_action(self, 'Push...', guicmds.push) self.menu_pull = add_action(self, 'Pull...', guicmds.pull) self.menu_open_repo = add_action(self, 'Open...', guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, 'Stash...', stash.stash, 'Alt+Shift+S') self.menu_diff_branch = add_action(self, 'Apply Changes From Branch...', guicmds.diff_branch) self.menu_branch_compare = add_action(self, 'Branches...', compare.branch_compare) self.menu_clone_repo = add_action(self, 'Clone...', guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, 'Documentation', lambda: self.model.git.web__browse(resources.html_docs()), QtGui.QKeySequence.HelpContents) self.menu_commit_compare = add_action(self, 'Commits...', compare.compare) self.menu_commit_compare_file = add_action(self, 'Commits Touching File...', compare.compare_file) self.menu_visualize_current = add_action(self, 'Visualize Current Branch...', emit(self, signals.visualize_current)) self.menu_visualize_all = add_action(self, 'Visualize All Branches...', emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, 'Search...', search.search) self.menu_browse_branch = add_action(self, 'Browse Current Branch...', guicmds.browse_current) self.menu_browse_other_branch = add_action(self, 'Browse Other Branch...', guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, 'Get Commit Message Template', emit(self, signals.load_commit_template)) self.menu_help_about = add_action(self, 'About', launch_about_dialog) self.menu_branch_diff = add_action(self, 'SHA-1...', guicmds.branch_diff) self.menu_diff_expression = add_action(self, 'Expression...', guicmds.diff_expression) self.menu_create_tag = add_action(self, 'Create Tag...', createtag.create_tag) self.menu_create_branch = add_action(self, 'Create...', create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, 'Delete...', guicmds.branch_delete) self.menu_checkout_branch = add_action(self, 'Checkout...', guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, 'Rebase...', guicmds.rebase) self.menu_branch_review = add_action(self, 'Review...', guicmds.review_branch) self.menu_classic = add_action(self, 'Cola Classic...', cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, 'DAG...', lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu('&File', self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu('Co&mmit', self.menubar) self.commit_menu.setTitle(tr('Commit@@verb')) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu('B&ranch', self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_diff_branch) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu('Act&ions', self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu('&Diff', self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addAction(self.menu_commit_compare) self.diff_menu.addAction(self.menu_commit_compare_file) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu('&Tools', self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.tools_menu.addAction(self.diffdockwidget.toggleViewAction()) self.tools_menu.addAction(self.actiondockwidget.toggleViewAction()) self.tools_menu.addAction(self.commitdockwidget.toggleViewAction()) self.tools_menu.addAction(self.statusdockwidget.toggleViewAction()) self.tools_menu.addAction(self.logdockwidget.toggleViewAction()) self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu('&Help', self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actiondockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_message_observer(model.message_mode_changed, self._mode_changed) model.add_message_observer(model.message_updated, self._update_view) prefs_model.add_message_observer(prefs_model.message_config_updated, self._config_updated) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan)) connect_button(self.alt_button, emit(self, signals.reset_mode)) connect_button(self.fetch_button, guicmds.fetch) connect_button(self.push_button, guicmds.push) connect_button(self.pull_button, guicmds.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self, SIGNAL('update'), self._update_callback) self.connect(self, SIGNAL('apply_state'), self.apply_state) self.connect(self, SIGNAL('install_config_actions'), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings self._gui_state_task = None self._load_gui_state() log(0, self.model.git_version + '\ncola version ' + version.version())
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self._linebreak = None self._textwidth = None self._tabwidth = None # Actions self.signoff_action = add_action(self, cmds.SignOff.NAME, cmds.run(cmds.SignOff), cmds.SignOff.SHORTCUT) self.signoff_action.setToolTip("Sign off on this commit") self.commit_action = add_action(self, "Commit@@verb", self.commit, "Ctrl+Return") self.commit_action.setToolTip(tr("Commit staged changes")) # Widgets self.summary = CommitSummaryLineEdit() self.summary.extra_actions.append(self.signoff_action) self.summary.extra_actions.append(self.commit_action) self.description = CommitMessageTextEdit() self.description.extra_actions.append(self.signoff_action) self.description.extra_actions.append(self.commit_action) commit_button_tooltip = "Commit staged changes\nShortcut: Ctrl+Enter" self.commit_button = create_toolbutton(text="Commit@@verb", tooltip=commit_button_tooltip, icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip="Actions...") self.actions_button.setMenu(self.actions_menu) self.actions_button.setPopupMode(QtGui.QToolButton.InstantPopup) self.actions_menu.addAction(self.signoff_action) self.actions_menu.addAction(self.commit_action) self.actions_menu.addSeparator() # Amend checkbox self.amend_action = self.actions_menu.addAction(tr("Amend Last Commit")) self.amend_action.setCheckable(True) # Line wrapping self.actions_menu.addSeparator() self.autowrap_action = self.actions_menu.addAction(tr("Auto-Wrap Lines")) self.autowrap_action.setCheckable(True) self.autowrap_action.setChecked(linebreak()) self.prev_commits_menu = self.actions_menu.addMenu(tr("Load Previous Commit Message")) self.connect(self.prev_commits_menu, SIGNAL("aboutToShow()"), self.build_prev_commits_menu) self.toplayout = QtGui.QHBoxLayout() self.toplayout.setMargin(0) self.toplayout.setSpacing(defs.spacing) self.toplayout.addWidget(self.actions_button) self.toplayout.addWidget(self.summary) self.toplayout.addWidget(self.commit_button) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.mainlayout.addLayout(self.toplayout) self.mainlayout.addWidget(self.description) self.setLayout(self.mainlayout) connect_button(self.commit_button, self.commit) notifier = cola.notifier() notifier.connect(notifier.AMEND, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, cmds.run(cmds.AmendMode)) # Handle the one-off autowrapping connect_action_bool(self.autowrap_action, self.set_linebreak) self.model.add_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL("returnPressed()"), self.focus_description) self.connect(self.summary, SIGNAL("downPressed()"), self.focus_description) self.connect(self.summary, SIGNAL("cursorPosition(int,int)"), self.emit_position) self.connect( self.description, SIGNAL("cursorPosition(int,int)"), # description starts at line 2 lambda row, col: self.emit_position(row + 2, col), ) # Keep model informed of changes self.connect(self.summary, SIGNAL("textChanged(QString)"), self.commit_message_changed) self.connect(self.description, SIGNAL("textChanged()"), self.commit_message_changed) self.connect(self.description, SIGNAL("shiftTab()"), self.focus_summary) self.setFont(diff_font()) self.summary.enable_hint(True) self.description.enable_hint(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False) self.setFocusProxy(self.summary) self.set_tabwidth(tabwidth()) self.set_textwidth(textwidth()) self.set_linebreak(linebreak()) # Allow tab to jump from the summary to the description self.setTabOrder(self.summary, self.description)
def __init__(self, parent=None): MainWindowBase.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.setDockOptions(QtGui.QMainWindow.AllowNestedDocks | QtGui.QMainWindow.AllowTabbedDocks | QtGui.QMainWindow.AnimatedDocks) # "Actions" widget self.actiondockwidget = self.create_dock('Actions') self.actiondockwidgetcontents = QtGui.QWidget() self.actiondockwidgetcontents.setContentsMargins(2, 2, 2, 2) self.actiondockwidgetlayout =\ QtGui.QVBoxLayout(self.actiondockwidgetcontents) self.actiondockwidgetlayout.setSpacing(3) self.actiondockwidgetlayout.setMargin(3) layout = self.actiondockwidgetlayout self.rescan_button = self.create_button('Rescan', layout) self.stage_button = self.create_button('Stage', layout) self.unstage_button = self.create_button('Unstage', layout) self.fetch_button = self.create_button('Fetch', layout) self.push_button = self.create_button('Push', layout) self.pull_button = self.create_button('Pull', layout) self.stash_button = self.create_button('Stash', layout) self.alt_button = self.create_button('Exit Diff Mode', layout) self.alt_button.hide() self.action_spacer = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) self.actiondockwidgetlayout.addItem(self.action_spacer) self.actiondockwidget.setWidget(self.actiondockwidgetcontents) # "Repository Status" widget self.statusdockwidget = self.create_dock('Repository Status') self.statusdockwidget.setWidget(status.widget()) # "Commit Message Editor" widget self.commitdockwidget = self.create_dock('Commit Message Editor') self.commitdockwidgetcontents = QtGui.QWidget() self.commitdockwidgetlayout = QtGui.QVBoxLayout(self.commitdockwidgetcontents) self.commitdockwidgetlayout.setMargin(3) self.vboxlayout = QtGui.QVBoxLayout() self.vboxlayout.setSpacing(0) self.commitmsg = QtGui.QTextEdit(self.commitdockwidgetcontents) self.commitmsg.setMinimumSize(QtCore.QSize(1, 1)) policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.commitmsg.setSizePolicy(policy) self.commitmsg.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.commitmsg.setAcceptRichText(False) self.vboxlayout.addWidget(self.commitmsg) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setSpacing(3) # Sign off and commit buttons self.signoff_button = self.create_button('Sign Off') self.commit_button = self.create_button('Commit@@verb') # Position display self.position_label = QtGui.QLabel(self.actiondockwidgetcontents) self.position_label.setAlignment(QtCore.Qt.AlignLeft) # Spacer between position and amend self.spacer = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Minimum) # Amend checkbox self.amend_checkbox = QtGui.QCheckBox(self.commitdockwidgetcontents) self.amend_checkbox.setText(tr('Amend Last Commit')) self.hboxlayout.addWidget(self.signoff_button) self.hboxlayout.addWidget(self.commit_button) self.hboxlayout.addWidget(self.position_label) self.hboxlayout.addItem(self.spacer) self.hboxlayout.addWidget(self.amend_checkbox) self.vboxlayout.addLayout(self.hboxlayout) self.commitdockwidgetlayout.addLayout(self.vboxlayout) self.commitdockwidget.setWidget(self.commitdockwidgetcontents) # "Command Output" widget logwidget = qtutils.logger() self.logdockwidget = self.create_dock('Command Output') self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = self.create_dock('Diff Viewer') self.diffdockwidgetcontents = QtGui.QWidget() self.diffdockwidgetlayout = QtGui.QVBoxLayout(self.diffdockwidgetcontents) self.diffdockwidgetlayout.setMargin(3) self.display_text = QtGui.QTextEdit(self.diffdockwidgetcontents) self.display_text.setMinimumSize(QtCore.QSize(1, 1)) self.display_text.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.display_text.setReadOnly(True) self.display_text.setAcceptRichText(False) self.display_text.setCursorWidth(2) self.display_text.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard|QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextBrowserInteraction|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.diffdockwidgetlayout.addWidget(self.display_text) self.diffdockwidget.setWidget(self.diffdockwidgetcontents) # All Actions self.menu_unstage_selected = self.create_action('Unstage From Commit') self.menu_show_diffstat = self.create_action('Diffstat') self.menu_stage_modified =\ self.create_action('Stage Changed Files To Commit') self.menu_stage_untracked = self.create_action('Stage All Untracked') self.menu_export_patches = self.create_action('Export Patches...') self.menu_cut = self.create_action('Cut') self.menu_copy = self.create_action('Copy') self.menu_paste = self.create_action('Paste') self.menu_select_all = self.create_action('Select All') self.menu_options = self.create_action('Options') self.menu_delete = self.create_action('Delete') self.menu_undo = self.create_action('Undo') self.menu_redo = self.create_action('Redo') self.menu_rescan = self.create_action('Rescan') self.menu_cherry_pick = self.create_action('Cherry-Pick...') self.menu_unstage_all = self.create_action('Unstage All') self.menu_load_commitmsg = self.create_action('Load Commit Message...') self.menu_quit = self.create_action('Quit') self.menu_search_revision = self.create_action('Revision ID...') self.menu_search_path =\ self.create_action('Commits Touching Path(s)...') self.menu_search_revision_range =\ self.create_action('Revision Range...') self.menu_search_date_range = self.create_action('Latest Commits...') self.menu_search_message = self.create_action('Commit Messages...') self.menu_search_diff =\ self.create_action('Content Introduced in Commit...') self.menu_search_author = self.create_action('Commits By Author...') self.menu_search_committer =\ self.create_action('Commits By Committer...') self.menu_manage_bookmarks = self.create_action('Bookmarks...') self.menu_save_bookmark = self.create_action('Bookmark Current...') self.menu_search_grep = self.create_action('Grep') self.menu_merge_local = self.create_action('Merge...') self.menu_merge_abort = self.create_action('Abort Merge...') self.menu_open_repo = self.create_action('Open...') self.menu_stash = self.create_action('Stash...') self.menu_diff_branch =\ self.create_action('Apply Changes From Branch...') self.menu_branch_compare = self.create_action('Branches...') self.menu_clone_repo = self.create_action('Clone...') self.menu_help_docs = self.create_action('Documentation') self.menu_commit_compare = self.create_action('Commits...') self.menu_visualize_current =\ self.create_action('Visualize Current Branch...') self.menu_visualize_all =\ self.create_action('Visualize All Branches...') self.menu_browse_commits = self.create_action('Browse Commits...') self.menu_browse_branch =\ self.create_action('Browse Current Branch...') self.menu_browse_other_branch =\ self.create_action('Browse Other Branch...') self.menu_load_commitmsg_template =\ self.create_action('Get Commit Message Template') self.menu_commit_compare_file =\ self.create_action('Commits Touching File...') self.menu_help_about = self.create_action('About') self.menu_branch_diff = self.create_action('SHA-1...') self.menu_diff_expression = self.create_action('Expression...') self.menu_create_tag = self.create_action('Create Tag...') self.menu_create_branch = self.create_action('Create...') self.menu_delete_branch = self.create_action('Delete...') self.menu_checkout_branch = self.create_action('Checkout...') self.menu_rebase_branch = self.create_action('Rebase...') self.menu_branch_review = self.create_action('Review...') self.menu_classic = self.create_action('Cola Classic...') # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = self.create_menu('File', self.menubar) self.file_menu.addAction(self.menu_open_repo) self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addAction(self.menu_save_bookmark) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Edit Menu self.edit_menu = self.create_menu('Edit', self.menubar) self.edit_menu.addAction(self.menu_undo) self.edit_menu.addAction(self.menu_redo) self.edit_menu.addSeparator() self.edit_menu.addAction(self.menu_cut) self.edit_menu.addAction(self.menu_copy) self.edit_menu.addAction(self.menu_paste) self.edit_menu.addAction(self.menu_delete) self.edit_menu.addSeparator() self.edit_menu.addAction(self.menu_select_all) self.edit_menu.addSeparator() self.edit_menu.addAction(self.menu_options) # Add to menubar self.menubar.addAction(self.edit_menu.menuAction()) # Commit Menu self.commit_menu = self.create_menu('Commit', self.menubar) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_browse_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = self.create_menu('Branch', self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_diff_branch) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Search Menu self.search_menu = self.create_menu('Search', self.menubar) self.search_menu.addAction(self.menu_search_date_range) self.search_menu.addAction(self.menu_search_grep) self.search_menu.addSeparator() # Search / More Menu self.menu_search_more = self.create_menu('More...', self.search_menu) self.menu_search_more.addAction(self.menu_search_author) self.menu_search_more.addAction(self.menu_search_path) self.menu_search_more.addAction(self.menu_search_message) self.menu_search_more.addSeparator() self.menu_search_more.addAction(self.menu_search_revision_range) self.menu_search_more.addAction(self.menu_search_revision) self.menu_search_more.addSeparator() self.menu_search_more.addAction(self.menu_search_diff) self.search_menu.addAction(self.menu_search_more.menuAction()) # Add to menubar self.menubar.addAction(self.search_menu.menuAction()) # Actions menu self.actions_menu = self.create_menu('Actions', self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = self.create_menu('Diff', self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addAction(self.menu_commit_compare) self.diff_menu.addAction(self.menu_commit_compare_file) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = self.create_menu('Tools', self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.diffdockwidget.toggleViewAction()) self.tools_menu.addAction(self.actiondockwidget.toggleViewAction()) self.tools_menu.addAction(self.commitdockwidget.toggleViewAction()) self.tools_menu.addAction(self.statusdockwidget.toggleViewAction()) self.tools_menu.addAction(self.logdockwidget.toggleViewAction()) self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = self.create_menu('Help', self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Shortcuts self.menu_show_diffstat.setShortcut(tr('Ctrl+D')) self.menu_stage_modified.setShortcut(tr('Alt+A')) self.menu_stage_untracked.setShortcut(tr('Alt+U')) self.menu_export_patches.setShortcut(tr('Ctrl+E')) self.menu_cut.setShortcut(tr('Ctrl+X')) self.menu_copy.setShortcut(tr('Ctrl+C')) self.menu_paste.setShortcut(tr('Ctrl+V')) self.menu_select_all.setShortcut(tr('Ctrl+A')) self.menu_options.setShortcut(tr('Ctrl+O')) self.menu_delete.setShortcut(tr('Del')) self.menu_undo.setShortcut(tr('Ctrl+Z')) self.menu_redo.setShortcut(tr('Ctrl+Shift+Z')) self.menu_rescan.setShortcut(tr('Ctrl+R')) self.menu_cherry_pick.setShortcut(tr('Ctrl+P')) self.menu_quit.setShortcut(tr('Ctrl+Q')) self.menu_create_branch.setShortcut(tr('Ctrl+B')) self.menu_checkout_branch.setShortcut(tr('Alt+B')) self.menu_stash.setShortcut(tr('Alt+Shift+S')) self.menu_help_docs.setShortcut(tr('F1')) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actiondockwidget) self.addDockWidget(bottom, self.logdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget)
def __init__(self, model, parent=None): QtGui.QDialog.__init__(self, parent) self.model = model self.setWindowModality(Qt.WindowModal) self.resize(700, 400) # Widgets self.title_label = QtGui.QLabel() self.revision_label = QtGui.QLabel() self.revision_label.setText(tr('Revision To Merge')) self.revision = completion.GitRefLineEdit() self.radio_local = QtGui.QRadioButton() self.radio_local.setText(tr('Local Branch')) self.radio_local.setChecked(True) self.radio_remote = QtGui.QRadioButton() self.radio_remote.setText(tr('Tracking Branch')) self.radio_tag = QtGui.QRadioButton() self.radio_tag.setText(tr('Tag')) self.revisions = QtGui.QListWidget() self.revisions.setAlternatingRowColors(True) self.button_viz = QtGui.QPushButton(self) self.button_viz.setText(tr('Visualize')) self.checkbox_squash = QtGui.QCheckBox(self) self.checkbox_squash.setText(tr('Squash')) self.checkbox_commit = QtGui.QCheckBox(self) self.checkbox_commit.setText(tr('Commit')) self.checkbox_commit.setChecked(True) self.checkbox_commit_state = True self.button_cancel = QtGui.QPushButton(self) self.button_cancel.setText(tr('Cancel')) self.button_merge = QtGui.QPushButton(self) self.button_merge.setText(tr('Merge')) # Layouts self.revlayt = QtGui.QHBoxLayout() self.revlayt.addWidget(self.revision_label) self.revlayt.addWidget(self.revision) self.revlayt.addStretch() self.revlayt.addWidget(self.title_label) self.radiolayt = QtGui.QHBoxLayout() self.radiolayt.addWidget(self.radio_local) self.radiolayt.addWidget(self.radio_remote) self.radiolayt.addWidget(self.radio_tag) self.buttonlayt = QtGui.QHBoxLayout() self.buttonlayt.setSpacing(defs.button_spacing) self.buttonlayt.addWidget(self.button_viz) self.buttonlayt.addStretch() self.buttonlayt.addWidget(self.checkbox_squash) self.buttonlayt.addWidget(self.checkbox_commit) self.buttonlayt.addWidget(self.button_cancel) self.buttonlayt.addWidget(self.button_merge) self.mainlayt = QtGui.QVBoxLayout() self.mainlayt.setMargin(defs.margin) self.mainlayt.setSpacing(defs.spacing) self.mainlayt.addLayout(self.radiolayt) self.mainlayt.addWidget(self.revisions) self.mainlayt.addLayout(self.revlayt) self.mainlayt.addLayout(self.buttonlayt) self.setLayout(self.mainlayt) self.revision.setFocus() # Signal/slot connections self.connect(self.revision, SIGNAL('textChanged(QString)'), self.update_title) self.connect(self.revisions, SIGNAL('itemSelectionChanged()'), self.revision_selected) qtutils.connect_button(self.button_cancel, self.reject) qtutils.connect_button(self.checkbox_squash, self.toggle_squash) qtutils.connect_button(self.radio_local, self.update_revisions) qtutils.connect_button(self.radio_remote, self.update_revisions) qtutils.connect_button(self.radio_tag, self.update_revisions) qtutils.connect_button(self.button_merge, self.merge_revision) qtutils.connect_button(self.button_viz, self.viz_revision) # Observer messages model.add_observer(model.message_updated, self.update_all) self.update_all()
def create_dock(self, title): """Create a dock widget and set it up accordingly.""" dock = QtGui.QDockWidget(self) dock.setWindowTitle(tr(title)) dock.setObjectName(title) return dock
def create_action(self, title): """Create an action and set its title.""" action = QtGui.QAction(self) action.setText(tr(title)) return action
def __init__(self, model, parent): MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = '' self.setAcceptDrops(True) self.setAttribute(Qt.WA_MacMetalStyle) # Dockwidget options qtcompat.set_common_dock_options(self) cfg = gitcfg.instance() self.classic_dockable = (cfg.get('cola.browserdockable') or cfg.get('cola.classicdockable')) if self.classic_dockable: self.classicdockwidget = create_dock('Browser', self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock('Action', self) self.actionsdockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actionsdockwidgetcontents.layout() self.stage_button = create_button(text='Stage', layout=layout) self.unstage_button = create_button(text='Unstage', layout=layout) self.rescan_button = create_button(text='Rescan', layout=layout) self.fetch_button = create_button(text='Fetch...', layout=layout) self.push_button = create_button(text='Push...', layout=layout) self.pull_button = create_button(text='Pull...', layout=layout) self.stash_button = create_button(text='Stash...', layout=layout) layout.addStretch() self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock('Status', self) self.statusdockwidget.setWidget(StatusWidget(self)) # "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) self.commitdockwidget = create_dock('Commit', self) titlebar = self.commitdockwidget.titleBarWidget() titlebar.add_corner_widget(self.position_label) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Console" widget self.logwidget = LogWidget() self.logdockwidget = create_dock('Console', self) self.logdockwidget.setWidget(self.logwidget) cola.notifier().connect(signals.log_cmd, self.logwidget.log) # "Diff Viewer" widget self.diffdockwidget = create_dock('Diff', self) self.diffeditor = DiffEditor(self.diffdockwidget) self.diffdockwidget.setWidget(self.diffeditor) # All Actions self.menu_unstage_all = add_action(self, 'Unstage All', emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, 'Unstage From Commit', emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, 'Diffstat', emit(self, signals.diffstat), 'Alt+D') self.menu_stage_modified = add_action(self, 'Stage Changed Files To Commit', emit(self, signals.stage_modified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, 'Stage All Untracked', emit(self, signals.stage_untracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, 'Export Patches...', guicmds.export_patches, 'Alt+E') self.menu_preferences = add_action(self, 'Preferences', lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_edit_remotes = add_action(self, 'Edit Remotes...', lambda: editremotes.edit().exec_()) self.menu_rescan = add_action(self, 'Rescan', emit(self, signals.rescan_and_refresh), 'Ctrl+R') self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, 'Recently Modified Files...', browse_recent, 'Shift+Ctrl+E') self.menu_cherry_pick = add_action(self, 'Cherry-Pick...', guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, 'Load Commit Message...', guicmds.load_commitmsg) self.menu_save_tarball = add_action(self, 'Save As Tarball/Zip...', self.save_archive) self.menu_quit = add_action(self, 'Quit', self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, 'Bookmarks...', manage_bookmarks) self.menu_grep = add_action(self, 'Grep', guicmds.grep) self.menu_merge_local = add_action(self, 'Merge...', merge.local_merge) self.menu_merge_abort = add_action(self, 'Abort Merge...', merge.abort_merge) self.menu_fetch = add_action(self, 'Fetch...', remote.fetch) self.menu_push = add_action(self, 'Push...', remote.push) self.menu_pull = add_action(self, 'Pull...', remote.pull) self.menu_open_repo = add_action(self, 'Open...', guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, 'Stash...', stash.stash, 'Alt+Shift+S') self.menu_clone_repo = add_action(self, 'Clone...', guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, 'Documentation', resources.show_html_docs, QtGui.QKeySequence.HelpContents) self.menu_help_shortcuts = add_action(self, 'Keyboard Shortcuts', show_shortcuts, QtCore.Qt.Key_Question) self.menu_visualize_current = add_action(self, 'Visualize Current Branch...', emit(self, signals.visualize_current)) self.menu_visualize_all = add_action(self, 'Visualize All Branches...', emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, 'Search...', search) self.menu_browse_branch = add_action(self, 'Browse Current Branch...', guicmds.browse_current) self.menu_browse_other_branch = add_action(self, 'Browse Other Branch...', guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, 'Get Commit Message Template', emit(self, signals.load_commit_template)) self.menu_help_about = add_action(self, 'About', launch_about_dialog) self.menu_branch_diff = add_action(self, 'SHA-1...', guicmds.diff_revision) self.menu_diff_expression = add_action(self, 'Expression...', guicmds.diff_expression) self.menu_branch_compare = add_action(self, 'Branches...', compare_branches) self.menu_create_tag = add_action(self, 'Create Tag...', create_tag) self.menu_create_branch = add_action(self, 'Create...', create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, 'Delete...', guicmds.branch_delete) self.menu_checkout_branch = add_action(self, 'Checkout...', guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, 'Rebase...', guicmds.rebase) self.menu_branch_review = add_action(self, 'Review...', guicmds.review_branch) self.menu_classic = add_action(self, 'Browser...', cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, 'DAG...', lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Relayed actions if not self.classic_dockable: # These shortcuts conflict with those from the # 'Browser' widget so don't register them when # the browser is a dockable tool. status_tree = self.statusdockwidget.widget().tree self.addAction(status_tree.up) self.addAction(status_tree.down) self.addAction(status_tree.process_selection) self.addAction(status_tree.launch_difftool) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu('&File', self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.menu_open_recent = self.file_menu.addMenu(tr('Open Recent')) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_edit_remotes) self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_browse_recent) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_save_tarball) self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu('Co&mmit', self.menubar) self.commit_menu.setTitle(tr('Commit@@verb')) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu('B&ranch', self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu('Act&ions', self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu('&Diff', self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu('&Tools', self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.setup_dockwidget_tools_menu() self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu('&Help', self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_shortcuts) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_observer(model.message_updated, self._update_view) prefs_model.add_observer(prefs_model.message_config_updated, self._config_updated) # Set a default value self.show_cursor_position(1, 0) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan_and_refresh)) connect_button(self.fetch_button, remote.fetch) connect_button(self.push_button, remote.push) connect_button(self.pull_button, remote.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self.menu_open_recent, SIGNAL('aboutToShow()'), self.build_recent_menu) self.connect(self.commitmsgeditor, SIGNAL('cursorPosition(int,int)'), self.show_cursor_position) self.connect(self, SIGNAL('update'), self._update_callback) self.connect(self, SIGNAL('install_config_actions'), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings qtutils.apply_state(self) self.statusdockwidget.widget().setFocus() log(0, version.git_version_str() + '\ncola version ' + version.version())
def __init__(self, parent=None): MainWindow.__init__(self, parent) self.setAcceptDrops(True) # Qt does not support noun/verbs self.commit_button.setText(qtutils.tr('Commit@@verb')) self.commit_menu.setTitle(qtutils.tr('Commit@@verb')) self._has_threadpool = hasattr(QtCore, 'QThreadPool') # Diff/patch syntax highlighter self.syntax = DiffSyntaxHighlighter(self.display_text.document()) # Display the current column self.connect(self.commitmsg, SIGNAL('cursorPositionChanged()'), self.show_cursor_position) # Keeps track of merge messages we've seen self.merge_message_hash = '' # Initialize the seen tree widget indexes self._seen_indexes = set() # Initialize the GUI to show 'Column: 00' self.show_cursor_position() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self._widget_version = 1 self.model = cola.model() self.model.add_message_observer(self.model.message_updated, self._update_view) # Listen for text and amend messages cola.notifier().connect(signals.diff_text, self.set_display) cola.notifier().connect(signals.mode, self._mode_changed) cola.notifier().connect(signals.amend, self.amend_checkbox.setChecked) # Broadcast the amend mode self.connect(self.amend_checkbox, SIGNAL('toggled(bool)'), SLOT(signals.amend_mode)) # Add button callbacks self._relay_button(self.alt_button, signals.reset_mode) self._relay_button(self.rescan_button, signals.rescan) self._connect_button(self.signoff_button, self.signoff) self._connect_button(self.stage_button, self.stage) self._connect_button(self.unstage_button, self.unstage) self._connect_button(self.commit_button, self.commit) self._connect_button(self.fetch_button, guicmds.fetch_slot(self)) self._connect_button(self.push_button, guicmds.push_slot(self)) self._connect_button(self.pull_button, guicmds.pull_slot(self)) self._connect_button(self.stash_button, lambda: stash.stash(parent=self)) # Menu actions actions = [ (self.menu_quit, self.close), (self.menu_branch_compare, compare.branch_compare), (self.menu_branch_diff, guicmds.branch_diff), (self.menu_branch_review, guicmds.review_branch), (self.menu_browse_branch, guicmds.browse_current), (self.menu_browse_other_branch, guicmds.browse_other), (self.menu_browse_commits, guicmds.browse_commits), (self.menu_create_tag, createtag.create_tag), (self.menu_create_branch, create_new_branch), (self.menu_checkout_branch, guicmds.checkout_branch), (self.menu_delete_branch, guicmds.branch_delete), (self.menu_rebase_branch, guicmds.rebase), (self.menu_clone_repo, guicmds.clone_repo), (self.menu_commit_compare, compare.compare), (self.menu_commit_compare_file, compare.compare_file), (self.menu_cherry_pick, guicmds.cherry_pick), (self.menu_diff_expression, guicmds.diff_expression), (self.menu_diff_branch, guicmds.diff_branch), (self.menu_export_patches, guicmds.export_patches), (self.menu_help_about, about.launch_about_dialog), (self.menu_help_docs, lambda: self.model.git.web__browse(resources.html_docs())), (self.menu_load_commitmsg, guicmds.load_commitmsg_slot(self)), (self.menu_load_commitmsg_template, SLOT(signals.load_commit_template)), (self.menu_manage_bookmarks, manage_bookmarks), (self.menu_save_bookmark, save_bookmark), (self.menu_merge_local, merge.local_merge), (self.menu_merge_abort, merge.abort_merge), (self.menu_fetch, guicmds.fetch_slot(self)), (self.menu_push, guicmds.push_slot(self)), (self.menu_pull, guicmds.pull_slot(self)), (self.menu_open_repo, guicmds.open_repo_slot(self)), (self.menu_options, update_options), (self.menu_rescan, SLOT(signals.rescan)), (self.menu_grep, guicmds.grep), (self.menu_search_commits, smod.search), (self.menu_show_diffstat, SLOT(signals.diffstat)), (self.menu_stash, lambda: stash.stash(parent=self)), (self.menu_stage_modified, SLOT(signals.stage_modified)), (self.menu_stage_untracked, SLOT(signals.stage_untracked)), (self.menu_unstage_selected, SLOT(signals.unstage_selected)), (self.menu_unstage_all, SLOT(signals.unstage_all)), (self.menu_visualize_all, SLOT(signals.visualize_all)), (self.menu_visualize_current, SLOT(signals.visualize_current)), # TODO This edit menu stuff should/could be command objects (self.menu_cut, self.action_cut), (self.menu_copy, self.action_copy), (self.menu_paste, self.commitmsg.paste), (self.menu_delete, self.action_delete), (self.menu_select_all, self.commitmsg.selectAll), (self.menu_undo, self.commitmsg.undo), (self.menu_redo, self.commitmsg.redo), (self.menu_classic, classic.cola_classic), (self.menu_dag, dag.git_dag), ] # Diff Actions if hasattr(Qt, 'WidgetWithChildrenShortcut'): # We can only enable this shortcut on newer versions of Qt # that support WidgetWithChildrenShortcut otherwise we get # an ambiguous shortcut error. self.diff_copy = QtGui.QAction(self.display_text) self.diff_copy.setShortcut(QtGui.QKeySequence.Copy) self.diff_copy.setShortcutContext(Qt.WidgetWithChildrenShortcut) self.display_text.addAction(self.diff_copy) actions.append((self.diff_copy, self.copy_display,)) for menu, callback in actions: self.connect(menu, SIGNAL('triggered()'), callback) # Install UI wrappers for command objects actionsmod.install_command_wrapper(self) guicmds.install_command_wrapper(self) # Install diff shortcut keys for stage/unstage self.display_text.keyPressEvent = self.diff_key_press_event self.display_text.contextMenuEvent = self.diff_context_menu_event self.connect(self, SIGNAL('update'), self._update_callback) self.connect(self, SIGNAL('import_state'), self.import_state) self.connect(self, SIGNAL('install_config_actions'), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings self._gui_state_task = None self._load_gui_state()