Project/CreateDialogCodeDialog.py

branch
maintenance
changeset 6693
3629d88ae235
parent 6661
19fcbb7be3da
equal deleted inserted replaced
6647:2a11e1b2dcbe 6693:3629d88ae235
11 try: 11 try:
12 str = unicode # __IGNORE_EXCEPTION__ 12 str = unicode # __IGNORE_EXCEPTION__
13 except NameError: 13 except NameError:
14 pass 14 pass
15 15
16 import sys
16 import os 17 import os
17 import json 18 import json
18 import xml.etree.ElementTree 19
19 20 from PyQt5.QtCore import pyqtSlot, Qt, QMetaObject, QRegExp, \
20 from PyQt5.QtCore import QMetaObject, QByteArray, QRegExp, Qt, pyqtSlot, \ 21 QSortFilterProxyModel, QProcess, QProcessEnvironment
21 QMetaMethod, QSortFilterProxyModel, QProcess, QProcessEnvironment
22 from PyQt5.QtGui import QStandardItemModel, QBrush, QStandardItem 22 from PyQt5.QtGui import QStandardItemModel, QBrush, QStandardItem
23 from PyQt5.QtWidgets import QWidget, QDialog, QDialogButtonBox, QAction 23 from PyQt5.QtWidgets import QDialog, QDialogButtonBox
24 from PyQt5 import uic
25 24
26 25
27 from E5Gui.E5Application import e5App 26 from E5Gui.E5Application import e5App
28 from E5Gui import E5MessageBox 27 from E5Gui import E5MessageBox
29 28
30 from .Ui_CreateDialogCodeDialog import Ui_CreateDialogCodeDialog 29 from .Ui_CreateDialogCodeDialog import Ui_CreateDialogCodeDialog
31 from .NewDialogClassDialog import NewDialogClassDialog 30 from .NewDialogClassDialog import NewDialogClassDialog
32 31
33 from eric6config import getConfig 32 from eric6config import getConfig
34
35 from Globals import qVersionTuple
36 33
37 34
38 pyqtSignatureRole = Qt.UserRole + 1 35 pyqtSignatureRole = Qt.UserRole + 1
39 pythonSignatureRole = Qt.UserRole + 2 36 pythonSignatureRole = Qt.UserRole + 2
40 rubySignatureRole = Qt.UserRole + 3 37 rubySignatureRole = Qt.UserRole + 3
159 """ 156 """
160 venvName = self.project.getDebugProperty("VIRTUALENV") 157 venvName = self.project.getDebugProperty("VIRTUALENV")
161 venvManager = e5App().getObject("VirtualEnvManager") 158 venvManager = e5App().getObject("VirtualEnvManager")
162 interpreter = venvManager.getVirtualenvInterpreter(venvName) 159 interpreter = venvManager.getVirtualenvInterpreter(venvName)
163 execPath = venvManager.getVirtualenvExecPath(venvName) 160 execPath = venvManager.getVirtualenvExecPath(venvName)
161
162 if not interpreter:
163 interpreter = sys.executable
164 164
165 env = QProcessEnvironment.systemEnvironment() 165 env = QProcessEnvironment.systemEnvironment()
166 if execPath: 166 if execPath:
167 if env.contains("PATH"): 167 if env.contains("PATH"):
168 env.insert( 168 env.insert(
213 """ seconds.</p>""").format(interpreter) 213 """ seconds.</p>""").format(interpreter)
214 ) 214 )
215 215
216 return uicText, ok 216 return uicText, ok
217 217
218 def __objectNameExternal(self): 218 def __objectName(self):
219 """ 219 """
220 Private method to get the object name of a form via an external 220 Private method to get the object name of a form.
221 interpreter.
222 221
223 @return object name 222 @return object name
224 @rtype str 223 @rtype str
225 """ 224 """
226 objectName = "" 225 objectName = ""
229 if ok and output: 228 if ok and output:
230 objectName = output 229 objectName = output
231 230
232 return objectName 231 return objectName
233 232
234 def __objectName(self): 233 def __className(self):
235 """ 234 """
236 Private method to get the object name of a form. 235 Private method to get the class name of a form.
237
238 @return object name
239 @rtype str
240 """
241 if self.project.getDebugProperty("VIRTUALENV"):
242 return self.__objectNameExternal()
243 else:
244 try:
245 dlg = uic.loadUi(
246 self.formFile, package=self.project.getProjectPath())
247 return dlg.objectName()
248 except (AttributeError, ImportError,
249 xml.etree.ElementTree.ParseError) as err:
250 E5MessageBox.critical(
251 self,
252 self.tr("uic error"),
253 self.tr(
254 """<p>There was an error loading the form <b>{0}</b>"""
255 """.</p><p>{1}</p>""").format(self.formFile, str(err)))
256 return ""
257
258 def __classNameExternal(self):
259 """
260 Private method to get the class name of a form via an external
261 interpreter.
262 236
263 @return class name 237 @return class name
264 @rtype str 238 @rtype str
265 """ 239 """
266 className = "" 240 className = ""
268 output, ok = self.__runUicLoadUi("class_name") 242 output, ok = self.__runUicLoadUi("class_name")
269 if ok and output: 243 if ok and output:
270 className = output 244 className = output
271 245
272 return className 246 return className
273
274 def __className(self):
275 """
276 Private method to get the class name of a form.
277
278 @return class name
279 @rtype str
280 """
281 if self.project.getDebugProperty("VIRTUALENV"):
282 return self.__classNameExternal()
283 else:
284 try:
285 dlg = uic.loadUi(
286 self.formFile, package=self.project.getProjectPath())
287 return dlg.metaObject().className()
288 except (AttributeError, ImportError,
289 xml.etree.ElementTree.ParseError) as err:
290 E5MessageBox.critical(
291 self,
292 self.tr("uic error"),
293 self.tr(
294 """<p>There was an error loading the form <b>{0}</b>"""
295 """.</p><p>{1}</p>""").format(self.formFile, str(err)))
296 return ""
297 247
298 def __signatures(self): 248 def __signatures(self):
299 """ 249 """
300 Private slot to get the signatures. 250 Private slot to get the signatures.
301 251
344 # 3. replace double by float 294 # 3. replace double by float
345 mapped = mapped.replace("double", "float") 295 mapped = mapped.replace("double", "float")
346 296
347 return mapped 297 return mapped
348 298
349 def __updateSlotsModelExternal(self): 299 def __updateSlotsModel(self):
350 """ 300 """
351 Private slot to update the slots tree display getting the data via an 301 Private slot to update the slots tree display.
352 external interpreter. 302 """
353 """ 303 self.filterEdit.clear()
304
354 output, ok = self.__runUicLoadUi("signatures") 305 output, ok = self.__runUicLoadUi("signatures")
355 if ok and output: 306 if ok and output:
356 objectsList = json.loads(output.strip()) 307 objectsList = json.loads(output.strip())
357 308
358 signatureList = self.__signatures() 309 signatureList = self.__signatures()
394 Qt.ItemIsSelectable) 345 Qt.ItemIsSelectable)
395 ) 346 )
396 itm2.setCheckState(Qt.Unchecked) 347 itm2.setCheckState(Qt.Unchecked)
397 348
398 self.slotsView.sortByColumn(0, Qt.AscendingOrder) 349 self.slotsView.sortByColumn(0, Qt.AscendingOrder)
399
400 def __updateSlotsModel(self):
401 """
402 Private slot to update the slots tree display.
403 """
404 self.filterEdit.clear()
405
406 if self.project.getDebugProperty("VIRTUALENV"):
407 self.__updateSlotsModelExternal()
408 else:
409 try:
410 dlg = uic.loadUi(
411 self.formFile, package=self.project.getProjectPath())
412 objects = dlg.findChildren(QWidget) + dlg.findChildren(QAction)
413
414 signatureList = self.__signatures()
415
416 self.slotsModel.clear()
417 self.slotsModel.setHorizontalHeaderLabels([""])
418 for obj in objects:
419 name = obj.objectName()
420 if not name or name.startswith("qt_"):
421 # ignore un-named or internal objects
422 continue
423
424 metaObject = obj.metaObject()
425 className = metaObject.className()
426 itm = QStandardItem("{0} ({1})".format(name, className))
427 self.slotsModel.appendRow(itm)
428 for index in range(metaObject.methodCount()):
429 metaMethod = metaObject.method(index)
430 if metaMethod.methodType() == QMetaMethod.Signal:
431 if qVersionTuple() >= (5, 0, 0):
432 itm2 = QStandardItem("on_{0}_{1}".format(
433 name,
434 bytes(metaMethod.methodSignature())
435 .decode()
436 ))
437 else:
438 itm2 = QStandardItem("on_{0}_{1}".format(
439 name, metaMethod.signature()
440 ))
441 itm.appendRow(itm2)
442 if self.__module is not None:
443 if qVersionTuple() >= (5, 0, 0):
444 method = "on_{0}_{1}".format(
445 name,
446 bytes(metaMethod.methodSignature())
447 .decode().split("(")[0])
448 else:
449 method = "on_{0}_{1}".format(
450 name,
451 metaMethod.signature().split("(")[0])
452 method2 = "{0}({1})".format(
453 method,
454 ", ".join([
455 self.__mapType(t)
456 for t in metaMethod.parameterTypes()
457 ])
458 )
459
460 if method2 in signatureList or \
461 method in signatureList:
462 itm2.setFlags(
463 Qt.ItemFlags(Qt.ItemIsEnabled))
464 itm2.setCheckState(Qt.Checked)
465 itm2.setForeground(QBrush(Qt.blue))
466 continue
467
468 returnType = self.__mapType(
469 metaMethod.typeName().encode())
470 if returnType == 'void':
471 returnType = ""
472 parameterTypesList = [
473 self.__mapType(t)
474 for t in metaMethod.parameterTypes()]
475 pyqtSignature = ", ".join(parameterTypesList)
476
477 parameterNames = metaMethod.parameterNames()
478 if parameterNames:
479 for index in range(len(parameterNames)):
480 if not parameterNames[index]:
481 parameterNames[index] = \
482 QByteArray("p{0:d}".format(index)
483 .encode("utf-8"))
484 parameterNamesList = [bytes(n).decode()
485 for n in parameterNames]
486 methNamesSig = ", ".join(parameterNamesList)
487
488 if methNamesSig:
489 if qVersionTuple() >= (5, 0, 0):
490 pythonSignature = \
491 "on_{0}_{1}(self, {2})".format(
492 name,
493 bytes(metaMethod.methodSignature())
494 .decode().split("(")[0],
495 methNamesSig)
496 else:
497 pythonSignature = \
498 "on_{0}_{1}(self, {2})".format(
499 name,
500 metaMethod.signature()
501 .split("(")[0],
502 methNamesSig)
503 else:
504 if qVersionTuple() >= (5, 0, 0):
505 pythonSignature = "on_{0}_{1}(self)"\
506 .format(
507 name,
508 bytes(metaMethod.methodSignature())
509 .decode().split("(")[0])
510 else:
511 pythonSignature = "on_{0}_{1}(self)"\
512 .format(
513 name,
514 metaMethod.signature().split(
515 "(")[0])
516 itm2.setData(pyqtSignature, pyqtSignatureRole)
517 itm2.setData(pythonSignature, pythonSignatureRole)
518 itm2.setData(returnType, returnTypeRole)
519 itm2.setData(parameterTypesList,
520 parameterTypesListRole)
521 itm2.setData(parameterNamesList,
522 parameterNamesListRole)
523
524 itm2.setFlags(Qt.ItemFlags(
525 Qt.ItemIsUserCheckable |
526 Qt.ItemIsEnabled |
527 Qt.ItemIsSelectable)
528 )
529 itm2.setCheckState(Qt.Unchecked)
530
531 self.slotsView.sortByColumn(0, Qt.AscendingOrder)
532 except (AttributeError, ImportError,
533 xml.etree.ElementTree.ParseError) as err:
534 E5MessageBox.critical(
535 self,
536 self.tr("uic error"),
537 self.tr(
538 """<p>There was an error loading the form <b>{0}</b>"""
539 """.</p><p>{1}</p>""").format(self.formFile, str(err)))
540 350
541 def __generateCode(self): 351 def __generateCode(self):
542 """ 352 """
543 Private slot to generate the code as requested by the user. 353 Private slot to generate the code as requested by the user.
544 """ 354 """

eric ide

mercurial