def __init__(self, parent, getCheckedFunc=None): super(MessageEntry, self).__init__(parent) self.setEdgeColor(QColor('LightSalmon')) self.setEdgeMode(QsciScintilla.EdgeLine) self.setReadOnly(False) self.setMarginWidth(1, 0) self.setFont(qtlib.getfont('fontcomment').font()) self.setCaretWidth(10) self.setCaretLineBackgroundColor(QColor("#e6fff0")) self.setCaretLineVisible(True) self.setAutoIndent(True) self.setAutoCompletionSource(QsciScintilla.AcsAPIs) self.setAutoCompletionFillupsEnabled(True) self.setLexer(QsciLexerMakefile(self)) font = qtlib.getfont('fontcomment').font() self.fontHeight = QFontMetrics(font).height() self.lexer().setFont(font) self.lexer().setColor(QColor(Qt.red), QsciLexerMakefile.Error) self.setMatchedBraceBackgroundColor(Qt.yellow) self.setIndentationsUseTabs(False) self.setBraceMatching(QsciScintilla.SloppyBraceMatch) #self.setIndentationGuidesBackgroundColor(QColor("#e6e6de")) #self.setFolding(QsciScintilla.BoxedFoldStyle) # http://www.riverbankcomputing.com/pipermail/qscintilla/2009-February/000461.html self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) # default message entry widgets to word wrap, user may override self.setWrapMode(QsciScintilla.WrapWord) self.getChecked = getCheckedFunc self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.menuRequested)
def __init__(self, parent=None): super(RevsetEntry, self).__init__(parent) self.setMarginWidth(1, 0) self.setReadOnly(False) self.setUtf8(True) self.setCaretWidth(10) self.setCaretLineBackgroundColor(QColor("#e6fff0")) self.setCaretLineVisible(True) self.setAutoIndent(True) self.setMatchedBraceBackgroundColor(Qt.yellow) self.setIndentationsUseTabs(False) self.setBraceMatching(QsciScintilla.SloppyBraceMatch) self.setWrapMode(QsciScintilla.WrapWord) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) sp = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) sp.setHorizontalStretch(1) sp.setVerticalStretch(0) self.setSizePolicy(sp) self.setAutoCompletionThreshold(2) self.setAutoCompletionSource(QsciScintilla.AcsAPIs) self.setAutoCompletionFillupsEnabled(True) self.setLexer(QsciLexerPython(self)) self.lexer().setFont(qtlib.getfont('fontcomment').font()) self.apis = QsciAPIs(self.lexer())
def initqsci(w): w.setUtf8(True) w.setReadOnly(True) w.setMarginWidth(1, 0) # hide area for line numbers self.lexer = lex = lexers.get_diff_lexer(self) fh = qtlib.getfont('fontdiff') fh.changed.connect(self.forwardFont) lex.setFont(fh.font()) w.setLexer(lex)
def applylexer(self): font = qtlib.getfont('fontcomment').font() self.fontHeight = QFontMetrics(font).height() if QSettings().value('msgentry/lexer', True).toBool(): self.setLexer(QsciLexerMakefile(self)) self.lexer().setColor(QColor(Qt.red), QsciLexerMakefile.Error) self.lexer().setFont(font) else: self.setLexer(None) self.setFont(font)
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 setupViews(self): self.tableViews = {'left': self.fileHistoryLeft, 'right': self.fileHistoryRight} # viewers are Scintilla editors self.viewers = {} # block are diff-block displayers self.block = {} self.diffblock = blockmatcher.BlockMatch(self.frame) lay = QHBoxLayout(self.frame) lay.setSpacing(0) lay.setContentsMargins(0, 0, 0, 0) try: contents = open(self.repo.wjoin(self.filename), "rb").read(1024) lexer = lexers.get_lexer(self.filename, contents, self) except Exception: lexer = None for side, idx in (('left', 0), ('right', 3)): sci = Scintilla(self.frame) sci.verticalScrollBar().setFocusPolicy(Qt.StrongFocus) sci.setFocusProxy(sci.verticalScrollBar()) sci.verticalScrollBar().installEventFilter(self) sci.setContextMenuPolicy(Qt.CustomContextMenu) sci.customContextMenuRequested.connect( functools.partial(self.fileViewMenuRequest, sci)) sci.setFrameShape(QFrame.NoFrame) sci.setMarginLineNumbers(1, True) sci.SendScintilla(sci.SCI_SETSELEOLFILLED, True) sci.setLexer(lexer) if lexer is None: sci.setFont(qtlib.getfont('fontdiff').font()) sci.setReadOnly(True) sci.setUtf8(True) lay.addWidget(sci) # hide margin 0 (markers) sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 0, 0) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 0, 0) # setup margin 1 for line numbers only sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 1, 1) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 1, 20) sci.SendScintilla(sci.SCI_SETMARGINMASKN, 1, 0) # define markers for colorize zones of diff self.markerplus = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markerplus, 0xB0FFA0) self.markerminus = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markerminus, 0xA0A0FF) self.markertriangle = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markertriangle, 0xFFA0A0) self.viewers[side] = sci blk = blockmatcher.BlockList(self.frame) blk.linkScrollBar(sci.verticalScrollBar()) self.diffblock.linkScrollBar(sci.verticalScrollBar(), side) lay.insertWidget(idx, blk) self.block[side] = blk lay.insertWidget(2, self.diffblock) for side in sides: table = getattr(self, 'tableView_revisions_%s' % side) table.setTabKeyNavigation(False) #table.installEventFilter(self) table.revisionSelected.connect(self.onRevisionSelected) table.revisionActivated.connect(self.onRevisionActivated) self.viewers[side].verticalScrollBar().valueChanged.connect( lambda value, side=side: self.sbar_changed(value, side, 'vertical')) self.viewers[side].horizontalScrollBar().valueChanged.connect( lambda value, side=side: self.sbar_changed(value, side, 'horizontal')) self.setTabOrder(table, self.viewers['left']) self.setTabOrder(self.viewers['left'], self.viewers['right']) # timer used to fill viewers with diff block markers during GUI idle time self.timer = QTimer() self.timer.setSingleShot(False) self.timer.timeout.connect(self.idle_fill_files)
def __init__(self, repoagent, parent=None): QDialog.__init__(self, parent) self.setWindowTitle(_('Reorder Unapplied Patches')) self.setWindowFlags(Qt.Window) self.setWindowIcon(qtlib.geticon('hg-qreorder')) self._repoagent = repoagent self.cached = None repoagent.repositoryChanged.connect(self.refresh) layout = QVBoxLayout() layout.setMargin(4) self.setLayout(layout) hb = QHBoxLayout() hb.setMargin(2) lbl = QLabel(_('Repository:')) hb.addWidget(lbl) le = QLineEdit() hb.addWidget(le) le.setReadOnly(True) le.setFont(qtlib.getfont('fontlist').font()) le.setText(self.repo.displayname) le.setFocusPolicy(Qt.NoFocus) layout.addLayout(hb) hl = qtlib.LabeledSeparator('') layout.addWidget(hl) class PatchListWidget(QListWidget): menuRequested = pyqtSignal(QPoint, object) def __init__(self, parent): QListWidget.__init__(self, parent) self.setCurrentRow(0) def contextMenuEvent(self, event): i = self.item(self.currentRow()) if i: self.menuRequested.emit(event.globalPos(), i.patchname) def focusInEvent(self, e): i = self.item(self.currentRow()) if i: self.parent().parent().showSummary(i) QListWidget.focusInEvent(self, e) ugb = QGroupBox(_('Unapplied Patches - drag to reorder')) 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.ulw.menuRequested.connect(self.patchlistMenuRequest) layout.addWidget(ugb) agb = QGroupBox(_('Applied Patches')) agb.setLayout(QVBoxLayout()) agb.layout().setContentsMargins(*(0,)*4) self.alw = PatchListWidget(self) agb.layout().addWidget(self.alw) self.alw.currentItemChanged.connect(lambda: self.showSummary(self.alw.item(self.alw.currentRow()))) self.alw.menuRequested.connect(self.patchlistMenuRequest) layout.addWidget(agb) slbl = QLabel(_('Summary:')) layout.addWidget(slbl) self.summ = QTextEdit() self.summ.setFont(qtlib.getfont('fontcomment').font()) self.summ.setMinimumWidth(500) # min 80 chars self.summ.setMaximumHeight(100) self.summ.setReadOnly(True) self.summ.setFocusPolicy(Qt.NoFocus) layout.addWidget(self.summ) self._readsettings() self.refresh() # dialog buttons BB = QDialogButtonBox bb = QDialogButtonBox(BB.Ok|BB.Cancel) self.apply_button = bb.button(BB.Apply) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) bb.button(BB.Ok).setDefault(True) layout.addWidget(bb) self.alw.setCurrentRow(0) self.ulw.setCurrentRow(0) self.ulw.setFocus()
def displayFile(self, filename=None, status=None): if isinstance(filename, (unicode, QString)): filename = hglib.fromunicode(filename) status = hglib.fromunicode(status) if filename and self._filename == filename: # Get the last visible line to restore it after reloading the editor lastCursorPosition = self.sci.getCursorPosition() lastScrollPosition = self.sci.firstVisibleLine() else: lastCursorPosition = (0, 0) lastScrollPosition = 0 self._filename, self._status = filename, status self.clearMarkup() self._diffs = [] if filename is None: self.restrictModes(False, False, False) return if self._ctx2: ctx2 = self._ctx2 elif self._parent == 0 or len(self._ctx.parents()) == 1: ctx2 = self._ctx.p1() else: ctx2 = self._ctx.p2() fd = filedata.FileData(self._ctx, ctx2, filename, status) if fd.elabel: self.extralabel.setText(fd.elabel) self.extralabel.show() else: self.extralabel.hide() self.filenamelabel.setText(fd.flabel) if not fd.isValid(): self.sci.setText(fd.error) self.sci.setLexer(None) self.sci.setFont(qtlib.getfont('fontlog').font()) self.sci.setMarginWidth(1, 0) self.blk.setVisible(False) self.restrictModes(False, False, False) return candiff = bool(fd.diff) canfile = bool(fd.contents or fd.ucontents) canann = bool(fd.contents) and type(self._ctx.rev()) is int if not candiff or not canfile: self.restrictModes(candiff, canfile, canann) else: self.actionDiffMode.setEnabled(True) self.actionFileMode.setEnabled(True) self.actionAnnMode.setEnabled(True) if self._lostMode: self._mode = self._lostMode if self._lostMode == DiffMode: self.actionDiffMode.trigger() elif self._lostMode == FileMode: self.actionFileMode.trigger() elif self._lostMode == AnnMode: self.actionAnnMode.trigger() self._lostMode = None self.blk.setVisible(self._mode != DiffMode) self.sci.setAnnotationEnabled(self._mode == AnnMode) if self._mode == DiffMode: self.sci.setMarginWidth(1, 0) lexer = lexers.get_diff_lexer(self) self.sci.setLexer(lexer) if lexer is None: self.sci.setFont(qtlib.getfont('fontlog').font()) # trim first three lines, for example: # diff -r f6bfc41af6d7 -r c1b18806486d tortoisehg/hgqt/thgrepo.py # --- a/tortoisehg/hgqt/thgrepo.py # +++ b/tortoisehg/hgqt/thgrepo.py if fd.diff: out = fd.diff.split('\n', 3) if len(out) == 4: self.sci.setText(hglib.tounicode(out[3])) else: # there was an error or rename without diffs self.sci.setText(hglib.tounicode(fd.diff)) elif fd.ucontents: # subrepo summary and perhaps other data self.sci.setText(fd.ucontents) self.sci.setLexer(None) self.sci.setFont(qtlib.getfont('fontlog').font()) self.sci.setMarginWidth(1, 0) self.blk.setVisible(False) return elif fd.contents: lexer = lexers.get_lexer(filename, fd.contents, self) self.sci.setLexer(lexer) if lexer is None: self.sci.setFont(qtlib.getfont('fontlog').font()) self.sci.setText(hglib.tounicode(fd.contents)) self.blk.setVisible(True) self.sci._updatemarginwidth() if self._mode == AnnMode: self.sci._updateannotation(self._ctx, filename) else: return # Recover the last cursor/scroll position self.sci.setCursorPosition(*lastCursorPosition) # Make sure that lastScrollPosition never exceeds the amount of # lines on the editor lastScrollPosition = min(lastScrollPosition, self.sci.lines() - 1) self.sci.verticalScrollBar().setValue(lastScrollPosition) self.highlightText(*self._lastSearch) uf = hglib.tounicode(filename) uc = hglib.tounicode(fd.contents) or '' self.fileDisplayed.emit(uf, uc) if self._mode != DiffMode: self.blk.setVisible(True) self.blk.syncPageStep() if fd.contents and fd.olddata: if self.timer.isActive(): self.timer.stop() self._fd = fd self.timer.start() self.actionNextDiff.setEnabled(bool(self._diffs)) self.actionPrevDiff.setEnabled(bool(self._diffs)) lexer = self.sci.lexer() if lexer: font = self.sci.lexer().font(0) else: font = self.sci.font() fm = QFontMetrics(font) self.maxWidth = fm.maxWidth() lines = unicode(self.sci.text()).splitlines() if lines: # assume that the longest line has the largest width; # fm.width() is too slow to apply to each line. try: longestline = max(lines, key=len) except TypeError: # Python<2.5 has no key support longestline = max((len(l), l) for l in lines)[1] self.maxWidth += fm.width(longestline) self.updateScrollBar()
def setupUi(self): SP = QSizePolicy sp = SP(SP.Preferred, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sp) # + basevbox -------------------------------------------------------+ # |+ filelistsplit ........ | # | + filelistframe (vbox) | + panelframe (vbox) | # | + filelisttbar | + revpanel | # +---------------------------+-------------------------------------+ # | + filelist | + messagesplitter | # | | :+ message | # | | :----------------------------------+ # | | + fileview | # +---------------------------+-------------------------------------+ basevbox = QVBoxLayout(self) basevbox.setSpacing(0) basevbox.setMargin(0) basevbox.setContentsMargins(2, 2, 2, 2) self.filelistsplit = QSplitter(self) basevbox.addWidget(self.filelistsplit) self.splitternames.append('filelistsplit') sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth( self.filelistsplit.sizePolicy().hasHeightForWidth()) self.filelistsplit.setSizePolicy(sp) self.filelistsplit.setOrientation(Qt.Horizontal) self.filelistsplit.setChildrenCollapsible(False) self.filelisttbar = QToolBar(_('File List Toolbar')) self.filelisttbar.setIconSize(QSize(16, 16)) self.filelist = HgFileListView(self.repo, self, True) self.filelist.linkActivated.connect(self.linkActivated) self.filelist.setContextMenuPolicy(Qt.CustomContextMenu) self.filelist.customContextMenuRequested.connect(self.menuRequest) self.filelist.doubleClicked.connect(self.onDoubleClick) self.filelistframe = QFrame(self.filelistsplit) sp = SP(SP.Preferred, SP.Preferred) sp.setHorizontalStretch(3) sp.setVerticalStretch(0) sp.setHeightForWidth( self.filelistframe.sizePolicy().hasHeightForWidth()) self.filelistframe.setSizePolicy(sp) self.filelistframe.setFrameShape(QFrame.NoFrame) vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setMargin(0) vbox.addWidget(self.filelisttbar) vbox.addWidget(self.filelist) self.filelistframe.setLayout(vbox) self.fileviewframe = QFrame(self.filelistsplit) sp = SP(SP.Preferred, SP.Preferred) sp.setHorizontalStretch(7) sp.setVerticalStretch(0) sp.setHeightForWidth( self.fileviewframe.sizePolicy().hasHeightForWidth()) self.fileviewframe.setSizePolicy(sp) self.fileviewframe.setFrameShape(QFrame.NoFrame) vbox = QVBoxLayout(self.fileviewframe) vbox.setSpacing(0) vbox.setSizeConstraint(QLayout.SetDefaultConstraint) vbox.setMargin(0) panelframevbox = vbox self.messagesplitter = QSplitter(self.fileviewframe) self.splitternames.append('messagesplitter') sp = SP(SP.Preferred, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth( self.messagesplitter.sizePolicy().hasHeightForWidth()) self.messagesplitter.setSizePolicy(sp) self.messagesplitter.setMinimumSize(QSize(50, 50)) self.messagesplitter.setFrameShape(QFrame.NoFrame) self.messagesplitter.setLineWidth(0) self.messagesplitter.setMidLineWidth(0) self.messagesplitter.setOrientation(Qt.Vertical) self.messagesplitter.setOpaqueResize(True) self.message = QTextBrowser(self.messagesplitter, lineWrapMode=QTextEdit.NoWrap, openLinks=False) self.message.minimumSizeHint = lambda: QSize(0, 25) self.message.anchorClicked.connect( lambda url: self.linkActivated.emit(url.toString())) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(2) sp.setHeightForWidth(self.message.sizePolicy().hasHeightForWidth()) self.message.setSizePolicy(sp) self.message.setMinimumSize(QSize(0, 0)) f = qtlib.getfont('fontcomment') self.message.setFont(f.font()) f.changed.connect(self.forwardFont) self.fileview = HgFileView(self.repo, self.messagesplitter) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(5) sp.setHeightForWidth(self.fileview.sizePolicy().hasHeightForWidth()) self.fileview.setSizePolicy(sp) self.fileview.setMinimumSize(QSize(0, 0)) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.setFont(qtlib.getfont('fontdiff').font()) self.fileview.showMessage.connect(self.showMessage) self.fileview.grepRequested.connect(self.grepRequested) self.fileview.revisionSelected.connect(self.revisionSelected) self.filelist.fileSelected.connect(self.fileview.displayFile) self.filelist.fileSelected.connect(self.updateItemFileActions) self.filelist.clearDisplay.connect(self.fileview.clearDisplay) self.revpanel = RevPanelWidget(self.repo) self.revpanel.linkActivated.connect(self.linkActivated) panelframevbox.addWidget(self.revpanel) panelframevbox.addSpacing(5) panelframevbox.addWidget(self.messagesplitter)
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, repo, parent, multiselectable): QWidget.__init__(self, parent) self.repo = repo self.multiselectable = multiselectable self.currentFile = None layout = QVBoxLayout(self) layout.setSpacing(0) layout.setMargin(0) layout.setContentsMargins(2, 2, 2, 2) self.setLayout(layout) self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Vertical) self.splitter.setChildrenCollapsible(False) self.layout().addWidget(self.splitter) self.filelist = filelistview.HgFileListView(repo, self, multiselectable) self.filelistmodel = filelistmodel.HgFileListModel(self) self.filelist.setModel(self.filelistmodel) self.filelist.setContextMenuPolicy(Qt.CustomContextMenu) self.filelist.customContextMenuRequested.connect(self.menuRequest) self.filelist.doubleClicked.connect(self.vdiff) self.fileListFrame = QFrame(self.splitter) self.fileListFrame.setFrameShape(QFrame.NoFrame) vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setMargin(0) vbox.addWidget(self.filelist) self.fileListFrame.setLayout(vbox) self.diffbrowse = DiffBrowser(self.splitter) self.diffbrowse.setFont(qtlib.getfont('fontdiff').font()) self.diffbrowse.showMessage.connect(self.showMessage) self.diffbrowse.linkActivated.connect(self.linkActivated) self.diffbrowse.chunksSelected.connect(self.chunksSelected) self.filelist.fileSelected.connect(self.displayFile) self.filelist.clearDisplay.connect(self.diffbrowse.clearDisplay) self.splitter.setStretchFactor(0, 0) self.splitter.setStretchFactor(1, 3) self.timerevent = self.startTimer(500) self._actions = {} for name, desc, icon, key, tip, cb in [ ('diff', _('Visual Diff'), 'visualdiff', 'Ctrl+D', _('View file changes in external diff tool'), self.vdiff), ('edit', _('Edit Local'), 'edit-file', 'Shift+Ctrl+L', _('Edit current file in working copy'), self.editCurrentFile), ('revert', _('Revert to Revision'), 'hg-revert', 'Shift+Ctrl+R', _('Revert file(s) to contents at this revision'), self.revertfile), ]: act = QAction(desc, self) if icon: act.setIcon(qtlib.geticon(icon)) if key: act.setShortcut(key) if tip: act.setStatusTip(tip) if cb: act.triggered.connect(cb) self._actions[name] = act self.addAction(act)
def cfg_lexer(self, lexer): font = qtlib.getfont('fontlog').font() lexer.setFont(font, -1) return lexer
def __init__(self, ui, path, parent=None): 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._onMenuRequested) self.baseLineColor = editor.markerDefine(qsci.Background, -1) editor.setMarkerBackgroundColor(QColor('lightblue'), self.baseLineColor) self.layout().addWidget(editor, 3) searchbar = qscilib.SearchToolBar(self) 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.addActions(searchbar.editorActions()) 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) self.textencgroup = fileencoding.createActionGroup(self) self.textencgroup.triggered.connect(self._reloadFile) fileencoding.checkActionByName(self.textencgroup, fileencoding.contentencoding(ui)) 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') if not qscilib.readFile(editor, hglib.tounicode(path), self._textEncoding()): self.hide() QTimer.singleShot(0, self.reject) return earlybytes = hglib.fromunicode(editor.text(), 'replace')[:4096] lexer = lexers.getlexer(ui, path, earlybytes, self) editor.setLexer(lexer) if lexer is None: editor.setFont(qtlib.getfont('fontlog').font()) 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 setupViews(self): # viewers are Scintilla editors self.viewers = {} # block are diff-block displayers self.block = {} self.diffblock = blockmatcher.BlockMatch(self.frame) lay = QHBoxLayout(self.frame) lay.setSpacing(0) lay.setContentsMargins(0, 0, 0, 0) try: contents = open(self.repo.wjoin(self.filename), "rb").read(1024) lexer = lexers.getlexer(self.repo.ui, self.filename, contents, self) except Exception: lexer = None for side, idx in (('left', 0), ('right', 3)): sci = _FileDiffScintilla(self.frame) sci.installEventFilter(self) sci.verticalScrollBar().setFocusPolicy(Qt.StrongFocus) sci.setFocusProxy(sci.verticalScrollBar()) sci.verticalScrollBar().installEventFilter(self) sci.setFrameShape(QFrame.NoFrame) sci.setMarginLineNumbers(1, True) sci.SendScintilla(sci.SCI_SETSELEOLFILLED, True) sci.setLexer(lexer) if lexer is None: sci.setFont(qtlib.getfont('fontdiff').font()) sci.setReadOnly(True) sci.setUtf8(True) lay.addWidget(sci) # hide margin 0 (markers) sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 0, 0) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 0, 0) # setup margin 1 for line numbers only sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 1, 1) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 1, 20) sci.SendScintilla(sci.SCI_SETMARGINMASKN, 1, 0) # define markers for colorize zones of diff self.markerplus = sci.markerDefine(QsciScintilla.Background) sci.setMarkerBackgroundColor(_colormap['+'], self.markerplus) self.markerminus = sci.markerDefine(QsciScintilla.Background) sci.setMarkerBackgroundColor(_colormap['-'], self.markerminus) self.markertriangle = sci.markerDefine(QsciScintilla.Background) sci.setMarkerBackgroundColor(_colormap['x'], self.markertriangle) self.markerplusline = sci.markerDefine(QsciScintilla.Invisible, _MARKERPLUSLINE) self.markerminusline = sci.markerDefine(QsciScintilla.Invisible, _MARKERMINUSLINE) self.markerplusunderline = sci.markerDefine(QsciScintilla.Invisible, _MARKERPLUSUNDERLINE) self.markerminusunderline = sci.markerDefine(QsciScintilla.Invisible, _MARKERMINUSUNDERLINE) self.viewers[side] = sci blk = blockmatcher.BlockList(self.frame) blk.linkScrollBar(sci.verticalScrollBar()) self.diffblock.linkScrollBar(sci.verticalScrollBar(), side) lay.insertWidget(idx, blk) self.block[side] = blk lay.insertWidget(2, self.diffblock) for table in self._repoViews: table.setTabKeyNavigation(False) table.installEventFilter(self) table.columnsVisibilityChanged.connect(self._syncColumnsVisibility) table.revisionSelected.connect(self.onRevisionSelected) table.revisionActivated.connect(self.onRevisionActivated) l, r = (self.viewers[k].verticalScrollBar() for k in sides) l.valueChanged.connect(self.sbar_changed_left) r.valueChanged.connect(self.sbar_changed_right) l, r = (self.viewers[k].horizontalScrollBar() for k in sides) l.valueChanged.connect(r.setValue) r.valueChanged.connect(l.setValue) self.setTabOrder(table, self.viewers['left']) self.setTabOrder(self.viewers['left'], self.viewers['right']) # timer used to merge requests of syncPageStep on ResizeEvent self._delayedSyncPageStep = QTimer(self, interval=0, singleShot=True) self._delayedSyncPageStep.timeout.connect(self.diffblock.syncPageStep) # timer used to fill viewers with diff block markers during GUI idle time self.timer = QTimer() self.timer.setSingleShot(False) self.timer.timeout.connect(self.idle_fill_files)
def setupUi(self): self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) # + basevbox -------------------------------------------------------+ # |+ filelistsplit ........ | # | + filelistframe (vbox) | + panelframe (vbox) | # | + filelisttbar | + revpanel | # +---------------------------+-------------------------------------+ # | + filelist | + messagesplitter | # | | :+ message | # | | :----------------------------------+ # | | + fileview | # +---------------------------+-------------------------------------+ basevbox = QVBoxLayout(self) basevbox.setSpacing(0) basevbox.setMargin(0) basevbox.setContentsMargins(2, 2, 2, 2) self.filelistsplit = QSplitter(self) basevbox.addWidget(self.filelistsplit) self.splitternames.append('filelistsplit') self.filelistsplit.setOrientation(Qt.Horizontal) self.filelistsplit.setChildrenCollapsible(False) self.filelisttbar = QToolBar(_('File List Toolbar')) self.filelisttbar.setIconSize(qtlib.smallIconSize()) self.filelist = HgFileListView(self) self.filelist.setContextMenuPolicy(Qt.CustomContextMenu) self.filelist.customContextMenuRequested.connect(self.menuRequest) self.filelist.doubleClicked.connect(self.onDoubleClick) self._filelistpaletteswitcher = qtlib.PaletteSwitcher(self.filelist) self.filelistframe = QWidget(self.filelistsplit) self.filelistsplit.setStretchFactor(0, 3) vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setMargin(0) vbox.addWidget(self.filelisttbar) vbox.addWidget(self.filelist) self.filelistframe.setLayout(vbox) self.fileviewframe = QWidget(self.filelistsplit) self.filelistsplit.setStretchFactor(1, 7) vbox = QVBoxLayout(self.fileviewframe) vbox.setSpacing(0) vbox.setSizeConstraint(QLayout.SetDefaultConstraint) vbox.setMargin(0) panelframevbox = vbox self.messagesplitter = QSplitter(self.fileviewframe) if os.name == 'nt': self.messagesplitter.setStyle(QStyleFactory.create('Plastique')) self.splitternames.append('messagesplitter') self.messagesplitter.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.messagesplitter.setMinimumSize(QSize(50, 50)) self.messagesplitter.setFrameShape(QFrame.NoFrame) self.messagesplitter.setLineWidth(0) self.messagesplitter.setMidLineWidth(0) self.messagesplitter.setOrientation(Qt.Vertical) self.messagesplitter.setOpaqueResize(True) self.message = QTextBrowser(self.messagesplitter, lineWrapMode=QTextEdit.NoWrap, openLinks=False) self.message.minimumSizeHint = lambda: QSize(0, 25) self.message.anchorClicked.connect(self._forwardAnchorClicked) self.message.setMinimumSize(QSize(0, 0)) self.message.sizeHint = lambda: QSize(0, 100) f = qtlib.getfont('fontcomment') self.message.setFont(f.font()) f.changed.connect(self.forwardFont) self.fileview = HgFileView(self._repoagent, self.messagesplitter) self.messagesplitter.setStretchFactor(1, 1) self.fileview.setMinimumSize(QSize(0, 0)) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.showMessage.connect(self.showMessage) self.fileview.grepRequested.connect(self.grepRequested) self.fileview.revisionSelected.connect(self.revisionSelected) self.filelist.fileSelected.connect(self._onFileSelected) self.filelist.clearDisplay.connect(self._onFileSelected) self.revpanel = RevPanelWidget(self.repo) self.revpanel.linkActivated.connect(self.linkActivated) panelframevbox.addWidget(self.revpanel) panelframevbox.addSpacing(5) panelframevbox.addWidget(self.messagesplitter)
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()
def setupUi(self): SP = QSizePolicy sp = SP(SP.Preferred, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sp) # + basevbox -------------------------------------------------------+ # |+ filelistsplit ........ | # | + filelistframe (vbox) | + panelframe (vbox) | # | + filelisttbar | + revpanel | # +---------------------------+-------------------------------------+ # | + filelist | + messagesplitter | # | | :+ message | # | | :----------------------------------+ # | | + fileview | # +---------------------------+-------------------------------------+ basevbox = QVBoxLayout(self) basevbox.setSpacing(0) basevbox.setMargin(0) basevbox.setContentsMargins(2, 2, 2, 2) self.filelistsplit = QSplitter(self) basevbox.addWidget(self.filelistsplit) self.splitternames.append('filelistsplit') sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth(self.filelistsplit.sizePolicy().hasHeightForWidth()) self.filelistsplit.setSizePolicy(sp) self.filelistsplit.setOrientation(Qt.Horizontal) self.filelistsplit.setChildrenCollapsible(False) self.filelisttbar = QToolBar(_('File List Toolbar')) self.filelisttbar.setIconSize(QSize(16,16)) self.filelist = HgFileListView(self.repo, self, True) self.filelist.linkActivated.connect(self.linkActivated) self.filelist.setContextMenuPolicy(Qt.CustomContextMenu) self.filelist.customContextMenuRequested.connect(self.menuRequest) self.filelist.doubleClicked.connect(self.onDoubleClick) self.filelistframe = QFrame(self.filelistsplit) sp = SP(SP.Preferred, SP.Preferred) sp.setHorizontalStretch(3) sp.setVerticalStretch(0) sp.setHeightForWidth( self.filelistframe.sizePolicy().hasHeightForWidth()) self.filelistframe.setSizePolicy(sp) self.filelistframe.setFrameShape(QFrame.NoFrame) vbox = QVBoxLayout() vbox.setSpacing(0) vbox.setMargin(0) vbox.addWidget(self.filelisttbar) vbox.addWidget(self.filelist) self.filelistframe.setLayout(vbox) self.fileviewframe = QFrame(self.filelistsplit) sp = SP(SP.Preferred, SP.Preferred) sp.setHorizontalStretch(7) sp.setVerticalStretch(0) sp.setHeightForWidth( self.fileviewframe.sizePolicy().hasHeightForWidth()) self.fileviewframe.setSizePolicy(sp) self.fileviewframe.setFrameShape(QFrame.NoFrame) vbox = QVBoxLayout(self.fileviewframe) vbox.setSpacing(0) vbox.setSizeConstraint(QLayout.SetDefaultConstraint) vbox.setMargin(0) panelframevbox = vbox self.messagesplitter = QSplitter(self.fileviewframe) self.splitternames.append('messagesplitter') sp = SP(SP.Preferred, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth(self.messagesplitter.sizePolicy().hasHeightForWidth()) self.messagesplitter.setSizePolicy(sp) self.messagesplitter.setMinimumSize(QSize(50, 50)) self.messagesplitter.setFrameShape(QFrame.NoFrame) self.messagesplitter.setLineWidth(0) self.messagesplitter.setMidLineWidth(0) self.messagesplitter.setOrientation(Qt.Vertical) self.messagesplitter.setOpaqueResize(True) self.message = QTextBrowser(self.messagesplitter, lineWrapMode=QTextEdit.NoWrap, openLinks=False) self.message.minimumSizeHint = lambda: QSize(0, 25) self.message.anchorClicked.connect( lambda url: self.linkActivated.emit(url.toString())) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(2) sp.setHeightForWidth(self.message.sizePolicy().hasHeightForWidth()) self.message.setSizePolicy(sp) self.message.setMinimumSize(QSize(0, 0)) f = qtlib.getfont('fontcomment') self.message.setFont(f.font()) f.changed.connect(self.forwardFont) self.fileview = HgFileView(self.repo, self.messagesplitter) sp = SP(SP.Expanding, SP.Expanding) sp.setHorizontalStretch(0) sp.setVerticalStretch(5) sp.setHeightForWidth(self.fileview.sizePolicy().hasHeightForWidth()) self.fileview.setSizePolicy(sp) self.fileview.setMinimumSize(QSize(0, 0)) self.fileview.linkActivated.connect(self.linkActivated) self.fileview.setFont(qtlib.getfont('fontdiff').font()) self.fileview.showMessage.connect(self.showMessage) self.fileview.grepRequested.connect(self.grepRequested) self.fileview.revisionSelected.connect(self.revisionSelected) self.filelist.fileSelected.connect(self.fileview.displayFile) self.filelist.clearDisplay.connect(self.fileview.clearDisplay) self.revpanel = RevPanelWidget(self.repo) self.revpanel.linkActivated.connect(self.linkActivated) panelframevbox.addWidget(self.revpanel) panelframevbox.addSpacing(5) panelframevbox.addWidget(self.messagesplitter)
def __init__(self, repoagent, embedded=False, parent=None): super(QQueueDialog, self).__init__(parent) self.setWindowIcon(qtlib.geticon('thg-mq')) self.setWindowTitle(_('Manage MQ patch queues')) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self._repoagent = repoagent repoagent.repositoryChanged.connect(self.reload) self.needsRefresh = False layout = QVBoxLayout() layout.setMargin(4) self.setLayout(layout) hbr = QHBoxLayout() hbr.setMargin(2) layout.addLayout(hbr) rlbl = QLabel(_('Repository:')) hbr.addWidget(rlbl) rle = QLineEdit() hbr.addWidget(rle) rle.setFont(qtlib.getfont('fontlist').font()) rle.setText(self.repo.displayname) rle.setReadOnly(True) rle.setFocusPolicy(Qt.NoFocus) topsep = qtlib.LabeledSeparator('') layout.addWidget(topsep) hbl = QHBoxLayout() hbl.setMargin(2) layout.addLayout(hbl) qvb = QVBoxLayout() hbl.addLayout(qvb) qlbl = QLabel(_('Patch queues:')) qvb.addWidget(qlbl) ql = QListWidget(self) qvb.addWidget(ql) ql.currentRowChanged.connect(self.updateUI) vbb = QVBoxLayout() vbb.setMargin(2) qvb.addLayout(vbb) hqbtntop = QHBoxLayout() vbb.addLayout(hqbtntop) hqbtnmid = QHBoxLayout() vbb.addLayout(hqbtnmid) hqbtnbot = QHBoxLayout() vbb.addLayout(hqbtnbot) btrel = QPushButton(_('Reload')) btrel.clicked.connect(self.reload) hqbtntop.addWidget(btrel) btact = QPushButton(_('Activate')) btact.clicked.connect(self.qqueueActivate) hqbtntop.addWidget(btact) btadd = QPushButton(_('Add')) btadd.clicked.connect(self.qqueueAdd) hqbtnmid.addWidget(btadd) btren = QPushButton(_('Rename')) btren.clicked.connect(self.qqueueRename) hqbtnmid.addWidget(btren) btdel = QPushButton(_('Delete')) btdel.clicked.connect(self.qqueueDelete) hqbtnbot.addWidget(btdel) btpur = QPushButton(_('Purge')) btpur.clicked.connect(self.qqueuePurge) hqbtnbot.addWidget(btpur) pvb = QVBoxLayout() hbl.addLayout(pvb) plbl = QLabel(_('Patches:')) pvb.addWidget(plbl) pl = QListWidget(self) pvb.addWidget(pl) botsep = qtlib.LabeledSeparator('') layout.addWidget(botsep) cmd = cmdui.Runner(not embedded, self) cmd.setTitle(_('QQueue')) cmd.output.connect(self.output) cmd.makeLogVisible.connect(self.makeLogVisible) cmd.commandFinished.connect(self.qqcmdFinished) BB = QDialogButtonBox bb = QDialogButtonBox(BB.Close) bb.button(BB.Close).clicked.connect(self.close) layout.addWidget(bb) self.setLayout(layout) self.ql = ql self.pl = pl self.btrel = btrel self.btact = btact self.btadd = btadd self.btren = btren self.btdel = btdel self.btpur = btpur self.bb = bb self.cmd = cmd self.itemfont = None self.itemfontbold = None self._readsettings() self.reload() self.ql.setFocus()
def cfg_lexer(self, lexer): font = qtlib.getfont('fontlog').font() lexer.setFont(font, -1) _fixdarkcolors(lexer) return lexer
def displayFile(self, filename=None, status=None): if isinstance(filename, (unicode, QString)): filename = hglib.fromunicode(filename) status = hglib.fromunicode(status) if filename and self._filename == filename: # Get the last visible line to restore it after reloading the editor lastCursorPosition = self.sci.getCursorPosition() lastScrollPosition = self.sci.firstVisibleLine() else: lastCursorPosition = (0, 0) lastScrollPosition = 0 self._filename, self._status = filename, status self.clearMarkup() self._diffs = [] if filename is None: self.restrictModes(False, False, False) return if self._ctx2: ctx2 = self._ctx2 elif self._parent == 0 or len(self._ctx.parents()) == 1: ctx2 = self._ctx.p1() else: ctx2 = self._ctx.p2() fd = filedata.FileData(self._ctx, ctx2, filename, status) if fd.elabel: self.extralabel.setText(fd.elabel) self.extralabel.show() else: self.extralabel.hide() self.filenamelabel.setText(fd.flabel) if not fd.isValid(): self.sci.setText(fd.error) self.sci.setLexer(None) self.sci.setFont(qtlib.getfont("fontlog").font()) self.sci.setMarginWidth(1, 0) self.blk.setVisible(False) self.restrictModes(False, False, False) return candiff = bool(fd.diff) canfile = bool(fd.contents or fd.ucontents) canann = bool(fd.contents) and type(self._ctx.rev()) is int if not candiff or not canfile: self.restrictModes(candiff, canfile, canann) else: self.actionDiffMode.setEnabled(True) self.actionFileMode.setEnabled(True) self.actionAnnMode.setEnabled(True) if self._lostMode: self._mode = self._lostMode if self._lostMode == DiffMode: self.actionDiffMode.trigger() elif self._lostMode == FileMode: self.actionFileMode.trigger() elif self._lostMode == AnnMode: self.actionAnnMode.trigger() self._lostMode = None self.blk.setVisible(self._mode != DiffMode) self.sci.setAnnotationEnabled(self._mode == AnnMode) if self._mode == DiffMode: self.sci.setMarginWidth(1, 0) lexer = lexers.get_diff_lexer(self) self.sci.setLexer(lexer) if lexer is None: self.sci.setFont(qtlib.getfont("fontlog").font()) # trim first three lines, for example: # diff -r f6bfc41af6d7 -r c1b18806486d tortoisehg/hgqt/thgrepo.py # --- a/tortoisehg/hgqt/thgrepo.py # +++ b/tortoisehg/hgqt/thgrepo.py if fd.diff: out = fd.diff.split("\n", 3) if len(out) == 4: self.sci.setText(hglib.tounicode(out[3])) else: # there was an error or rename without diffs self.sci.setText(hglib.tounicode(fd.diff)) elif fd.ucontents: # subrepo summary and perhaps other data self.sci.setText(fd.ucontents) self.sci.setLexer(None) self.sci.setFont(qtlib.getfont("fontlog").font()) self.sci.setMarginWidth(1, 0) self.blk.setVisible(False) return elif fd.contents: lexer = lexers.get_lexer(filename, fd.contents, self) self.sci.setLexer(lexer) if lexer is None: self.sci.setFont(qtlib.getfont("fontlog").font()) self.sci.setText(hglib.tounicode(fd.contents)) self.blk.setVisible(True) self.sci._updatemarginwidth() if self._mode == AnnMode: self.sci._updateannotation(self._ctx, filename) else: return # Recover the last cursor/scroll position self.sci.setCursorPosition(*lastCursorPosition) # Make sure that lastScrollPosition never exceeds the amount of # lines on the editor lastScrollPosition = min(lastScrollPosition, self.sci.lines() - 1) self.sci.verticalScrollBar().setValue(lastScrollPosition) self.highlightText(*self._lastSearch) uf = hglib.tounicode(filename) uc = hglib.tounicode(fd.contents) or "" self.fileDisplayed.emit(uf, uc) if self._mode != DiffMode: self.blk.setVisible(True) self.blk.syncPageStep() if fd.contents and fd.olddata: if self.timer.isActive(): self.timer.stop() self._fd = fd self.timer.start() self.actionNextDiff.setEnabled(bool(self._diffs)) self.actionPrevDiff.setEnabled(bool(self._diffs)) lexer = self.sci.lexer() if lexer: font = self.sci.lexer().font(0) else: font = self.sci.font() fm = QFontMetrics(font) self.maxWidth = fm.maxWidth() lines = unicode(self.sci.text()).splitlines() if lines: # assume that the longest line has the largest width; # fm.width() is too slow to apply to each line. try: longestline = max(lines, key=len) except TypeError: # Python<2.5 has no key support longestline = max((len(l), l) for l in lines)[1] self.maxWidth += fm.width(longestline) self.updateScrollBar()
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, 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 _initfont(self): tf = qtlib.getfont("fontoutputlog") tf.changed.connect(self.forwardFont) self.setFont(tf.font())
def _initfont(self): tf = qtlib.getfont('fontoutputlog') tf.changed.connect(self.forwardFont) self.setFont(tf.font())
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()
def __init__(self, repo, patches, parent): super(QFoldDialog, self).__init__(parent) 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) self.repo = repo 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.repo.configChanged.connect(self.configChanged) self._readsettings() self.msgte.setText(self.composeMsg(self.patches)) self.msgte.refresh(self.repo) self.focus = self.msgte
def __init__(self, repoagent, parent=None): QDialog.__init__(self, parent) self.setWindowTitle(_('Reorder Unapplied Patches')) self.setWindowFlags(Qt.Window) self.setWindowIcon(qtlib.geticon('hg-qreorder')) self._repoagent = repoagent self.cached = None repoagent.repositoryChanged.connect(self.refresh) layout = QVBoxLayout() layout.setMargin(4) self.setLayout(layout) hb = QHBoxLayout() hb.setMargin(2) lbl = QLabel(_('Repository:')) hb.addWidget(lbl) le = QLineEdit() hb.addWidget(le) le.setReadOnly(True) le.setFont(qtlib.getfont('fontlist').font()) le.setText(self.repo.displayname) le.setFocusPolicy(Qt.NoFocus) layout.addLayout(hb) hl = qtlib.LabeledSeparator('') layout.addWidget(hl) class PatchListWidget(QListWidget): menuRequested = pyqtSignal(QPoint, object) def __init__(self, parent): QListWidget.__init__(self, parent) self.setCurrentRow(0) def contextMenuEvent(self, event): i = self.item(self.currentRow()) if i: self.menuRequested.emit(event.globalPos(), i.patchname) def focusInEvent(self, e): i = self.item(self.currentRow()) if i: self.parent().parent().showSummary(i) QListWidget.focusInEvent(self, e) ugb = QGroupBox(_('Unapplied Patches - drag to reorder')) 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.ulw.menuRequested.connect(self.patchlistMenuRequest) layout.addWidget(ugb) agb = QGroupBox(_('Applied Patches')) agb.setLayout(QVBoxLayout()) agb.layout().setContentsMargins(*(0, ) * 4) self.alw = PatchListWidget(self) agb.layout().addWidget(self.alw) self.alw.currentItemChanged.connect( lambda: self.showSummary(self.alw.item(self.alw.currentRow()))) self.alw.menuRequested.connect(self.patchlistMenuRequest) layout.addWidget(agb) slbl = QLabel(_('Summary:')) layout.addWidget(slbl) self.summ = QTextEdit() self.summ.setFont(qtlib.getfont('fontcomment').font()) self.summ.setMinimumWidth(500) # min 80 chars self.summ.setMaximumHeight(100) self.summ.setReadOnly(True) self.summ.setFocusPolicy(Qt.NoFocus) layout.addWidget(self.summ) self._readsettings() self.refresh() # dialog buttons BB = QDialogButtonBox bb = QDialogButtonBox(BB.Ok | BB.Cancel) self.apply_button = bb.button(BB.Apply) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) bb.button(BB.Ok).setDefault(True) layout.addWidget(bb) self.alw.setCurrentRow(0) self.ulw.setCurrentRow(0) self.ulw.setFocus()
def setupViews(self): self.tableViews = { 'left': self.fileHistoryLeft, 'right': self.fileHistoryRight } # viewers are Scintilla editors self.viewers = {} # block are diff-block displayers self.block = {} self.diffblock = blockmatcher.BlockMatch(self.frame) lay = QHBoxLayout(self.frame) lay.setSpacing(0) lay.setContentsMargins(0, 0, 0, 0) try: contents = open(self.repo.wjoin(self.filename), "rb").read(1024) lexer = lexers.get_lexer(self.filename, contents, self) except Exception: lexer = None for side, idx in (('left', 0), ('right', 3)): sci = Scintilla(self.frame) sci.verticalScrollBar().setFocusPolicy(Qt.StrongFocus) sci.setFocusProxy(sci.verticalScrollBar()) sci.verticalScrollBar().installEventFilter(self) sci.setContextMenuPolicy(Qt.CustomContextMenu) sci.customContextMenuRequested.connect( functools.partial(self.fileViewMenuRequest, sci)) sci.setFrameShape(QFrame.NoFrame) sci.setMarginLineNumbers(1, True) sci.SendScintilla(sci.SCI_SETSELEOLFILLED, True) sci.setLexer(lexer) if lexer is None: sci.setFont(qtlib.getfont('fontdiff').font()) sci.setReadOnly(True) sci.setUtf8(True) lay.addWidget(sci) # hide margin 0 (markers) sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 0, 0) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 0, 0) # setup margin 1 for line numbers only sci.SendScintilla(sci.SCI_SETMARGINTYPEN, 1, 1) sci.SendScintilla(sci.SCI_SETMARGINWIDTHN, 1, 20) sci.SendScintilla(sci.SCI_SETMARGINMASKN, 1, 0) # define markers for colorize zones of diff self.markerplus = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markerplus, 0xB0FFA0) self.markerminus = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markerminus, 0xA0A0FF) self.markertriangle = sci.markerDefine(QsciScintilla.Background) sci.SendScintilla(sci.SCI_MARKERSETBACK, self.markertriangle, 0xFFA0A0) self.viewers[side] = sci blk = blockmatcher.BlockList(self.frame) blk.linkScrollBar(sci.verticalScrollBar()) self.diffblock.linkScrollBar(sci.verticalScrollBar(), side) lay.insertWidget(idx, blk) self.block[side] = blk lay.insertWidget(2, self.diffblock) for side in sides: table = getattr(self, 'tableView_revisions_%s' % side) table.setTabKeyNavigation(False) #table.installEventFilter(self) table.revisionSelected.connect(self.onRevisionSelected) table.revisionActivated.connect(self.onRevisionActivated) self.viewers[side].verticalScrollBar().valueChanged.connect( lambda value, side=side: self.sbar_changed( value, side, 'vertical')) self.viewers[side].horizontalScrollBar().valueChanged.connect( lambda value, side=side: self.sbar_changed( value, side, 'horizontal')) self.setTabOrder(table, self.viewers['left']) self.setTabOrder(self.viewers['left'], self.viewers['right']) # timer used to fill viewers with diff block markers during GUI idle time self.timer = QTimer() self.timer.setSingleShot(False) self.timer.timeout.connect(self.idle_fill_files)
def __init__(self, repo, embedded=False, parent=None): super(QQueueDialog, self).__init__(parent) self.setWindowIcon(qtlib.geticon('thg-mq')) self.setWindowTitle(_('Manage MQ patch queues')) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.repo = repo repo.repositoryChanged.connect(self.reload) self.needsRefresh = False layout = QVBoxLayout() layout.setMargin(4) self.setLayout(layout) hbr = QHBoxLayout() hbr.setMargin(2) layout.addLayout(hbr) rlbl = QLabel(_('Repository:')) hbr.addWidget(rlbl) rle = QLineEdit() hbr.addWidget(rle) rle.setFont(qtlib.getfont('fontlist').font()) rle.setText(repo.displayname) rle.setReadOnly(True) rle.setFocusPolicy(Qt.NoFocus) topsep = qtlib.LabeledSeparator('') layout.addWidget(topsep) hbl = QHBoxLayout() hbl.setMargin(2) layout.addLayout(hbl) qvb = QVBoxLayout() hbl.addLayout(qvb) qlbl = QLabel(_('Patch queues:')) qvb.addWidget(qlbl) ql = QListWidget(self) qvb.addWidget(ql) ql.currentRowChanged.connect(self.updateUI) vbb = QVBoxLayout() vbb.setMargin(2) qvb.addLayout(vbb) hqbtntop = QHBoxLayout() vbb.addLayout(hqbtntop) hqbtnmid = QHBoxLayout() vbb.addLayout(hqbtnmid) hqbtnbot = QHBoxLayout() vbb.addLayout(hqbtnbot) btrel = QPushButton(_('Reload')) btrel.clicked.connect(self.reload) hqbtntop.addWidget(btrel) btact = QPushButton(_('Activate')) btact.clicked.connect(self.qqueueActivate) hqbtntop.addWidget(btact) btadd = QPushButton(_('Add')) btadd.clicked.connect(self.qqueueAdd) hqbtnmid.addWidget(btadd) btren = QPushButton(_('Rename')) btren.clicked.connect(self.qqueueRename) hqbtnmid.addWidget(btren) btdel = QPushButton(_('Delete')) btdel.clicked.connect(self.qqueueDelete) hqbtnbot.addWidget(btdel) btpur = QPushButton(_('Purge')) btpur.clicked.connect(self.qqueuePurge) hqbtnbot.addWidget(btpur) pvb = QVBoxLayout() hbl.addLayout(pvb) plbl = QLabel(_('Patches:')) pvb.addWidget(plbl) pl = QListWidget(self) pvb.addWidget(pl) botsep = qtlib.LabeledSeparator('') layout.addWidget(botsep) cmd = cmdui.Runner(not embedded, self) cmd.setTitle(_('QQueue')) cmd.output.connect(self.output) cmd.makeLogVisible.connect(self.makeLogVisible) cmd.commandFinished.connect(self.qqcmdFinished) BB = QDialogButtonBox bb = QDialogButtonBox(BB.Close) bb.button(BB.Close).clicked.connect(self.close) layout.addWidget(bb) self.setLayout(layout) self.ql = ql self.pl = pl self.btrel = btrel self.btact = btact self.btadd = btadd self.btren = btren self.btdel = btdel self.btpur = btpur self.bb = bb self.cmd = cmd self.itemfont = None self.itemfontbold = None self._readsettings() self.reload() self.ql.setFocus()