def getlog(self, ctx, gnode): if ctx.rev() is None: msg = None if self.unicodestar: # The Unicode symbol is a black star: msg = u'\u2605 ' + _('Working Directory') + u' \u2605' else: msg = '*** ' + _('Working Directory') + ' ***' for pctx in ctx.parents(): if self.repo._branchheads and pctx.node() not in self.repo._branchheads: text = _('Not a head revision!') msg += " " + qtlib.markup(text, fg='red', weight='bold') return msg msg = ctx.longsummary() if ctx.thgmqunappliedpatch(): effects = qtlib.geteffect('log.unapplied_patch') text = qtlib.applyeffects(' %s ' % ctx._patchname, effects) # qtlib.markup(msg, fg=UNAPPLIED_PATCH_COLOR) msg = qtlib.markup(msg) return hglib.tounicode(text + ' ') + msg if ctx.hidden(): return qtlib.markup(msg, fg=HIDDENREV_COLOR) parts = [] if ctx.thgbranchhead(): branchu = hglib.tounicode(ctx.branch()) effects = qtlib.geteffect('log.branch') parts.append(qtlib.applyeffects(u' %s ' % branchu, effects)) for mark in ctx.bookmarks(): style = 'log.bookmark' if mark == self.repo._bookmarkcurrent: bn = self.repo._bookmarks[self.repo._bookmarkcurrent] if bn in self.repo.dirstate.parents(): style = 'log.curbookmark' marku = hglib.tounicode(mark) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u' %s ' % marku, effects)) for tag in ctx.thgtags(): if self.repo.thgmqtag(tag): style = 'log.patch' else: style = 'log.tag' tagu = hglib.tounicode(tag) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u' %s ' % tagu, effects)) if msg: if ctx.thgwdparent(): msg = qtlib.markup(msg, weight='bold') else: msg = qtlib.markup(msg) parts.append(hglib.tounicode(msg)) return ' '.join(parts)
def getlog(self, ctx, gnode): if ctx.rev() is None: msg = None if self.unicodestar: # The Unicode symbol is a black star: msg = u'\u2605 ' + _('Working Directory') + u' \u2605' else: msg = '*** ' + _('Working Directory') + ' ***' for pctx in ctx.parents(): if self.repo._branchheads and pctx.node( ) not in self.repo._branchheads: text = _('Not a head revision!') msg += " " + qtlib.markup(text, fg='red', weight='bold') return msg msg = ctx.longsummary() if ctx.thgmqunappliedpatch(): effects = qtlib.geteffect('log.unapplied_patch') text = qtlib.applyeffects(' %s ' % ctx._patchname, effects) # qtlib.markup(msg, fg=UNAPPLIED_PATCH_COLOR) msg = qtlib.markup(msg) return hglib.tounicode(text + ' ') + msg parts = [] if ctx.thgbranchhead(): branchu = hglib.tounicode(ctx.branch()) effects = qtlib.geteffect('log.branch') parts.append(qtlib.applyeffects(u' %s ' % branchu, effects)) for mark in ctx.bookmarks(): style = 'log.bookmark' if mark == self.repo._bookmarkcurrent: bn = self.repo._bookmarks[self.repo._bookmarkcurrent] if bn in self.repo.dirstate.parents(): style = 'log.curbookmark' marku = hglib.tounicode(mark) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u' %s ' % marku, effects)) for tag in ctx.thgtags(): if self.repo.thgmqtag(tag): style = 'log.patch' else: style = 'log.tag' tagu = hglib.tounicode(tag) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u' %s ' % tagu, effects)) if msg: if ctx.thgwdparent(): msg = qtlib.markup(msg, weight='bold') else: msg = qtlib.markup(msg) parts.append(hglib.tounicode(msg)) return ' '.join(parts)
def getlog(self, ctx, gnode): if ctx.rev() is None: msg = None if self.unicodestar: # The Unicode symbol is a black star: msg = u"\u2605 " + _("Working Directory") + u" \u2605" else: msg = "*** " + _("Working Directory") + " ***" for pctx in ctx.parents(): if self.repo._branchheads and pctx.node() not in self.repo._branchheads: text = _("Not a head revision!") msg += " " + qtlib.markup(text, fg="red", weight="bold") return msg msg = ctx.longsummary() if ctx.thgmqunappliedpatch(): effects = qtlib.geteffect("log.unapplied_patch") text = qtlib.applyeffects(" %s " % ctx._patchname, effects) # qtlib.markup(msg, fg=UNAPPLIED_PATCH_COLOR) msg = qtlib.markup(msg) return hglib.tounicode(text + " ") + msg parts = [] if ctx.thgbranchhead(): branchu = hglib.tounicode(ctx.branch()) effects = qtlib.geteffect("log.branch") parts.append(qtlib.applyeffects(u" %s " % branchu, effects)) for mark in ctx.bookmarks(): style = "log.bookmark" if mark == self.repo._bookmarkcurrent: bn = self.repo._bookmarks[self.repo._bookmarkcurrent] if bn in self.repo.dirstate.parents(): style = "log.curbookmark" marku = hglib.tounicode(mark) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u" %s " % marku, effects)) for tag in ctx.thgtags(): if self.repo.thgmqtag(tag): style = "log.patch" else: style = "log.tag" tagu = hglib.tounicode(tag) effects = qtlib.geteffect(style) parts.append(qtlib.applyeffects(u" %s " % tagu, effects)) if msg: if ctx.thgwdparent(): msg = qtlib.markup(msg, weight="bold") else: msg = qtlib.markup(msg) parts.append(hglib.tounicode(msg)) return " ".join(parts)
def cfg_lexer(self, lexer): for label, i in (('diff.inserted', 6), ('diff.deleted', 5), ('diff.hunk', 4)): effect = qtlib.geteffect(label) for e in effect.split(';'): if e.startswith('color:'): lexer.setColor(QtGui.QColor(e[7:]), i) if e.startswith('background-color:'): lexer.setEolFill(True, i) lexer.setPaper(QtGui.QColor(e[18:]), i) font = qtlib.getfont('fontdiff').font() lexer.setFont(font, -1) return lexer
def cfg_lexer(self, lexer): for label, i in (('diff.inserted', 6), ('diff.deleted', 5), ('diff.hunk', 4)): effect = qtlib.geteffect(label) for e in effect.split(';'): if e.startswith('color:'): lexer.setColor(QtGui.QColor(e[7:]), i) if e.startswith('background-color:'): lexer.setEolFill(True, i) lexer.setPaper(QtGui.QColor(e[18:]), i) font = qtlib.getfont('fontdiff').font() lexer.setFont(font, -1) return lexer
def __init__(self, repoagent, pats, opts, parent=None, checkable=True, defcheck='commit'): QWidget.__init__(self, parent) self.opts = dict(modified=True, added=True, removed=True, deleted=True, unknown=True, clean=False, ignored=False, subrepo=True) self.opts.update(opts) self._repoagent = repoagent self.pats = pats self.checkable = checkable self.defcheck = defcheck self.pctx = None self.savechecks = True self.refthread = None self.refreshWctxLater = QTimer(self, interval=10, singleShot=True) self.refreshWctxLater.timeout.connect(self.refreshWctx) self.partials = {} # determine the user configured status colors # (in the future, we could support full rich-text tags) labels = [(stat, val.uilabel) for stat, val in statusTypes.items()] labels.extend([('r', 'resolve.resolved'), ('u', 'resolve.unresolved')]) for stat, label in labels: effect = qtlib.geteffect(label) for e in effect.split(';'): if e.startswith('color:'): _colors[stat] = QColor(e[7:]) break SP = QSizePolicy split = QSplitter(Qt.Horizontal) split.setChildrenCollapsible(False) layout = QVBoxLayout() layout.setMargin(0) layout.addWidget(split) self.setLayout(layout) vbox = QVBoxLayout() vbox.setMargin(0) frame = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) frame.setSizePolicy(sp) frame.setLayout(vbox) hbox = QHBoxLayout() hbox.setMargin(4) hbox.setContentsMargins(0, 0, 0, 0) self.refreshBtn = tb = QToolButton() tb.setToolTip(_('Refresh file list')) tb.setIcon(qtlib.geticon('view-refresh')) tb.clicked.connect(self.refreshWctx) le = QLineEdit() if hasattr(le, 'setPlaceholderText'): # Qt >= 4.7 le.setPlaceholderText(_('### filter text ###')) else: lbl = QLabel(_('Filter:')) hbox.addWidget(lbl) st = '' for s in statusTypes: val = statusTypes[s] if self.opts[val.name]: st = st + s self.statusfilter = StatusFilterActionGroup( statustext=st, types=StatusType.preferredOrder) if self.checkable: self.checkAllTT = _('Check all files') self.checkNoneTT = _('Uncheck all files') self.checkAllNoneBtn = QCheckBox() self.checkAllNoneBtn.setToolTip(self.checkAllTT) self.checkAllNoneBtn.clicked.connect(self.checkAllNone) self.filelistToolbar = QToolBar(_('Status File List Toolbar')) self.filelistToolbar.setIconSize(qtlib.smallIconSize()) self.filelistToolbar.setStyleSheet(qtlib.tbstylesheet) hbox.addWidget(self.filelistToolbar) if self.checkable: self.filelistToolbar.addWidget(qtlib.Spacer(3, 2)) self.filelistToolbar.addWidget(self.checkAllNoneBtn) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(le) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget( createStatusFilterMenuButton(self.statusfilter, self)) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(self.refreshBtn) self._fileactions = filectxactions.WctxActions(self._repoagent, self) self._fileactions.setupCustomToolsMenu('workbench.commit.custom-menu') self._fileactions.linkActivated.connect(self.linkActivated) self._fileactions.refreshNeeded.connect(self.refreshWctx) self._fileactions.runCustomCommandRequested.connect( self.runCustomCommandRequested) self.addActions(self._fileactions.actions()) tv = WctxFileTree(self) vbox.addLayout(hbox) vbox.addWidget(tv) split.addWidget(frame) self.clearPatternBtn = QPushButton(_('Remove filter, show root')) vbox.addWidget(self.clearPatternBtn) self.clearPatternBtn.clicked.connect(self.clearPattern) self.clearPatternBtn.setAutoDefault(False) self.clearPatternBtn.setVisible(bool(self.pats)) tv.setAllColumnsShowFocus(True) tv.setContextMenuPolicy(Qt.CustomContextMenu) tv.setDragDropMode(QTreeView.DragOnly) tv.setItemsExpandable(False) tv.setRootIsDecorated(False) tv.setSelectionMode(QTreeView.ExtendedSelection) tv.setTextElideMode(Qt.ElideLeft) tv.sortByColumn(COL_STATUS, Qt.AscendingOrder) tv.doubleClicked.connect(self.onRowDoubleClicked) tv.customContextMenuRequested.connect(self.onMenuRequest) le.textEdited.connect(self.setFilter) self.statusfilter.statusChanged.connect(self.setStatusFilter) self.tv = tv self.le = le self._tvpaletteswitcher = qtlib.PaletteSwitcher(tv) self._togglefileshortcut = a = QShortcut(Qt.Key_Space, tv) a.setContext(Qt.WidgetShortcut) a.setEnabled(False) a.activated.connect(self._toggleSelectedFiles) # Diff panel side of splitter vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setContentsMargins(0, 0, 0, 0) docf = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(1) sp.setVerticalStretch(0) docf.setSizePolicy(sp) docf.setLayout(vbox) self.docf = docf self.fileview = fileview.HgFileView(self._repoagent, self) self.fileview.setShelveButtonVisible(True) self.fileview.showMessage.connect(self.showMessage) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.fileDisplayed.connect(self.fileDisplayed) self.fileview.shelveToolExited.connect(self.refreshWctx) self.fileview.chunkSelectionChanged.connect(self.chunkSelectionChanged) self.fileview.grepRequested.connect(self.grepRequested) self.fileview.setMinimumSize(QSize(16, 16)) vbox.addWidget(self.fileview, 1) self.split = split self.diffvbox = vbox
def __init__(self, repo, pats, opts, parent=None, checkable=True): QWidget.__init__(self, parent) self.opts = dict(modified=True, added=True, removed=True, deleted=True, unknown=True, clean=False, ignored=False, subrepo=True) self.opts.update(opts) self.repo = repo self.pats = pats self.checkable = checkable self.pctx = None self.savechecks = True self.refthread = None # determine the user configured status colors # (in the future, we could support full rich-text tags) labels = [(stat, val.uilabel) for stat, val in statusTypes.items()] labels.extend([('r', 'resolve.resolved'), ('u', 'resolve.unresolved')]) for stat, label in labels: effect = qtlib.geteffect(label) for e in effect.split(';'): if e.startswith('color:'): _colors[stat] = QColor(e[7:]) break SP = QSizePolicy split = QSplitter(Qt.Horizontal) split.setChildrenCollapsible(False) layout = QVBoxLayout() layout.setMargin(0) layout.addWidget(split) self.setLayout(layout) vbox = QVBoxLayout() vbox.setMargin(0) frame = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) frame.setSizePolicy(sp) frame.setLayout(vbox) hbox = QHBoxLayout() hbox.setMargin(4) hbox.setContentsMargins(0, 0, 0, 0) self.refreshBtn = tb = QToolButton() tb.setToolTip(_('Refresh file list')) tb.setIcon(qtlib.geticon('view-refresh')) tb.clicked.connect(self.refreshWctx) le = QLineEdit() if hasattr(le, 'setPlaceholderText'): # Qt >= 4.7 le.setPlaceholderText(_('### filter text ###')) else: lbl = QLabel(_('Filter:')) hbox.addWidget(lbl) st = '' for s in statusTypes: val = statusTypes[s] if self.opts[val.name]: st = st + s self.statusfilter = StatusFilterButton( statustext=st, types=StatusType.preferredOrder) if self.checkable: self.checkAllTT = _('Check all files') self.checkNoneTT = _('Uncheck all files') self.checkAllNoneBtn = QCheckBox() self.checkAllNoneBtn.setToolTip(self.checkAllTT) self.checkAllNoneBtn.stateChanged.connect(self.checkAllNone) self.filelistToolbar = QToolBar(_('Status File List Toolbar')) self.filelistToolbar.setIconSize(QSize(16,16)) self.filelistToolbar.setStyleSheet(qtlib.tbstylesheet) hbox.addWidget(self.filelistToolbar) if self.checkable: self.filelistToolbar.addWidget(qtlib.Spacer(3, 2)) self.filelistToolbar.addWidget(self.checkAllNoneBtn) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(le) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(self.statusfilter) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(self.refreshBtn) self.actions = wctxactions.WctxActions(self.repo, self) tv = WctxFileTree(self.repo, checkable=checkable) vbox.addLayout(hbox) vbox.addWidget(tv) split.addWidget(frame) if self.pats: def clearPattern(): self.pats = [] self.refreshWctx() cpb.setVisible(False) self.titleTextChanged.emit(self.getTitle()) cpb = QPushButton(_('Remove filter, show root')) vbox.addWidget(cpb) cpb.clicked.connect(clearPattern) tv.setItemsExpandable(False) tv.setRootIsDecorated(False) tv.sortByColumn(COL_STATUS, Qt.AscendingOrder) tv.clicked.connect(self.onRowClicked) tv.doubleClicked.connect(self.onRowDoubleClicked) tv.menuRequest.connect(self.onMenuRequest) le.textEdited.connect(self.setFilter) def statusTypeTrigger(status): status = str(status) for s in statusTypes: val = statusTypes[s] self.opts[val.name] = s in status self.refreshWctx() self.statusfilter.statusChanged.connect(statusTypeTrigger) self.tv = tv self.le = le # Diff panel side of splitter vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setContentsMargins(0, 0, 0, 0) docf = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(1) sp.setVerticalStretch(0) docf.setSizePolicy(sp) docf.setLayout(vbox) self.docf = docf self.fileview = fileview.HgFileView(self.repo, self) self.fileview.showMessage.connect(self.showMessage) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.fileDisplayed.connect(self.fileDisplayed) self.fileview.shelveToolExited.connect(self.refreshWctx) self.fileview.setContext(self.repo[None]) self.fileview.setMinimumSize(QSize(16, 16)) vbox.addWidget(self.fileview, 1) self.split = split self.diffvbox = vbox
def style(self, msg, label): "Escape message for safe HTML, then apply specified style" msg = cgi.escape(msg).replace("\n", "<br />") style = qtlib.geteffect(label) return '<span style="%s">%s</span>' % (style, msg)
def __init__(self, repoagent, pats, opts, parent=None, checkable=True, defcheck='commit'): QWidget.__init__(self, parent) self.opts = dict(modified=True, added=True, removed=True, deleted=True, unknown=True, clean=False, ignored=False, subrepo=True) self.opts.update(opts) self._repoagent = repoagent self.pats = pats self.checkable = checkable self.defcheck = defcheck self.pctx = None self.savechecks = True self.refthread = None self.refreshWctxLater = QTimer(self, interval=10, singleShot=True) self.refreshWctxLater.timeout.connect(self.refreshWctx) self.partials = {} self.manualCheckAllUpdate = False # determine the user configured status colors # (in the future, we could support full rich-text tags) labels = [(stat, val.uilabel) for stat, val in statusTypes.items()] labels.extend([('r', 'resolve.resolved'), ('u', 'resolve.unresolved')]) for stat, label in labels: effect = qtlib.geteffect(label) for e in effect.split(';'): if e.startswith('color:'): _colors[stat] = QColor(e[7:]) break SP = QSizePolicy split = QSplitter(Qt.Horizontal) split.setChildrenCollapsible(False) layout = QVBoxLayout() layout.setMargin(0) layout.addWidget(split) self.setLayout(layout) vbox = QVBoxLayout() vbox.setMargin(0) frame = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) frame.setSizePolicy(sp) frame.setLayout(vbox) hbox = QHBoxLayout() hbox.setMargin(4) hbox.setContentsMargins(0, 0, 0, 0) self.refreshBtn = tb = QToolButton() tb.setToolTip(_('Refresh file list')) tb.setIcon(qtlib.geticon('view-refresh')) tb.clicked.connect(self.refreshWctx) le = QLineEdit() if hasattr(le, 'setPlaceholderText'): # Qt >= 4.7 le.setPlaceholderText(_('### filter text ###')) else: lbl = QLabel(_('Filter:')) hbox.addWidget(lbl) st = '' for s in statusTypes: val = statusTypes[s] if self.opts[val.name]: st = st + s self.statusfilter = StatusFilterButton(statustext=st, types=StatusType.preferredOrder) if self.checkable: self.checkAllTT = _('Check all files') self.checkNoneTT = _('Uncheck all files') self.checkAllNoneBtn = QCheckBox() self.checkAllNoneBtn.setToolTip(self.checkAllTT) self.checkAllNoneBtn.stateChanged.connect(self.checkAllNone) self.filelistToolbar = QToolBar(_('Status File List Toolbar')) self.filelistToolbar.setIconSize(QSize(16, 16)) self.filelistToolbar.setStyleSheet(qtlib.tbstylesheet) hbox.addWidget(self.filelistToolbar) if self.checkable: self.filelistToolbar.addWidget(qtlib.Spacer(3, 2)) self.filelistToolbar.addWidget(self.checkAllNoneBtn) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(le) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(self.statusfilter) self.filelistToolbar.addSeparator() self.filelistToolbar.addWidget(self.refreshBtn) self.actions = wctxactions.WctxActions(self._repoagent, self, checkable) self.actions.refreshNeeded.connect(self.refreshWctx) self.actions.runCustomCommandRequested.connect( self.runCustomCommandRequested) tv = WctxFileTree(self.repo, checkable=checkable) vbox.addLayout(hbox) vbox.addWidget(tv) split.addWidget(frame) self.clearPatternBtn = QPushButton(_('Remove filter, show root')) vbox.addWidget(self.clearPatternBtn) self.clearPatternBtn.clicked.connect(self.clearPattern) self.clearPatternBtn.setVisible(bool(self.pats)) tv.setItemsExpandable(False) tv.setRootIsDecorated(False) tv.sortByColumn(COL_STATUS, Qt.AscendingOrder) tv.clicked.connect(self.onRowClicked) tv.doubleClicked.connect(self.onRowDoubleClicked) tv.menuRequest.connect(self.onMenuRequest) le.textEdited.connect(self.setFilter) self.statusfilter.statusChanged.connect(self.setStatusFilter) self.tv = tv self.le = le # Diff panel side of splitter vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setContentsMargins(0, 0, 0, 0) docf = QFrame(split) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(1) sp.setVerticalStretch(0) docf.setSizePolicy(sp) docf.setLayout(vbox) self.docf = docf self.fileview = fileview.HgFileView(self._repoagent, self) self.fileview.showMessage.connect(self.showMessage) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.fileDisplayed.connect(self.fileDisplayed) self.fileview.shelveToolExited.connect(self.refreshWctx) self.fileview.newChunkList.connect(self.updatePartials) self.fileview.chunkSelectionChanged.connect(self.chunkSelectionChanged) self.fileview.grepRequested.connect(self.grepRequested) self.fileview.setContext(self.repo[None]) self.fileview.setMinimumSize(QSize(16, 16)) vbox.addWidget(self.fileview, 1) self.split = split self.diffvbox = vbox
def addtotal(files, style): effects = qtlib.geteffect(style) text = qtlib.applyeffects(" %s " % len(files), effects) changes.append(text)
def style(self, msg, label): 'Escape message for safe HTML, then apply specified style' msg = cgi.escape(msg).replace('\n', '<br />') style = qtlib.geteffect(label) return '<span style="%s">%s</span>' % (style, msg)
def addtotal(files, style): effects = qtlib.geteffect(style) text = qtlib.applyeffects(' %s ' % len(files), effects) changes.append(text)