/tortoisehg/hgqt/qfold.py

https://bitbucket.org/tortoisehg/hgtk/ · Python · 188 lines · 148 code · 32 blank · 8 comment · 12 complexity · 7ea98034348739153b85aad448cb6a8e MD5 · raw file

  1. # qfold.py - QFold dialog for TortoiseHg
  2. #
  3. # Copyright 2010 Steve Borho <steve@borho.org>
  4. # Copyright 2010 Johan Samyn <johan.samyn@gmail.com>
  5. #
  6. # This software may be used and distributed according to the terms of the
  7. # GNU General Public License version 2, incorporated herein by reference.
  8. import os
  9. from PyQt4.QtCore import *
  10. from PyQt4.QtGui import *
  11. from PyQt4.Qsci import QsciScintilla, QsciAPIs, QsciLexerMakefile
  12. from hgext import mq
  13. from tortoisehg.util import hglib
  14. from tortoisehg.hgqt.i18n import _
  15. from tortoisehg.hgqt import cmdui, qscilib, qtlib
  16. from tortoisehg.hgqt.commit import MessageEntry
  17. class QFoldDialog(QDialog):
  18. output = pyqtSignal(QString, QString)
  19. makeLogVisible = pyqtSignal(bool)
  20. def __init__(self, repo, patches, parent):
  21. super(QFoldDialog, self).__init__(parent)
  22. self.setWindowTitle(_('Patch fold - %s') % repo.displayname)
  23. f = self.windowFlags()
  24. self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint)
  25. self.setLayout(QVBoxLayout())
  26. mlbl = QLabel(_('New patch message:'))
  27. self.layout().addWidget(mlbl)
  28. self.msgte = MessageEntry()
  29. self.msgte.setContextMenuPolicy(Qt.CustomContextMenu)
  30. self.msgte.customContextMenuRequested.connect(self.menuRequested)
  31. self.msgte.installEventFilter(qscilib.KeyPressInterceptor(self))
  32. self.layout().addWidget(self.msgte)
  33. self.keepchk = QCheckBox(_('Keep patch files'))
  34. self.keepchk.setChecked(True)
  35. self.layout().addWidget(self.keepchk)
  36. self.repo = repo
  37. q = self.repo.mq
  38. q.parse_series()
  39. self.patches = [p for p in q.series if p in patches]
  40. class PatchListWidget(QListWidget):
  41. def __init__(self, parent):
  42. QListWidget.__init__(self, parent)
  43. self.setCurrentRow(0)
  44. def focusInEvent(self, event):
  45. i = self.item(self.currentRow())
  46. if i:
  47. self.parent().parent().showSummary(i)
  48. QListWidget.focusInEvent(self, event)
  49. def dropEvent(self, event):
  50. QListWidget.dropEvent(self, event)
  51. spp = self.parent().parent()
  52. spp.msgte.setText(spp.composeMsg(self.getPatchList()))
  53. def getPatchList(self):
  54. return [hglib.fromunicode(self.item(i).text()) \
  55. for i in xrange(0, self.count())]
  56. ugb = QGroupBox(_('Patches to fold'))
  57. ugb.setLayout(QVBoxLayout())
  58. ugb.layout().setContentsMargins(*(0,)*4)
  59. self.ulw = PatchListWidget(self)
  60. self.ulw.setDragDropMode(QListView.InternalMove)
  61. ugb.layout().addWidget(self.ulw)
  62. self.ulw.currentItemChanged.connect(lambda:
  63. self.showSummary(self.ulw.item(self.ulw.currentRow())))
  64. self.layout().addWidget(ugb)
  65. for p in self.patches:
  66. item = QListWidgetItem(hglib.tounicode(p))
  67. item.setFlags(Qt.ItemIsSelectable |
  68. Qt.ItemIsEnabled |
  69. Qt.ItemIsDragEnabled)
  70. self.ulw.addItem(item)
  71. slbl = QLabel(_('Summary:'))
  72. self.layout().addWidget(slbl)
  73. self.summ = QTextEdit()
  74. self.summ.setFont(qtlib.getfont('fontcomment').font())
  75. self.summ.setMaximumHeight(80)
  76. self.summ.setReadOnly(True)
  77. self.summ.setFocusPolicy(Qt.NoFocus)
  78. self.layout().addWidget(self.summ)
  79. self.cmd = cmdui.Runner()
  80. self.cmd.output.connect(self.output)
  81. self.cmd.makeLogVisible.connect(self.makeLogVisible)
  82. BB = QDialogButtonBox
  83. bbox = QDialogButtonBox(BB.Ok|BB.Cancel)
  84. bbox.accepted.connect(self.accept)
  85. bbox.rejected.connect(self.reject)
  86. self.layout().addWidget(bbox)
  87. self.bbox = bbox
  88. self.repo.configChanged.connect(self.configChanged)
  89. self._readsettings()
  90. self.msgte.setText(self.composeMsg(self.patches))
  91. self.msgte.refresh(self.repo)
  92. self.focus = self.msgte
  93. def showSummary(self, item):
  94. patchname = hglib.fromunicode(item.text())
  95. txt = '\n'.join(mq.patchheader(self.repo.mq.join(patchname)).message)
  96. self.summ.setText(hglib.tounicode(txt))
  97. def composeMsg(self, patches):
  98. return '\n* * *\n'.join(
  99. [self.repo.changectx('qtip').description()]
  100. + [self.repo.changectx(p).description() for p in patches])
  101. def getMessage(self):
  102. text = self.msgte.text()
  103. try:
  104. text = hglib.fromunicode(text, 'strict')
  105. except UnicodeEncodeError:
  106. pass # TODO (see commit.py)
  107. return text
  108. def configChanged(self):
  109. '''Repository is reporting its config files have changed'''
  110. self.msgte.refresh(self.repo)
  111. def accept(self):
  112. self._writesettings()
  113. self.bbox.setDisabled(True)
  114. cmdline = ['qfold', '--repository', self.repo.root]
  115. if self.keepchk.isChecked():
  116. cmdline += ['--keep']
  117. cmdline += ['--message', self.getMessage()]
  118. cmdline += ['--']
  119. cmdline += self.ulw.getPatchList()
  120. def finished():
  121. self.repo.decrementBusyCount()
  122. QDialog.accept(self)
  123. self.repo.incrementBusyCount()
  124. self.cmd.commandFinished.connect(finished)
  125. self.cmd.run(cmdline)
  126. def menuRequested(self, point):
  127. line = self.msgte.lineAt(point)
  128. point = self.msgte.mapToGlobal(point)
  129. def apply():
  130. line = 0
  131. while True:
  132. line = self.mste.reflowBlock(line)
  133. if line is None:
  134. break;
  135. def settings():
  136. from tortoisehg.hgqt.settings import SettingsDialog
  137. dlg = SettingsDialog(True, focus='tortoisehg.summarylen')
  138. dlg.exec_()
  139. menu = self.msgte.createStandardContextMenu()
  140. menu.addSeparator()
  141. for name, func in [(_('App&ly Format'), apply),
  142. (_('C&onfigure Format'), settings)]:
  143. def add(name, func):
  144. action = menu.addAction(name)
  145. action.triggered.connect(lambda: func())
  146. add(name, func)
  147. return menu.exec_(point)
  148. def closeEvent(self, event):
  149. self._writesettings()
  150. super(QFoldDialog, self).closeEvent(event)
  151. def _readsettings(self):
  152. s = QSettings()
  153. self.restoreGeometry(s.value('qfold/geom').toByteArray())
  154. def _writesettings(self):
  155. s = QSettings()
  156. s.setValue('qfold/geom', self.saveGeometry())