def __init__(self, hint, parent=None): from cola.prefs import diff_font QtGui.QLineEdit.__init__(self, parent) HintedTextWidgetMixin.__init__(self, hint) self.setFont(diff_font()) self.connect(self, SIGNAL('cursorPositionChanged(int,int)'), lambda x, y: self.emit_position())
def __init__(self, parent): from cola.prefs import diff_font, tab_width QtGui.QTextEdit.__init__(self, parent) self.setMinimumSize(QtCore.QSize(1, 1)) self.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.setAcceptRichText(False) self.setFont(diff_font()) self.set_tab_width(tab_width()) self.setCursorWidth(2)
def __init__(self, model, view, revs, summaries): QObserver.__init__(self, model, view) self.model.set_revisions(revs) self.model.set_summaries(summaries) self.connect(view.commit_list, SIGNAL('itemSelectionChanged()'), self.commit_sha1_selected) view.commit_list.contextMenuEvent = self.context_menu_event self.view.commit_text.setFont(diff_font())
def __init__(self, parent): from cola.prefs import diff_font, tabwidth QtGui.QTextEdit.__init__(self, parent) self._tabwidth = 8 self.setMinimumSize(QtCore.QSize(1, 1)) self.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.setAcceptRichText(False) self.setFont(diff_font()) self.set_tabwidth(tabwidth()) self.setCursorWidth(2)
def __init__(self, notifier, parent): QtGui.QWidget.__init__(self, parent) author_font = QtGui.QFont(self.font()) author_font.setPointSize(int(author_font.pointSize() * 1.1)) summary_font = QtGui.QFont(author_font) summary_font.setWeight(QtGui.QFont.Bold) policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gravatar_label = GravatarLabel() self.author_label = TextLabel() self.author_label.setTextFormat(Qt.RichText) self.author_label.setFont(author_font) self.author_label.setSizePolicy(policy) self.author_label.setAlignment(Qt.AlignBottom) self.author_label.elide() self.summary_label = TextLabel() self.summary_label.setTextFormat(Qt.PlainText) self.summary_label.setFont(summary_font) self.summary_label.setSizePolicy(policy) self.summary_label.setAlignment(Qt.AlignTop) self.summary_label.elide() self.diff = QtGui.QTextEdit() self.diff.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.diff.setReadOnly(True) self.diff.setFont(diff_font()) self.highlighter = DiffSyntaxHighlighter(self.diff.document()) self.info_layout = QtGui.QVBoxLayout() self.info_layout.setMargin(0) self.info_layout.setSpacing(0) self.info_layout.addWidget(self.author_label) self.info_layout.addWidget(self.summary_label) self.logo_layout = QtGui.QHBoxLayout() self.logo_layout.setContentsMargins(defs.margin, 0, defs.margin, 0) self.logo_layout.setSpacing(defs.button_spacing) self.logo_layout.addWidget(self.gravatar_label) self.logo_layout.addLayout(self.info_layout) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(0) self.main_layout.setSpacing(defs.spacing) self.main_layout.addLayout(self.logo_layout) self.main_layout.addWidget(self.diff) self.setLayout(self.main_layout) sig = signals.commits_selected notifier.add_observer(sig, self.commits_selected)
def __init__(self, parent): QtGui.QTextEdit.__init__(self, parent) self.setMinimumSize(QtCore.QSize(1, 1)) self.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.setAcceptRichText(False) self.setCursorWidth(2) self.setTextInteractionFlags(Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) # Diff/patch syntax highlighter self.syntax = DiffSyntaxHighlighter(self.document()) self.setFont(diff_font()) self.set_tab_width(tab_width())
def __init__(self, parent): super(AddRemoteWidget, self).__init__(parent) self.setWindowModality(Qt.WindowModal) self.add_btn = QtGui.QPushButton(self.tr('Add Remote')) self.add_btn.setIcon(qtutils.apply_icon()) self.cancel_btn = QtGui.QPushButton(self.tr('Cancel')) diff_font = prefs.diff_font() metrics = QtGui.QFontMetrics(diff_font) def lineedit(hint): widget = text.HintedLineEdit(hint) widget.setFont(diff_font) widget.enable_hint(True) widget.setMinimumWidth(metrics.width('_' * 32)) return widget self.name = lineedit('Name for the new remote') self.url = lineedit('git://git.example.com/repo.git') self._form = QtGui.QFormLayout() self._form.setMargin(defs.margin) self._form.setSpacing(defs.spacing) self._form.addRow(self.tr('Name'), self.name) self._form.addRow(self.tr('URL'), self.url) self._btn_layout = QtGui.QHBoxLayout() self._btn_layout.setMargin(0) self._btn_layout.setSpacing(defs.button_spacing) self._btn_layout.addStretch() self._btn_layout.addWidget(self.add_btn) self._btn_layout.addWidget(self.cancel_btn) self._layout = QtGui.QVBoxLayout() self._layout.setMargin(defs.margin) self._layout.setSpacing(defs.margin) self._layout.addLayout(self._form) self._layout.addLayout(self._btn_layout) self.setLayout(self._layout) self.connect(self.name, SIGNAL('textChanged(QString)'), self.validate) self.connect(self.url, SIGNAL('textChanged(QString)'), self.validate) self.add_btn.setEnabled(False) qtutils.connect_button(self.add_btn, self.accept) qtutils.connect_button(self.cancel_btn, self.reject)
def __init__(self, parent=None): from cola.prefs import diff_font QtGui.QLineEdit.__init__(self, parent) self.setFont(diff_font()) # used to hide the completion popup after a drag-select self._drag = 0 self._completer = None self._delegate = HighlightDelegate(self) self.connect(self, SIGNAL('textChanged(QString)'), self._text_changed) self._keys_to_ignore = set([Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape])
def __init__(self, notifier, parent=None): QtGui.QWidget.__init__(self, parent) self.diff = QtGui.QTextEdit() self.diff.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.diff.setReadOnly(True) self.diff.setFont(diff_font()) self.diff_syn = DiffSyntaxHighlighter(self.diff.document()) self._layt = QtGui.QHBoxLayout() self._layt.addWidget(self.diff) self._layt.setMargin(2) self.setLayout(self._layt) sig = signals.commits_selected notifier.add_message_observer(sig, self._commits_selected)
def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setWindowTitle('About git-cola') self.setWindowModality(Qt.WindowModal) self.label = QtGui.QLabel() self.pixmap = QtGui.QPixmap('icons:logo-top.png') #self.label.setStyleSheet('QWidget {background: #000; }') self.label.setPixmap(self.pixmap) self.label.setAlignment(Qt.AlignRight | Qt.AlignTop) palette = self.label.palette() palette.setColor(QtGui.QPalette.Window, Qt.black) self.label.setAutoFillBackground(True) self.label.setPalette(palette) self.text = QtGui.QTextEdit() self.text.setReadOnly(True) self.text.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.text.setAcceptRichText(False) self.text.setTextInteractionFlags(Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) self.text.setFont(diff_font()) self.text.setPlainText(COPYRIGHT) self.close_button = QtGui.QPushButton() self.close_button.setText(self.tr('Close')) self.close_button.setDefault(True) self.button_layout = QtGui.QHBoxLayout() self.button_layout.addStretch() self.button_layout.addWidget(self.close_button) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(0) self.main_layout.setSpacing(defs.spacing) self.main_layout.addWidget(self.label) self.main_layout.addWidget(self.text) self.main_layout.addLayout(self.button_layout) self.setLayout(self.main_layout) self.resize(666, 420) qtutils.connect_button(self.close_button, self.accept)
def __init__(self, model, parent=None): QtGui.QLineEdit.__init__(self, parent) from cola.prefs import diff_font self.setFont(diff_font()) # used to hide the completion popup after a drag-select self._drag = 0 self._keys_to_ignore = set( [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape]) completion_model = model(self) completer = Completer(completion_model, self) completer.setWidget(self) self._completer = completer self._delegate = HighlightDelegate(self) self.connect(self, SIGNAL('textChanged(QString)'), self._text_changed) completer.popup().setItemDelegate(self._delegate) self.connect(self._completer, SIGNAL('activated(QString)'), self._complete)
def __init__(self, model, parent=None): QtGui.QLineEdit.__init__(self, parent) from cola.prefs import diff_font self.setFont(diff_font()) # used to hide the completion popup after a drag-select self._drag = 0 self._keys_to_ignore = set([Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape]) completion_model = model(self) completer = Completer(completion_model, self) completer.setWidget(self) self._completer = completer self._delegate = HighlightDelegate(self) self.connect(self, SIGNAL('textChanged(QString)'), self._text_changed) completer.popup().setItemDelegate(self._delegate) self.connect(self._completer, SIGNAL('activated(QString)'), self._complete)
def __init__(self, parent): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) hint = N_('command-line arguments') self.input_txt = HintedLineEdit(hint, self) self.input_txt.enable_hint(True) hint = N_('grep result...') self.result_txt = GrepTextView(hint, self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(N_('Edit')) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(N_('Refresh')) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(N_('Shell arguments')) self.shell_checkbox.setToolTip( N_('Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".')) self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(N_('Close')) self.input_layout = QtGui.QHBoxLayout() self.input_layout.setMargin(0) self.input_layout.setSpacing(defs.button_spacing) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.button_spacing) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.input_layout.addWidget(self.input_label) self.input_layout.addWidget(self.input_txt) self.bottom_layout.addWidget(self.edit_button) self.bottom_layout.addWidget(self.refresh_button) self.bottom_layout.addWidget(self.shell_checkbox) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.close_button) self.mainlayout.addLayout(self.input_layout) self.mainlayout.addWidget(self.result_txt) self.mainlayout.addLayout(self.bottom_layout) self.setLayout(self.mainlayout) self.grep_thread = GrepThread(self) self.connect(self.grep_thread, SIGNAL('result'), self.process_result) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), self.input_txt_changed) self.connect(self.result_txt, SIGNAL('leave()'), lambda: self.input_txt.setFocus()) qtutils.add_action(self.input_txt, 'FocusResults', lambda: self.result_txt.setFocus(), Qt.Key_Down, Qt.Key_Enter, Qt.Key_Return) qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not qtutils.apply_state(self): self.resize(666, 420)
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._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, opts, parent): super(CreateTag, self).__init__(parent=parent) self.setWindowModality(QtCore.Qt.WindowModal) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(self.tr('Create Tag')) self.opts = opts self.main_layt = QtGui.QVBoxLayout(self) self.main_layt.setContentsMargins(6, 12, 6, 6) # Form layout for inputs self.input_form_layt = QtGui.QFormLayout() self.input_form_layt.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) # Tag label self.tag_name_label = QtGui.QLabel(self) self.tag_name_label.setText(self.tr('Name')) self.input_form_layt.setWidget(0, QtGui.QFormLayout.LabelRole, self.tag_name_label) self.tag_name = text.HintedLineEdit('vX.Y.Z', self) self.tag_name.setToolTip(self.tr('Specifies the tag name')) self.input_form_layt.setWidget(0, QtGui.QFormLayout.FieldRole, self.tag_name) # Sign Tag self.sign_label = QtGui.QLabel(self) self.sign_label.setText(self.tr('Sign Tag')) self.input_form_layt.setWidget(1, QtGui.QFormLayout.LabelRole, self.sign_label) self.sign_tag = QtGui.QCheckBox(self) self.sign_tag.setToolTip( self.tr('Whether to sign the tag (git tag -s)')) self.input_form_layt.setWidget(1, QtGui.QFormLayout.FieldRole, self.sign_tag) self.main_layt.addLayout(self.input_form_layt) # Tag message self.tag_msg_label = QtGui.QLabel(self) self.tag_msg_label.setText(self.tr('Message')) self.input_form_layt.setWidget(2, QtGui.QFormLayout.LabelRole, self.tag_msg_label) self.tag_msg = text.HintedTextEdit('Tag message...', self) self.tag_msg.setToolTip(self.tr('Specifies the tag message')) self.tag_msg.setFont(diff_font()) self.tag_msg.enable_hint(True) self.input_form_layt.setWidget(2, QtGui.QFormLayout.FieldRole, self.tag_msg) # Revision self.rev_label = QtGui.QLabel(self) self.rev_label.setText(self.tr('Revision')) self.input_form_layt.setWidget(3, QtGui.QFormLayout.LabelRole, self.rev_label) self.revision = completion.GitRefLineEdit() self.revision.setText(self.opts.revision) self.revision.setToolTip(self.tr('Specifies the SHA-1 to tag')) self.input_form_layt.setWidget(3, QtGui.QFormLayout.FieldRole, self.revision) # Buttons self.button_hbox_layt = QtGui.QHBoxLayout() self.button_hbox_layt.addStretch() self.create_button = qt.create_button(text='Create Tag', icon=qtutils.git_icon()) self.button_hbox_layt.addWidget(self.create_button) self.main_layt.addLayout(self.button_hbox_layt) self.close_button = qt.create_button(text='Close') self.button_hbox_layt.addWidget(self.close_button) connect_button(self.close_button, self.accept) connect_button(self.create_button, self.create_tag) self.resize(506, 295)
def __init__(self, parent=None, title=None, multiselect=True, syntax=True): QtGui.QDialog.__init__(self, parent) if title: self.setWindowTitle(title) # Allow disabling multi-select self.resize(700, 420) self.setObjectName('commit') self.vboxlayout = QtGui.QVBoxLayout(self) self.vboxlayout.setObjectName('vboxlayout') self.splitter = QtGui.QSplitter(self) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setHandleWidth(2) self.splitter.setObjectName('splitter') self.commit_list = QtGui.QListWidget(self.splitter) self.commit_list.setObjectName('commit_list') self.commit_list.setAlternatingRowColors(True) if multiselect: mode = QtGui.QAbstractItemView.ExtendedSelection else: mode = QtGui.QAbstractItemView.SingleSelection self.commit_list.setSelectionMode(mode) self.commit_text = QtGui.QTextEdit(self.splitter) self.commit_text.setMinimumSize(QtCore.QSize(0, 40)) self.commit_text.setTabChangesFocus(True) self.commit_text.setUndoRedoEnabled(False) self.commit_text.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.commit_text.setReadOnly(True) self.commit_text.setObjectName('commit_text') self.vboxlayout.addWidget(self.splitter) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setObjectName("hboxlayout") self.label = QtGui.QLabel(self) self.label.setObjectName('label') self.label.setText(self.tr('Revision Expression:')) self.hboxlayout.addWidget(self.label) self.revision = QtGui.QLineEdit(self) self.revision.setObjectName('revision') self.hboxlayout.addWidget(self.revision) self.vboxlayout.addLayout(self.hboxlayout) self.button_box = QtGui.QDialogButtonBox(self) self.button_box.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok) self.button_box.setObjectName('button_box') self.vboxlayout.addWidget(self.button_box) self.connect(self.button_box, SIGNAL('accepted()'), self.accept) self.connect(self.button_box, SIGNAL('rejected()'), self.reject) self.setTabOrder(self.button_box, self.commit_list) self.setTabOrder(self.commit_list, self.revision) self.setTabOrder(self.revision, self.commit_text) # Make the list widget slighty larger self.splitter.setSizes([100, 150]) self.syntax = DiffSyntaxHighlighter(self.commit_text.document(), whitespace=False) # Set the console font if syntax: self.commit_text.setFont(diff_font())
def __init__(self, parent): super(RemoteEditor, self).__init__(parent) self.setWindowTitle('Edit Remotes') self.setWindowModality(Qt.WindowModal) self.default_hint = ('' 'Add and remove remote repositories using the \n' 'Add(+) and Delete(-) buttons on the left-hand side.\n' '\n' 'Remotes can be renamed by selecting one from the list\n' 'and pressing "enter", or by double-clicking.') self.remote_list = [] self.remotes = QtGui.QListWidget() self.remotes.setToolTip(self.tr( 'Remote git repositories - double-click to rename')) self.info = text.HintedTextEdit(self.default_hint) self.info.setReadOnly(True) self.info.setFont(prefs.diff_font()) font = self.info.font() metrics = QtGui.QFontMetrics(font) width = metrics.width('_' * 72) height = metrics.height() * 13 self.info.setMinimumWidth(width) self.info.setMinimumHeight(height) self.info_thread = RemoteInfoThread(self) self.cfg = gitcfg.instance() self.add_btn = QtGui.QToolButton() self.add_btn.setIcon(qtutils.icon('add.svg')) self.add_btn.setToolTip(self.tr('Add new remote git repository')) self.refresh_btn = QtGui.QToolButton() self.refresh_btn.setIcon(qtutils.icon('view-refresh.svg')) self.refresh_btn.setToolTip(self.tr('Refresh')) self.delete_btn = QtGui.QToolButton() self.delete_btn.setIcon(qtutils.icon('remove.svg')) self.delete_btn.setToolTip(self.tr('Delete remote')) self.close_btn = QtGui.QPushButton(self.tr('Close')) self._top_layout = QtGui.QSplitter() self._top_layout.setOrientation(Qt.Horizontal) self._top_layout.setHandleWidth(defs.handle_width) self._top_layout.addWidget(self.remotes) self._top_layout.addWidget(self.info) width = self._top_layout.width() self._top_layout.setSizes([width/4, width*3/4]) self._button_layout = QtGui.QHBoxLayout() self._button_layout.addWidget(self.add_btn) self._button_layout.addWidget(self.delete_btn) self._button_layout.addWidget(self.refresh_btn) self._button_layout.addStretch() self._button_layout.addWidget(self.close_btn) self._layout = QtGui.QVBoxLayout() self._layout.setMargin(defs.margin) self._layout.setSpacing(defs.spacing) self._layout.addWidget(self._top_layout) self._layout.addLayout(self._button_layout) self.setLayout(self._layout) self.refresh() qtutils.connect_button(self.add_btn, self.add) qtutils.connect_button(self.delete_btn, self.delete) qtutils.connect_button(self.refresh_btn, self.refresh) qtutils.connect_button(self.close_btn, self.close) self.connect(self.info_thread, SIGNAL('info'), self.info.set_value) self.connect(self.remotes, SIGNAL('itemChanged(QListWidgetItem*)'), self.remote_renamed) self.connect(self.remotes, SIGNAL('itemSelectionChanged()'), self.selection_changed)
def __init__(self, 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): 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, 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): super(MainView, self).__init__(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 logwidget = qtutils.logger() logwidget.setFont(diff_font()) self.logdockwidget = create_dock('Console', self) self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = create_dock('Diff', self) self.diff_editor = DiffEditor(self.diffdockwidget) self.diffdockwidget.setWidget(self.diff_editor) # 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.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.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): standard.Dialog.__init__(self, parent=parent) self.setWindowModality(QtCore.Qt.WindowModal) self.setWindowTitle(self.tr('Create Tag')) self.resize(506, 295) self._main_layt = QtGui.QVBoxLayout(self) self._main_layt.setContentsMargins(6, 12, 6, 6) # Form layout for inputs self._input_form_layt = QtGui.QFormLayout() self._input_form_layt.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) # Tag label self._tag_name_label = QtGui.QLabel(self) self._tag_name_label.setText(self.tr('Name')) self._input_form_layt.setWidget(0, QtGui.QFormLayout.LabelRole, self._tag_name_label) self.tag_name = QtGui.QLineEdit(self) self.tag_name.setToolTip(self.tr('Specifies the tag name')) self._input_form_layt.setWidget(0, QtGui.QFormLayout.FieldRole, self.tag_name) # Sign Tag self._sign_label = QtGui.QLabel(self) self._sign_label.setText(self.tr('Sign Tag')) self._input_form_layt.setWidget(1, QtGui.QFormLayout.LabelRole, self._sign_label) self.sign_tag = QtGui.QCheckBox(self) self.sign_tag.setToolTip( self.tr('Whether to sign the tag (git tag -s)')) self._input_form_layt.setWidget(1, QtGui.QFormLayout.FieldRole, self.sign_tag) self._main_layt.addLayout(self._input_form_layt) # Tag message self._tag_msg_label = QtGui.QLabel(self) self._tag_msg_label.setText(self.tr('Message')) self._input_form_layt.setWidget(2, QtGui.QFormLayout.LabelRole, self._tag_msg_label) # Exposed self.tag_msg = QtGui.QTextEdit(self) self.tag_msg.setAcceptRichText(False) self.tag_msg.setToolTip(self.tr('Specifies the tag message')) self.tag_msg.setFont(diff_font()) self._input_form_layt.setWidget(2, QtGui.QFormLayout.FieldRole, self.tag_msg) # Revision self._rev_label = QtGui.QLabel(self) self._rev_label.setText(self.tr('Revision')) self._input_form_layt.setWidget(3, QtGui.QFormLayout.LabelRole, self._rev_label) # Exposed self.revision = QtGui.QComboBox(self) self.revision.setEditable(True) self.revision.setToolTip(self.tr('Specifies the SHA-1 to tag')) self._input_form_layt.setWidget(3, QtGui.QFormLayout.FieldRole, self.revision) # Buttons self._button_hbox_layt = QtGui.QHBoxLayout() self._button_spacer = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self._button_hbox_layt.addItem(self._button_spacer) self.create_button = QtGui.QPushButton(self) self.create_button.setText(self.tr('Create Tag')) self.create_button.setIcon(qtutils.git_icon()) self._button_hbox_layt.addWidget(self.create_button) self._main_layt.addLayout(self._button_hbox_layt) self.close_button = QtGui.QPushButton(self) self.close_button.setText(self.tr('Close')) self._button_hbox_layt.addWidget(self.close_button) self.connect(self.close_button, SIGNAL('clicked()'), self.accept)
def __init__(self, parent=None): standard.Dialog.__init__(self, parent=parent) self.setWindowTitle(self.tr('Search')) if self.parent(): self.resize(600, self.parent().height()) else: self.resize(600, 500) self._main_vbox_layt = QtGui.QVBoxLayout(self) self._top_grid_layt = QtGui.QGridLayout() # Exposed self.radio_range = QtGui.QRadioButton(self) self.radio_range.setText(self.tr('Revision Range Expression')) self._top_grid_layt.addWidget(self.radio_range, 0, 0, 1, 2) # Exposed self.radio_path = QtGui.QRadioButton(self) self.radio_path.setText(self.tr('Commits Touching Paths')) self._top_grid_layt.addWidget(self.radio_path, 0, 2, 1, 1) # Exposed self.radio_author = QtGui.QRadioButton(self) self.radio_author.setText(self.tr('Author')) self._top_grid_layt.addWidget(self.radio_author, 0, 3, 1, 1) # Exposed self.radio_committer = QtGui.QRadioButton(self) self.radio_committer.setText(self.tr('Committer')) self._top_grid_layt.addWidget(self.radio_committer, 0, 4, 1, 1) # Exposed self.radio_revision = QtGui.QRadioButton(self) self.radio_revision.setText(self.tr('Revision ID')) self._top_grid_layt.addWidget(self.radio_revision, 1, 0, 1, 2) # Exposed self.radio_message = QtGui.QRadioButton(self) self.radio_message.setText(self.tr('Commit Messages')) self._top_grid_layt.addWidget(self.radio_message, 1, 2, 1, 1) # Exposed self.radio_daterange = QtGui.QRadioButton(self) self.radio_daterange.setText(self.tr('Date Range (Start / End)')) self._top_grid_layt.addWidget(self.radio_daterange, 1, 3, 1, 2) # Exposed self.maxresults_label = QtGui.QLabel(self) self.maxresults_label.setText(self.tr('Max Results')) self._top_grid_layt.addWidget(self.maxresults_label, 2, 0, 1, 1) # Exposed self.max_results = QtGui.QSpinBox(self) self.max_results.setMinimum(5) self.max_results.setMaximum(9995) self.max_results.setSingleStep(5) self.max_results.setProperty("value", QtCore.QVariant(500)) self._top_grid_layt.addWidget(self.max_results, 2, 1, 1, 1) # Exposed self.radio_diff = QtGui.QRadioButton(self) self.radio_diff.setText(self.tr('Diff Content')) self._top_grid_layt.addWidget(self.radio_diff, 2, 2, 1, 1) # Exposed self.start_date = QtGui.QDateEdit(self) self.start_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.start_date.setCalendarPopup(True) self.start_date.setDisplayFormat(self.tr('yyyy-MM-dd')) self._top_grid_layt.addWidget(self.start_date, 2, 3, 1, 1) # Exposed self.end_date = QtGui.QDateEdit(self) self.end_date.setCurrentSection(QtGui.QDateTimeEdit.YearSection) self.end_date.setCalendarPopup(True) self.end_date.setDisplayFormat(self.tr('yyyy-MM-dd')) self._top_grid_layt.addWidget(self.end_date, 2, 4, 1, 1) # Exposed self.button_search = QtGui.QPushButton(self) self.button_search.setText(self.tr('Search')) self.button_search.setShortcut(self.tr('Return')) self._top_grid_layt.addWidget(self.button_search, 3, 0, 1, 1) # Exposed self.query = QtGui.QLineEdit(self) self.query.setFocus() self._top_grid_layt.addWidget(self.query, 3, 1, 1, 3) # Exposed self.button_browse = QtGui.QPushButton(self) self.button_browse.setText(self.tr('Browse')) self._top_grid_layt.addWidget(self.button_browse, 3, 4, 1, 1) self._main_vbox_layt.addLayout(self._top_grid_layt) # Exposed self.splitter = QtGui.QSplitter(self) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setHandleWidth(2) # Exposed self.commit_list = QtGui.QListWidget(self.splitter) self.commit_list.setMinimumSize(QtCore.QSize(1, 1)) self.commit_list.setAlternatingRowColors(True) self.commit_list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) # Exposed self.commit_text = QtGui.QTextEdit(self.splitter) self.commit_text.setMinimumSize(QtCore.QSize(1, 1)) self.commit_text.setTabChangesFocus(True) self.commit_text.setReadOnly(True) self.commit_text.setAcceptRichText(False) self.commit_text.setFont(diff_font()) self._syntax = DiffSyntaxHighlighter(self.commit_text.document(), whitespace=False) self._main_vbox_layt.addWidget(self.splitter) self._button_grid_layt = QtGui.QGridLayout() # Exposed self.button_export = QtGui.QPushButton(self) self.button_export.setText(self.tr('Export Patches')) self._button_grid_layt.addWidget(self.button_export, 0, 0, 1, 1) # Exposed self.button_cherrypick = QtGui.QPushButton(self) self.button_cherrypick.setText(self.tr('Cherry Pick')) self._button_grid_layt.addWidget(self.button_cherrypick, 0, 1, 1, 1) # Exposed self._button_spacer = QtGui.QSpacerItem(111, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self._button_grid_layt.addItem(self._button_spacer, 0, 2, 1, 1) # Exposed self.button_close = QtGui.QPushButton(self) self.button_close.setText(self.tr('Close')) self._button_grid_layt.addWidget(self.button_close, 0, 3, 1, 1) self._main_vbox_layt.addLayout(self._button_grid_layt) self.connect(self.button_close, SIGNAL('clicked()'), self.accept)
def __init__(self, model, action, parent): """Customizes the dialog based on the remote action """ standard.Dialog.__init__(self, parent=parent) self.model = model self.action = action self.tasks = [] self.filtered_remote_branches = [] self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.setWindowTitle(N_(action)) self.progress = QtGui.QProgressDialog(self) self.progress.setFont(prefs.diff_font()) self.progress.setRange(0, 0) self.progress.setCancelButton(None) self.progress.setWindowTitle(action) self.progress.setWindowModality(Qt.WindowModal) self.progress.setLabelText('Updating.. ') self.progress_thread = ProgressAnimationThread('Updating', self) self.local_label = QtGui.QLabel() self.local_label.setText(N_('Local Branch')) self.local_branch = QtGui.QLineEdit() self.local_branches = QtGui.QListWidget() self.local_branches.addItems(self.model.local_branches) self.remote_label = QtGui.QLabel() self.remote_label.setText(N_('Remote')) self.remote_name = QtGui.QLineEdit() self.remotes = QtGui.QListWidget() self.remotes.addItems(self.model.remotes) self.remote_branch_label = QtGui.QLabel() self.remote_branch_label.setText(N_('Remote Branch')) self.remote_branch = QtGui.QLineEdit() self.remote_branches = QtGui.QListWidget() self.remote_branches.addItems(self.model.remote_branches) self.ffwd_only_checkbox = QtGui.QCheckBox() self.ffwd_only_checkbox.setText(N_('Fast Forward Only ')) self.ffwd_only_checkbox.setChecked(True) self.tags_checkbox = QtGui.QCheckBox() self.tags_checkbox.setText(N_('Include tags ')) self.rebase_checkbox = QtGui.QCheckBox() self.rebase_checkbox.setText(N_('Rebase ')) self.action_button = QtGui.QPushButton() self.action_button.setText(N_(action)) self.action_button.setIcon(qtutils.ok_icon()) self.close_button = QtGui.QPushButton() self.close_button.setText(N_('Close')) self.close_button.setIcon(qtutils.close_icon()) self.local_branch_layout = QtGui.QHBoxLayout() self.local_branch_layout.addWidget(self.local_label) self.local_branch_layout.addWidget(self.local_branch) self.remote_branch_layout = QtGui.QHBoxLayout() self.remote_branch_layout.addWidget(self.remote_label) self.remote_branch_layout.addWidget(self.remote_name) self.remote_branches_layout = QtGui.QHBoxLayout() self.remote_branches_layout.addWidget(self.remote_branch_label) self.remote_branches_layout.addWidget(self.remote_branch) self.options_layout = QtGui.QHBoxLayout() self.options_layout.setSpacing(defs.button_spacing) self.options_layout.addStretch() self.options_layout.addWidget(self.ffwd_only_checkbox) self.options_layout.addWidget(self.tags_checkbox) self.options_layout.addWidget(self.rebase_checkbox) self.options_layout.addWidget(self.action_button) self.options_layout.addWidget(self.close_button) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addLayout(self.remote_branch_layout) self.main_layout.addWidget(self.remotes) if action == PUSH: self.main_layout.addLayout(self.local_branch_layout) self.main_layout.addWidget(self.local_branches) self.main_layout.addLayout(self.remote_branches_layout) self.main_layout.addWidget(self.remote_branches) else: # fetch and pull self.main_layout.addLayout(self.remote_branches_layout) self.main_layout.addWidget(self.remote_branches) self.main_layout.addLayout(self.local_branch_layout) self.main_layout.addWidget(self.local_branches) self.main_layout.addLayout(self.options_layout) self.setLayout(self.main_layout) remotes = self.model.remotes if 'origin' in remotes: idx = remotes.index('origin') if self.select_remote(idx): self.remote_name.setText('origin') else: if self.select_first_remote(): self.remote_name.setText(remotes[0]) # Trim the remote list to just the default remote self.update_remotes() self.set_field_defaults() # Setup signals and slots self.connect(self.remotes, SIGNAL('itemSelectionChanged()'), self.update_remotes) self.connect(self.local_branches, SIGNAL('itemSelectionChanged()'), self.update_local_branches) self.connect(self.remote_branches, SIGNAL('itemSelectionChanged()'), self.update_remote_branches) connect_button(self.action_button, self.action_callback) connect_button(self.close_button, self.reject) self.connect(self, SIGNAL('action_completed'), self.action_completed) self.connect(self.progress_thread, SIGNAL('str'), self.update_progress) if action == PULL: self.tags_checkbox.hide() self.ffwd_only_checkbox.hide() self.local_label.hide() self.local_branch.hide() self.local_branches.hide() self.remote_branch.setFocus() else: self.rebase_checkbox.hide() if not qtutils.apply_state(self): self.resize(666, 420) self.remote_name.setFocus()
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, model, action, parent): """Customizes the dialog based on the remote action """ standard.Dialog.__init__(self, parent=parent) self.model = model self.action = action self.tasks = [] self.filtered_remote_branches = [] self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.setWindowTitle(self.tr(action)) self.progress = QtGui.QProgressDialog(self) self.progress.setFont(prefs.diff_font()) self.progress.setRange(0, 0) self.progress.setCancelButton(None) self.progress.setWindowTitle(self.tr(action)) self.progress.setWindowModality(Qt.WindowModal) self.progress.setLabelText('Updating.. ') self.progress_thread = ProgressAnimationThread('Updating', self) self.local_label = QtGui.QLabel() self.local_label.setText(self.tr('Local Branch')) self.local_branch = QtGui.QLineEdit() self.local_branches = QtGui.QListWidget() self.local_branches.addItems(self.model.local_branches) self.remote_label = QtGui.QLabel() self.remote_label.setText(self.tr('Remote')) self.remote_name = QtGui.QLineEdit() self.remotes = QtGui.QListWidget() self.remotes.addItems(self.model.remotes) self.remote_branch_label = QtGui.QLabel() self.remote_branch_label.setText(self.tr('Remote Branch')) self.remote_branch = QtGui.QLineEdit() self.remote_branches = QtGui.QListWidget() self.remote_branches.addItems(self.model.remote_branches) self.ffwd_only_checkbox = QtGui.QCheckBox() self.ffwd_only_checkbox.setText(self.tr('Fast Forward Only ')) self.ffwd_only_checkbox.setChecked(True) self.tags_checkbox = QtGui.QCheckBox() self.tags_checkbox.setText(self.tr('Include tags ')) self.rebase_checkbox = QtGui.QCheckBox() self.rebase_checkbox.setText(self.tr('Rebase ')) self.action_button = QtGui.QPushButton() self.action_button.setText(self.tr(action)) self.action_button.setIcon(qtutils.ok_icon()) self.close_button = QtGui.QPushButton() self.close_button.setText(self.tr('Close')) self.close_button.setIcon(qtutils.close_icon()) self.local_branch_layout = QtGui.QHBoxLayout() self.local_branch_layout.addWidget(self.local_label) self.local_branch_layout.addWidget(self.local_branch) self.remote_branch_layout = QtGui.QHBoxLayout() self.remote_branch_layout.addWidget(self.remote_label) self.remote_branch_layout.addWidget(self.remote_name) self.remote_branches_layout = QtGui.QHBoxLayout() self.remote_branches_layout.addWidget(self.remote_branch_label) self.remote_branches_layout.addWidget(self.remote_branch) self.options_layout = QtGui.QHBoxLayout() self.options_layout.setSpacing(defs.button_spacing) self.options_layout.addStretch() self.options_layout.addWidget(self.ffwd_only_checkbox) self.options_layout.addWidget(self.tags_checkbox) self.options_layout.addWidget(self.rebase_checkbox) self.options_layout.addWidget(self.action_button) self.options_layout.addWidget(self.close_button) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(defs.margin) self.main_layout.setSpacing(defs.spacing) self.main_layout.addLayout(self.remote_branch_layout) self.main_layout.addWidget(self.remotes) if action == PUSH: self.main_layout.addLayout(self.local_branch_layout) self.main_layout.addWidget(self.local_branches) self.main_layout.addLayout(self.remote_branches_layout) self.main_layout.addWidget(self.remote_branches) else: # fetch and pull self.main_layout.addLayout(self.remote_branches_layout) self.main_layout.addWidget(self.remote_branches) self.main_layout.addLayout(self.local_branch_layout) self.main_layout.addWidget(self.local_branches) self.main_layout.addLayout(self.options_layout) self.setLayout(self.main_layout) remotes = self.model.remotes if 'origin' in remotes: idx = remotes.index('origin') if self.select_remote(idx): self.remote_name.setText('origin') else: if self.select_first_remote(): self.remote_name.setText(remotes[0]) # Trim the remote list to just the default remote self.update_remotes() self.set_field_defaults() # Setup signals and slots self.connect(self.remotes, SIGNAL('itemSelectionChanged()'), self.update_remotes) self.connect(self.local_branches, SIGNAL('itemSelectionChanged()'), self.update_local_branches) self.connect(self.remote_branches, SIGNAL('itemSelectionChanged()'), self.update_remote_branches) connect_button(self.action_button, self.action_callback) connect_button(self.close_button, self.reject) self.connect(self, SIGNAL('action_completed'), self.action_completed) self.connect(self.progress_thread, SIGNAL('str'), self.update_progress) if action == PULL: self.tags_checkbox.hide() self.ffwd_only_checkbox.hide() self.local_label.hide() self.local_branch.hide() self.local_branches.hide() self.remote_branch.setFocus() else: self.rebase_checkbox.hide() if not qtutils.apply_state(self): self.resize(666, 420) self.remote_name.setFocus()
def __init__(self, parent): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) hint = 'command-line arguments' self.input_txt = GrepLineEdit(hint, self) self.input_txt.enable_hint(True) hint = 'grep result...' self.result_txt = GrepTextView(hint, self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(self.tr('Edit')) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(self.tr('Refresh')) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(self.tr('Shell arguments')) self.shell_checkbox.setToolTip( 'Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".') self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(self.tr('Close')) self.input_layout = QtGui.QHBoxLayout() self.input_layout.setMargin(0) self.input_layout.setSpacing(defs.button_spacing) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.button_spacing) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.input_layout.addWidget(self.input_label) self.input_layout.addWidget(self.input_txt) self.bottom_layout.addWidget(self.edit_button) self.bottom_layout.addWidget(self.refresh_button) self.bottom_layout.addWidget(self.shell_checkbox) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.close_button) self.mainlayout.addLayout(self.input_layout) self.mainlayout.addWidget(self.result_txt) self.mainlayout.addLayout(self.bottom_layout) self.setLayout(self.mainlayout) self.grep_thread = GrepThread(self) self.connect(self.grep_thread, SIGNAL('result'), self.process_result) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), self.input_txt_changed) self.connect(self.input_txt, SIGNAL('returnPressed()'), lambda: self.result_txt.setFocus()) qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not qtutils.apply_state(self): self.resize(666, 420)
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)