Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py

branch
Py2 comp.
changeset 3484
645c12de6b0c
parent 3178
f25fc1364c88
parent 3359
6b6c224d67d6
child 3591
2f2a4a76dd22
equal deleted inserted replaced
3456:96232974dcdb 3484:645c12de6b0c
12 import os 12 import os
13 import sys 13 import sys
14 14
15 import pysvn 15 import pysvn
16 16
17 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot 17 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot, QPoint
18 from PyQt4.QtGui import QCursor, QHeaderView, QDialog, QApplication, \ 18 from PyQt4.QtGui import QCursor, QHeaderView, QWidget, QApplication, \
19 QDialogButtonBox, QTreeWidgetItem 19 QDialogButtonBox, QTreeWidgetItem
20 20
21 from E5Gui import E5MessageBox 21 from E5Gui import E5MessageBox
22 22
23 from .SvnUtilities import formatTime, dateFromTime_t 23 from .SvnUtilities import formatTime, dateFromTime_t
24 from .SvnDialogMixin import SvnDialogMixin 24 from .SvnDialogMixin import SvnDialogMixin
25 25
26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog 26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog
27 27
28 28
29 class SvnLogBrowserDialog(QDialog, SvnDialogMixin, Ui_SvnLogBrowserDialog): 29 class SvnLogBrowserDialog(QWidget, SvnDialogMixin, Ui_SvnLogBrowserDialog):
30 """ 30 """
31 Class implementing a dialog to browse the log history. 31 Class implementing a dialog to browse the log history.
32 """ 32 """
33 def __init__(self, vcs, isFile=False, parent=None): 33 def __init__(self, vcs, parent=None):
34 """ 34 """
35 Constructor 35 Constructor
36 36
37 @param vcs reference to the vcs object 37 @param vcs reference to the vcs object
38 @param isFile flag indicating log for a file is to be shown (boolean)
39 @param parent parent widget (QWidget) 38 @param parent parent widget (QWidget)
40 """ 39 """
41 super(SvnLogBrowserDialog, self).__init__(parent) 40 super(SvnLogBrowserDialog, self).__init__(parent)
42 self.setupUi(self) 41 self.setupUi(self)
43 SvnDialogMixin.__init__(self) 42 SvnDialogMixin.__init__(self)
44 43
44 self.__position = QPoint()
45
45 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) 46 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
46 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) 47 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
47 48
48 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") 49 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
49 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) 50 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder)
50 51
51 self.sbsCheckBox.setEnabled(isFile)
52 self.sbsCheckBox.setVisible(isFile)
53
54 self.vcs = vcs 52 self.vcs = vcs
55 53
56 self.__maxDate = QDate() 54 self.__initData()
57 self.__minDate = QDate()
58 self.__filterLogsEnabled = True
59 55
60 self.fromDate.setDisplayFormat("yyyy-MM-dd") 56 self.fromDate.setDisplayFormat("yyyy-MM-dd")
61 self.toDate.setDisplayFormat("yyyy-MM-dd") 57 self.toDate.setDisplayFormat("yyyy-MM-dd")
62 self.fromDate.setDate(QDate.currentDate()) 58 self.__resetUI()
63 self.toDate.setDate(QDate.currentDate())
64 self.fieldCombo.setCurrentIndex(
65 self.fieldCombo.findText(self.trUtf8("Message")))
66 self.limitSpinBox.setValue(
67 self.vcs.getPlugin().getPreferences("LogLimit"))
68 self.stopCheckBox.setChecked(
69 self.vcs.getPlugin().getPreferences("StopLogOnCopy"))
70 59
71 self.__messageRole = Qt.UserRole 60 self.__messageRole = Qt.UserRole
72 self.__changesRole = Qt.UserRole + 1 61 self.__changesRole = Qt.UserRole + 1
73 62
74 self.flags = { 63 self.flags = {
75 'A': self.trUtf8('Added'), 64 'A': self.tr('Added'),
76 'D': self.trUtf8('Deleted'), 65 'D': self.tr('Deleted'),
77 'M': self.trUtf8('Modified'), 66 'M': self.tr('Modified'),
78 'R': self.trUtf8('Replaced'), 67 'R': self.tr('Replaced'),
79 } 68 }
80
81 self.diff = None
82 self.__lastRev = 0
83 69
84 self.client = self.vcs.getClient() 70 self.client = self.vcs.getClient()
85 self.client.callback_cancel = \ 71 self.client.callback_cancel = \
86 self._clientCancelCallback 72 self._clientCancelCallback
87 self.client.callback_get_login = \ 73 self.client.callback_get_login = \
88 self._clientLoginCallback 74 self._clientLoginCallback
89 self.client.callback_ssl_server_trust_prompt = \ 75 self.client.callback_ssl_server_trust_prompt = \
90 self._clientSslServerTrustPromptCallback 76 self._clientSslServerTrustPromptCallback
91 77
78 def __initData(self):
79 """
80 Private method to (re-)initialize some data.
81 """
82 self.__maxDate = QDate()
83 self.__minDate = QDate()
84 self.__filterLogsEnabled = True
85
86 self.diff = None
87 self.__lastRev = 0
88
89 def closeEvent(self, e):
90 """
91 Private slot implementing a close event handler.
92
93 @param e close event (QCloseEvent)
94 """
95 self.__position = self.pos()
96
97 e.accept()
98
99 def show(self):
100 """
101 Public slot to show the dialog.
102 """
103 if not self.__position.isNull():
104 self.move(self.__position)
105 self.__resetUI()
106
107 super(SvnLogBrowserDialog, self).show()
108
109 def __resetUI(self):
110 """
111 Private method to reset the user interface.
112 """
113 self.fromDate.setDate(QDate.currentDate())
114 self.toDate.setDate(QDate.currentDate())
115 self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(
116 self.tr("Message")))
117 self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
118 "LogLimit"))
119 self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences(
120 "StopLogOnCopy"))
121
122 self.logTree.clear()
123
124 self.nextButton.setEnabled(True)
125 self.limitSpinBox.setEnabled(True)
126
92 def _reset(self): 127 def _reset(self):
93 """ 128 """
94 Protected method to reset the internal state of the dialog. 129 Protected method to reset the internal state of the dialog.
95 """ 130 """
96 SvnDialogMixin._reset(self) 131 SvnDialogMixin._reset(self)
298 locker.unlock() 333 locker.unlock()
299 self.__showError(e.args[0]) 334 self.__showError(e.args[0])
300 os.chdir(cwd) 335 os.chdir(cwd)
301 self.__finish() 336 self.__finish()
302 337
303 def start(self, fn): 338 def start(self, fn, isFile=False):
304 """ 339 """
305 Public slot to start the svn log command. 340 Public slot to start the svn log command.
306 341
307 @param fn filename to show the log for (string) 342 @param fn filename to show the log for (string)
308 """ 343 @keyparam isFile flag indicating log for a file is to be shown
344 (boolean)
345 """
346 self.sbsCheckBox.setEnabled(isFile)
347 self.sbsCheckBox.setVisible(isFile)
348
349 self.__initData()
350
309 self.filename = fn 351 self.filename = fn
310 self.dname, self.fname = self.vcs.splitPath(fn) 352 self.dname, self.fname = self.vcs.splitPath(fn)
311 353
312 self.activateWindow() 354 self.activateWindow()
313 self.raise_() 355 self.raise_()
366 Private slot called, when the current item of the log tree changes. 408 Private slot called, when the current item of the log tree changes.
367 409
368 @param current reference to the new current item (QTreeWidgetItem) 410 @param current reference to the new current item (QTreeWidgetItem)
369 @param previous reference to the old current item (QTreeWidgetItem) 411 @param previous reference to the old current item (QTreeWidgetItem)
370 """ 412 """
371 self.messageEdit.setPlainText(current.data(0, self.__messageRole)) 413 if current is not None:
372 414 self.messageEdit.setPlainText(current.data(0, self.__messageRole))
373 self.filesTree.clear() 415
374 changes = current.data(0, self.__changesRole) 416 self.filesTree.clear()
375 if len(changes) > 0: 417 changes = current.data(0, self.__changesRole)
376 for change in changes: 418 if len(changes) > 0:
377 self.__generateFileItem( 419 for change in changes:
378 change["action"], change["path"], 420 self.__generateFileItem(
379 change["copyfrom_path"], change["copyfrom_revision"]) 421 change["action"], change["path"],
380 self.__resizeColumnsFiles() 422 change["copyfrom_path"], change["copyfrom_revision"])
381 self.__resortFiles() 423 self.__resizeColumnsFiles()
424 self.__resortFiles()
382 425
383 self.diffPreviousButton.setEnabled( 426 self.diffPreviousButton.setEnabled(
384 current != self.logTree.topLevelItem( 427 current != self.logTree.topLevelItem(
385 self.logTree.topLevelItemCount() - 1)) 428 self.logTree.topLevelItemCount() - 1))
386 429
453 496
454 @param msg error message to show (string) 497 @param msg error message to show (string)
455 """ 498 """
456 E5MessageBox.critical( 499 E5MessageBox.critical(
457 self, 500 self,
458 self.trUtf8("Subversion Error"), 501 self.tr("Subversion Error"),
459 msg) 502 msg)
460 503
461 @pyqtSlot(QDate) 504 @pyqtSlot(QDate)
462 def on_fromDate_dateChanged(self, date): 505 def on_fromDate_dateChanged(self, date):
463 """ 506 """
500 """ 543 """
501 if self.__filterLogsEnabled: 544 if self.__filterLogsEnabled:
502 from_ = self.fromDate.date().toString("yyyy-MM-dd") 545 from_ = self.fromDate.date().toString("yyyy-MM-dd")
503 to_ = self.toDate.date().addDays(1).toString("yyyy-MM-dd") 546 to_ = self.toDate.date().addDays(1).toString("yyyy-MM-dd")
504 txt = self.fieldCombo.currentText() 547 txt = self.fieldCombo.currentText()
505 if txt == self.trUtf8("Author"): 548 if txt == self.tr("Author"):
506 fieldIndex = 1 549 fieldIndex = 1
507 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) 550 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive)
508 elif txt == self.trUtf8("Revision"): 551 elif txt == self.tr("Revision"):
509 fieldIndex = 0 552 fieldIndex = 0
510 txt = self.rxEdit.text() 553 txt = self.rxEdit.text()
511 if txt.startswith("^"): 554 if txt.startswith("^"):
512 searchRx = QRegExp( 555 searchRx = QRegExp(
513 "^\s*{0}".format(txt[1:]), Qt.CaseInsensitive) 556 "^\s*{0}".format(txt[1:]), Qt.CaseInsensitive)

eric ide

mercurial