14 except NameError: |
14 except NameError: |
15 pass |
15 pass |
16 |
16 |
17 import os |
17 import os |
18 |
18 |
19 from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer |
19 from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer, QSize |
20 from PyQt5.QtGui import QTextCursor |
20 from PyQt5.QtGui import QTextCursor |
21 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QMenu, QHeaderView, \ |
21 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QMenu, QHeaderView, \ |
22 QTreeWidgetItem, QLineEdit |
22 QTreeWidgetItem, QLineEdit |
23 |
23 |
24 from E5Gui.E5Application import e5App |
24 from E5Gui.E5Application import e5App |
75 self.process = QProcess() |
74 self.process = QProcess() |
76 self.process.finished.connect(self.__procFinished) |
75 self.process.finished.connect(self.__procFinished) |
77 self.process.readyReadStandardOutput.connect(self.__readStdout) |
76 self.process.readyReadStandardOutput.connect(self.__readStdout) |
78 self.process.readyReadStandardError.connect(self.__readStderr) |
77 self.process.readyReadStandardError.connect(self.__readStderr) |
79 |
78 |
80 self.diffSplitter.setSizes([350, 350]) |
79 self.diffSplitter.setSizes([300, 300]) |
81 self.__diffSplitterState = None |
|
82 |
80 |
83 self.statusList.headerItem().setText(self.__lastColumn, "") |
81 self.statusList.headerItem().setText(self.__lastColumn, "") |
84 self.statusList.header().setSortIndicator( |
82 self.statusList.header().setSortIndicator( |
85 self.__pathColumn, Qt.AscendingOrder) |
83 self.__pathColumn, Qt.AscendingOrder) |
86 |
84 |
196 'R': self.tr('removed'), |
194 'R': self.tr('removed'), |
197 '?': self.tr('not tracked'), |
195 '?': self.tr('not tracked'), |
198 '!': self.tr('missing'), |
196 '!': self.tr('missing'), |
199 } |
197 } |
200 |
198 |
|
199 def closeEvent(self, e): |
|
200 """ |
|
201 Protected slot implementing a close event handler. |
|
202 |
|
203 @param e close event (QCloseEvent) |
|
204 """ |
|
205 if self.__hgClient: |
|
206 if self.__hgClient.isExecuting(): |
|
207 self.__hgClient.cancel() |
|
208 else: |
|
209 if self.process is not None and \ |
|
210 self.process.state() != QProcess.NotRunning: |
|
211 self.process.terminate() |
|
212 QTimer.singleShot(2000, self.process.kill) |
|
213 self.process.waitForFinished(3000) |
|
214 |
|
215 if self.__mq: |
|
216 self.vcs.getPlugin().setPreferences( |
|
217 "MqStatusDialogGeometry", self.saveGeometry()) |
|
218 self.vcs.getPlugin().setPreferences( |
|
219 "MqStatusDialogSplitterState", self.diffSplitter.saveState()) |
|
220 else: |
|
221 self.vcs.getPlugin().setPreferences( |
|
222 "StatusDialogGeometry", self.saveGeometry()) |
|
223 self.vcs.getPlugin().setPreferences( |
|
224 "StatusDialogSplitterState", self.diffSplitter.saveState()) |
|
225 |
|
226 e.accept() |
|
227 |
|
228 def show(self): |
|
229 """ |
|
230 Public slot to show the dialog. |
|
231 """ |
|
232 super(HgStatusDialog, self).show() |
|
233 |
|
234 if self.__mq: |
|
235 geom = self.vcs.getPlugin().getPreferences( |
|
236 "MqStatusDialogGeometry") |
|
237 else: |
|
238 geom = self.vcs.getPlugin().getPreferences( |
|
239 "StatusDialogGeometry") |
|
240 if geom.isEmpty(): |
|
241 s = QSize(800, 600) |
|
242 self.resize(s) |
|
243 else: |
|
244 self.restoreGeometry(geom) |
|
245 |
|
246 if self.__mq: |
|
247 diffSplitterState = self.vcs.getPlugin().getPreferences( |
|
248 "MqStatusDialogSplitterState") |
|
249 else: |
|
250 diffSplitterState = self.vcs.getPlugin().getPreferences( |
|
251 "StatusDialogSplitterState") |
|
252 if diffSplitterState is not None: |
|
253 self.diffSplitter.restoreState(diffSplitterState) |
|
254 |
201 def __activeExtensionsChanged(self): |
255 def __activeExtensionsChanged(self): |
202 """ |
256 """ |
203 Private slot handling a change in the activated extensions. |
257 Private slot handling a change in the activated extensions. |
204 """ |
258 """ |
205 if self.vcs.isExtensionActive("largefiles"): |
259 if self.vcs.isExtensionActive("largefiles"): |
206 if self.addButton.menu() is None: |
260 if self.addButton.menu() is None: |
207 self.addButton.setMenu(self.__addButtonMenu) |
261 self.addButton.setMenu(self.__addButtonMenu) |
208 else: |
262 else: |
209 if self.addButton.menu() is not None: |
263 if self.addButton.menu() is not None: |
210 self.addButton.setMenu(None) |
264 self.addButton.setMenu(None) |
211 |
|
212 def show(self): |
|
213 """ |
|
214 Public slot to show the dialog. |
|
215 """ |
|
216 super(HgStatusDialog, self).show() |
|
217 |
|
218 if not self.__mq and self.__diffSplitterState: |
|
219 self.diffSplitter.restoreState(self.__diffSplitterState) |
|
220 |
265 |
221 def __resort(self): |
266 def __resort(self): |
222 """ |
267 """ |
223 Private method to resort the tree. |
268 Private method to resort the tree. |
224 """ |
269 """ |
257 itm.setFlags(itm.flags() & ~Qt.ItemIsUserCheckable) |
302 itm.setFlags(itm.flags() & ~Qt.ItemIsUserCheckable) |
258 |
303 |
259 if statusText not in self.__statusFilters: |
304 if statusText not in self.__statusFilters: |
260 self.__statusFilters.append(statusText) |
305 self.__statusFilters.append(statusText) |
261 |
306 |
262 def closeEvent(self, e): |
|
263 """ |
|
264 Protected slot implementing a close event handler. |
|
265 |
|
266 @param e close event (QCloseEvent) |
|
267 """ |
|
268 if self.__hgClient: |
|
269 if self.__hgClient.isExecuting(): |
|
270 self.__hgClient.cancel() |
|
271 else: |
|
272 if self.process is not None and \ |
|
273 self.process.state() != QProcess.NotRunning: |
|
274 self.process.terminate() |
|
275 QTimer.singleShot(2000, self.process.kill) |
|
276 self.process.waitForFinished(3000) |
|
277 |
|
278 if not self.__mq: |
|
279 self.__diffSplitterState = self.diffSplitter.saveState() |
|
280 |
|
281 e.accept() |
|
282 |
|
283 def start(self, fn): |
307 def start(self, fn): |
284 """ |
308 """ |
285 Public slot to start the hg status command. |
309 Public slot to start the hg status command. |
286 |
310 |
287 @param fn filename(s)/directoryname(s) to show the status of |
311 @param fn filename(s)/directoryname(s) to show the status of |