RefactoringRope/ChangeSignatureDialog.py

changeset 11
562f9758d2e1
child 20
83b71483e198
equal deleted inserted replaced
10:0fdfae822ca7 11:562f9758d2e1
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Change Signature dialog.
8 """
9
10 import copy
11
12 from PyQt4.QtCore import pyqtSlot, Qt
13 from PyQt4.QtGui import QDialog, QDialogButtonBox, QListWidgetItem, \
14 QAbstractButton
15
16 import rope.refactor.change_signature
17
18 from Ui_ChangeSignatureDialog import Ui_ChangeSignatureDialog
19 from RefactoringDialogBase import RefactoringDialogBase
20 from AddParameterDialog import AddParameterDialog
21
22 class ChangeSignatureDialog(RefactoringDialogBase, Ui_ChangeSignatureDialog):
23 """
24 Class implementing the Change Signature dialog.
25 """
26 NameRole = Qt.UserRole
27 IsAddedRole = Qt.UserRole + 1
28 DefaultRole = Qt.UserRole + 2
29 ValueRole = Qt.UserRole + 3
30
31 def __init__(self, refactoring, title, changer, parent=None):
32 """
33 Constructor
34
35 @param refactoring reference to the main refactoring object
36 (Refactoring)
37 @param title title of the dialog (string)
38 @param changer reference to the signature changer object
39 (rope.refactor.change_signature.ChangeSignature)
40 @param parent reference to the parent widget (QWidget)
41 """
42 RefactoringDialogBase.__init__(self, refactoring, title, parent)
43 self.setupUi(self)
44
45 self.__signature = changer
46 self.__definition_info = self.__signature.get_args()
47 self.__to_be_removed = []
48
49 self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok)
50 self.__previewButton = self.buttonBox.addButton(
51 self.trUtf8("Preview"), QDialogButtonBox.ActionRole)
52 self.__previewButton.setDefault(True)
53
54 # populate the parameters list
55 for arg, default in self.__definition_info:
56 if default is None:
57 itm = QListWidgetItem(arg, self.parameterList)
58 else:
59 itm = QListWidgetItem("{0} = {1}".format(arg, default),
60 self.parameterList)
61 itm.setData(ChangeSignatureDialog.NameRole, arg)
62 itm.setData(ChangeSignatureDialog.IsAddedRole, False)
63 itm.setData(ChangeSignatureDialog.DefaultRole, None)
64 itm.setData(ChangeSignatureDialog.ValueRole, None)
65
66 if self.parameterList.count():
67 self.parameterList.setCurrentRow(0)
68 else:
69 self.on_parameterList_currentRowChanged(-1)
70
71 @pyqtSlot(int)
72 def on_parameterList_currentRowChanged(self, currentRow):
73 """
74 Private slot called, when the current row is changed.
75
76 @param currentRow index of the current row (integer)
77 """
78 if currentRow == -1:
79 self.upButton.setEnabled(False)
80 self.downButton.setEnabled(False)
81 self.removeButton.setEnabled(False)
82 else:
83 maxIndex = self.parameterList.count() - 1
84 self.upButton.setEnabled(currentRow != 0)
85 self.downButton.setEnabled(currentRow != maxIndex)
86
87 @pyqtSlot()
88 def on_upButton_clicked(self):
89 """
90 Private slot called to move the selected item up in the list.
91 """
92 row = self.parameterList.currentRow()
93 if row == 0:
94 # we're already at the top
95 return
96
97 itm = self.parameterList.takeItem(row)
98 self.parameterList.insertItem(row - 1, itm)
99 self.parameterList.setCurrentItem(itm)
100 if row == 1:
101 self.upButton.setEnabled(False)
102 else:
103 self.upButton.setEnabled(True)
104 self.downButton.setEnabled(True)
105
106 @pyqtSlot()
107 def on_downButton_clicked(self):
108 """
109 Private slot called to move the selected item down in the list.
110 """
111 rows = self.parameterList.count()
112 row = self.parameterList.currentRow()
113 if row == rows - 1:
114 # we're already at the end
115 return
116
117 itm = self.parameterList.takeItem(row)
118 self.parameterList.insertItem(row + 1, itm)
119 self.parameterList.setCurrentItem(itm)
120 self.upButton.setEnabled(True)
121 if row == rows - 2:
122 self.downButton.setEnabled(False)
123 else:
124 self.downButton.setEnabled(True)
125
126 @pyqtSlot()
127 def on_removeButton_clicked(self):
128 """
129 Private slot to remove a parameter.
130 """
131 itm = self.parameterList.takeItem(self.parameterList.currentRow())
132 self.__to_be_removed.append(itm)
133
134 @pyqtSlot()
135 def on_addButton_clicked(self):
136 """
137 Private slot to add a new parameter.
138 """
139 dlg = AddParameterDialog(self)
140 if dlg.exec_() == QDialog.Accepted:
141 name, default, value = dlg.getData()
142 if default:
143 s = "%s = %s" % (name, default)
144 else:
145 s = name
146 itm = QListWidgetItem(s)
147 itm.setData(ChangeSignatureDialog.NameRole, name)
148 itm.setData(ChangeSignatureDialog.IsAddedRole, True)
149 if default:
150 itm.setData(ChangeSignatureDialog.DefaultRole, default)
151 else:
152 itm.setData(ChangeSignatureDialog.DefaultRole, None)
153 if value:
154 itm.setData(ChangeSignatureDialog.ValueRole, value)
155 else:
156 itm.setData(ChangeSignatureDialog.ValueRole, None)
157 if self.parameterList.count():
158 self.parameterList.insertItem(
159 self.parameterList.currentRow() + 1, itm)
160 else:
161 self.parameterList.addItem(itm)
162 self.parameterList.setCurrentItem(itm)
163
164 @pyqtSlot(QAbstractButton)
165 def on_buttonBox_clicked(self, button):
166 """
167 Private slot to act on the button pressed.
168
169 @param button reference to the button pressed (QAbstractButton)
170 """
171 if button == self.__previewButton:
172 self.previewChanges()
173 elif button == self.__okButton:
174 self.applyChanges()
175
176 def __getParameterIndex(self, definition_info, name):
177 """
178 Private method to calculate the index of the given paramter.
179
180 @param definition_info object containing the method definition
181 @param name parameter name (string)
182 @return index of the parameter (integer)
183 """
184 for index, pair in enumerate(definition_info):
185 if pair[0] == name:
186 return index
187
188 def _calculateChanges(self, handle):
189 """
190 Protected method to calculate the changes.
191
192 @param handle reference to the task handle
193 (rope.base.taskhandle.TaskHandle)
194 @return reference to the Changes object (rope.base.change.ChangeSet)
195 """
196 changers = []
197 definition_info = copy.deepcopy(self.__definition_info)
198 for itm in self.__to_be_removed:
199 if itm.data(ChangeSignatureDialog.IsAddedRole):
200 continue
201 index = self.__getParameterIndex(definition_info,
202 itm.data(ChangeSignatureDialog.NameRole))
203 remover = rope.refactor.change_signature.ArgumentRemover(index)
204 changers.append(remover)
205 del definition_info[index]
206
207 for index in range(self.parameterList.count()):
208 itm = self.parameterList.item(index)
209 if itm.data(ChangeSignatureDialog.IsAddedRole):
210 name = itm.data(ChangeSignatureDialog.NameRole)
211 default = itm.data(ChangeSignatureDialog.DefaultRole)
212 value = itm.data(ChangeSignatureDialog.ValueRole)
213 adder = rope.refactor.change_signature.ArgumentAdder(
214 index, name, default, value)
215 changers.append(adder)
216 try:
217 definition_info.insert(index, (name, default))
218 except Exception as err:
219 self._refactoring.handleRopeError(err, self._title)
220
221 new_ordering = []
222 for row in range(self.parameterList.count()):
223 itm = self.parameterList.item(row)
224 name = itm.data(ChangeSignatureDialog.NameRole)
225 new_ordering.append(
226 self.__getParameterIndex(definition_info, name))
227 autodef = self.autodefEdit.text()
228 if not autodef:
229 autodef = None
230 changers.append(rope.refactor.change_signature.ArgumentReorderer(
231 new_ordering, autodef=autodef))
232
233 try:
234 changes = self.__signature.get_changes(
235 changers, in_hierarchy=self.hierarchyCheckBox.isChecked(),
236 task_handle=handle)
237 return changes
238 except Exception as err:
239 self._refactoring.handleRopeError(err, self._title, handle)
240 return None

eric ide

mercurial