def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self.spellcheck_initialized = 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(N_('Sign off on this commit')) self.commit_action = add_action(self, N_('Commit@@verb'), self.commit, cmds.Commit.SHORTCUT) self.commit_action.setToolTip(N_('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 = N_('Commit staged changes\n' 'Shortcut: Ctrl+Enter') self.commit_button = create_toolbutton(text=N_('Commit@@verb'), tooltip=commit_button_tooltip, icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip=N_('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( N_('Amend Last Commit')) self.amend_action.setCheckable(True) self.amend_action.setShortcut(cmds.AmendMode.SHORTCUT) self.amend_action.setShortcutContext(Qt.ApplicationShortcut) # Spell checker self.check_spelling_action = self.actions_menu.addAction( N_('Check Spelling')) self.check_spelling_action.setCheckable(True) self.check_spelling_action.setChecked(False) # Line wrapping self.actions_menu.addSeparator() self.autowrap_action = self.actions_menu.addAction( N_('Auto-Wrap Lines')) self.autowrap_action.setCheckable(True) self.autowrap_action.setChecked(linebreak()) self.prev_commits_menu = self.actions_menu.addMenu( N_('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)) connect_action_bool(self.check_spelling_action, self.toggle_check_spelling) # Handle the one-off autowrapping connect_action_bool(self.autowrap_action, self.set_linebreak) add_action(self.summary, N_('Move Down'), self.focus_description, Qt.Key_Down, Qt.Key_Return, Qt.Key_Enter) self.model.add_observer(self.model.message_commit_message_changed, self.set_commit_message) 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('leave()'), 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()) # Loading message commit_msg = "" commit_msg_path = commit_message_path() if commit_msg_path: commit_msg = utils.slurp(commit_msg_path) self.set_commit_message(commit_msg) # Allow tab to jump from the summary to the description self.setTabOrder(self.summary, self.description)
def __init__(self, parent): standard.Dialog.__init__(self, parent) self.setAttribute(QtCore.Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Search')) self.mode_combo = QtGui.QComboBox() self.browse_button = create_toolbutton(icon=dir_icon(), tooltip=N_('Browse...')) self.query = QtGui.QLineEdit() self.start_date = QtGui.QDateEdit() self.start_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.start_date.setCalendarPopup(True) self.start_date.setDisplayFormat(N_('yyyy-MM-dd')) self.end_date = QtGui.QDateEdit() self.end_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.end_date.setCalendarPopup(True) self.end_date.setDisplayFormat(N_('yyyy-MM-dd')) self.search_button = QtGui.QPushButton() self.search_button.setText(N_('Search')) self.search_button.setDefault(True) self.max_count = QtGui.QSpinBox() self.max_count.setMinimum(5) self.max_count.setMaximum(9995) self.max_count.setSingleStep(5) self.max_count.setValue(500) self.commit_list = QtGui.QListWidget() self.commit_list.setMinimumSize(QtCore.QSize(1, 1)) self.commit_list.setAlternatingRowColors(True) self.commit_list.setSelectionMode( QtGui.QAbstractItemView.SingleSelection) self.commit_text = DiffTextEdit(self, whitespace=False) self.button_export = QtGui.QPushButton() self.button_export.setText(N_('Export Patches')) self.button_cherrypick = QtGui.QPushButton() self.button_cherrypick.setText(N_('Cherry Pick')) self.button_close = QtGui.QPushButton() self.button_close.setText(N_('Close')) self.top_layout = QtGui.QHBoxLayout() self.top_layout.setMargin(0) self.top_layout.setSpacing(defs.button_spacing) self.top_layout.addWidget(self.query) self.top_layout.addWidget(self.start_date) self.top_layout.addWidget(self.end_date) self.top_layout.addWidget(self.browse_button) self.top_layout.addWidget(self.search_button) self.top_layout.addStretch() self.top_layout.addWidget(self.mode_combo) self.top_layout.addWidget(self.max_count) self.splitter = QtGui.QSplitter() self.splitter.setHandleWidth(defs.handle_width) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setChildrenCollapsible(True) self.splitter.addWidget(self.commit_list) self.splitter.addWidget(self.commit_text) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.spacing) self.bottom_layout.addWidget(self.button_export) self.bottom_layout.addWidget(self.button_cherrypick) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.button_close) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addLayout(self.top_layout) self.main_layout.addWidget(self.splitter) self.main_layout.addLayout(self.bottom_layout) self.setLayout(self.main_layout) if self.parent(): self.resize(self.parent().width(), self.parent().height()) else: self.resize(720, 500)
def toolbutton(self, text, tooltip, icon): return qt.create_toolbutton(text=text, tooltip=tooltip, icon=icon)
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): standard.Dialog.__init__(self, parent) self.setAttribute(QtCore.Qt.WA_MacMetalStyle) self.setWindowTitle(self.tr('Search')) self.mode_combo = QtGui.QComboBox() self.browse_button = create_toolbutton(icon=dir_icon(), tooltip='Browse...') self.query = QtGui.QLineEdit() self.start_date = QtGui.QDateEdit() self.start_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.start_date.setCalendarPopup(True) self.start_date.setDisplayFormat(self.tr('yyyy-MM-dd')) self.end_date = QtGui.QDateEdit() self.end_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.end_date.setCalendarPopup(True) self.end_date.setDisplayFormat(self.tr('yyyy-MM-dd')) self.search_button = QtGui.QPushButton() self.search_button.setText(self.tr('Search')) self.search_button.setDefault(True) self.max_count = QtGui.QSpinBox() self.max_count.setMinimum(5) self.max_count.setMaximum(9995) self.max_count.setSingleStep(5) self.max_count.setValue(500) self.commit_list = QtGui.QListWidget() self.commit_list.setMinimumSize(QtCore.QSize(1, 1)) self.commit_list.setAlternatingRowColors(True) self.commit_list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) self.commit_text = DiffTextEdit(self, whitespace=False) self.button_export = QtGui.QPushButton() self.button_export.setText(self.tr('Export Patches')) self.button_cherrypick = QtGui.QPushButton() self.button_cherrypick.setText(self.tr('Cherry Pick')) self.button_close = QtGui.QPushButton() self.button_close.setText(self.tr('Close')) self.top_layout = QtGui.QHBoxLayout() self.top_layout.setMargin(0) self.top_layout.setSpacing(defs.button_spacing) self.top_layout.addWidget(self.query) self.top_layout.addWidget(self.start_date) self.top_layout.addWidget(self.end_date) self.top_layout.addWidget(self.browse_button) self.top_layout.addWidget(self.search_button) self.top_layout.addStretch() self.top_layout.addWidget(self.mode_combo) self.top_layout.addWidget(self.max_count) self.splitter = QtGui.QSplitter() self.splitter.setHandleWidth(defs.handle_width) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setChildrenCollapsible(True) self.splitter.addWidget(self.commit_list) self.splitter.addWidget(self.commit_text) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.spacing) self.bottom_layout.addWidget(self.button_export) self.bottom_layout.addWidget(self.button_cherrypick) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.button_close) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addLayout(self.top_layout) self.main_layout.addWidget(self.splitter) self.main_layout.addLayout(self.bottom_layout) self.setLayout(self.main_layout) if self.parent(): self.resize(self.parent().width(), self.parent().height()) else: self.resize(720, 500)
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 = prefs.PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 2 # 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(N_('Browser'), self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock(N_('Action'), self) self.actionsdockwidgetcontents = action.ActionButtons(self) self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) self.actionsdockwidget.toggleViewAction().setChecked(False) self.actionsdockwidget.hide() # "Repository Status" widget self.statuswidget = StatusWidget(self) self.statusdockwidget = create_dock(N_('Status'), self) self.statusdockwidget.setWidget(self.statuswidget) # "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(N_('Commit'), self) titlebar = self.commitdockwidget.titleBarWidget() titlebar.add_corner_widget(self.position_label) self.commitmsgeditor = CommitMessageEditor(model, self) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Console" widget self.logwidget = 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.diffeditor = DiffEditor(self.diffdockwidget) self.diffdockwidget.setWidget(self.diffeditor) # "Diff Options" tool menu self.diff_ignore_space_at_eol_action = add_action(self, N_('Ignore changes in whitespace at EOL'), self._update_diff_opts) self.diff_ignore_space_at_eol_action.setCheckable(True) self.diff_ignore_space_change_action = add_action(self, N_('Ignore changes in amount of whitespace'), self._update_diff_opts) self.diff_ignore_space_change_action.setCheckable(True) self.diff_ignore_all_space_action = add_action(self, N_('Ignore all whitespace'), self._update_diff_opts) self.diff_ignore_all_space_action.setCheckable(True) self.diff_function_context_action = add_action(self, N_('Show whole surrounding functions of changes'), self._update_diff_opts) self.diff_function_context_action.setCheckable(True) self.diffopts_button = create_toolbutton(text=N_('Options'), icon=options_icon(), tooltip=N_('Diff Options')) self.diffopts_menu = create_menu(N_('Diff Options'), self.diffopts_button) self.diffopts_menu.addAction(self.diff_ignore_space_at_eol_action) self.diffopts_menu.addAction(self.diff_ignore_space_change_action) self.diffopts_menu.addAction(self.diff_ignore_all_space_action) self.diffopts_menu.addAction(self.diff_function_context_action) self.diffopts_button.setMenu(self.diffopts_menu) self.diffopts_button.setPopupMode(QtGui.QToolButton.InstantPopup) titlebar = self.diffdockwidget.titleBarWidget() titlebar.add_corner_widget(self.diffopts_button) # All Actions self.menu_unstage_all = add_action(self, N_('Unstage All'), cmds.run(cmds.UnstageAll)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, N_('Unstage From Commit'), cmds.run(cmds.UnstageSelected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, N_('Diffstat'), cmds.run(cmds.Diffstat), 'Alt+D') self.menu_stage_modified = add_action(self, N_('Stage Changed Files To Commit'), cmds.run(cmds.StageModified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, N_('Stage All Untracked'), cmds.run(cmds.StageUntracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, N_('Export Patches...'), guicmds.export_patches, 'Alt+E') self.menu_preferences = add_action(self, N_('Preferences'), self.preferences, QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_edit_remotes = add_action(self, N_('Edit Remotes...'), lambda: editremotes.edit().exec_()) self.menu_rescan = add_action(self, cmds.RescanAndRefresh.name(), cmds.run(cmds.RescanAndRefresh), cmds.RescanAndRefresh.SHORTCUT) self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, N_('Recently Modified Files...'), browse_recent, 'Shift+Ctrl+E') self.menu_cherry_pick = add_action(self, N_('Cherry-Pick...'), guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, N_('Load Commit Message...'), guicmds.load_commitmsg) self.menu_save_tarball = add_action(self, N_('Save As Tarball/Zip...'), self.save_archive) self.menu_quit = add_action(self, N_('Quit'), self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, N_('Bookmarks...'), manage_bookmarks) self.menu_grep = add_action(self, N_('Grep'), guicmds.grep, 'Ctrl+G') self.menu_merge_local = add_action(self, N_('Merge...'), merge.local_merge) self.menu_merge_abort = add_action(self, N_('Abort Merge...'), merge.abort_merge) self.menu_fetch = add_action(self, N_('Fetch...'), remote.fetch) self.menu_push = add_action(self, N_('Push...'), remote.push) self.menu_pull = add_action(self, N_('Pull...'), remote.pull) self.menu_open_repo = add_action(self, N_('Open...'), guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, N_('Stash...'), stash.stash, 'Alt+Shift+S') self.menu_clone_repo = add_action(self, N_('Clone...'), guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, N_('Documentation'), resources.show_html_docs, QtGui.QKeySequence.HelpContents) self.menu_help_shortcuts = add_action(self, N_('Keyboard Shortcuts'), show_shortcuts, QtCore.Qt.Key_Question) self.menu_visualize_current = add_action(self, N_('Visualize Current Branch...'), cmds.run(cmds.VisualizeCurrent)) self.menu_visualize_all = add_action(self, N_('Visualize All Branches...'), cmds.run(cmds.VisualizeAll)) self.menu_search_commits = add_action(self, N_('Search...'), search) self.menu_browse_branch = add_action(self, N_('Browse Current Branch...'), guicmds.browse_current) self.menu_browse_other_branch = add_action(self, N_('Browse Other Branch...'), guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, N_('Get Commit Message Template'), cmds.run(cmds.LoadCommitTemplate)) self.menu_help_about = add_action(self, N_('About'), launch_about_dialog) self.menu_diff_expression = add_action(self, N_('Expression...'), guicmds.diff_expression) self.menu_branch_compare = add_action(self, N_('Branches...'), compare_branches) self.menu_create_tag = add_action(self, N_('Create Tag...'), create_tag) self.menu_create_branch = add_action(self, N_('Create...'), create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, N_('Delete...'), guicmds.branch_delete) self.menu_checkout_branch = add_action(self, N_('Checkout...'), guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, N_('Rebase...'), guicmds.rebase) self.menu_branch_review = add_action(self, N_('Review...'), guicmds.review_branch) self.menu_classic = add_action(self, N_('Browser...'), cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, N_('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) # 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.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.menu_open_recent = self.file_menu.addMenu(N_('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(N_('Commit@@verb'), self.menubar) self.commit_menu.setTitle(N_('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(N_('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) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu(N_('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_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(N_('Diff'), self.menubar) 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(N_('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(N_('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 left = Qt.LeftDockWidgetArea right = Qt.RightDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(left, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(left, self.classicdockwidget) self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.addDockWidget(left, self.diffdockwidget) self.addDockWidget(bottom, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) self.tabifyDockWidget(self.actionsdockwidget, self.logdockwidget) self.addDockWidget(right, self.statusdockwidget) # 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) 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() self.dockwidgets = ( self.logdockwidget, self.commitdockwidget, self.statusdockwidget, self.diffdockwidget, self.actionsdockwidget, ) # Restore saved settings if not qtutils.apply_state(self): 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 __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 = prefs.PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 2 # Keeps track of merge messages we've seen self.merge_message_hash = '' self.setAcceptDrops(True) self.setAttribute(Qt.WA_MacMetalStyle) cfg = gitcfg.instance() self.classic_dockable = (cfg.get('cola.browserdockable') or cfg.get('cola.classicdockable')) if self.classic_dockable: self.classicdockwidget = create_dock(N_('Browser'), self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock(N_('Action'), self) self.actionsdockwidgetcontents = action.ActionButtons(self) self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) self.actionsdockwidget.toggleViewAction().setChecked(False) self.actionsdockwidget.hide() # "Repository Status" widget self.statuswidget = StatusWidget(self) self.statusdockwidget = create_dock(N_('Status'), self) self.statusdockwidget.setWidget(self.statuswidget) # "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(N_('Commit'), self) titlebar = self.commitdockwidget.titleBarWidget() titlebar.add_corner_widget(self.position_label) self.commitmsgeditor = CommitMessageEditor(model, self) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Console" widget self.logwidget = 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.diffeditor = DiffEditor(self.diffdockwidget) self.diffdockwidget.setWidget(self.diffeditor) # "Diff Options" tool menu self.diff_ignore_space_at_eol_action = add_action(self, N_('Ignore changes in whitespace at EOL'), self._update_diff_opts) self.diff_ignore_space_at_eol_action.setCheckable(True) self.diff_ignore_space_change_action = add_action(self, N_('Ignore changes in amount of whitespace'), self._update_diff_opts) self.diff_ignore_space_change_action.setCheckable(True) self.diff_ignore_all_space_action = add_action(self, N_('Ignore all whitespace'), self._update_diff_opts) self.diff_ignore_all_space_action.setCheckable(True) self.diff_function_context_action = add_action(self, N_('Show whole surrounding functions of changes'), self._update_diff_opts) self.diff_function_context_action.setCheckable(True) self.diffopts_button = create_toolbutton(text=N_('Options'), icon=options_icon(), tooltip=N_('Diff Options')) self.diffopts_menu = create_menu(N_('Diff Options'), self.diffopts_button) self.diffopts_menu.addAction(self.diff_ignore_space_at_eol_action) self.diffopts_menu.addAction(self.diff_ignore_space_change_action) self.diffopts_menu.addAction(self.diff_ignore_all_space_action) self.diffopts_menu.addAction(self.diff_function_context_action) self.diffopts_button.setMenu(self.diffopts_menu) self.diffopts_button.setPopupMode(QtGui.QToolButton.InstantPopup) titlebar = self.diffdockwidget.titleBarWidget() titlebar.add_corner_widget(self.diffopts_button) # All Actions self.menu_unstage_all = add_action(self, N_('Unstage All'), cmds.run(cmds.UnstageAll)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, N_('Unstage From Commit'), cmds.run(cmds.UnstageSelected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, N_('Diffstat'), cmds.run(cmds.Diffstat), 'Alt+D') self.menu_stage_modified = add_action(self, N_('Stage Changed Files To Commit'), cmds.run(cmds.StageModified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, N_('Stage All Untracked'), cmds.run(cmds.StageUntracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, N_('Export Patches...'), guicmds.export_patches, 'Alt+E') self.menu_preferences = add_action(self, N_('Preferences'), self.preferences, QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_edit_remotes = add_action(self, N_('Edit Remotes...'), lambda: editremotes.edit().exec_()) self.menu_rescan = add_action(self, cmds.Refresh.name(), cmds.run(cmds.Refresh), cmds.Refresh.SHORTCUT) self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, N_('Recently Modified Files...'), browse_recent, 'Shift+Ctrl+E') self.menu_cherry_pick = add_action(self, N_('Cherry-Pick...'), guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, N_('Load Commit Message...'), guicmds.load_commitmsg) self.menu_save_tarball = add_action(self, N_('Save As Tarball/Zip...'), self.save_archive) self.menu_quit = add_action(self, N_('Quit'), self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, N_('Bookmarks...'), manage_bookmarks) self.menu_grep = add_action(self, N_('Grep'), guicmds.grep, 'Ctrl+G') self.menu_merge_local = add_action(self, N_('Merge...'), merge.local_merge) self.menu_merge_abort = add_action(self, N_('Abort Merge...'), merge.abort_merge) self.menu_fetch = add_action(self, N_('Fetch...'), remote.fetch) self.menu_push = add_action(self, N_('Push...'), remote.push) self.menu_pull = add_action(self, N_('Pull...'), remote.pull) self.menu_open_repo = add_action(self, N_('Open...'), guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, N_('Stash...'), stash.stash, 'Alt+Shift+S') self.menu_clone_repo = add_action(self, N_('Clone...'), guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, N_('Documentation'), resources.show_html_docs, QtGui.QKeySequence.HelpContents) self.menu_help_shortcuts = add_action(self, N_('Keyboard Shortcuts'), show_shortcuts, QtCore.Qt.Key_Question) self.menu_visualize_current = add_action(self, N_('Visualize Current Branch...'), cmds.run(cmds.VisualizeCurrent)) self.menu_visualize_all = add_action(self, N_('Visualize All Branches...'), cmds.run(cmds.VisualizeAll)) self.menu_search_commits = add_action(self, N_('Search...'), search) self.menu_browse_branch = add_action(self, N_('Browse Current Branch...'), guicmds.browse_current) self.menu_browse_other_branch = add_action(self, N_('Browse Other Branch...'), guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, N_('Get Commit Message Template'), cmds.run(cmds.LoadCommitTemplate)) self.menu_help_about = add_action(self, N_('About'), launch_about_dialog) self.menu_diff_expression = add_action(self, N_('Expression...'), guicmds.diff_expression) self.menu_branch_compare = add_action(self, N_('Branches...'), compare_branches) self.menu_create_tag = add_action(self, N_('Create Tag...'), create_tag) self.menu_create_branch = add_action(self, N_('Create...'), create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, N_('Delete...'), guicmds.delete_branch) self.menu_delete_remote_branch = add_action(self, N_('Delete Remote Branch...'), guicmds.delete_remote_branch) self.menu_checkout_branch = add_action(self, N_('Checkout...'), guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, N_('Rebase...'), guicmds.rebase) self.menu_branch_review = add_action(self, N_('Review...'), guicmds.review_branch) self.menu_classic = add_action(self, N_('Browser...'), cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, N_('DAG...'), lambda: git_dag(self.model).show()) 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) # 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.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.menu_open_recent = self.file_menu.addMenu(N_('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_export_patches) self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu(N_('Index'), self.menubar) self.commit_menu.setTitle(N_('Index')) 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) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu(N_('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.addAction(self.menu_delete_remote_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(N_('Actions'), self.menubar) self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_grep) self.actions_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu(N_('Diff'), self.menubar) 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(N_('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(N_('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 left = Qt.LeftDockWidgetArea right = Qt.RightDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(left, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(left, self.classicdockwidget) self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.addDockWidget(left, self.diffdockwidget) self.addDockWidget(bottom, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) self.tabifyDockWidget(self.actionsdockwidget, self.logdockwidget) self.addDockWidget(right, self.statusdockwidget) # 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) 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 if not qtutils.apply_state(self): 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 __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, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self._layt = QtGui.QVBoxLayout() self._layt.setMargin(0) self._layt.setSpacing(0) self.commitmsg = CommitMessageTextEdit(model, self) self.commitmsg.setFont(diff_font()) self._ctrls_layt = QtGui.QHBoxLayout() self._ctrls_layt.setSpacing(4) self._ctrls_layt.setMargin(4) # Sign off and commit buttons self.signoff_button = create_toolbutton(self, text='Sign Off', tooltip='Sign off on this commit', icon=apply_icon()) self.commit_button = create_toolbutton(self, text='Commit@@verb', tooltip='Commit staged changes', icon=save_icon()) # Position display self.position_label = QtGui.QLabel() self.position_label.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) # Amend checkbox self.amend_checkbox = QtGui.QCheckBox() self.amend_checkbox.setText(tr('Amend Last Commit')) self._ctrls_layt.addWidget(self.signoff_button) self._ctrls_layt.addWidget(self.commit_button) self._ctrls_layt.addWidget(self.position_label) self._ctrls_layt.addStretch() self._ctrls_layt.addWidget(self.amend_checkbox) self._layt.addWidget(self.commitmsg) self._layt.addLayout(self._ctrls_layt) self.setLayout(self._layt) relay_signal(self, self.commitmsg, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) cola.notifier().connect(signals.amend, self.amend_checkbox.setChecked) # Broadcast the amend mode self.connect(self.amend_checkbox, SIGNAL('toggled(bool)'), emit(self, signals.amend_mode)) self.connect(self.signoff_button, SIGNAL('clicked()'), emit(self, signals.signoff)) # Display the current column self.connect(self.commitmsg, SIGNAL('cursorPositionChanged()'), self.show_cursor_position) # Initialize the GUI to show 'Column: 00' self.show_cursor_position()
def __init__(self, parent=None): MainWindowBase.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) # Dockwidget options qtcompat.set_common_dock_options(self) self.classic_dockable = gitcfg.instance().get('cola.classicdockable') if self.classic_dockable: self.classicdockwidget = self.create_dock('Cola Classic') self.classicwidget = classic.widget(parent=self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actiondockwidget = self.create_dock('Actions') self.actiondockwidgetcontents = qt.QFlowLayoutWidget(parent=self) layout = self.actiondockwidgetcontents.layout() self.rescan_button = qt.create_button('Rescan', layout) self.stage_button = qt.create_button('Stage', layout) self.unstage_button = qt.create_button('Unstage', layout) self.fetch_button = qt.create_button('Fetch...', layout) self.push_button = qt.create_button('Push...', layout) self.pull_button = qt.create_button('Pull...', layout) self.stash_button = qt.create_button('Stash...', layout) self.alt_button = qt.create_button('Exit Diff Mode', layout) self.alt_button.hide() layout.addStretch() self.actiondockwidget.setWidget(self.actiondockwidgetcontents) # "Repository Status" widget self.statusdockwidget = self.create_dock('Repository Status') self.statusdockwidget.setWidget(status.StatusWidget(self)) # "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(0) self.commitdockwidgetlayout.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.commit_ctrls_layt = QtGui.QHBoxLayout() self.commit_ctrls_layt.setSpacing(4) self.commit_ctrls_layt.setMargin(4) # Sign off and commit buttons self.signoff_button = qt.create_toolbutton(self, text='Sign Off', tooltip='Sign off on this commit', icon=qtutils.apply_icon()) self.commit_button = qt.create_toolbutton(self, text='Commit@@verb', tooltip='Commit staged changes', icon=qtutils.save_icon()) # Position display self.position_label = QtGui.QLabel(self.actiondockwidgetcontents) self.position_label.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) # Amend checkbox self.amend_checkbox = QtGui.QCheckBox(self.commitdockwidgetcontents) self.amend_checkbox.setText(tr('Amend Last Commit')) self.commit_ctrls_layt.addWidget(self.signoff_button) self.commit_ctrls_layt.addWidget(self.commit_button) self.commit_ctrls_layt.addWidget(self.position_label) self.commit_ctrls_layt.addStretch() self.commit_ctrls_layt.addWidget(self.amend_checkbox) self.commitdockwidgetlayout.addWidget(self.commitmsg) self.commitdockwidgetlayout.addLayout(self.commit_ctrls_layt) 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(0) 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(Qt.LinksAccessibleByKeyboard | Qt.LinksAccessibleByMouse | Qt.TextBrowserInteraction | Qt.TextSelectableByKeyboard | 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', local=True) self.menu_paste = self.create_action('Paste') self.menu_select_all = self.create_action('Select All') self.menu_options = self.create_action('Preferences') 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_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_grep = self.create_action('Grep') self.menu_merge_local = self.create_action('Merge...') self.menu_merge_abort = self.create_action('Abort Merge...') self.menu_fetch = self.create_action('Fetch...') self.menu_push = self.create_action('Push...') self.menu_pull = self.create_action('Pull...') 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...') self.menu_search_commits = self.create_action('Search...') 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...') self.menu_dag = self.create_action('DAG...') # 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('Co&mmit', 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) self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = self.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 = self.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 = 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.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 = 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(QtGui.QKeySequence.Cut) self.menu_copy.setShortcut(QtGui.QKeySequence.Copy) self.menu_paste.setShortcut(QtGui.QKeySequence.Paste) self.menu_select_all.setShortcut(QtGui.QKeySequence.SelectAll) 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) 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)
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self.summary = CommitSummaryLineEdit() self.description = CommitMessageTextEdit() self.commit_button = create_toolbutton(text='Commit@@verb', tooltip='Commit staged changes', 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) # Amend checkbox self.signoff_action = self.actions_menu.addAction(tr('Sign Off')) self.signoff_action.setToolTip('Sign off on this commit') self.signoff_action.setShortcut('Ctrl+i') self.commit_action = self.actions_menu.addAction(tr('Commit@@verb')) self.commit_action.setToolTip(tr('Commit staged changes')) self.commit_action.setShortcut('Ctrl+Return') self.actions_menu.addSeparator() self.amend_action = self.actions_menu.addAction(tr('Amend Last Commit')) self.amend_action.setCheckable(True) self.prev_commits_menu = self.actions_menu.addMenu( '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) relay_signal(self, self.description, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) connect_action(self.commit_action, self.commit) connect_action(self.signoff_action, emit(self, signals.signoff)) cola.notifier().connect(signals.amend, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, emit(self, signals.amend_mode)) 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)
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self.summary_placeholder = u'Commit summary' self.description_placeholder = u'Extended description...' # Palette for normal text self.default_palette = QtGui.QPalette(self.palette()) # Palette used for the placeholder text self.placeholder_palette = pal = QtGui.QPalette(self.palette()) color = pal.text().color() color.setAlpha(128) pal.setColor(QtGui.QPalette.Active, QtGui.QPalette.Text, color) pal.setColor(QtGui.QPalette.Inactive, QtGui.QPalette.Text, color) self.summary = QtGui.QLineEdit() self.description = CommitMessageTextEdit() self.commit_button = create_toolbutton(text='Commit@@verb', tooltip='Commit staged changes', 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) # Amend checkbox self.signoff_action = self.actions_menu.addAction(tr('Sign Off')) self.signoff_action.setToolTip('Sign off on this commit') self.signoff_action.setShortcut('Ctrl+i') self.commit_action = self.actions_menu.addAction(tr('Commit@@verb')) self.commit_action.setToolTip(tr('Commit staged changes')) self.commit_action.setShortcut('Ctrl+m') self.actions_menu.addSeparator() self.amend_action = self.actions_menu.addAction(tr('Amend Last Commit')) self.amend_action.setCheckable(True) self.prev_commits_menu = self.actions_menu.addMenu( '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) relay_signal(self, self.description, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) connect_action(self.commit_action, self.commit) connect_action(self.signoff_action, emit(self, signals.signoff)) cola.notifier().connect(signals.amend, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, emit(self, signals.amend_mode)) self.model.add_message_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL('returnPressed()'), self.summary_return_pressed) # 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.setFocusProxy(self.summary) self.setFont(diff_font()) self.summary.installEventFilter(self) self.description.installEventFilter(self) self.enable_placeholder_summary(True) self.enable_placeholder_description(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False)