def __init__(self, parent): super(RejectBrowser, self).__init__(parent) self.setFrameStyle(0) self.setReadOnly(True) self.setUtf8(True) self.installEventFilter(qscilib.KeyPressInterceptor(self)) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.menuRequested) self.setCaretLineVisible(False) self.setMarginType(1, qsci.SymbolMargin) self.setMarginLineNumbers(1, False) self.setMarginWidth(1, QFontMetrics(self.font()).width('XX')) self.setMarginSensitivity(1, True) self.addedMark = self.markerDefine(qsci.Plus, -1) self.removedMark = self.markerDefine(qsci.Minus, -1) self.addedColor = self.markerDefine(qsci.Background, -1) self.removedColor = self.markerDefine(qsci.Background, -1) self.setMarkerBackgroundColor(QColor('lightgreen'), self.addedColor) self.setMarkerBackgroundColor(QColor('cyan'), self.removedColor) mask = (1 << self.addedMark) | (1 << self.removedMark) | \ (1 << self.addedColor) | (1 << self.removedColor) self.setMarginMarkerMask(1, mask) lexer = lexers.difflexer(self) self.setLexer(lexer)
def __init__(self, logWindow, parent): super(Core, self).__init__(parent) self.thread = None self.extproc = None self.stbar = None self.queue = [] self.rawoutlines = [] self.display = None self.useproc = False if logWindow: self.outputLog = LogWidget() self.outputLog.installEventFilter( qscilib.KeyPressInterceptor(self)) self.output.connect(self.outputLog.appendLog)
def __init__(self, logWindow, parent): super(Core, self).__init__(parent) self._worker = None self.stbar = None self.queue = [] self.rawoutlines = [] self.display = None self.useproc = False if logWindow: # TODO: move logWindow back to cmdui from tortoisehg.hgqt import cmdui, qscilib self.outputLog = cmdui.LogWidget() self.outputLog.installEventFilter( qscilib.KeyPressInterceptor(self)) self.output.connect(self.outputLog.appendLog)
def __init__(self, repoagent, parent): super(CommitPage, self).__init__(repoagent, parent) self.commitComplete = False self.setTitle(_('Commit backout and merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) repo = repoagent.rawRepo() # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value if self.wizard() and self.wizard().parentbackout: return '%s (%s)' % (text, rev) else: return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) bkCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) bkCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(bkCsInfo) # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'backout/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts( [Qt.CTRL + Qt.Key_Return, Qt.CTRL + Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox( _('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('backout/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast) def eng_toggled(checked): if self.isComplete(): oldmsg = self.msgEntry.text() if self.wizard().backoutmergeparentrev: msgset = i18n.keepgettext()._( 'Backed out merge changeset: ') else: msgset = i18n.keepgettext()._('Backed out changeset: ') msg = checked and msgset['id'] or msgset['str'] if oldmsg and oldmsg != msg: if not qtlib.QuestionMsgBox( _('Confirm Discard Message'), _('Discard current backout message?'), parent=self): self.engChk.blockSignals(True) self.engChk.setChecked(not checked) self.engChk.blockSignals(False) return self.msgEntry.setText(msg + str(self.repo[self.wizard().backoutrev])) self.msgEntry.moveCursorToEnd() self.engChk = QCheckBox(_('Use English backout message')) self.engChk.toggled.connect(eng_toggled) engmsg = self.repo.ui.configbool('tortoisehg', 'engmsg', False) self.engChk.setChecked(engmsg) self.layout().addWidget(self.engChk)
def __init__(self, path, parent): super(RejectsDialog, self).__init__(parent) self.setWindowTitle(_('Merge rejected patch chunks into %s') % hglib.tounicode(path)) self.setWindowFlags(Qt.Window) self.path = path self.setLayout(QVBoxLayout()) editor = qscilib.Scintilla() editor.setBraceMatching(qsci.SloppyBraceMatch) editor.setFolding(qsci.BoxedTreeFoldStyle) editor.installEventFilter(qscilib.KeyPressInterceptor(self)) editor.setContextMenuPolicy(Qt.CustomContextMenu) editor.customContextMenuRequested.connect(self.menuRequested) self.baseLineColor = editor.markerDefine(qsci.Background, -1) editor.setMarkerBackgroundColor(QColor('lightblue'), self.baseLineColor) self.layout().addWidget(editor, 3) searchbar = qscilib.SearchToolBar(self, hidable=True) searchbar.searchRequested.connect(editor.find) searchbar.conditionChanged.connect(editor.highlightText) searchbar.hide() def showsearchbar(): searchbar.show() searchbar.setFocus(Qt.OtherFocusReason) qtlib.newshortcutsforstdkey(QKeySequence.Find, self, showsearchbar) self.layout().addWidget(searchbar) hbox = QHBoxLayout() hbox.setContentsMargins(2, 2, 2, 2) self.layout().addLayout(hbox, 1) self.chunklist = QListWidget(self) self.updating = True self.chunklist.currentRowChanged.connect(self.showChunk) hbox.addWidget(self.chunklist, 1) bvbox = QVBoxLayout() bvbox.setContentsMargins(2, 2, 2, 2) self.resolved = tb = QToolButton() tb.setIcon(qtlib.geticon('thg-success')) tb.setToolTip(_('Mark this chunk as resolved, goto next unresolved')) tb.pressed.connect(self.resolveCurrentChunk) self.unresolved = tb = QToolButton() tb.setIcon(qtlib.geticon('thg-warning')) tb.setToolTip(_('Mark this chunk as unresolved')) tb.pressed.connect(self.unresolveCurrentChunk) bvbox.addStretch(1) bvbox.addWidget(self.resolved, 0) bvbox.addWidget(self.unresolved, 0) bvbox.addStretch(1) hbox.addLayout(bvbox, 0) self.editor = editor self.rejectbrowser = RejectBrowser(self) hbox.addWidget(self.rejectbrowser, 5) BB = QDialogButtonBox bb = QDialogButtonBox(BB.Save|BB.Cancel) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) self.layout().addWidget(bb) self.saveButton = bb.button(BB.Save) s = QSettings() self.restoreGeometry(s.value('rejects/geometry').toByteArray()) self.editor.loadSettings(s, 'rejects/editor') self.rejectbrowser.loadSettings(s, 'rejects/rejbrowse') f = QFile(hglib.tounicode(path)) if not f.open(QIODevice.ReadOnly): qtlib.ErrorMsgBox(_('Unable to merge rejects'), _("Can't read this file (maybe deleted)")) self.hide() QTimer.singleShot(0, self.reject) return earlybytes = f.read(4096) if '\0' in earlybytes: qtlib.ErrorMsgBox(_('Unable to merge rejects'), _('This appears to be a binary file')) self.hide() QTimer.singleShot(0, self.reject) return f.seek(0) editor.read(f) editor.setModified(False) lexer = lexers.getlexer(ui.ui(), path, earlybytes, self) editor.setLexer(lexer) editor.setMarginLineNumbers(1, True) editor.setMarginWidth(1, str(editor.lines())+'X') buf = cStringIO.StringIO() try: buf.write('diff -r aaaaaaaaaaaa -r bbbbbbbbbbb %s\n' % path) buf.write(open(path + '.rej', 'rb').read()) buf.seek(0) except IOError, e: pass
def __init__(self, parent): QFrame.__init__(self, parent) self.curchunks = [] self.countselected = 0 self._ctx = None self._lastfile = None self._status = None vbox = QVBoxLayout() vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) self.setLayout(vbox) self.labelhbox = hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(2) self.layout().addLayout(hbox) self.filenamelabel = w = QLabel() self.filenamelabel.hide() hbox.addWidget(w) w.setWordWrap(True) f = w.textInteractionFlags() w.setTextInteractionFlags(f | Qt.TextSelectableByMouse) w.linkActivated.connect(self.linkActivated) self.searchbar = qscilib.SearchToolBar(hidable=True) self.searchbar.hide() self.searchbar.searchRequested.connect(self.find) self.searchbar.conditionChanged.connect(self.highlightText) guifont = qtlib.getfont('fontlist').font() self.sumlabel = QLabel() self.sumlabel.setFont(guifont) self.allbutton = QToolButton() self.allbutton.setFont(guifont) self.allbutton.setText(_('All', 'files')) self.allbutton.setShortcut(QKeySequence.SelectAll) self.allbutton.clicked.connect(self.selectAll) self.nonebutton = QToolButton() self.nonebutton.setFont(guifont) self.nonebutton.setText(_('None', 'files')) self.nonebutton.setShortcut(QKeySequence.New) self.nonebutton.clicked.connect(self.selectNone) self.actionFind = self.searchbar.toggleViewAction() self.actionFind.setIcon(qtlib.geticon('edit-find')) self.actionFind.setToolTip(_('Toggle display of text search bar')) qtlib.newshortcutsforstdkey(QKeySequence.Find, self, self.searchbar.show) self.diffToolbar = QToolBar(_('Diff Toolbar')) self.diffToolbar.setIconSize(QSize(16, 16)) self.diffToolbar.setStyleSheet(qtlib.tbstylesheet) self.diffToolbar.addAction(self.actionFind) hbox.addWidget(self.diffToolbar) hbox.addStretch(1) hbox.addWidget(self.sumlabel) hbox.addWidget(self.allbutton) hbox.addWidget(self.nonebutton) self.extralabel = w = QLabel() w.setWordWrap(True) w.linkActivated.connect(self.linkActivated) self.layout().addWidget(w) self.layout().addSpacing(2) w.hide() self._forceviewindicator = None self.sci = qscilib.Scintilla(self) self.sci.setReadOnly(True) self.sci.setUtf8(True) self.sci.installEventFilter(qscilib.KeyPressInterceptor(self)) self.sci.setContextMenuPolicy(Qt.CustomContextMenu) self.sci.customContextMenuRequested.connect(self.menuRequested) self.sci.setCaretLineVisible(False) self.sci.setMarginType(1, qsci.SymbolMargin) self.sci.setMarginLineNumbers(1, False) self.sci.setMarginWidth(1, QFontMetrics(self.font()).width('XX')) self.sci.setMarginSensitivity(1, True) self.sci.marginClicked.connect(self.marginClicked) self._checkedpix = qtlib.getcheckboxpixmap(QStyle.State_On, Qt.gray, self) self.selected = self.sci.markerDefine(self._checkedpix, -1) self._uncheckedpix = qtlib.getcheckboxpixmap(QStyle.State_Off, Qt.gray, self) self.unselected = self.sci.markerDefine(self._uncheckedpix, -1) self.vertical = self.sci.markerDefine(qsci.VerticalLine, -1) self.divider = self.sci.markerDefine(qsci.Background, -1) self.selcolor = self.sci.markerDefine(qsci.Background, -1) self.sci.setMarkerBackgroundColor(QColor('#BBFFFF'), self.selcolor) self.sci.setMarkerBackgroundColor(QColor('#AAAAAA'), self.divider) mask = (1 << self.selected) | (1 << self.unselected) | \ (1 << self.vertical) | (1 << self.selcolor) | (1 << self.divider) self.sci.setMarginMarkerMask(1, mask) self.blksearch = blockmatcher.BlockList(self) self.blksearch.linkScrollBar(self.sci.verticalScrollBar()) self.blksearch.setVisible(False) hbox = QHBoxLayout() hbox.addWidget(self.sci) hbox.addWidget(self.blksearch) lexer = lexers.difflexer(self) self.sci.setLexer(lexer) self.layout().addLayout(hbox) self.layout().addWidget(self.searchbar) self.clearDisplay()
def __init__(self, repo, parent): QFrame.__init__(self, parent) framelayout = QVBoxLayout(self) framelayout.setContentsMargins(0, 0, 0, 0) l = QHBoxLayout() l.setContentsMargins(0, 0, 0, 0) l.setSpacing(0) self.repo = repo self._diffs = [] self.topLayout = QVBoxLayout() self.labelhbox = hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(2) self.topLayout.addLayout(hbox) self.diffToolbar = QToolBar(_('Diff Toolbar')) self.diffToolbar.setIconSize(QSize(16, 16)) self.diffToolbar.setStyleSheet(qtlib.tbstylesheet) hbox.addWidget(self.diffToolbar) self.filenamelabel = w = QLabel() w.setWordWrap(True) f = w.textInteractionFlags() w.setTextInteractionFlags(f | Qt.TextSelectableByMouse) w.linkActivated.connect(self.linkActivated) hbox.addWidget(w, 1) self.extralabel = w = QLabel() w.setWordWrap(True) w.linkActivated.connect(self.linkActivated) self.topLayout.addWidget(w) w.hide() framelayout.addLayout(self.topLayout) framelayout.addLayout(l, 1) hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(0) l.addLayout(hbox) self.blk = blockmatcher.BlockList(self) self.sci = AnnotateView(repo, self) hbox.addWidget(self.blk) hbox.addWidget(self.sci, 1) self.sci.showMessage.connect(self.showMessage) self.sci.setAnnotationEnabled(False) self.sci.setContextMenuPolicy(Qt.CustomContextMenu) self.sci.customContextMenuRequested.connect(self.menuRequest) self.blk.linkScrollBar(self.sci.verticalScrollBar()) self.blk.setVisible(False) self.sci.setReadOnly(True) self.sci.setUtf8(True) self.sci.installEventFilter(qscilib.KeyPressInterceptor(self)) self.sci.setCaretLineVisible(False) # define markers for colorize zones of diff self.markerplus = self.sci.markerDefine(qsci.Background) self.markerminus = self.sci.markerDefine(qsci.Background) self.markertriangle = self.sci.markerDefine(qsci.Background) self.sci.setMarkerBackgroundColor(QColor('#B0FFA0'), self.markerplus) self.sci.setMarkerBackgroundColor(QColor('#A0A0FF'), self.markerminus) self.sci.setMarkerBackgroundColor(QColor('#FFA0A0'), self.markertriangle) # hide margin 0 (markers) self.sci.setMarginType(0, qsci.SymbolMargin) self.sci.setMarginWidth(0, 0) self.searchbar = qscilib.SearchToolBar(hidable=True) self.searchbar.hide() self.searchbar.searchRequested.connect(self.find) self.searchbar.conditionChanged.connect(self.highlightText) self.layout().addWidget(self.searchbar) self._ctx = None self._filename = None self._status = None self._mode = None self._parent = 0 self._lostMode = None self._lastSearch = u'', False self.actionDiffMode = QAction(qtlib.geticon('view-diff'), _('View change as unified diff output'), self) self.actionDiffMode.setCheckable(True) self.actionDiffMode._mode = DiffMode self.actionFileMode = QAction(qtlib.geticon('view-file'), _('View change in context of file'), self) self.actionFileMode.setCheckable(True) self.actionFileMode._mode = FileMode self.actionAnnMode = QAction(qtlib.geticon('view-annotate'), _('annotate with revision numbers'), self) self.actionAnnMode.setCheckable(True) self.actionAnnMode._mode = AnnMode self.modeToggleGroup = QActionGroup(self) self.modeToggleGroup.addAction(self.actionDiffMode) self.modeToggleGroup.addAction(self.actionFileMode) self.modeToggleGroup.addAction(self.actionAnnMode) self.modeToggleGroup.triggered.connect(self.setMode) # Next/Prev diff (in full file mode) self.actionNextDiff = QAction(qtlib.geticon('go-down'), _('Next diff (alt+down)'), self) self.actionNextDiff.setShortcut('Alt+Down') self.actionNextDiff.triggered.connect(self.nextDiff) self.actionPrevDiff = QAction(qtlib.geticon('go-up'), _('Previous diff (alt+up)'), self) self.actionPrevDiff.setShortcut('Alt+Up') self.actionPrevDiff.triggered.connect(self.prevDiff) self.setMode(self.actionDiffMode) self.actionFirstParent = QAction('1', self) self.actionFirstParent.setCheckable(True) self.actionFirstParent.setChecked(True) self.actionFirstParent.setShortcut('CTRL+1') self.actionFirstParent.setToolTip(_('Show changes from first parent')) self.actionSecondParent = QAction('2', self) self.actionSecondParent.setCheckable(True) self.actionSecondParent.setShortcut('CTRL+2') self.actionSecondParent.setToolTip( _('Show changes from second parent')) self.parentToggleGroup = QActionGroup(self) self.parentToggleGroup.addAction(self.actionFirstParent) self.parentToggleGroup.addAction(self.actionSecondParent) self.parentToggleGroup.triggered.connect(self.setParent) self.actionFind = self.searchbar.toggleViewAction() self.actionFind.setIcon(qtlib.geticon('edit-find')) self.actionFind.setToolTip(_('Toggle display of text search bar')) qtlib.newshortcutsforstdkey(QKeySequence.Find, self, self.searchbar.show) self.actionShelf = QAction('Shelve', self) self.actionShelf.setIcon(qtlib.geticon('shelve')) self.actionShelf.setToolTip(_('Open shelve tool')) self.actionShelf.triggered.connect(self.launchShelve) tb = self.diffToolbar tb.addAction(self.actionFirstParent) tb.addAction(self.actionSecondParent) tb.addSeparator() tb.addAction(self.actionDiffMode) tb.addAction(self.actionFileMode) tb.addAction(self.actionAnnMode) tb.addSeparator() tb.addAction(self.actionNextDiff) tb.addAction(self.actionPrevDiff) tb.addSeparator() tb.addAction(self.actionFind) tb.addAction(self.actionShelf) self.timer = QTimer() self.timer.setSingleShot(False) self.timer.timeout.connect(self.timerBuildDiffMarkers)
def __init__(self, repoagent, parent, **opts): QWidget.__init__(self, parent) self._repoagent = repoagent repo = repoagent.rawRepo() self.opts = opts self.refreshing = False self.finishfunc = None layout = QVBoxLayout() layout.setSpacing(4) self.setLayout(layout) b = QPushButton(_('QRefresh')) f = b.font() f.setWeight(QFont.Bold) b.setFont(f) self.qnewOrRefreshBtn = b self.qqueueBtn = QPushButton(_('Queues')) # top toolbar tbarhbox = QHBoxLayout() tbarhbox.setSpacing(5) self.layout().addLayout(tbarhbox, 0) self.revisionOrCommitBtn = QPushButton() self.queueCombo = QComboBox() self.queueCombo.activated['QString'].connect(self.qqueueActivate) self.optionsBtn = QPushButton(_('Options')) self.msgSelectCombo = PatchMessageCombo(self) tbarhbox.addWidget(self.revisionOrCommitBtn) tbarhbox.addWidget(self.queueCombo) tbarhbox.addWidget(self.optionsBtn) tbarhbox.addWidget(self.qqueueBtn) tbarhbox.addWidget(self.msgSelectCombo, 1) tbarhbox.addWidget(self.qnewOrRefreshBtn) # main area consists of a two-way horizontal splitter self.splitter = splitter = QSplitter() self.layout().addWidget(splitter, 1) splitter.setOrientation(Qt.Horizontal) splitter.setChildrenCollapsible(True) splitter.setObjectName('splitter') self.filesFrame = QFrame(splitter) # Files Frame layout = QVBoxLayout() layout.setSpacing(5) layout.setContentsMargins(0, 0, 0, 0) self.filesFrame.setLayout(layout) mtbarhbox = QHBoxLayout() mtbarhbox.setSpacing(8) layout.addLayout(mtbarhbox, 0) mtbarhbox.setContentsMargins(0, 0, 0, 0) self.newCheckBox = QCheckBox(_('New Patch')) self.patchNameLE = mqutil.getPatchNameLineEdit() mtbarhbox.addWidget(self.newCheckBox) mtbarhbox.addWidget(self.patchNameLE, 1) self.messageEditor = messageentry.MessageEntry(self) self.messageEditor.installEventFilter( qscilib.KeyPressInterceptor(self)) self.messageEditor.refresh(repo) self.stwidget = status.StatusWidget(repoagent, None, opts, self) self.stwidget.runCustomCommandRequested.connect( self.runCustomCommandRequested) self.fileview = self.stwidget.fileview self.fileview.showMessage.connect(self.showMessage) self.fileview.setContext(repo[None]) self.fileview.shelveToolExited.connect(self.reload) layout.addWidget(self.stwidget) # Message and diff vb2 = QVBoxLayout() vb2.setSpacing(0) vb2.setContentsMargins(0, 0, 0, 0) w = QWidget() w.setLayout(vb2) splitter.addWidget(w) self.vsplitter = vsplitter = QSplitter() vsplitter.setOrientation(Qt.Vertical) vb2.addWidget(vsplitter) vsplitter.addWidget(self.messageEditor) vsplitter.addWidget(self.stwidget.docf) # Command runner and connections... self.cmd = cmdui.Runner(not parent, self) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.progress.connect(self.progress) self.cmd.commandFinished.connect(self.onCommandFinished) self.qqueueBtn.clicked.connect(self.launchQQueueTool) self.optionsBtn.clicked.connect(self.launchOptionsDialog) self.revisionOrCommitBtn.clicked.connect(self.qinitOrCommit) self.msgSelectCombo.activated.connect(self.onMessageSelected) self.newCheckBox.toggled.connect(self.onNewModeToggled) self.qnewOrRefreshBtn.clicked.connect(self.onQNewOrQRefresh) QShortcut(QKeySequence('Ctrl+Return'), self, self.onQNewOrQRefresh) QShortcut(QKeySequence('Ctrl+Enter'), self, self.onQNewOrQRefresh) self._repoagent.configChanged.connect(self.onConfigChanged) self._repoagent.repositoryChanged.connect(self.reload) self.setAcceptDrops(True) if parent: self.layout().setContentsMargins(2, 2, 2, 2) else: self.layout().setContentsMargins(0, 0, 0, 0) self.setWindowTitle(_('TortoiseHg Patch Queue')) self.statusbar = cmdui.ThgStatusBar(self) self.layout().addWidget(self.statusbar) self.progress.connect(self.statusbar.progress) self.showMessage.connect(self.statusbar.showMessage) qtlib.newshortcutsforstdkey(QKeySequence.Refresh, self, self.reload) self.resize(850, 550) self.loadConfigs() QTimer.singleShot(0, self.reload)
def __init__(self, repoagent, patches, parent): super(QFoldDialog, self).__init__(parent) self._repoagent = repoagent repo = repoagent.rawRepo() self.setWindowTitle(_('Patch fold - %s') % repo.displayname) self.setWindowIcon(qtlib.geticon('hg-qfold')) f = self.windowFlags() self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint | Qt.WindowMaximizeButtonHint) self.setLayout(QVBoxLayout()) mlbl = QLabel(_('New patch message:')) self.layout().addWidget(mlbl) self.msgte = messageentry.MessageEntry(self) self.msgte.installEventFilter(qscilib.KeyPressInterceptor(self)) self.layout().addWidget(self.msgte) self.keepchk = QCheckBox(_('Keep patch files')) self.keepchk.setChecked(True) self.layout().addWidget(self.keepchk) q = self.repo.mq q.parseseries() self.patches = [p for p in q.series if p in patches] class PatchListWidget(QListWidget): def __init__(self, parent): QListWidget.__init__(self, parent) self.setCurrentRow(0) def focusInEvent(self, event): i = self.item(self.currentRow()) if i: self.parent().parent().showSummary(i) QListWidget.focusInEvent(self, event) def dropEvent(self, event): QListWidget.dropEvent(self, event) spp = self.parent().parent() spp.msgte.setText(spp.composeMsg(self.getPatchList())) def getPatchList(self): return [hglib.fromunicode(self.item(i).text()) \ for i in xrange(0, self.count())] ugb = QGroupBox(_('Patches to fold')) ugb.setLayout(QVBoxLayout()) ugb.layout().setContentsMargins(*(0, ) * 4) self.ulw = PatchListWidget(self) self.ulw.setDragDropMode(QListView.InternalMove) ugb.layout().addWidget(self.ulw) self.ulw.currentItemChanged.connect( lambda: self.showSummary(self.ulw.item(self.ulw.currentRow()))) self.layout().addWidget(ugb) for p in self.patches: item = QListWidgetItem(hglib.tounicode(p)) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled) self.ulw.addItem(item) slbl = QLabel(_('Summary:')) self.layout().addWidget(slbl) self.summ = QTextEdit() self.summ.setFont(qtlib.getfont('fontcomment').font()) self.summ.setMaximumHeight(80) self.summ.setReadOnly(True) self.summ.setFocusPolicy(Qt.NoFocus) self.layout().addWidget(self.summ) self.cmd = cmdui.Runner(False, self) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) BB = QDialogButtonBox bbox = QDialogButtonBox(BB.Ok | BB.Cancel) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) self.layout().addWidget(bbox) self.bbox = bbox self._repoagent.configChanged.connect(self.configChanged) self._readsettings() self.msgte.setText(self.composeMsg(self.patches)) self.msgte.refresh(self.repo)
def __init__(self, repoagent, parent): super(CommitPage, self).__init__(repoagent, parent) self.setTitle(_('Commit merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) repo = repoagent.rawRepo() # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) mergeCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) mergeCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(mergeCsInfo) self.mergeCsInfo = mergeCsInfo # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'merge/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) self.delayednext = False def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts( [Qt.CTRL + Qt.Key_Return, Qt.CTRL + Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox( _('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('merge/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast) hblayout = QHBoxLayout() self.opts = commit.readrepoopts(self.repo) self.optionsbtn = QPushButton(_('Commit Options')) self.optionsbtn.clicked.connect(self.details) hblayout.addWidget(self.optionsbtn) self.optionslabelfmt = _('<b>Selected Options:</b> %s') self.optionslabel = QLabel('') hblayout.addWidget(self.optionslabel) hblayout.addStretch() self.layout().addLayout(hblayout) self.setButtonText(QWizard.CommitButton, _('Commit Now')) # The cancel button does not really "cancel" the merge self.setButtonText(QWizard.CancelButton, _('Commit Later')) # Update the options label self.refresh()
def __init__(self, repoagent, parent): QFrame.__init__(self, parent) framelayout = QVBoxLayout(self) framelayout.setContentsMargins(0,0,0,0) l = QHBoxLayout() l.setContentsMargins(0,0,0,0) l.setSpacing(0) self._repoagent = repoagent repo = repoagent.rawRepo() # TODO: replace by repoagent if setRepo(bundlerepo) can be removed self.repo = repo self._diffs = [] self.changes = None self.changeselection = False self.chunkatline = {} self.excludemsg = _(' (excluded from the next commit)') self.topLayout = QVBoxLayout() self.labelhbox = hbox = QHBoxLayout() hbox.setContentsMargins(0,0,0,0) hbox.setSpacing(2) self.topLayout.addLayout(hbox) self.diffToolbar = QToolBar(_('Diff Toolbar')) self.diffToolbar.setIconSize(QSize(16,16)) self.diffToolbar.setStyleSheet(qtlib.tbstylesheet) hbox.addWidget(self.diffToolbar) self.filenamelabel = w = QLabel() w.setWordWrap(True) f = w.textInteractionFlags() w.setTextInteractionFlags(f | Qt.TextSelectableByMouse) w.linkActivated.connect(self.linkActivated) hbox.addWidget(w, 1) self.extralabel = w = QLabel() w.setWordWrap(True) w.linkActivated.connect(self.linkActivated) self.topLayout.addWidget(w) w.hide() framelayout.addLayout(self.topLayout) framelayout.addLayout(l, 1) hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(0) l.addLayout(hbox) self.blk = blockmatcher.BlockList(self) self.blksearch = blockmatcher.BlockList(self) self.sci = AnnotateView(repoagent, self) self._forceviewindicator = None hbox.addWidget(self.blk) hbox.addWidget(self.sci, 1) hbox.addWidget(self.blksearch) self.sci.showMessage.connect(self.showMessage) self.sci.setAnnotationEnabled(False) self.sci.setContextMenuPolicy(Qt.CustomContextMenu) self.sci.customContextMenuRequested.connect(self.menuRequest) self.annmarginclicked = False self.sci.marginClicked.connect(self.marginClicked) self.blk.linkScrollBar(self.sci.verticalScrollBar()) self.blk.setVisible(False) self.blksearch.linkScrollBar(self.sci.verticalScrollBar()) self.blksearch.setVisible(False) self.sci.setReadOnly(True) self.sci.setUtf8(True) keys = set((Qt.Key_Space,)) self.sci.installEventFilter(qscilib.KeyPressInterceptor(self, keys)) self.sci.setCaretLineVisible(False) # define markers for colorize zones of diff self.markerplus = self.sci.markerDefine(qsci.Background) self.markerminus = self.sci.markerDefine(qsci.Background) self.markertriangle = self.sci.markerDefine(qsci.Background) self.sci.setMarkerBackgroundColor(QColor('#B0FFA0'), self.markerplus) self.sci.setMarkerBackgroundColor(QColor('#A0A0FF'), self.markerminus) self.sci.setMarkerBackgroundColor(QColor('#FFA0A0'), self.markertriangle) self._checkedpix = qtlib.getcheckboxpixmap(QStyle.State_On, QColor('#B0FFA0'), self) self.inclmarker = self.sci.markerDefine(self._checkedpix, -1) self._uncheckedpix = qtlib.getcheckboxpixmap(QStyle.State_Off, QColor('#B0FFA0'), self) self.exclmarker = self.sci.markerDefine(self._uncheckedpix, -1) self.exclcolor = self.sci.markerDefine(qsci.Background, -1) self.sci.setMarkerBackgroundColor(QColor('lightgrey'), self.exclcolor) self.sci.setMarkerForegroundColor(QColor('darkgrey'), self.exclcolor) mask = (1 << self.inclmarker) | (1 << self.exclmarker) | \ (1 << self.exclcolor) self.sci.setMarginType(4, qsci.SymbolMargin) self.sci.setMarginMarkerMask(4, mask) self.markexcluded = QSettings().value('changes-mark-excluded').toBool() self.excludeindicator = -1 self.updateChunkIndicatorMarks() self.sci.setIndicatorDrawUnder(True, self.excludeindicator) self.sci.setIndicatorForegroundColor(QColor('gray'), self.excludeindicator) # hide margin 0 (markers) self.sci.setMarginType(0, qsci.SymbolMargin) self.sci.setMarginWidth(0, 0) self.searchbar = qscilib.SearchToolBar(hidable=True) self.searchbar.hide() self.searchbar.searchRequested.connect(self.find) self.searchbar.conditionChanged.connect(self.highlightText) self.layout().addWidget(self.searchbar) self._ctx = None self._filename = None self._status = None self._mode = None self._parent = 0 self._lostMode = None self._lastSearch = u'', False self.actionDiffMode = QAction(qtlib.geticon('view-diff'), _('View change as unified diff output'), self) self.actionDiffMode.setCheckable(True) self.actionDiffMode._mode = DiffMode self.actionFileMode = QAction(qtlib.geticon('view-file'), _('View change in context of file'), self) self.actionFileMode.setCheckable(True) self.actionFileMode._mode = FileMode self.actionAnnMode = QAction(qtlib.geticon('view-annotate'), _('annotate with revision numbers'), self) self.actionAnnMode.setCheckable(True) self.actionAnnMode._mode = AnnMode self.modeToggleGroup = QActionGroup(self) self.modeToggleGroup.addAction(self.actionDiffMode) self.modeToggleGroup.addAction(self.actionFileMode) self.modeToggleGroup.addAction(self.actionAnnMode) self.modeToggleGroup.triggered.connect(self._setModeByAction) # Next/Prev diff (in full file mode) self.actionNextDiff = QAction(qtlib.geticon('go-down'), _('Next diff (alt+down)'), self) self.actionNextDiff.setShortcut('Alt+Down') self.actionNextDiff.triggered.connect(self.nextDiff) self.actionPrevDiff = QAction(qtlib.geticon('go-up'), _('Previous diff (alt+up)'), self) self.actionPrevDiff.setShortcut('Alt+Up') self.actionPrevDiff.triggered.connect(self.prevDiff) self._setModeByAction(self.actionDiffMode) self.actionFirstParent = QAction('1', self) self.actionFirstParent.setCheckable(True) self.actionFirstParent.setChecked(True) self.actionFirstParent.setShortcut('CTRL+1') self.actionFirstParent.setToolTip(_('Show changes from first parent')) self.actionSecondParent = QAction('2', self) self.actionSecondParent.setCheckable(True) self.actionSecondParent.setShortcut('CTRL+2') self.actionSecondParent.setToolTip(_('Show changes from second parent')) self.parentToggleGroup = QActionGroup(self) self.parentToggleGroup.addAction(self.actionFirstParent) self.parentToggleGroup.addAction(self.actionSecondParent) self.parentToggleGroup.triggered.connect(self.setParent) self.actionFind = self.searchbar.toggleViewAction() self.actionFind.setIcon(qtlib.geticon('edit-find')) self.actionFind.setToolTip(_('Toggle display of text search bar')) self.actionFind.triggered.connect(self.searchbarTriggered) qtlib.newshortcutsforstdkey(QKeySequence.Find, self, self.showsearchbar) self.actionShelf = QAction('Shelve', self) self.actionShelf.setIcon(qtlib.geticon('shelve')) self.actionShelf.setToolTip(_('Open shelve tool')) self.actionShelf.triggered.connect(self.launchShelve) tb = self.diffToolbar tb.addAction(self.actionFirstParent) tb.addAction(self.actionSecondParent) tb.addSeparator() tb.addAction(self.actionDiffMode) tb.addAction(self.actionFileMode) tb.addAction(self.actionAnnMode) tb.addSeparator() tb.addAction(self.actionNextDiff) tb.addAction(self.actionPrevDiff) tb.addSeparator() tb.addAction(self.actionFind) tb.addAction(self.actionShelf) self.timer = QTimer(self) self.timer.setSingleShot(False) self.timer.timeout.connect(self.timerBuildDiffMarkers)
def __init__(self, parent): QFrame.__init__(self, parent) self.curchunks = [] self.countselected = 0 self._ctx = None self._lastfile = None vbox = QVBoxLayout() vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) self.setLayout(vbox) self.labelhbox = hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.setSpacing(2) self.layout().addLayout(hbox) self.filenamelabel = w = QLabel() self.filenamelabel.hide() hbox.addWidget(w) w.setWordWrap(True) f = w.textInteractionFlags() w.setTextInteractionFlags(f | Qt.TextSelectableByMouse) w.linkActivated.connect(self.linkActivated) guifont = qtlib.getfont('fontlist').font() self.sumlabel = QLabel() self.sumlabel.setFont(guifont) self.allbutton = QToolButton() self.allbutton.setFont(guifont) self.allbutton.setText(_('All', 'files')) self.allbutton.setShortcut(QKeySequence.SelectAll) self.allbutton.clicked.connect(self.selectAll) self.nonebutton = QToolButton() self.nonebutton.setFont(guifont) self.nonebutton.setText(_('None', 'files')) self.nonebutton.setShortcut(QKeySequence.New) self.nonebutton.clicked.connect(self.selectNone) hbox.addStretch(1) hbox.addWidget(self.sumlabel) hbox.addWidget(self.allbutton) hbox.addWidget(self.nonebutton) self.extralabel = w = QLabel() w.setWordWrap(True) w.linkActivated.connect(self.linkActivated) self.layout().addWidget(w) self.layout().addSpacing(2) w.hide() self.sci = qscilib.Scintilla(self) self.sci.setReadOnly(True) self.sci.setUtf8(True) self.sci.installEventFilter(qscilib.KeyPressInterceptor(self)) self.sci.setContextMenuPolicy(Qt.CustomContextMenu) self.sci.customContextMenuRequested.connect(self.menuRequested) self.sci.setCaretLineVisible(False) self.sci.setMarginType(1, qsci.SymbolMargin) self.sci.setMarginLineNumbers(1, False) self.sci.setMarginWidth(1, QFontMetrics(self.font()).width('XX')) self.sci.setMarginSensitivity(1, True) self.sci.marginClicked.connect(self.marginClicked) self.selected = self.sci.markerDefine(qsci.Plus, -1) self.unselected = self.sci.markerDefine(qsci.Minus, -1) self.vertical = self.sci.markerDefine(qsci.VerticalLine, -1) self.divider = self.sci.markerDefine(qsci.Background, -1) self.selcolor = self.sci.markerDefine(qsci.Background, -1) self.sci.setMarkerBackgroundColor(QColor('#BBFFFF'), self.selcolor) self.sci.setMarkerBackgroundColor(QColor('#AAAAAA'), self.divider) mask = (1 << self.selected) | (1 << self.unselected) | \ (1 << self.vertical) | (1 << self.selcolor) | (1 << self.divider) self.sci.setMarginMarkerMask(1, mask) self.layout().addWidget(self.sci, 1) lexer = lexers.get_diff_lexer(self) self.sci.setLexer(lexer) self.clearDisplay()