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, 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, **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, 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()