eric6/Graphics/UMLGraphicsView.py

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

eric ide

mercurial