|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog used by the queue management functions. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import pyqtSlot, QProcess |
|
11 from PyQt4.QtGui import QDialog, QDialogButtonBox, QAbstractItemView, QListWidgetItem, \ |
|
12 QAbstractButton |
|
13 |
|
14 from .Ui_HgQueuesQueueManagementDialog import Ui_HgQueuesQueueManagementDialog |
|
15 |
|
16 import Preferences |
|
17 |
|
18 |
|
19 class HgQueuesQueueManagementDialog(QDialog, Ui_HgQueuesQueueManagementDialog): |
|
20 """ |
|
21 Class implementing a dialog used by the queue management functions. |
|
22 """ |
|
23 NO_INPUT = 0 |
|
24 NAME_INPUT = 1 |
|
25 QUEUE_INPUT = 2 |
|
26 |
|
27 def __init__(self, mode, title, suppressActive, repodir, parent=None): |
|
28 """ |
|
29 Constructor |
|
30 |
|
31 @param mode mode of the dialog (HgQueuesQueueManagementDialog.NO_INPUT |
|
32 HgQueuesQueueManagementDialog.NAME_INPUT, |
|
33 HgQueuesQueueManagementDialog.QUEUE_INPUT) |
|
34 @param title title for the dialog (string) |
|
35 @param suppressActive flag indicating to not show the name of the active |
|
36 queue (boolean) |
|
37 @param repodir name of the repository directory (string) |
|
38 @param parent reference to the parent widget (QWidget) |
|
39 """ |
|
40 QDialog.__init__(self, parent) |
|
41 self.setupUi(self) |
|
42 |
|
43 if mode not in (HgQueuesQueueManagementDialog.NO_INPUT, |
|
44 HgQueuesQueueManagementDialog.NAME_INPUT, |
|
45 HgQueuesQueueManagementDialog.QUEUE_INPUT): |
|
46 raise ValueError("illegal value for mode") |
|
47 |
|
48 self.__mode = mode |
|
49 self.__repodir = repodir |
|
50 self.__suppressActive = suppressActive |
|
51 |
|
52 self.inputFrame.setHidden(mode != HgQueuesQueueManagementDialog.NAME_INPUT) |
|
53 self.selectLabel.setHidden(mode != HgQueuesQueueManagementDialog.QUEUE_INPUT) |
|
54 if mode != HgQueuesQueueManagementDialog.QUEUE_INPUT: |
|
55 self.queuesList.setSelectionMode(QAbstractItemView.NoSelection) |
|
56 |
|
57 if mode == HgQueuesQueueManagementDialog.NO_INPUT: |
|
58 self.buttonBox.removeButton(self.buttonBox.button(QDialogButtonBox.Ok)) |
|
59 self.buttonBox.removeButton(self.buttonBox.button(QDialogButtonBox.Cancel)) |
|
60 self.refreshButton = self.buttonBox.addButton( |
|
61 self.trUtf8("Refresh"), QDialogButtonBox.ActionRole) |
|
62 self.refreshButton.setToolTip( |
|
63 self.trUtf8("Press to refresh the queues list")) |
|
64 self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) |
|
65 else: |
|
66 self.buttonBox.removeButton(self.buttonBox.button(QDialogButtonBox.Close)) |
|
67 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) |
|
68 self.refreshButton = None |
|
69 |
|
70 self.setWindowTitle(title) |
|
71 |
|
72 self.refresh() |
|
73 |
|
74 def __getQueuesList(self): |
|
75 """ |
|
76 Public method to get a list of all queues and the name of the active queue. |
|
77 |
|
78 @return tuple with a list of all queues and the name of the active queue |
|
79 (list of strings, string) |
|
80 """ |
|
81 queuesList = [] |
|
82 activeQueue = "" |
|
83 |
|
84 ioEncoding = Preferences.getSystem("IOEncoding") |
|
85 process = QProcess() |
|
86 args = [] |
|
87 args.append("qqueue") |
|
88 args.append("--list") |
|
89 |
|
90 process.setWorkingDirectory(self.__repodir) |
|
91 process.start('hg', args) |
|
92 procStarted = process.waitForStarted() |
|
93 if procStarted: |
|
94 finished = process.waitForFinished(30000) |
|
95 if finished and process.exitCode() == 0: |
|
96 output = \ |
|
97 str(process.readAllStandardOutput(), ioEncoding, 'replace') |
|
98 for queue in output.splitlines(): |
|
99 queue = queue.strip() |
|
100 if queue.endswith("(active)"): |
|
101 queue = queue.rsplit(None, 1)[0] |
|
102 activeQueue = queue |
|
103 queuesList.append(queue) |
|
104 |
|
105 if self.__suppressActive: |
|
106 if activeQueue in queuesList: |
|
107 queuesList.remove(activeQueue) |
|
108 activeQueue = "" |
|
109 return queuesList, activeQueue |
|
110 |
|
111 @pyqtSlot(str) |
|
112 def on_nameEdit_textChanged(self, txt): |
|
113 """ |
|
114 Private slot to handle changes of the entered queue name. |
|
115 """ |
|
116 if self.__mode == HgQueuesQueueManagementDialog.NAME_INPUT: |
|
117 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(txt != "") |
|
118 |
|
119 @pyqtSlot() |
|
120 def on_queuesList_itemSelectionChanged(self): |
|
121 """ |
|
122 Private slot to handle changes of selected queue names. |
|
123 """ |
|
124 if self.__mode == HgQueuesQueueManagementDialog.QUEUE_INPUT: |
|
125 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( |
|
126 len(self.queuesList.selectedItems()) > 0) |
|
127 |
|
128 @pyqtSlot(QAbstractButton) |
|
129 def on_buttonBox_clicked(self, button): |
|
130 """ |
|
131 Private slot called by a button of the button box clicked. |
|
132 |
|
133 @param button button that was clicked (QAbstractButton) |
|
134 """ |
|
135 if button == self.refreshButton: |
|
136 self.refresh() |
|
137 elif button == self.buttonBox.button(QDialogButtonBox.Close): |
|
138 self.close() |
|
139 |
|
140 def refresh(self): |
|
141 """ |
|
142 Public slot to refresh the list of queues. |
|
143 """ |
|
144 self.queuesList.clear() |
|
145 queuesList, activeQueue = self.__getQueuesList() |
|
146 for queue in sorted(queuesList): |
|
147 itm = QListWidgetItem(queue, self.queuesList) |
|
148 if queue == activeQueue: |
|
149 font = itm.font() |
|
150 font.setBold(True) |
|
151 itm.setFont(font) |
|
152 |
|
153 def getData(self): |
|
154 """ |
|
155 Public slot to get the data. |
|
156 |
|
157 @return queue name (string) |
|
158 """ |
|
159 name = "" |
|
160 if self.__mode == HgQueuesQueueManagementDialog.NAME_INPUT: |
|
161 name = self.nameEdit.text() |
|
162 elif self.__mode == HgQueuesQueueManagementDialog.QUEUE_INPUT: |
|
163 selItems = self.queuesList.selectedItems() |
|
164 if selItems: |
|
165 name = selItems[0].text() |
|
166 return name |