eric6/Graphics/UMLGraphicsView.py

branch
maintenance
changeset 8176
31965986ecd1
parent 8043
0acf98cd089a
parent 8150
fc1ae39af8c9
child 8273
698ae46f40a4
equal deleted inserted replaced
8153:e01ae92db699 8176:31965986ecd1
42 @param scene reference to the scene object (QGraphicsScene) 42 @param scene reference to the scene object (QGraphicsScene)
43 @param parent parent widget of the view (QWidget) 43 @param parent parent widget of the view (QWidget)
44 """ 44 """
45 E5GraphicsView.__init__(self, scene, parent) 45 E5GraphicsView.__init__(self, scene, parent)
46 self.setObjectName("UMLGraphicsView") 46 self.setObjectName("UMLGraphicsView")
47 self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate) 47 self.setViewportUpdateMode(
48 QGraphicsView.ViewportUpdateMode.FullViewportUpdate)
48 49
49 self.diagramName = "Unnamed" 50 self.diagramName = "Unnamed"
50 self.__itemId = -1 51 self.__itemId = -1
51 52
52 self.border = 10 53 self.border = 10
64 65
65 self.__initActions() 66 self.__initActions()
66 67
67 scene.changed.connect(self.__sceneChanged) 68 scene.changed.connect(self.__sceneChanged)
68 69
69 self.grabGesture(Qt.PinchGesture) 70 self.grabGesture(Qt.GestureType.PinchGesture)
70 71
71 def __initActions(self): 72 def __initActions(self):
72 """ 73 """
73 Private method to initialize the view actions. 74 Private method to initialize the view actions.
74 """ 75 """
75 self.alignMapper = QSignalMapper(self) 76 self.alignMapper = QSignalMapper(self)
76 self.alignMapper.mapped[int].connect(self.__alignShapes) 77 try:
78 self.alignMapper.mappedInt.connect(self.__alignShapes)
79 except AttributeError:
80 # pre Qt 5.15
81 self.alignMapper.mapped[int].connect(self.__alignShapes)
77 82
78 self.deleteShapeAct = QAction( 83 self.deleteShapeAct = QAction(
79 UI.PixmapCache.getIcon("deleteShape"), 84 UI.PixmapCache.getIcon("deleteShape"),
80 self.tr("Delete shapes"), self) 85 self.tr("Delete shapes"), self)
81 self.deleteShapeAct.triggered.connect(self.__deleteShape) 86 self.deleteShapeAct.triggered.connect(self.__deleteShape)
124 self.relayoutAct.triggered.connect(self.__relayout) 129 self.relayoutAct.triggered.connect(self.__relayout)
125 130
126 self.alignLeftAct = QAction( 131 self.alignLeftAct = QAction(
127 UI.PixmapCache.getIcon("shapesAlignLeft"), 132 UI.PixmapCache.getIcon("shapesAlignLeft"),
128 self.tr("Align Left"), self) 133 self.tr("Align Left"), self)
129 self.alignMapper.setMapping(self.alignLeftAct, Qt.AlignLeft) 134 self.alignMapper.setMapping(
135 self.alignLeftAct, Qt.AlignmentFlag.AlignLeft)
130 self.alignLeftAct.triggered.connect(self.alignMapper.map) 136 self.alignLeftAct.triggered.connect(self.alignMapper.map)
131 137
132 self.alignHCenterAct = QAction( 138 self.alignHCenterAct = QAction(
133 UI.PixmapCache.getIcon("shapesAlignHCenter"), 139 UI.PixmapCache.getIcon("shapesAlignHCenter"),
134 self.tr("Align Center Horizontal"), self) 140 self.tr("Align Center Horizontal"), self)
135 self.alignMapper.setMapping(self.alignHCenterAct, Qt.AlignHCenter) 141 self.alignMapper.setMapping(
142 self.alignHCenterAct, Qt.AlignmentFlag.AlignHCenter)
136 self.alignHCenterAct.triggered.connect(self.alignMapper.map) 143 self.alignHCenterAct.triggered.connect(self.alignMapper.map)
137 144
138 self.alignRightAct = QAction( 145 self.alignRightAct = QAction(
139 UI.PixmapCache.getIcon("shapesAlignRight"), 146 UI.PixmapCache.getIcon("shapesAlignRight"),
140 self.tr("Align Right"), self) 147 self.tr("Align Right"), self)
141 self.alignMapper.setMapping(self.alignRightAct, Qt.AlignRight) 148 self.alignMapper.setMapping(
149 self.alignRightAct, Qt.AlignmentFlag.AlignRight)
142 self.alignRightAct.triggered.connect(self.alignMapper.map) 150 self.alignRightAct.triggered.connect(self.alignMapper.map)
143 151
144 self.alignTopAct = QAction( 152 self.alignTopAct = QAction(
145 UI.PixmapCache.getIcon("shapesAlignTop"), 153 UI.PixmapCache.getIcon("shapesAlignTop"),
146 self.tr("Align Top"), self) 154 self.tr("Align Top"), self)
147 self.alignMapper.setMapping(self.alignTopAct, Qt.AlignTop) 155 self.alignMapper.setMapping(
156 self.alignTopAct, Qt.AlignmentFlag.AlignTop)
148 self.alignTopAct.triggered.connect(self.alignMapper.map) 157 self.alignTopAct.triggered.connect(self.alignMapper.map)
149 158
150 self.alignVCenterAct = QAction( 159 self.alignVCenterAct = QAction(
151 UI.PixmapCache.getIcon("shapesAlignVCenter"), 160 UI.PixmapCache.getIcon("shapesAlignVCenter"),
152 self.tr("Align Center Vertical"), self) 161 self.tr("Align Center Vertical"), self)
153 self.alignMapper.setMapping(self.alignVCenterAct, Qt.AlignVCenter) 162 self.alignMapper.setMapping(
163 self.alignVCenterAct, Qt.AlignmentFlag.AlignVCenter)
154 self.alignVCenterAct.triggered.connect(self.alignMapper.map) 164 self.alignVCenterAct.triggered.connect(self.alignMapper.map)
155 165
156 self.alignBottomAct = QAction( 166 self.alignBottomAct = QAction(
157 UI.PixmapCache.getIcon("shapesAlignBottom"), 167 UI.PixmapCache.getIcon("shapesAlignBottom"),
158 self.tr("Align Bottom"), self) 168 self.tr("Align Bottom"), self)
159 self.alignMapper.setMapping(self.alignBottomAct, Qt.AlignBottom) 169 self.alignMapper.setMapping(
170 self.alignBottomAct, Qt.AlignmentFlag.AlignBottom)
160 self.alignBottomAct.triggered.connect(self.alignMapper.map) 171 self.alignBottomAct.triggered.connect(self.alignMapper.map)
161 172
162 def __checkSizeActions(self): 173 def __checkSizeActions(self):
163 """ 174 """
164 Private slot to set the enabled state of the size actions. 175 Private slot to set the enabled state of the size actions.
306 from .UMLSceneSizeDialog import UMLSceneSizeDialog 317 from .UMLSceneSizeDialog import UMLSceneSizeDialog
307 rect = self._getDiagramRect(10) 318 rect = self._getDiagramRect(10)
308 sceneRect = self.scene().sceneRect() 319 sceneRect = self.scene().sceneRect()
309 dlg = UMLSceneSizeDialog(sceneRect.width(), sceneRect.height(), 320 dlg = UMLSceneSizeDialog(sceneRect.width(), sceneRect.height(),
310 rect.width(), rect.height(), self) 321 rect.width(), rect.height(), self)
311 if dlg.exec() == QDialog.Accepted: 322 if dlg.exec() == QDialog.DialogCode.Accepted:
312 width, height = dlg.getData() 323 width, height = dlg.getData()
313 self.setSceneSize(width, height) 324 self.setSceneSize(width, height)
314 self.__checkSizeActions() 325 self.__checkSizeActions()
315 326
316 def autoAdjustSceneSize(self, limit=False): 327 def autoAdjustSceneSize(self, limit=False):
398 409
399 def printDiagram(self): 410 def printDiagram(self):
400 """ 411 """
401 Public slot called to print the diagram. 412 Public slot called to print the diagram.
402 """ 413 """
403 printer = QPrinter(mode=QPrinter.ScreenResolution) 414 printer = QPrinter(mode=QPrinter.PrinterMode.ScreenResolution)
404 printer.setFullPage(True) 415 printer.setFullPage(True)
405 if Preferences.getPrinter("ColorMode"): 416 if Preferences.getPrinter("ColorMode"):
406 printer.setColorMode(QPrinter.Color) 417 printer.setColorMode(QPrinter.ColorMode.Color)
407 else: 418 else:
408 printer.setColorMode(QPrinter.GrayScale) 419 printer.setColorMode(QPrinter.ColorMode.GrayScale)
409 if Preferences.getPrinter("FirstPageFirst"): 420 if Preferences.getPrinter("FirstPageFirst"):
410 printer.setPageOrder(QPrinter.FirstPageFirst) 421 printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
411 else: 422 else:
412 printer.setPageOrder(QPrinter.LastPageFirst) 423 printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
413 printer.setPageMargins( 424 printer.setPageMargins(
414 Preferences.getPrinter("LeftMargin") * 10, 425 Preferences.getPrinter("LeftMargin") * 10,
415 Preferences.getPrinter("TopMargin") * 10, 426 Preferences.getPrinter("TopMargin") * 10,
416 Preferences.getPrinter("RightMargin") * 10, 427 Preferences.getPrinter("RightMargin") * 10,
417 Preferences.getPrinter("BottomMargin") * 10, 428 Preferences.getPrinter("BottomMargin") * 10,
418 QPrinter.Millimeter 429 QPrinter.Unit.Millimeter
419 ) 430 )
420 printerName = Preferences.getPrinter("PrinterName") 431 printerName = Preferences.getPrinter("PrinterName")
421 if printerName: 432 if printerName:
422 printer.setPrinterName(printerName) 433 printer.setPrinterName(printerName)
423 434
430 """ 441 """
431 Public slot called to show a print preview of the diagram. 442 Public slot called to show a print preview of the diagram.
432 """ 443 """
433 from PyQt5.QtPrintSupport import QPrintPreviewDialog 444 from PyQt5.QtPrintSupport import QPrintPreviewDialog
434 445
435 printer = QPrinter(mode=QPrinter.ScreenResolution) 446 printer = QPrinter(mode=QPrinter.PrinterMode.ScreenResolution)
436 printer.setFullPage(True) 447 printer.setFullPage(True)
437 if Preferences.getPrinter("ColorMode"): 448 if Preferences.getPrinter("ColorMode"):
438 printer.setColorMode(QPrinter.Color) 449 printer.setColorMode(QPrinter.ColorMode.Color)
439 else: 450 else:
440 printer.setColorMode(QPrinter.GrayScale) 451 printer.setColorMode(QPrinter.ColorMode.GrayScale)
441 if Preferences.getPrinter("FirstPageFirst"): 452 if Preferences.getPrinter("FirstPageFirst"):
442 printer.setPageOrder(QPrinter.FirstPageFirst) 453 printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
443 else: 454 else:
444 printer.setPageOrder(QPrinter.LastPageFirst) 455 printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
445 printer.setPageMargins( 456 printer.setPageMargins(
446 Preferences.getPrinter("LeftMargin") * 10, 457 Preferences.getPrinter("LeftMargin") * 10,
447 Preferences.getPrinter("TopMargin") * 10, 458 Preferences.getPrinter("TopMargin") * 10,
448 Preferences.getPrinter("RightMargin") * 10, 459 Preferences.getPrinter("RightMargin") * 10,
449 Preferences.getPrinter("BottomMargin") * 10, 460 Preferences.getPrinter("BottomMargin") * 10,
450 QPrinter.Millimeter 461 QPrinter.Unit.Millimeter
451 ) 462 )
452 printerName = Preferences.getPrinter("PrinterName") 463 printerName = Preferences.getPrinter("PrinterName")
453 if printerName: 464 if printerName:
454 printer.setPrinterName(printerName) 465 printer.setPrinterName(printerName)
455 466
486 497
487 # step 2: find the index of the item to align in relation to 498 # step 2: find the index of the item to align in relation to
488 amount = None 499 amount = None
489 for i, item in enumerate(items): 500 for i, item in enumerate(items):
490 rect = item.sceneBoundingRect() 501 rect = item.sceneBoundingRect()
491 if alignment == Qt.AlignLeft: 502 if alignment == Qt.AlignmentFlag.AlignLeft:
492 if amount is None or rect.x() < amount: 503 if amount is None or rect.x() < amount:
493 amount = rect.x() 504 amount = rect.x()
494 index = i 505 index = i
495 elif alignment == Qt.AlignRight: 506 elif alignment == Qt.AlignmentFlag.AlignRight:
496 if amount is None or rect.x() + rect.width() > amount: 507 if amount is None or rect.x() + rect.width() > amount:
497 amount = rect.x() + rect.width() 508 amount = rect.x() + rect.width()
498 index = i 509 index = i
499 elif alignment == Qt.AlignHCenter: 510 elif alignment == Qt.AlignmentFlag.AlignHCenter:
500 if amount is None or rect.width() > amount: 511 if amount is None or rect.width() > amount:
501 amount = rect.width() 512 amount = rect.width()
502 index = i 513 index = i
503 elif alignment == Qt.AlignTop: 514 elif alignment == Qt.AlignmentFlag.AlignTop:
504 if amount is None or rect.y() < amount: 515 if amount is None or rect.y() < amount:
505 amount = rect.y() 516 amount = rect.y()
506 index = i 517 index = i
507 elif alignment == Qt.AlignBottom: 518 elif alignment == Qt.AlignmentFlag.AlignBottom:
508 if amount is None or rect.y() + rect.height() > amount: 519 if amount is None or rect.y() + rect.height() > amount:
509 amount = rect.y() + rect.height() 520 amount = rect.y() + rect.height()
510 index = i 521 index = i
511 elif alignment == Qt.AlignVCenter: 522 elif alignment == Qt.AlignmentFlag.AlignVCenter:
512 if amount is None or rect.height() > amount: 523 if amount is None or rect.height() > amount:
513 amount = rect.height() 524 amount = rect.height()
514 index = i 525 index = i
515 rect = items[index].sceneBoundingRect() 526 rect = items[index].sceneBoundingRect()
516 527
518 for i, item in enumerate(items): 529 for i, item in enumerate(items):
519 if i == index: 530 if i == index:
520 continue 531 continue
521 itemrect = item.sceneBoundingRect() 532 itemrect = item.sceneBoundingRect()
522 xOffset = yOffset = 0 533 xOffset = yOffset = 0
523 if alignment == Qt.AlignLeft: 534 if alignment == Qt.AlignmentFlag.AlignLeft:
524 xOffset = rect.x() - itemrect.x() 535 xOffset = rect.x() - itemrect.x()
525 elif alignment == Qt.AlignRight: 536 elif alignment == Qt.AlignmentFlag.AlignRight:
526 xOffset = ( 537 xOffset = (
527 (rect.x() + rect.width()) - 538 (rect.x() + rect.width()) -
528 (itemrect.x() + itemrect.width()) 539 (itemrect.x() + itemrect.width())
529 ) 540 )
530 elif alignment == Qt.AlignHCenter: 541 elif alignment == Qt.AlignmentFlag.AlignHCenter:
531 xOffset = ( 542 xOffset = (
532 (rect.x() + rect.width() // 2) - 543 (rect.x() + rect.width() // 2) -
533 (itemrect.x() + itemrect.width() // 2) 544 (itemrect.x() + itemrect.width() // 2)
534 ) 545 )
535 elif alignment == Qt.AlignTop: 546 elif alignment == Qt.AlignmentFlag.AlignTop:
536 yOffset = rect.y() - itemrect.y() 547 yOffset = rect.y() - itemrect.y()
537 elif alignment == Qt.AlignBottom: 548 elif alignment == Qt.AlignmentFlag.AlignBottom:
538 yOffset = ( 549 yOffset = (
539 (rect.y() + rect.height()) - 550 (rect.y() + rect.height()) -
540 (itemrect.y() + itemrect.height()) 551 (itemrect.y() + itemrect.height())
541 ) 552 )
542 elif alignment == Qt.AlignVCenter: 553 elif alignment == Qt.AlignmentFlag.AlignVCenter:
543 yOffset = ( 554 yOffset = (
544 (rect.y() + rect.height() // 2) - 555 (rect.y() + rect.height() // 2) -
545 (itemrect.y() + itemrect.height() // 2) 556 (itemrect.y() + itemrect.height() // 2)
546 ) 557 )
547 item.moveBy(xOffset, yOffset) 558 item.moveBy(xOffset, yOffset)
573 Protected method handling key press events. 584 Protected method handling key press events.
574 585
575 @param evt reference to the key event (QKeyEvent) 586 @param evt reference to the key event (QKeyEvent)
576 """ 587 """
577 key = evt.key() 588 key = evt.key()
578 if key in [Qt.Key_Up, Qt.Key_Down, Qt.Key_Left, Qt.Key_Right]: 589 if key in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left,
590 Qt.Key.Key_Right]:
579 items = self.filteredItems(self.scene().selectedItems()) 591 items = self.filteredItems(self.scene().selectedItems())
580 if items: 592 if items:
581 if evt.modifiers() & Qt.ControlModifier: 593 if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
582 stepSize = 50 594 stepSize = 50
583 else: 595 else:
584 stepSize = 5 596 stepSize = 5
585 if key == Qt.Key_Up: 597 if key == Qt.Key.Key_Up:
586 dx = 0 598 dx = 0
587 dy = -stepSize 599 dy = -stepSize
588 elif key == Qt.Key_Down: 600 elif key == Qt.Key.Key_Down:
589 dx = 0 601 dx = 0
590 dy = stepSize 602 dy = stepSize
591 elif key == Qt.Key_Left: 603 elif key == Qt.Key.Key_Left:
592 dx = -stepSize 604 dx = -stepSize
593 dy = 0 605 dy = 0
594 else: 606 else:
595 dx = stepSize 607 dx = stepSize
596 dy = 0 608 dy = 0
605 """ 617 """
606 Protected method to handle wheel events. 618 Protected method to handle wheel events.
607 619
608 @param evt reference to the wheel event (QWheelEvent) 620 @param evt reference to the wheel event (QWheelEvent)
609 """ 621 """
610 if evt.modifiers() & Qt.ControlModifier: 622 if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
611 delta = evt.angleDelta().y() 623 delta = evt.angleDelta().y()
612 if delta < 0: 624 if delta < 0:
613 self.zoomOut() 625 self.zoomOut()
614 elif delta > 0: 626 elif delta > 0:
615 self.zoomIn() 627 self.zoomIn()
623 Public method handling events. 635 Public method handling events.
624 636
625 @param evt reference to the event (QEvent) 637 @param evt reference to the event (QEvent)
626 @return flag indicating, if the event was handled (boolean) 638 @return flag indicating, if the event was handled (boolean)
627 """ 639 """
628 if evt.type() == QEvent.Gesture: 640 if evt.type() == QEvent.Type.Gesture:
629 self.gestureEvent(evt) 641 self.gestureEvent(evt)
630 return True 642 return True
631 643
632 return super(UMLGraphicsView, self).event(evt) 644 return super(UMLGraphicsView, self).event(evt)
633 645
635 """ 647 """
636 Protected method handling gesture events. 648 Protected method handling gesture events.
637 649
638 @param evt reference to the gesture event (QGestureEvent 650 @param evt reference to the gesture event (QGestureEvent
639 """ 651 """
640 pinch = evt.gesture(Qt.PinchGesture) 652 pinch = evt.gesture(Qt.GestureType.PinchGesture)
641 if pinch: 653 if pinch:
642 if pinch.state() == Qt.GestureStarted: 654 if pinch.state() == Qt.GestureState.GestureStarted:
643 pinch.setTotalScaleFactor(self.zoom() / 100.0) 655 pinch.setTotalScaleFactor(self.zoom() / 100.0)
644 elif pinch.state() == Qt.GestureUpdated: 656 elif pinch.state() == Qt.GestureState.GestureUpdated:
645 self.setZoom(int(pinch.totalScaleFactor() * 100)) 657 self.setZoom(int(pinch.totalScaleFactor() * 100))
646 evt.accept() 658 evt.accept()
647 659
648 def getItemId(self): 660 def getItemId(self):
649 """ 661 """

eric ide

mercurial