eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.py

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

eric ide

mercurial