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 |
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 |
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 """ |