/tortoisehg/hgqt/qfold.py
https://bitbucket.org/tortoisehg/hgtk/ · Python · 188 lines · 148 code · 32 blank · 8 comment · 12 complexity · 7ea98034348739153b85aad448cb6a8e MD5 · raw file
- # qfold.py - QFold dialog for TortoiseHg
- #
- # Copyright 2010 Steve Borho <steve@borho.org>
- # Copyright 2010 Johan Samyn <johan.samyn@gmail.com>
- #
- # This software may be used and distributed according to the terms of the
- # GNU General Public License version 2, incorporated herein by reference.
- import os
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from PyQt4.Qsci import QsciScintilla, QsciAPIs, QsciLexerMakefile
- from hgext import mq
- from tortoisehg.util import hglib
- from tortoisehg.hgqt.i18n import _
- from tortoisehg.hgqt import cmdui, qscilib, qtlib
- from tortoisehg.hgqt.commit import MessageEntry
- class QFoldDialog(QDialog):
- output = pyqtSignal(QString, QString)
- makeLogVisible = pyqtSignal(bool)
- def __init__(self, repo, patches, parent):
- super(QFoldDialog, self).__init__(parent)
- self.setWindowTitle(_('Patch fold - %s') % repo.displayname)
- f = self.windowFlags()
- self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint)
- self.setLayout(QVBoxLayout())
- mlbl = QLabel(_('New patch message:'))
- self.layout().addWidget(mlbl)
- self.msgte = MessageEntry()
- self.msgte.setContextMenuPolicy(Qt.CustomContextMenu)
- self.msgte.customContextMenuRequested.connect(self.menuRequested)
- 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.parse_series()
- 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()
- 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 showSummary(self, item):
- patchname = hglib.fromunicode(item.text())
- txt = '\n'.join(mq.patchheader(self.repo.mq.join(patchname)).message)
- self.summ.setText(hglib.tounicode(txt))
- def composeMsg(self, patches):
- return '\n* * *\n'.join(
- [self.repo.changectx('qtip').description()]
- + [self.repo.changectx(p).description() for p in patches])
- def getMessage(self):
- text = self.msgte.text()
- try:
- text = hglib.fromunicode(text, 'strict')
- except UnicodeEncodeError:
- pass # TODO (see commit.py)
- return text
- def configChanged(self):
- '''Repository is reporting its config files have changed'''
- self.msgte.refresh(self.repo)
- def accept(self):
- self._writesettings()
- self.bbox.setDisabled(True)
- cmdline = ['qfold', '--repository', self.repo.root]
- if self.keepchk.isChecked():
- cmdline += ['--keep']
- cmdline += ['--message', self.getMessage()]
- cmdline += ['--']
- cmdline += self.ulw.getPatchList()
- def finished():
- self.repo.decrementBusyCount()
- QDialog.accept(self)
- self.repo.incrementBusyCount()
- self.cmd.commandFinished.connect(finished)
- self.cmd.run(cmdline)
- def menuRequested(self, point):
- line = self.msgte.lineAt(point)
- point = self.msgte.mapToGlobal(point)
- def apply():
- line = 0
- while True:
- line = self.mste.reflowBlock(line)
- if line is None:
- break;
- def settings():
- from tortoisehg.hgqt.settings import SettingsDialog
- dlg = SettingsDialog(True, focus='tortoisehg.summarylen')
- dlg.exec_()
- menu = self.msgte.createStandardContextMenu()
- menu.addSeparator()
- for name, func in [(_('App&ly Format'), apply),
- (_('C&onfigure Format'), settings)]:
- def add(name, func):
- action = menu.addAction(name)
- action.triggered.connect(lambda: func())
- add(name, func)
- return menu.exec_(point)
- def closeEvent(self, event):
- self._writesettings()
- super(QFoldDialog, self).closeEvent(event)
- def _readsettings(self):
- s = QSettings()
- self.restoreGeometry(s.value('qfold/geom').toByteArray())
- def _writesettings(self):
- s = QSettings()
- s.setValue('qfold/geom', self.saveGeometry())