diff options
Diffstat (limited to 'examples/widgets/graphicsview/diagramscene')
3 files changed, 852 insertions, 874 deletions
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.py b/examples/widgets/graphicsview/diagramscene/diagramscene.py index 3890782c4..60e05613c 100644 --- a/examples/widgets/graphicsview/diagramscene/diagramscene.py +++ b/examples/widgets/graphicsview/diagramscene/diagramscene.py @@ -1,300 +1,276 @@ - -############################################################################# -## -## Copyright (C) 2013 Riverbank Computing Limited. -## Copyright (C) 2016 The Qt Company Ltd. -## Contact: http://www.qt.io/licensing/ -## -## This file is part of the Qt for Python examples of the Qt Toolkit. -## -## $QT_BEGIN_LICENSE:BSD$ -## You may use this file under the terms of the BSD license as follows: -## -## "Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions are -## met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * Redistributions in binary form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in -## the documentation and/or other materials provided with the -## distribution. -## * Neither the name of The Qt Company Ltd nor the names of its -## contributors may be used to endorse or promote products derived -## from this software without specific prior written permission. -## -## -## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -## -## $QT_END_LICENSE$ -## -############################################################################# +# Copyright (C) 2013 Riverbank Computing Limited. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import math +import sys -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6.QtCore import (QLineF, QPointF, QRect, QRectF, QSize, QSizeF, Qt, + Signal, Slot) +from PySide6.QtGui import (QAction, QBrush, QColor, QFont, QIcon, QIntValidator, + QPainter, QPainterPath, QPen, QPixmap, QPolygonF) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QButtonGroup, + QComboBox, QFontComboBox, QGraphicsItem, QGraphicsLineItem, + QGraphicsPolygonItem, QGraphicsTextItem, + QGraphicsScene, QGraphicsView, QGridLayout, + QHBoxLayout, QLabel, QMainWindow, QMenu, + QMessageBox, QSizePolicy, QToolBox, QToolButton, + QWidget) -import diagramscene_rc +import diagramscene_rc # noqa: F401 -class Arrow(QtWidgets.QGraphicsLineItem): +class Arrow(QGraphicsLineItem): def __init__(self, startItem, endItem, parent=None, scene=None): - super(Arrow, self).__init__(parent, scene) + super().__init__(parent, scene) - self.arrowHead = QtGui.QPolygonF() + self._arrow_head = QPolygonF() - self.myStartItem = startItem - self.myEndItem = endItem - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) - self.myColor = QtCore.Qt.black - self.setPen(QtGui.QPen(self.myColor, 2, QtCore.Qt.SolidLine, - QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) + self._my_start_item = startItem + self._my_end_item = endItem + self.setFlag(QGraphicsItem.ItemIsSelectable, True) + self._my_color = Qt.black + self.setPen(QPen(self._my_color, 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)) - def setColor(self, color): - self.myColor = color + def set_color(self, color): + self._my_color = color - def startItem(self): - return self.myStartItem + def start_item(self): + return self._my_start_item - def endItem(self): - return self.myEndItem + def end_item(self): + return self._my_end_item def boundingRect(self): extra = (self.pen().width() + 20) / 2.0 p1 = self.line().p1() p2 = self.line().p2() - return QtCore.QRectF(p1, QtCore.QSizeF(p2.x() - p1.x(), p2.y() - p1.y())).normalized().adjusted(-extra, -extra, extra, extra) + rect = QRectF(p1, QSizeF(p2.x() - p1.x(), p2.y() - p1.y())) + return rect.normalized().adjusted(-extra, -extra, extra, extra) def shape(self): path = super(Arrow, self).shape() - path.addPolygon(self.arrowHead) + path.addPolygon(self._arrow_head) return path - def updatePosition(self): - line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0)) - self.setLine(line) + def update_position(self): + start = self.mapFromItem(self._my_start_item, 0, 0) + end = self.mapFromItem(self._my_end_item, 0, 0) + self.setLine(QLineF(start, end)) def paint(self, painter, option, widget=None): - if (self.myStartItem.collidesWithItem(self.myEndItem)): + if (self._my_start_item.collidesWithItem(self._my_end_item)): return - myStartItem = self.myStartItem - myEndItem = self.myEndItem - myColor = self.myColor - myPen = self.pen() - myPen.setColor(self.myColor) - arrowSize = 20.0 - painter.setPen(myPen) - painter.setBrush(self.myColor) - - centerLine = QtCore.QLineF(myStartItem.pos(), myEndItem.pos()) - endPolygon = myEndItem.polygon() - p1 = endPolygon.at(0) + myEndItem.pos() - - intersectPoint = QtCore.QPointF() - for i in endPolygon: - p2 = i + myEndItem.pos() - polyLine = QtCore.QLineF(p1, p2) - intersectType, intersectPoint = polyLine.intersect(centerLine) - if intersectType == QtCore.QLineF.BoundedIntersection: + my_start_item = self._my_start_item + my_end_item = self._my_end_item + my_color = self._my_color + my_pen = self.pen() + my_pen.setColor(self._my_color) + arrow_size = 20.0 + painter.setPen(my_pen) + painter.setBrush(self._my_color) + + center_line = QLineF(my_start_item.pos(), my_end_item.pos()) + end_polygon = my_end_item.polygon() + p1 = end_polygon.at(0) + my_end_item.pos() + + intersect_point = QPointF() + for i in end_polygon: + p2 = i + my_end_item.pos() + poly_line = QLineF(p1, p2) + intersectType, intersect_point = poly_line.intersects(center_line) + if intersectType == QLineF.BoundedIntersection: break p1 = p2 - self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos())) + self.setLine(QLineF(intersect_point, my_start_item.pos())) line = self.line() angle = math.acos(line.dx() / line.length()) if line.dy() >= 0: angle = (math.pi * 2.0) - angle - arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize, - math.cos(angle + math.pi / 3) * arrowSize) - arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize, - math.cos(angle + math.pi - math.pi / 3.0) * arrowSize) + arrow_head1 = QPointF(math.sin(angle + math.pi / 3.0) * arrow_size, + math.cos(angle + math.pi / 3) * arrow_size) + arrow_p1 = line.p1() + arrow_head1 + arrow_head2 = QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrow_size, + math.cos(angle + math.pi - math.pi / 3.0) * arrow_size) + arrow_p2 = line.p1() + arrow_head2 - self.arrowHead.clear() - for point in [line.p1(), arrowP1, arrowP2]: - self.arrowHead.append(point) + self._arrow_head.clear() + for point in [line.p1(), arrow_p1, arrow_p2]: + self._arrow_head.append(point) painter.drawLine(line) - painter.drawPolygon(self.arrowHead) + painter.drawPolygon(self._arrow_head) if self.isSelected(): - painter.setPen(QtGui.QPen(myColor, 1, QtCore.Qt.DashLine)) - myLine = QtCore.QLineF(line) - myLine.translate(0, 4.0) - painter.drawLine(myLine) - myLine.translate(0,-8.0) - painter.drawLine(myLine) + painter.setPen(QPen(my_color, 1, Qt.DashLine)) + my_line = QLineF(line) + my_line.translate(0, 4.0) + painter.drawLine(my_line) + my_line.translate(0, -8.0) + painter.drawLine(my_line) -class DiagramTextItem(QtWidgets.QGraphicsTextItem): - lostFocus = QtCore.Signal(QtWidgets.QGraphicsTextItem) +class DiagramTextItem(QGraphicsTextItem): + lost_focus = Signal(QGraphicsTextItem) - selectedChange = QtCore.Signal(QtWidgets.QGraphicsItem) + selected_change = Signal(QGraphicsItem) def __init__(self, parent=None, scene=None): - super(DiagramTextItem, self).__init__(parent, scene) + super().__init__(parent, scene) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) + self.setFlag(QGraphicsItem.ItemIsMovable) + self.setFlag(QGraphicsItem.ItemIsSelectable) def itemChange(self, change, value): - if change == QtWidgets.QGraphicsItem.ItemSelectedChange: - self.selectedChange.emit(self) + if change == QGraphicsItem.ItemSelectedChange: + self.selected_change.emit(self) return value def focusOutEvent(self, event): - self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) - self.lostFocus.emit(self) + self.setTextInteractionFlags(Qt.NoTextInteraction) + self.lost_focus.emit(self) super(DiagramTextItem, self).focusOutEvent(event) def mouseDoubleClickEvent(self, event): - if self.textInteractionFlags() == QtCore.Qt.NoTextInteraction: - self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) + if self.textInteractionFlags() == Qt.NoTextInteraction: + self.setTextInteractionFlags(Qt.TextEditorInteraction) super(DiagramTextItem, self).mouseDoubleClickEvent(event) -class DiagramItem(QtWidgets.QGraphicsPolygonItem): +class DiagramItem(QGraphicsPolygonItem): Step, Conditional, StartEnd, Io = range(4) - def __init__(self, diagramType, contextMenu, parent=None, scene=None): - super(DiagramItem, self).__init__(parent, scene) + def __init__(self, diagram_type, contextMenu, parent=None, scene=None): + super().__init__(parent, scene) self.arrows = [] - self.diagramType = diagramType - self.myContextMenu = contextMenu + self.diagram_type = diagram_type + self._my_context_menu = contextMenu - path = QtGui.QPainterPath() - if self.diagramType == self.StartEnd: + path = QPainterPath() + if self.diagram_type == self.StartEnd: path.moveTo(200, 50) path.arcTo(150, 0, 50, 50, 0, 90) path.arcTo(50, 0, 50, 50, 90, 90) path.arcTo(50, 50, 50, 50, 180, 90) path.arcTo(150, 50, 50, 50, 270, 90) path.lineTo(200, 25) - self.myPolygon = path.toFillPolygon() - elif self.diagramType == self.Conditional: - self.myPolygon = QtGui.QPolygonF([ - QtCore.QPointF(-100, 0), QtCore.QPointF(0, 100), - QtCore.QPointF(100, 0), QtCore.QPointF(0, -100), - QtCore.QPointF(-100, 0)]) - elif self.diagramType == self.Step: - self.myPolygon = QtGui.QPolygonF([ - QtCore.QPointF(-100, -100), QtCore.QPointF(100, -100), - QtCore.QPointF(100, 100), QtCore.QPointF(-100, 100), - QtCore.QPointF(-100, -100)]) + self._my_polygon = path.toFillPolygon() + elif self.diagram_type == self.Conditional: + self._my_polygon = QPolygonF([ + QPointF(-100, 0), QPointF(0, 100), + QPointF(100, 0), QPointF(0, -100), + QPointF(-100, 0)]) + elif self.diagram_type == self.Step: + self._my_polygon = QPolygonF([ + QPointF(-100, -100), QPointF(100, -100), + QPointF(100, 100), QPointF(-100, 100), + QPointF(-100, -100)]) else: - self.myPolygon = QtGui.QPolygonF([ - QtCore.QPointF(-120, -80), QtCore.QPointF(-70, 80), - QtCore.QPointF(120, 80), QtCore.QPointF(70, -80), - QtCore.QPointF(-120, -80)]) + self._my_polygon = QPolygonF([ + QPointF(-120, -80), QPointF(-70, 80), + QPointF(120, 80), QPointF(70, -80), + QPointF(-120, -80)]) - self.setPolygon(self.myPolygon) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + self.setPolygon(self._my_polygon) + self.setFlag(QGraphicsItem.ItemIsMovable, True) + self.setFlag(QGraphicsItem.ItemIsSelectable, True) - def removeArrow(self, arrow): + def remove_arrow(self, arrow): try: self.arrows.remove(arrow) except ValueError: pass - def removeArrows(self): + def remove_arrows(self): for arrow in self.arrows[:]: - arrow.startItem().removeArrow(arrow) - arrow.endItem().removeArrow(arrow) + arrow.start_item().remove_arrow(arrow) + arrow.end_item().remove_arrow(arrow) self.scene().removeItem(arrow) - def addArrow(self, arrow): + def add_arrow(self, arrow): self.arrows.append(arrow) def image(self): - pixmap = QtGui.QPixmap(250, 250) - pixmap.fill(QtCore.Qt.transparent) - painter = QtGui.QPainter(pixmap) - painter.setPen(QtGui.QPen(QtCore.Qt.black, 8)) - painter.translate(125, 125) - painter.drawPolyline(self.myPolygon) + pixmap = QPixmap(250, 250) + pixmap.fill(Qt.transparent) + with QPainter(pixmap) as painter: + painter.setPen(QPen(Qt.black, 8)) + painter.translate(125, 125) + painter.drawPolyline(self._my_polygon) return pixmap def contextMenuEvent(self, event): self.scene().clearSelection() self.setSelected(True) - self.myContextMenu.exec_(event.screenPos()) + self._my_context_menu.exec(event.screenPos()) def itemChange(self, change, value): - if change == QtWidgets.QGraphicsItem.ItemPositionChange: + if change == QGraphicsItem.ItemPositionChange: for arrow in self.arrows: arrow.updatePosition() return value -class DiagramScene(QtWidgets.QGraphicsScene): - InsertItem, InsertLine, InsertText, MoveItem = range(4) +class DiagramScene(QGraphicsScene): + InsertItem, InsertLine, InsertText, MoveItem = range(4) - itemInserted = QtCore.Signal(DiagramItem) + item_inserted = Signal(DiagramItem) - textInserted = QtCore.Signal(QtWidgets.QGraphicsTextItem) + text_inserted = Signal(QGraphicsTextItem) - itemSelected = QtCore.Signal(QtWidgets.QGraphicsItem) + item_selected = Signal(QGraphicsItem) def __init__(self, itemMenu, parent=None): - super(DiagramScene, self).__init__(parent) + super().__init__(parent) - self.myItemMenu = itemMenu - self.myMode = self.MoveItem - self.myItemType = DiagramItem.Step + self._my_item_menu = itemMenu + self._my_mode = self.MoveItem + self._my_item_type = DiagramItem.Step self.line = None - self.textItem = None - self.myItemColor = QtCore.Qt.white - self.myTextColor = QtCore.Qt.black - self.myLineColor = QtCore.Qt.black - self.myFont = QtGui.QFont() - - def setLineColor(self, color): - self.myLineColor = color - if self.isItemChange(Arrow): + self._text_item = None + self._my_item_color = Qt.white + self._my_text_color = Qt.black + self._my_line_color = Qt.black + self._my_font = QFont() + + def set_line_color(self, color): + self._my_line_color = color + if self.is_item_change(Arrow): item = self.selectedItems()[0] - item.setColor(self.myLineColor) + item.set_color(self._my_line_color) self.update() - def setTextColor(self, color): - self.myTextColor = color - if self.isItemChange(DiagramTextItem): + def set_text_color(self, color): + self._my_text_color = color + if self.is_item_change(DiagramTextItem): item = self.selectedItems()[0] - item.setDefaultTextColor(self.myTextColor) + item.setDefaultTextColor(self._my_text_color) - def setItemColor(self, color): - self.myItemColor = color - if self.isItemChange(DiagramItem): + def set_item_color(self, color): + self._my_item_color = color + if self.is_item_change(DiagramItem): item = self.selectedItems()[0] - item.setBrush(self.myItemColor) + item.setBrush(self._my_item_color) - def setFont(self, font): - self.myFont = font - if self.isItemChange(DiagramTextItem): + def set_font(self, font): + self._my_font = font + if self.is_item_change(DiagramTextItem): item = self.selectedItems()[0] - item.setFont(self.myFont) + item.setFont(self._my_font) - def setMode(self, mode): - self.myMode = mode + def set_mode(self, mode): + self._my_mode = mode - def setItemType(self, type): - self.myItemType = type + def set_item_type(self, type): + self._my_item_type = type - def editorLostFocus(self, item): + def editor_lost_focus(self, item): cursor = item.textCursor() cursor.clearSelection() item.setTextCursor(cursor) @@ -304,521 +280,523 @@ class DiagramScene(QtWidgets.QGraphicsScene): item.deleteLater() def mousePressEvent(self, mouseEvent): - if (mouseEvent.button() != QtCore.Qt.LeftButton): + if (mouseEvent.button() != Qt.LeftButton): return - if self.myMode == self.InsertItem: - item = DiagramItem(self.myItemType, self.myItemMenu) - item.setBrush(self.myItemColor) + if self._my_mode == self.InsertItem: + item = DiagramItem(self._my_item_type, self._my_item_menu) + item.setBrush(self._my_item_color) self.addItem(item) item.setPos(mouseEvent.scenePos()) - self.itemInserted.emit(item) - elif self.myMode == self.InsertLine: - self.line = QtWidgets.QGraphicsLineItem(QtCore.QLineF(mouseEvent.scenePos(), - mouseEvent.scenePos())) - self.line.setPen(QtGui.QPen(self.myLineColor, 2)) + self.item_inserted.emit(item) + elif self._my_mode == self.InsertLine: + self.line = QGraphicsLineItem(QLineF(mouseEvent.scenePos(), mouseEvent.scenePos())) + self.line.setPen(QPen(self._my_line_color, 2)) self.addItem(self.line) - elif self.myMode == self.InsertText: - textItem = DiagramTextItem() - textItem.setFont(self.myFont) - textItem.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) - textItem.setZValue(1000.0) - textItem.lostFocus.connect(self.editorLostFocus) - textItem.selectedChange.connect(self.itemSelected) - self.addItem(textItem) - textItem.setDefaultTextColor(self.myTextColor) - textItem.setPos(mouseEvent.scenePos()) - self.textInserted.emit(textItem) + elif self._my_mode == self.InsertText: + text_item = DiagramTextItem() + text_item.setFont(self._my_font) + text_item.setTextInteractionFlags(Qt.TextEditorInteraction) + text_item.setZValue(1000.0) + text_item.lost_focus.connect(self.editor_lost_focus) + text_item.selected_change.connect(self.item_selected) + self.addItem(text_item) + text_item.setDefaultTextColor(self._my_text_color) + text_item.setPos(mouseEvent.scenePos()) + self.text_inserted.emit(text_item) super(DiagramScene, self).mousePressEvent(mouseEvent) def mouseMoveEvent(self, mouseEvent): - if self.myMode == self.InsertLine and self.line: - newLine = QtCore.QLineF(self.line.line().p1(), mouseEvent.scenePos()) - self.line.setLine(newLine) - elif self.myMode == self.MoveItem: + if self._my_mode == self.InsertLine and self.line: + new_line = QLineF(self.line.line().p1(), mouseEvent.scenePos()) + self.line.setLine(new_line) + elif self._my_mode == self.MoveItem: super(DiagramScene, self).mouseMoveEvent(mouseEvent) def mouseReleaseEvent(self, mouseEvent): - if self.line and self.myMode == self.InsertLine: - startItems = self.items(self.line.line().p1()) - if len(startItems) and startItems[0] == self.line: - startItems.pop(0) - endItems = self.items(self.line.line().p2()) - if len(endItems) and endItems[0] == self.line: - endItems.pop(0) + if self.line and self._my_mode == self.InsertLine: + start_items = self.items(self.line.line().p1()) + if len(start_items) and start_items[0] == self.line: + start_items.pop(0) + end_items = self.items(self.line.line().p2()) + if len(end_items) and end_items[0] == self.line: + end_items.pop(0) self.removeItem(self.line) self.line = None - if len(startItems) and len(endItems) and \ - isinstance(startItems[0], DiagramItem) and \ - isinstance(endItems[0], DiagramItem) and \ - startItems[0] != endItems[0]: - startItem = startItems[0] - endItem = endItems[0] - arrow = Arrow(startItem, endItem) - arrow.setColor(self.myLineColor) - startItem.addArrow(arrow) - endItem.addArrow(arrow) + if (len(start_items) and len(end_items) + and isinstance(start_items[0], DiagramItem) + and isinstance(end_items[0], DiagramItem) + and start_items[0] != end_items[0]): + start_item = start_items[0] + end_item = end_items[0] + arrow = Arrow(start_item, end_item) + arrow.set_color(self._my_line_color) + start_item.add_arrow(arrow) + end_item.add_arrow(arrow) arrow.setZValue(-1000.0) self.addItem(arrow) - arrow.updatePosition() + arrow.update_position() self.line = None super(DiagramScene, self).mouseReleaseEvent(mouseEvent) - def isItemChange(self, type): + def is_item_change(self, type): for item in self.selectedItems(): if isinstance(item, type): return True return False -class MainWindow(QtWidgets.QMainWindow): - InsertTextButton = 10 +class MainWindow(QMainWindow): + insert_text_button = 10 def __init__(self): - super(MainWindow, self).__init__() + super().__init__() - self.createActions() - self.createMenus() - self.createToolBox() + self.create_actions() + self.create_menus() + self.create_tool_box() - self.scene = DiagramScene(self.itemMenu) - self.scene.setSceneRect(QtCore.QRectF(0, 0, 5000, 5000)) - self.scene.itemInserted.connect(self.itemInserted) - self.scene.textInserted.connect(self.textInserted) - self.scene.itemSelected.connect(self.itemSelected) + self.scene = DiagramScene(self._item_menu) + self.scene.setSceneRect(QRectF(0, 0, 5000, 5000)) + self.scene.item_inserted.connect(self.item_inserted) + self.scene.text_inserted.connect(self.text_inserted) + self.scene.item_selected.connect(self.item_selected) - self.createToolbars() + self.create_toolbars() - layout = QtWidgets.QHBoxLayout() - layout.addWidget(self.toolBox) - self.view = QtWidgets.QGraphicsView(self.scene) + layout = QHBoxLayout() + layout.addWidget(self._tool_box) + self.view = QGraphicsView(self.scene) layout.addWidget(self.view) - self.widget = QtWidgets.QWidget() + self.widget = QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("Diagramscene") - def backgroundButtonGroupClicked(self, button): - buttons = self.backgroundButtonGroup.buttons() + @Slot(QAbstractButton) + def background_button_group_clicked(self, button): + buttons = self._background_button_group.buttons() for myButton in buttons: if myButton != button: button.setChecked(False) text = button.text() if text == "Blue Grid": - self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background1.png'))) + self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background1.png'))) elif text == "White Grid": - self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background2.png'))) + self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background2.png'))) elif text == "Gray Grid": - self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background3.png'))) + self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background3.png'))) else: - self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background4.png'))) + self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background4.png'))) self.scene.update() self.view.update() - def buttonGroupClicked(self, id): - buttons = self.buttonGroup.buttons() + @Slot(int) + def button_group_clicked(self, idx): + buttons = self._button_group.buttons() for button in buttons: - if self.buttonGroup.button(id) != button: + if self._button_group.button(idx) != button: button.setChecked(False) - if id == self.InsertTextButton: - self.scene.setMode(DiagramScene.InsertText) + if idx == self.insert_text_button: + self.scene.set_mode(DiagramScene.InsertText) else: - self.scene.setItemType(id) - self.scene.setMode(DiagramScene.InsertItem) + self.scene.set_item_type(idx) + self.scene.set_mode(DiagramScene.InsertItem) - def deleteItem(self): + @Slot() + def delete_item(self): for item in self.scene.selectedItems(): if isinstance(item, DiagramItem): - item.removeArrows() + item.remove_arrows() self.scene.removeItem(item) - def pointerGroupClicked(self, i): - self.scene.setMode(self.pointerTypeGroup.checkedId()) + @Slot(int) + def pointer_group_clicked(self, i): + self.scene.set_mode(self._pointer_type_group.checkedId()) - def bringToFront(self): + @Slot() + def bring_to_front(self): if not self.scene.selectedItems(): return - selectedItem = self.scene.selectedItems()[0] - overlapItems = selectedItem.collidingItems() + selected_item = self.scene.selectedItems()[0] + overlap_items = selected_item.collidingItems() - zValue = 0 - for item in overlapItems: - if (item.zValue() >= zValue and isinstance(item, DiagramItem)): - zValue = item.zValue() + 0.1 - selectedItem.setZValue(zValue) + z_value = 0 + for item in overlap_items: + if (item.zValue() >= z_value and isinstance(item, DiagramItem)): + z_value = item.zValue() + 0.1 + selected_item.setZValue(z_value) - def sendToBack(self): + @Slot() + def send_to_back(self): if not self.scene.selectedItems(): return - selectedItem = self.scene.selectedItems()[0] - overlapItems = selectedItem.collidingItems() - - zValue = 0 - for item in overlapItems: - if (item.zValue() <= zValue and isinstance(item, DiagramItem)): - zValue = item.zValue() - 0.1 - selectedItem.setZValue(zValue) - - def itemInserted(self, item): - self.pointerTypeGroup.button(DiagramScene.MoveItem).setChecked(True) - self.scene.setMode(self.pointerTypeGroup.checkedId()) - self.buttonGroup.button(item.diagramType).setChecked(False) - - def textInserted(self, item): - self.buttonGroup.button(self.InsertTextButton).setChecked(False) - self.scene.setMode(self.pointerTypeGroup.checkedId()) - - def currentFontChanged(self, font): - self.handleFontChange() - - def fontSizeChanged(self, font): - self.handleFontChange() - - def sceneScaleChanged(self, scale): - newScale = int(scale[:-1]) / 100.0 - oldMatrix = self.view.matrix() - self.view.resetMatrix() - self.view.translate(oldMatrix.dx(), oldMatrix.dy()) - self.view.scale(newScale, newScale) - - def textColorChanged(self): - self.textAction = self.sender() - self.fontColorToolButton.setIcon(self.createColorToolButtonIcon( - ':/images/textpointer.png', - QtGui.QColor(self.textAction.data()))) - self.textButtonTriggered() - - def itemColorChanged(self): - self.fillAction = self.sender() - self.fillColorToolButton.setIcon(self.createColorToolButtonIcon( - ':/images/floodfill.png', - QtGui.QColor(self.fillAction.data()))) - self.fillButtonTriggered() - - def lineColorChanged(self): - self.lineAction = self.sender() - self.lineColorToolButton.setIcon(self.createColorToolButtonIcon( - ':/images/linecolor.png', - QtGui.QColor(self.lineAction.data()))) - self.lineButtonTriggered() - - def textButtonTriggered(self): - self.scene.setTextColor(QtGui.QColor(self.textAction.data())) - - def fillButtonTriggered(self): - self.scene.setItemColor(QtGui.QColor(self.fillAction.data())) - - def lineButtonTriggered(self): - self.scene.setLineColor(QtGui.QColor(self.lineAction.data())) - - def handleFontChange(self): - font = self.fontCombo.currentFont() - font.setPointSize(int(self.fontSizeCombo.currentText())) - if self.boldAction.isChecked(): - font.setWeight(QtGui.QFont.Bold) + selected_item = self.scene.selectedItems()[0] + overlap_items = selected_item.collidingItems() + + z_value = 0 + for item in overlap_items: + if (item.zValue() <= z_value and isinstance(item, DiagramItem)): + z_value = item.zValue() - 0.1 + selected_item.setZValue(z_value) + + @Slot(QGraphicsPolygonItem) + def item_inserted(self, item): + self._pointer_type_group.button(DiagramScene.MoveItem).setChecked(True) + self.scene.set_mode(self._pointer_type_group.checkedId()) + self._button_group.button(item.diagram_type).setChecked(False) + + @Slot(QGraphicsTextItem) + def text_inserted(self, item): + self._button_group.button(self.insert_text_button).setChecked(False) + self.scene.set_mode(self._pointer_type_group.checkedId()) + + @Slot(QFont) + def current_font_changed(self, font): + self.handle_font_change() + + @Slot(int) + def font_size_changed(self, font): + self.handle_font_change() + + @Slot(str) + def scene_scale_changed(self, scale): + new_scale = int(scale[:-1]) / 100.0 + old_matrix = self.view.transform() + self.view.resetTransform() + self.view.translate(old_matrix.dx(), old_matrix.dy()) + self.view.scale(new_scale, new_scale) + + @Slot() + def text_color_changed(self): + self._text_action = self.sender() + self._font_color_tool_button.setIcon(self.create_color_tool_button_icon( + ':/images/textpointer.png', QColor(self._text_action.data()))) + self.text_button_triggered() + + @Slot() + def item_color_changed(self): + self._fill_action = self.sender() + self._fill_color_tool_button.setIcon(self.create_color_tool_button_icon( + ':/images/floodfill.png', QColor(self._fill_action.data()))) + self.fill_button_triggered() + + @Slot() + def line_color_changed(self): + self._line_action = self.sender() + self._line_color_tool_button.setIcon(self.create_color_tool_button_icon( + ':/images/linecolor.png', QColor(self._line_action.data()))) + self.line_button_triggered() + + @Slot() + def text_button_triggered(self): + self.scene.set_text_color(QColor(self._text_action.data())) + + @Slot() + def fill_button_triggered(self): + self.scene.set_item_color(QColor(self._fill_action.data())) + + @Slot() + def line_button_triggered(self): + self.scene.set_line_color(QColor(self._line_action.data())) + + @Slot() + def handle_font_change(self): + font = self._font_combo.currentFont() + font.setPointSize(int(self._font_size_combo.currentText())) + if self._bold_action.isChecked(): + font.setWeight(QFont.Bold) else: - font.setWeight(QtGui.QFont.Normal) - font.setItalic(self.italicAction.isChecked()) - font.setUnderline(self.underlineAction.isChecked()) + font.setWeight(QFont.Normal) + font.setItalic(self._italic_action.isChecked()) + font.setUnderline(self._underline_action.isChecked()) - self.scene.setFont(font) + self.scene.set_font(font) - def itemSelected(self, item): + @Slot(QGraphicsItem) + def item_selected(self, item): font = item.font() - color = item.defaultTextColor() - self.fontCombo.setCurrentFont(font) - self.fontSizeCombo.setEditText(str(font.pointSize())) - self.boldAction.setChecked(font.weight() == QtGui.QFont.Bold) - self.italicAction.setChecked(font.italic()) - self.underlineAction.setChecked(font.underline()) + self._font_combo.setCurrentFont(font) + self._font_size_combo.setEditText(str(font.pointSize())) + self._bold_action.setChecked(font.weight() == QFont.Bold) + self._italic_action.setChecked(font.italic()) + self._underline_action.setChecked(font.underline()) + @Slot() def about(self): - QtWidgets.QMessageBox.about(self, "About Diagram Scene", - "The <b>Diagram Scene</b> example shows use of the graphics framework.") - - def createToolBox(self): - self.buttonGroup = QtWidgets.QButtonGroup() - self.buttonGroup.setExclusive(False) - self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked) - - layout = QtWidgets.QGridLayout() - layout.addWidget(self.createCellWidget("Conditional", DiagramItem.Conditional), - 0, 0) - layout.addWidget(self.createCellWidget("Process", DiagramItem.Step), 0, - 1) - layout.addWidget(self.createCellWidget("Input/Output", DiagramItem.Io), - 1, 0) - - textButton = QtWidgets.QToolButton() - textButton.setCheckable(True) - self.buttonGroup.addButton(textButton, self.InsertTextButton) - textButton.setIcon(QtGui.QIcon(QtGui.QPixmap(':/images/textpointer.png') + QMessageBox.about(self, "About Diagram Scene", + "The <b>Diagram Scene</b> example shows use of the graphics framework.") + + def create_tool_box(self): + self._button_group = QButtonGroup() + self._button_group.setExclusive(False) + self._button_group.idClicked.connect(self.button_group_clicked) + + layout = QGridLayout() + layout.addWidget(self.create_cell_widget("Conditional", DiagramItem.Conditional), 0, 0) + layout.addWidget(self.create_cell_widget("Process", DiagramItem.Step), 0, 1) + layout.addWidget(self.create_cell_widget("Input/Output", DiagramItem.Io), 1, 0) + + text_button = QToolButton() + text_button.setCheckable(True) + self._button_group.addButton(text_button, self.insert_text_button) + text_button.setIcon(QIcon(QPixmap(':/images/textpointer.png') .scaled(30, 30))) - textButton.setIconSize(QtCore.QSize(50, 50)) + text_button.setIconSize(QSize(50, 50)) - textLayout = QtWidgets.QGridLayout() - textLayout.addWidget(textButton, 0, 0, QtCore.Qt.AlignHCenter) - textLayout.addWidget(QtWidgets.QLabel("Text"), 1, 0, - QtCore.Qt.AlignCenter) - textWidget = QtWidgets.QWidget() - textWidget.setLayout(textLayout) - layout.addWidget(textWidget, 1, 1) + text_layout = QGridLayout() + text_layout.addWidget(text_button, 0, 0, Qt.AlignHCenter) + text_layout.addWidget(QLabel("Text"), 1, 0, Qt.AlignCenter) + text_widget = QWidget() + text_widget.setLayout(text_layout) + layout.addWidget(text_widget, 1, 1) layout.setRowStretch(3, 10) layout.setColumnStretch(2, 10) - itemWidget = QtWidgets.QWidget() - itemWidget.setLayout(layout) - - self.backgroundButtonGroup = QtWidgets.QButtonGroup() - self.backgroundButtonGroup.buttonClicked.connect(self.backgroundButtonGroupClicked) - - backgroundLayout = QtWidgets.QGridLayout() - backgroundLayout.addWidget(self.createBackgroundCellWidget("Blue Grid", - ':/images/background1.png'), 0, 0) - backgroundLayout.addWidget(self.createBackgroundCellWidget("White Grid", - ':/images/background2.png'), 0, 1) - backgroundLayout.addWidget(self.createBackgroundCellWidget("Gray Grid", - ':/images/background3.png'), 1, 0) - backgroundLayout.addWidget(self.createBackgroundCellWidget("No Grid", - ':/images/background4.png'), 1, 1) - - backgroundLayout.setRowStretch(2, 10) - backgroundLayout.setColumnStretch(2, 10) - - backgroundWidget = QtWidgets.QWidget() - backgroundWidget.setLayout(backgroundLayout) - - self.toolBox = QtWidgets.QToolBox() - self.toolBox.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Ignored)) - self.toolBox.setMinimumWidth(itemWidget.sizeHint().width()) - self.toolBox.addItem(itemWidget, "Basic Flowchart Shapes") - self.toolBox.addItem(backgroundWidget, "Backgrounds") - - def createActions(self): - self.toFrontAction = QtWidgets.QAction( - QtGui.QIcon(':/images/bringtofront.png'), "Bring to &Front", - self, shortcut="Ctrl+F", statusTip="Bring item to front", - triggered=self.bringToFront) - - self.sendBackAction = QtWidgets.QAction( - QtGui.QIcon(':/images/sendtoback.png'), "Send to &Back", self, - shortcut="Ctrl+B", statusTip="Send item to back", - triggered=self.sendToBack) - - self.deleteAction = QtWidgets.QAction(QtGui.QIcon(':/images/delete.png'), - "&Delete", self, shortcut="Delete", - statusTip="Delete item from diagram", - triggered=self.deleteItem) - - self.exitAction = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+X", - statusTip="Quit Scenediagram example", triggered=self.close) - - self.boldAction = QtWidgets.QAction(QtGui.QIcon(':/images/bold.png'), - "Bold", self, checkable=True, shortcut="Ctrl+B", - triggered=self.handleFontChange) - - self.italicAction = QtWidgets.QAction(QtGui.QIcon(':/images/italic.png'), - "Italic", self, checkable=True, shortcut="Ctrl+I", - triggered=self.handleFontChange) - - self.underlineAction = QtWidgets.QAction( - QtGui.QIcon(':/images/underline.png'), "Underline", self, - checkable=True, shortcut="Ctrl+U", - triggered=self.handleFontChange) - - self.aboutAction = QtWidgets.QAction("A&bout", self, shortcut="Ctrl+B", - triggered=self.about) - - def createMenus(self): - self.fileMenu = self.menuBar().addMenu("&File") - self.fileMenu.addAction(self.exitAction) - - self.itemMenu = self.menuBar().addMenu("&Item") - self.itemMenu.addAction(self.deleteAction) - self.itemMenu.addSeparator() - self.itemMenu.addAction(self.toFrontAction) - self.itemMenu.addAction(self.sendBackAction) - - self.aboutMenu = self.menuBar().addMenu("&Help") - self.aboutMenu.addAction(self.aboutAction) - - def createToolbars(self): - self.editToolBar = self.addToolBar("Edit") - self.editToolBar.addAction(self.deleteAction) - self.editToolBar.addAction(self.toFrontAction) - self.editToolBar.addAction(self.sendBackAction) - - self.fontCombo = QtWidgets.QFontComboBox() - self.fontCombo.currentFontChanged.connect(self.currentFontChanged) - - self.fontSizeCombo = QtWidgets.QComboBox() - self.fontSizeCombo.setEditable(True) + item_widget = QWidget() + item_widget.setLayout(layout) + + self._background_button_group = QButtonGroup() + self._background_button_group.buttonClicked.connect(self.background_button_group_clicked) + + background_layout = QGridLayout() + background_layout.addWidget( + self.create_background_cell_widget("Blue Grid", ':/images/background1.png'), 0, 0) + background_layout.addWidget( + self.create_background_cell_widget("White Grid", ':/images/background2.png'), 0, 1) + background_layout.addWidget( + self.create_background_cell_widget("Gray Grid", ':/images/background3.png'), 1, 0) + background_layout.addWidget( + self.create_background_cell_widget("No Grid", ':/images/background4.png'), 1, 1) + + background_layout.setRowStretch(2, 10) + background_layout.setColumnStretch(2, 10) + + background_widget = QWidget() + background_widget.setLayout(background_layout) + + self._tool_box = QToolBox() + self._tool_box.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored)) + self._tool_box.setMinimumWidth(item_widget.sizeHint().width()) + self._tool_box.addItem(item_widget, "Basic Flowchart Shapes") + self._tool_box.addItem(background_widget, "Backgrounds") + + def create_actions(self): + self._to_front_action = QAction( + QIcon(':/images/bringtofront.png'), "Bring to &Front", + self, shortcut="Ctrl+F", statusTip="Bring item to front", + triggered=self.bring_to_front) + + self._send_back_action = QAction( + QIcon(':/images/sendtoback.png'), "Send to &Back", self, + shortcut="Ctrl+B", statusTip="Send item to back", + triggered=self.send_to_back) + + self._delete_action = QAction(QIcon(':/images/delete.png'), + "&Delete", self, shortcut="Delete", + statusTip="Delete item from diagram", + triggered=self.delete_item) + + self._exit_action = QAction("E&xit", self, shortcut="Ctrl+X", + statusTip="Quit Scenediagram example", triggered=self.close) + + self._bold_action = QAction(QIcon(':/images/bold.png'), + "Bold", self, checkable=True, shortcut="Ctrl+B", + triggered=self.handle_font_change) + + self._italic_action = QAction(QIcon(':/images/italic.png'), + "Italic", self, checkable=True, shortcut="Ctrl+I", + triggered=self.handle_font_change) + + self._underline_action = QAction( + QIcon(':/images/underline.png'), "Underline", self, + checkable=True, shortcut="Ctrl+U", + triggered=self.handle_font_change) + + self._about_action = QAction("A&bout", self, shortcut="Ctrl+B", triggered=self.about) + + def create_menus(self): + self._file_menu = self.menuBar().addMenu("&File") + self._file_menu.addAction(self._exit_action) + + self._item_menu = self.menuBar().addMenu("&Item") + self._item_menu.addAction(self._delete_action) + self._item_menu.addSeparator() + self._item_menu.addAction(self._to_front_action) + self._item_menu.addAction(self._send_back_action) + + self._about_menu = self.menuBar().addMenu("&Help") + self._about_menu.addAction(self._about_action) + + def create_toolbars(self): + self._edit_tool_bar = self.addToolBar("Edit") + self._edit_tool_bar.addAction(self._delete_action) + self._edit_tool_bar.addAction(self._to_front_action) + self._edit_tool_bar.addAction(self._send_back_action) + + self._font_combo = QFontComboBox() + self._font_combo.currentFontChanged.connect(self.current_font_changed) + + self._font_size_combo = QComboBox() + self._font_size_combo.setEditable(True) for i in range(8, 30, 2): - self.fontSizeCombo.addItem(str(i)) - validator = QtGui.QIntValidator(2, 64, self) - self.fontSizeCombo.setValidator(validator) - self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged) - - self.fontColorToolButton = QtWidgets.QToolButton() - self.fontColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - self.fontColorToolButton.setMenu( - self.createColorMenu(self.textColorChanged, QtCore.Qt.black)) - self.textAction = self.fontColorToolButton.menu().defaultAction() - self.fontColorToolButton.setIcon( - self.createColorToolButtonIcon(':/images/textpointer.png', - QtCore.Qt.black)) - self.fontColorToolButton.setAutoFillBackground(True) - self.fontColorToolButton.clicked.connect(self.textButtonTriggered) - - self.fillColorToolButton = QtWidgets.QToolButton() - self.fillColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - self.fillColorToolButton.setMenu( - self.createColorMenu(self.itemColorChanged, QtCore.Qt.white)) - self.fillAction = self.fillColorToolButton.menu().defaultAction() - self.fillColorToolButton.setIcon( - self.createColorToolButtonIcon(':/images/floodfill.png', - QtCore.Qt.white)) - self.fillColorToolButton.clicked.connect(self.fillButtonTriggered) - - self.lineColorToolButton = QtWidgets.QToolButton() - self.lineColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - self.lineColorToolButton.setMenu( - self.createColorMenu(self.lineColorChanged, QtCore.Qt.black)) - self.lineAction = self.lineColorToolButton.menu().defaultAction() - self.lineColorToolButton.setIcon( - self.createColorToolButtonIcon(':/images/linecolor.png', - QtCore.Qt.black)) - self.lineColorToolButton.clicked.connect(self.lineButtonTriggered) - - self.textToolBar = self.addToolBar("Font") - self.textToolBar.addWidget(self.fontCombo) - self.textToolBar.addWidget(self.fontSizeCombo) - self.textToolBar.addAction(self.boldAction) - self.textToolBar.addAction(self.italicAction) - self.textToolBar.addAction(self.underlineAction) - - self.colorToolBar = self.addToolBar("Color") - self.colorToolBar.addWidget(self.fontColorToolButton) - self.colorToolBar.addWidget(self.fillColorToolButton) - self.colorToolBar.addWidget(self.lineColorToolButton) - - pointerButton = QtWidgets.QToolButton() - pointerButton.setCheckable(True) - pointerButton.setChecked(True) - pointerButton.setIcon(QtGui.QIcon(':/images/pointer.png')) - linePointerButton = QtWidgets.QToolButton() - linePointerButton.setCheckable(True) - linePointerButton.setIcon(QtGui.QIcon(':/images/linepointer.png')) - - self.pointerTypeGroup = QtWidgets.QButtonGroup() - self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem) - self.pointerTypeGroup.addButton(linePointerButton, - DiagramScene.InsertLine) - self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked) - - self.sceneScaleCombo = QtWidgets.QComboBox() - self.sceneScaleCombo.addItems(["50%", "75%", "100%", "125%", "150%"]) - self.sceneScaleCombo.setCurrentIndex(2) - self.sceneScaleCombo.currentIndexChanged[str].connect(self.sceneScaleChanged) - - self.pointerToolbar = self.addToolBar("Pointer type") - self.pointerToolbar.addWidget(pointerButton) - self.pointerToolbar.addWidget(linePointerButton) - self.pointerToolbar.addWidget(self.sceneScaleCombo) - - def createBackgroundCellWidget(self, text, image): - button = QtWidgets.QToolButton() + self._font_size_combo.addItem(str(i)) + validator = QIntValidator(2, 64, self) + self._font_size_combo.setValidator(validator) + self._font_size_combo.currentIndexChanged.connect(self.font_size_changed) + + self._font_color_tool_button = QToolButton() + self._font_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup) + self._font_color_tool_button.setMenu( + self.create_color_menu(self.text_color_changed, Qt.black)) + self._text_action = self._font_color_tool_button.menu().defaultAction() + self._font_color_tool_button.setIcon( + self.create_color_tool_button_icon(':/images/textpointer.png', Qt.black)) + self._font_color_tool_button.setAutoFillBackground(True) + self._font_color_tool_button.clicked.connect(self.text_button_triggered) + + self._fill_color_tool_button = QToolButton() + self._fill_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup) + self._fill_color_tool_button.setMenu( + self.create_color_menu(self.item_color_changed, Qt.white)) + self._fill_action = self._fill_color_tool_button.menu().defaultAction() + self._fill_color_tool_button.setIcon( + self.create_color_tool_button_icon(':/images/floodfill.png', Qt.white)) + self._fill_color_tool_button.clicked.connect(self.fill_button_triggered) + + self._line_color_tool_button = QToolButton() + self._line_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup) + self._line_color_tool_button.setMenu( + self.create_color_menu(self.line_color_changed, Qt.black)) + self._line_action = self._line_color_tool_button.menu().defaultAction() + self._line_color_tool_button.setIcon( + self.create_color_tool_button_icon(':/images/linecolor.png', Qt.black)) + self._line_color_tool_button.clicked.connect(self.line_button_triggered) + + self._text_tool_bar = self.addToolBar("Font") + self._text_tool_bar.addWidget(self._font_combo) + self._text_tool_bar.addWidget(self._font_size_combo) + self._text_tool_bar.addAction(self._bold_action) + self._text_tool_bar.addAction(self._italic_action) + self._text_tool_bar.addAction(self._underline_action) + + self._color_tool_bar = self.addToolBar("Color") + self._color_tool_bar.addWidget(self._font_color_tool_button) + self._color_tool_bar.addWidget(self._fill_color_tool_button) + self._color_tool_bar.addWidget(self._line_color_tool_button) + + pointer_button = QToolButton() + pointer_button.setCheckable(True) + pointer_button.setChecked(True) + pointer_button.setIcon(QIcon(':/images/pointer.png')) + line_pointer_button = QToolButton() + line_pointer_button.setCheckable(True) + line_pointer_button.setIcon(QIcon(':/images/linepointer.png')) + + self._pointer_type_group = QButtonGroup() + self._pointer_type_group.addButton(pointer_button, DiagramScene.MoveItem) + self._pointer_type_group.addButton(line_pointer_button, DiagramScene.InsertLine) + self._pointer_type_group.idClicked.connect(self.pointer_group_clicked) + + self._scene_scale_combo = QComboBox() + self._scene_scale_combo.addItems(["50%", "75%", "100%", "125%", "150%"]) + self._scene_scale_combo.setCurrentIndex(2) + self._scene_scale_combo.currentTextChanged.connect(self.scene_scale_changed) + + self._pointer_toolbar = self.addToolBar("Pointer type") + self._pointer_toolbar.addWidget(pointer_button) + self._pointer_toolbar.addWidget(line_pointer_button) + self._pointer_toolbar.addWidget(self._scene_scale_combo) + + def create_background_cell_widget(self, text, image): + button = QToolButton() button.setText(text) - button.setIcon(QtGui.QIcon(image)) - button.setIconSize(QtCore.QSize(50, 50)) + button.setIcon(QIcon(image)) + button.setIconSize(QSize(50, 50)) button.setCheckable(True) - self.backgroundButtonGroup.addButton(button) + self._background_button_group.addButton(button) - layout = QtWidgets.QGridLayout() - layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter) - layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter) + layout = QGridLayout() + layout.addWidget(button, 0, 0, Qt.AlignHCenter) + layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) - widget = QtWidgets.QWidget() + widget = QWidget() widget.setLayout(layout) return widget - def createCellWidget(self, text, diagramType): - item = DiagramItem(diagramType, self.itemMenu) - icon = QtGui.QIcon(item.image()) + def create_cell_widget(self, text, diagram_type): + item = DiagramItem(diagram_type, self._item_menu) + icon = QIcon(item.image()) - button = QtWidgets.QToolButton() + button = QToolButton() button.setIcon(icon) - button.setIconSize(QtCore.QSize(50, 50)) + button.setIconSize(QSize(50, 50)) button.setCheckable(True) - self.buttonGroup.addButton(button, diagramType) + self._button_group.addButton(button, diagram_type) - layout = QtWidgets.QGridLayout() - layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter) - layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter) + layout = QGridLayout() + layout.addWidget(button, 0, 0, Qt.AlignHCenter) + layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter) - widget = QtWidgets.QWidget() + widget = QWidget() widget.setLayout(layout) return widget - def createColorMenu(self, slot, defaultColor): - colors = [QtCore.Qt.black, QtCore.Qt.white, QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow] + def create_color_menu(self, slot, defaultColor): + colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow] names = ["black", "white", "red", "blue", "yellow"] - colorMenu = QtWidgets.QMenu(self) + color_menu = QMenu(self) for color, name in zip(colors, names): - action = QtWidgets.QAction(self.createColorIcon(color), name, self, - triggered=slot) - action.setData(QtGui.QColor(color)) - colorMenu.addAction(action) + action = QAction(self.create_color_icon(color), name, self, triggered=slot) + action.setData(QColor(color)) + color_menu.addAction(action) if color == defaultColor: - colorMenu.setDefaultAction(action) - return colorMenu + color_menu.setDefaultAction(action) + return color_menu - def createColorToolButtonIcon(self, imageFile, color): - pixmap = QtGui.QPixmap(50, 80) - pixmap.fill(QtCore.Qt.transparent) - painter = QtGui.QPainter(pixmap) - image = QtGui.QPixmap(imageFile) - target = QtCore.QRect(0, 0, 50, 60) - source = QtCore.QRect(0, 0, 42, 42) - painter.fillRect(QtCore.QRect(0, 60, 50, 80), color) - painter.drawPixmap(target, image, source) - painter.end() + def create_color_tool_button_icon(self, imageFile, color): + pixmap = QPixmap(50, 80) + pixmap.fill(Qt.transparent) - return QtGui.QIcon(pixmap) + with QPainter(pixmap) as painter: + image = QPixmap(imageFile) + target = QRect(0, 0, 50, 60) + source = QRect(0, 0, 42, 42) + painter.fillRect(QRect(0, 60, 50, 80), color) + painter.drawPixmap(target, image, source) - def createColorIcon(self, color): - pixmap = QtGui.QPixmap(20, 20) - painter = QtGui.QPainter(pixmap) - painter.setPen(QtCore.Qt.NoPen) - painter.fillRect(QtCore.QRect(0, 0, 20, 20), color) - painter.end() + return QIcon(pixmap) - return QtGui.QIcon(pixmap) + def create_color_icon(self, color): + pixmap = QPixmap(20, 20) + with QPainter(pixmap) as painter: + painter.setPen(Qt.NoPen) + painter.fillRect(QRect(0, 0, 20, 20), color) -if __name__ == '__main__': + return QIcon(pixmap) - import sys - app = QtWidgets.QApplication(sys.argv) +if __name__ == '__main__': + app = QApplication(sys.argv) - mainWindow = MainWindow() - mainWindow.setGeometry(100, 100, 800, 500) - mainWindow.show() + main_window = MainWindow() + main_window.setGeometry(100, 100, 800, 500) + main_window.show() - sys.exit(app.exec_()) + sys.exit(app.exec()) diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject b/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject index 0acabdd78..79b8c8658 100644 --- a/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject +++ b/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject @@ -1,3 +1,3 @@ { - "files": ["diagramscene.qrc", "diagramscene.py", "diagramscene_rc.py"] + "files": ["diagramscene.qrc", "diagramscene.py"] } diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py index 8fee5a0d6..144d9200f 100644 --- a/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py +++ b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py @@ -1,149 +1,11 @@ # Resource object code (Python 3) # Created by: object code -# Created by: The Resource Compiler for Qt version 5.14.0 +# Created by: The Resource Compiler for Qt version 6.2.2 # WARNING! All changes made in this file will be lost! -from PySide2 import QtCore +from PySide6 import QtCore qt_resource_data = b"\ -\x00\x00\x00\xf7\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\ -\x00\x00\x00\xbeIDAT(S\x85\x911\x0e@@\ -\x10EWM$J7\xa1\xa4\x918\x85^t\xaa=\ -\x8aNT{\x80\xadun\xa0\xd1l\xe7\x12\xc4\x97\x19\ -\xb1!YQ\xfcb\xfe\xbc\xfc\x99\xcc\x08\x00\x82t\x1c\ -\x07\xa6i\x82\x10\xc2)\xcf\xf3.\xf0\xd68\x8e\xa8\xaa\ -\x8aU\x14\x05\x03I\x92X\xef\x05?\xd5u\x1d\xc3Z\ -k\xd0T\xf2\x9c 5\xeb\xbafx]W\xdc\xfeg\ -r\x9a\xa6\x88\xe3\x18O\xcf\x09n\xdb\x06\xdf\xf7Q\x96\ -\xa5]\xc1\x09Ss\x9eg^AJ\xf9\x9f<\x0c\x03\ -\xc3J\xa9\xff\xe4\xb6m\x19^\x96\xe5?9\xcfs\x84\ -a\x88}\xdf\xdf\xc9T\x18c\xec\xe1IA\x10 \x8a\ -\x22[7M\x03\x9b\xdc\xf7\xfd\xf5\xce\x8fWgY\xc6\ -\x13N\xfaWVX\xe8@\xda\xc6\x00\x00\x00\x00IE\ -ND\xaeB`\x82\ -\x00\x00\x01\x1a\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00*\x00\x00\x00+\x02\x03\x00\x00\x00s\xf1\xf2m\ -\x00\x00\x00\x0cPLTE\xff\xff\xff\x80\x80\x80\x00\x00\ -\x00\xff\xff\xffEJK8\x00\x00\x00\x01tRNS\ -\x00@\xe6\xd8f\x00\x00\x00\xbcIDATx^M\ -\xcb\xbd\x89\x041\x0c\x86a\xa1\xd0U8\x1c\xdc\x8f&\ -\xd8\x12\xa6\x0a\xb3\xe1\xe6N.2\x07\x02\xdb\x07[\xc0\ -\x96\xb4U\x9cG?3V\xf4!\xde\x07B\xcd\xe0\x17\ -F\xbd\xf6\xb6\xec\x1a\xef\xa6A\x024\xb2A\x80`$\ -\xcf\x9d\x9a\xee8\x8b~x\x83O~d\xb30hW\ -\x102t\x22\x05\x98\x91\x89\x0c\xe4P\x88\x0c\xd4D\xe4\ - \xce\xdc\xc1\x98\x89\x833q \x89\x02\xe4\x9d\x1d`\ -\xa1.@\xff\xe9\x02\xfd\xf1*\x0e\xd2\xfe{\x81P\xda\ -\x02\x8e\xef\x02>\x0bx\xb3l\x01\x7f]\x1a\x03f\x1d\ -4\x00\x03B\x15\xb0\xe4\x0a$7P$W\xc0\x92+\ -\xe8\x92\x1b\x90\xdc\x80\xe4\x0a$7\xf0so\x1cp_\ -[v<\xc7?\xd6Qh R\x85\xdb_\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x00\xfa\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\ -\x00\x00\x00\xc1IDAT(S\xcd\x901\x0a\x840\ -\x10E\xc7\xceV\xb0\xd3F\x10o`\xe5\x01\xbcB@\ -\x0b\x9bt\x22\x11\xbc\x94\x9d'\xd2\x03x\x03\x03\x19\xf7\ -\x0f\xb8\xd9,l\xbf\x81Of\xde\xfc|\xc8P\x1c\xc7\ -LD\xa2(\x8a8\xcfs~\x1d\xc2\xfd\xc9\xd34e\ -\xd2ZsQ\x14\x02\x86a\xe0y\x9e\xc5\x8c\x1b=8\ -\xe6\xe382a\xa0\x94\x12\x88\xfa[\xe0\x98;\xe7B\ -3\xc0/3\xea\x7fJ\xee\xbaN\xcc\xd7u\x05\x0f\xd0\ -\x83\xf7}\xef\x93\xb1&\xc0}\xdf\x03\xf3q\x1c\xc2\x97\ -e\xf1\xc9\xeb\xba\x0a\x9c\xa6)0?!\xdb\xb6\xf9d\ -\xa8\xaek\x19\x94e\xc9m\xdbrUU\xd27M\xc3\ -\xd6Z\x9f\xfc\xc8\x18\xc3Y\x96\x89)I\x12\xc6_\xce\ -\xf3|o\xe9\x063 8\xcd\x08\x1exv\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x00r\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ -\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\ -\xd3~\x00\x00\x00'IDATH\xc7c`\x80\x82\ -\x06\x0640*0*0*0*\x80*\xf0\x1f\x15\ -\xfc\x1b\x0d\xa0Q\x81Q\x81Q\x01\x22\x05\x00\xd5;N\ -\xf0s\xe3o\xe9\x00\x00\x00\x00IEND\xaeB`\ -\x82\ -\x00\x00\x02\xf1\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00*\x00\x00\x00,\x08\x03\x00\x00\x00$D\xdat\ -\x00\x00\x012PLTE\xff\xff\xff\xfe\xfe\xfe\x01\x01\ -\x01\xbe\xbe\xbe\xfd\xfd\xfd\x00\x00\x00ddd\xd2\xd2\xd2\ -|||\xfb\xfb\xfb\xe7\xe7\xe7\x84\x84\x84\xd7\xd7\xd7\xe0\ -\xe0\xe0\xe1\xe1\xe1\x0c\x0c\x0c(((\xf5\xf5\xf5\xb3\xb3\ -\xb3\x02\x02\x02\x95\x95\x95...\x11\x11\x11kkk\ -\x03\x03\x03rrrIII\xfc\xfc\xfc\x13\x13\x13\x04\ -\x04\x04\x9f\x9f\x9f\xc4\xc4\xc4\xa9\xa9\xa9\x05\x05\x05WW\ -W\x17\x17\x17\xf6\xf6\xf6\x16\x16\x16\xa6\xa6\xa6\xa0\xa0\xa0\ -```$$$>>>###\xb7\xb7\xb7M\ -MM\xf8\xf8\xf8\xc0\xc0\xc0000\x09\x09\x09\xec\xec\ -\xec \x8a\x8a\x8a\xda\xda\xda\xf1\xf1\xf1\x0d\x0d\x0d\ -\x99\x99\x99\x19\x19\x19\xf9\xf9\xf9\xcd\xcd\xcd\xf4\xf4\xf49\ -99---;;;\x12\x12\x12CCC\xc2\xc2\ -\xc2\xa4\xa4\xa4\xdc\xdc\xdcUUUhhhZZZ\ -PPP\xf0\xf0\xf0\x06\x06\x06\x1f\x1f\x1fttt\xb1\ -\xb1\xb1]]]!!!666\x08\x08\x08\xea\xea\ -\xea\xdb\xdb\xdb\x81\x81\x81\x9c\x9c\x9c\x8b\x8b\x8buuu\ -\xf2\xf2\xf2%%%\xce\xce\xceHHHccc\xba\ -\xba\xbaSSS888\xf7\xf7\xf7\xe4\xe4\xe4\xa2\xa2\ -\xa2JJJ\xf3\xf3\xf3___\xf1i\x00\xec\x00\x00\ -\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x01mI\ -DATx^\xd5\x92\xc5v\xc30\x10E=\x92\x1d\ -f\xe6\x94\x99\x99\x99\x99\x99\xe1\xff\x7f\xa1\x9e\x89\x93S\ -\xa9\xb2Nvm\xdf\xf2\xea\xfa\xbdY\xd8\xf8+\xf10\ -\xeb[X\xcc\x047\x13<\x96\x10\xc6\xb5\xadB\xda\x9a\ -om\x0d@\xb3\xad,\xe8\xda\x1a\xe2\xb5\xf4\xd4\xddq\ -\xbf\xa1\x0d\x14{\x1b\xed\x09\xd0\xbb\x03\x0d\x93\x0d\xeaM\ -\xd8A+3\x82n.\xac5\xc39\xbb\x95\xe5\xbb\xa9\ -\xdb\xa7\xbd\xc0G\xcedG'~1;\xa7q\x87\xda\ -\xd1,\x00\xf8\xe8\xda\x16\xcd~\x17\x19\x09\xc3\x88\x94\xd1\ -]\xd5\xb4\xf6\xe1n\xbf\xdf66\xe9\x92\x90\xab\xeb\xa5\ -\xf7\x09\xdb\x84a\xea\xcf\xbb\xeeg\xd1\x1c\x1dC`\xa6\ -\xd1]\x89\xbb\x98S\xd3\xb8\xef\xa9\x81\x19Z\xa8\x80\xda\ -M\xd1\xeb<\xbd\xc2B\x06\xbf[T\x9b\xe6\x12\x9a\xcb\ -N\x0f\x1c\xd0\xb5w\xca\xfd5z[\xaf\x83\x8d$\xba\ -[\xca\x0b\xb6q_\x0a\x8b\xee*\xdc\xc0\x9e\xa5\x08K\ -)\xf6\x83\x962i\xf3\x87\xe9\xdfgj\xb7\x0a\xb2{\ -\xe8b\xb2#\xd9\x84\x02\xf2c.\xe4\x04\xd9\xe9\x99d\ -\x9eS\xc3\x85H/i\xe9\x0aDzmS\x96\x8c\x08\ -\x14n\xa2Ho\x8b\x02\x8d\x97\xb0\xf5\x1e\xa4\xad\x07\xda\ -z\x14XE\xfd\xd7W\xe9\x82'\xa1\xe1\x19\x97J/\ -r\xab\x19C^~\xads\xce\xf9\x1b}\xfd\xce1\x1f\ -\xe0`\xcc'\xademL\xcc\x12\xc2\xbcN#\x139\ -A\x89y\xc1P5\xfc~\xeb\xff\xca\x17Uq \xbb\ -\xd7\xbb.\xca\x00\x00\x00\x00IEND\xaeB`\x82\ -\ -\x00\x00\x01>\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ -\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ -\xa7\x93\x00\x00\x00\xf3IDAT8\xcb\xed\x94An\ -\x830\x10E\x9f%\xe0\x0c\xbdC/\xd0\x13\xe5\xfaU\ -b\x9b\xd83\x01w\x81\x0d$\x85\xaa1\xca\xaa\x1d\x89\ -\x8d\x0dO\xef{\x067m\xdb&\x0e\x94\xaa\x9a\xad\xf5\ -\x06@D\xaa\xa0]\xd7\xed\xee5\xbc\xa8\xfe\xc1\x7f\x01\ -l\x8c\xd9\xdbJ\x87\x8dS\xda`\x8c\x03\x0c\x01\xf4\x0a\ -\xd2Ct\x98\xb7\xf7\x83G1*h\x81z\x10\x07\xd1\ -\x1d<\xe3A&\xa0\xf6\x0b48\x88\x97Jp\x1aa\ -\x88Kt\xf5\x93e\xb4\xd3#5\xc6i\x80[\x00)\ -\xd1=\xa8\x83`W`_\x01\x96\x1c}\xb6|0\x95\ -jp\xfep\x06\xba\x15\xd4\xe5\x14v\x01\xfft\xfd\xdd\ -U\xb8\xe4\xce\xdb\x05\x5c&A\xfd\xb2\x064{\x17\xf5\ -\xe6\x8f\x10\xce\xdf\xa1\xc54\xe6\x89\xa8j^\xf8\x9cF\ -j\xb6t\x10\xb3\xa9\xac\x1a\xf84\xf8z\xce\xa6\x16b\ -\x0fj\xef\x1bXRT\x81\xa5\x98nLE\xf4p\xeb\ -\x9f\x07\x9b\x8f\xd3\xaf\xdf\xfd\x02\xd6\xbd\xde\xdfp\xdb\x04\ -\x83\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00\x00\xad\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ @@ -157,56 +19,47 @@ r\x1f\x17a\x1aW\x9e\x80A\xb9\xf3\x82@\xeb\xc8B\ \xfed\xcc\x8f\xdc\x17\xd9\x83\xf6\x1e\xe4\xd8\xdd\xe3\xd8\x1d\ sa.\xb4\x8e'\xf0\x07\xd5\x18\x11\x1b\xedM#\xf4\ \x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00p\ +\x00\x00\x01\x12\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ -\x00\x00\x00\x06PLTE\x00\xff\xff\xff\xff\xff\xb1\xb8\ -^\xa0\x00\x00\x00%IDATx^\xed\xcc!\x12\ -\x00\x00\x04\x00A\xff\x7f4\x82\x11du/n\xb8\xd8\ -j\xca\x0b\x00\x00\xf0\x9d\x01\x00@\x03\x94\x98\xeb\xc0\x19\ -8\xa1\x84\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\x91\ +\x00\x00\x0b\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x7f\xf5\x94;\ +\x00\x00\x00\xd9IDAT(S}\x901\x0eE@\ +\x10\x86G$$\x1a\x0d\x0d\xd1\x22Qp\x80m\x5c@\ +\xe7<\x0e!\x0aGq\x19\xb5N\xa9\xc1x3\xb2\x8b\ +\xf7\xec\xdb\xe4\xcbfv\xfe\xf9gv\xc00\x0c\x04\x80\ +\x07\xf4fY\x16&I\x82\x9f\x03\xc4\xbe\xef\x94;\x05\ +i\x9a2$\x08\xc3\xf0QX\xd75\x17\x01\x05\x04U\ +\xde]\xe8v\x1c\x87s\xb6m\xe3\xc3Y\x0a\xefDQ\ +\xc4\xe2 \x08\xf4\xce\xeb\xbab\xdb\xb6j\x94\xbe\xefO\ +\xb1|(\x8a\x82\xc9\xf3\x1c}\xdfg\x03!\x04\x0e\xc3\ +\xa0L@\xb7\x0d\xd34Y\xdcu\xdd%\xfe\x9ey\xdb\ +6\x9c\xa6\x89c\xd9!\x8ec\x1c\xc7\x11\xd5\xcco\x1f\ +$d\xbe\xaa\xaa\xff\xdbX\x96E\x8dF]^\xb7A\ +\xcc\xf3\x8cM\xd3\xa0\xccgYv9{\x9e\xa7p]\ +\xf7\xe7\xd3\xdamH\xa8\xa8,K\xd5\xf1\x00\xd0\xc0\x13\ +\xc8\x06\xaf\x16(\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00r\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00*\x00\x00\x00+\x01\x03\x00\x00\x004Q\x88\xbd\ +\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ \x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\ -\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\ -\x00\x009IDAT\x18Wc`\xc0\x05\x14 T\ -\x01\x84\xfa\x01&\x19\xff\x80)f\x08\x8f\xfd\x03\x98\xe2\ -\x7f\x00\xa6\xe4\x0f\x80)\xfb\x060U\x0f\xd1\xf6oP\ -k\xe3\x87hc\x83P,\x0c\x84\x00\x00\x91\xca\x1c\x09\ -\xf6#*\xfe\x00\x00\x00\x00IEND\xaeB`\x82\ -\ -\x00\x00\x01%\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ -\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ -\xa7\x93\x00\x00\x00\xdaIDATH\xc7\xed\x94A\x0e\ -\x820\x10E\x1fF8\x83w\xf0\xfe\x87\xf0\x1a^@\ -\xb1\xa5t\xa6\x1a\x5c\xb4\x04\x8c\xa2\x11\xca\xc2\xc4I\xd8\ -\xd0\xe4\xe5\xf5\xf7g\x8a\xb2,;\x16L\x08\xa1x\xf5\ -\x7f\x0b\xa0\xaa\xb3\xa0UUM\x9emXi\xfe\xe0\x1f\ -\x06o30\xbaU\xc0\xdd\xed\x0a7\x0f\xa1\x05u \ -\x96b\xb7\xcf`\x1c\x5c\x826\xa0\x16\xc4f\x8aB\xed\ -\x00\xf5\x16\xe4\x92\x09,\x97h)&~\x9a\xcb\xd8\xd7\ -\xe0\xcd\x08\xdcd\x02\xbb\xf3`\xaa9\xc1\xed9A\xfb\ -\xac\xcd\x00~\xb7\xfe>g\x5c\xc7\x8cC\x93\xe2H\x19\ -O-\xeaW\x95\xed\x8e\x87!KI\x96\xbe\x8e\xa6\x92\ -\x1a1\xeb\xf1\xfc)V\xaa\xefk\xb0 \xc9TG\x0f\ -\xf85\xb8M\xd7V\x03\xe2 \x98\xc7\xaa\xf5\xb7\x98\x05\ -\xd6\xde\xd4>\xf7W\x1a\xb8:\x00\x8a\xa5\xcbfj\xee\ -\x91a\xa9f\xc0\x0f\xb5]\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x00`\ +\xd3~\x00\x00\x00'IDATH\xc7c`\x80\x82\ +\x06\x0640*0*0*0*\x80*\xf0\x1f\x15\ +\xfc\x1b\x0d\xa0Q\x81Q\x81Q\x01\x22\x05\x00\xd5;N\ +\xf0s\xe3o\xe9\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00\x8d\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ -\x00\x00\x00\x03PLTE\xff\xff\xff\xa7\xc4\x1b\xc8\x00\ -\x00\x00\x18IDATx^\xed\xc01\x01\x00\x00\x00\ -\xc2 \xfb\xa76\xc5>X\x0b\x00\xe0\x08o\x00\x01\x01\ ->\xc31\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x1b\x00\x00\x00\x1b\x01\x03\x00\x00\x00\xb7\x1af\x16\ +\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\ +\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\ +\x00\x005IDAT\x08\x99c`\xc0\x02\xd8\x1b\x80\ +\x04\xff\x01L\x82\xfd\x01H\xba\x00DX\x80\x08\x19\x10\ +\xc1\x07\xd6\x02\x22\x98A\xfa\x18A\x0a\x19\xc0\x0a\xeb@\ +\x84=\x16B\x0e\xddF\x00\xb5\x00\x09@\xa31\xbf^\ +\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00\x03?\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ @@ -261,37 +114,6 @@ I\x22\x8f\x8f\xc15\xf7\xdd\x12\xae\xb4\xf4\x04n\xa9\x0c\ \x8a\x88\xa6Y\xd6\xa8Syku\x9eO>\x8e\x1b\xec\ \x0f\xe4\x1a\xda\xa0h\xebM\xed\x7f=\xa9\x97\x96\x02\xf1\ +\x1c\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\x8d\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x1b\x00\x00\x00\x1b\x01\x03\x00\x00\x00\xb7\x1af\x16\ -\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\ -\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\ -\x00\x005IDAT\x08\x99c`\xc0\x02\xd8\x1b\x80\ -\x04\xff\x01L\x82\xfd\x01H\xba\x00DX\x80\x08\x19\x10\ -\xc1\x07\xd6\x02\x22\x98A\xfa\x18A\x0a\x19\xc0\x0a\xeb@\ -\x84=\x16B\x0e\xddF\x00\xb5\x00\x09@\xa31\xbf^\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\x12\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0b\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x7f\xf5\x94;\ -\x00\x00\x00\xd9IDAT(S}\x901\x0eE@\ -\x10\x86G$$\x1a\x0d\x0d\xd1\x22Qp\x80m\x5c@\ -\xe7<\x0e!\x0aGq\x19\xb5N\xa9\xc1x3\xb2\x8b\ -\xf7\xec\xdb\xe4\xcbfv\xfe\xf9gv\xc00\x0c\x04\x80\ -\x07\xf4fY\x16&I\x82\x9f\x03\xc4\xbe\xef\x94;\x05\ -i\x9a2$\x08\xc3\xf0QX\xd75\x17\x01\x05\x04U\ -\xde]\xe8v\x1c\x87s\xb6m\xe3\xc3Y\x0a\xefDQ\ -\xc4\xe2 \x08\xf4\xce\xeb\xbab\xdb\xb6j\x94\xbe\xefO\ -\xb1|(\x8a\x82\xc9\xf3\x1c}\xdfg\x03!\x04\x0e\xc3\ -\xa0L@\xb7\x0d\xd34Y\xdcu\xdd%\xfe\x9ey\xdb\ -6\x9c\xa6\x89c\xd9!\x8ec\x1c\xc7\x11\xd5\xcco\x1f\ -$d\xbe\xaa\xaa\xff\xdbX\x96E\x8dF]^\xb7A\ -\xcc\xf3\x8cM\xd3\xa0\xccgYv9{\x9e\xa7p]\ -\xf7\xe7\xd3\xdamH\xa8\xa8,K\xd5\xf1\x00\xd0\xc0\x13\ -\xc8\x06\xaf\x16(\x00\x00\x00\x00IEND\xaeB`\ -\x82\ \x00\x00\x00t\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ @@ -302,6 +124,184 @@ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ C\xc4\xff\x8d\x0a\x8c\x0a\x8c\x0a\x8c\x0a`\x17\x00\x00?\ x\xe4\xb7\xe3\x900_\x00\x00\x00\x00IEND\xae\ B`\x82\ +\x00\x00\x00`\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ +\x00\x00\x00\x03PLTE\xff\xff\xff\xa7\xc4\x1b\xc8\x00\ +\x00\x00\x18IDATx^\xed\xc01\x01\x00\x00\x00\ +\xc2 \xfb\xa76\xc5>X\x0b\x00\xe0\x08o\x00\x01\x01\ +>\xc31\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00p\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ +\x00\x00\x00\x06PLTE\x00\xff\xff\xff\xff\xff\xb1\xb8\ +^\xa0\x00\x00\x00%IDATx^\xed\xcc!\x12\ +\x00\x00\x04\x00A\xff\x7f4\x82\x11du/n\xb8\xd8\ +j\xca\x0b\x00\x00\xf0\x9d\x01\x00@\x03\x94\x98\xeb\xc0\x19\ +8\xa1\x84\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01>\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\xf3IDAT8\xcb\xed\x94An\ +\x830\x10E\x9f%\xe0\x0c\xbdC/\xd0\x13\xe5\xfaU\ +b\x9b\xd83\x01w\x81\x0d$\x85\xaa1\xca\xaa\x1d\x89\ +\x8d\x0dO\xef{\x067m\xdb&\x0e\x94\xaa\x9a\xad\xf5\ +\x06@D\xaa\xa0]\xd7\xed\xee5\xbc\xa8\xfe\xc1\x7f\x01\ +l\x8c\xd9\xdbJ\x87\x8dS\xda`\x8c\x03\x0c\x01\xf4\x0a\ +\xd2Ct\x98\xb7\xf7\x83G1*h\x81z\x10\x07\xd1\ +\x1d<\xe3A&\xa0\xf6\x0b48\x88\x97Jp\x1aa\ +\x88Kt\xf5\x93e\xb4\xd3#5\xc6i\x80[\x00)\ +\xd1=\xa8\x83`W`_\x01\x96\x1c}\xb6|0\x95\ +jp\xfep\x06\xba\x15\xd4\xe5\x14v\x01\xfft\xfd\xdd\ +U\xb8\xe4\xce\xdb\x05\x5c&A\xfd\xb2\x064{\x17\xf5\ +\xe6\x8f\x10\xce\xdf\xa1\xc54\xe6\x89\xa8j^\xf8\x9cF\ +j\xb6t\x10\xb3\xa9\xac\x1a\xf84\xf8z\xce\xa6\x16b\ +\x0fj\xef\x1bXRT\x81\xa5\x98nLE\xf4p\xeb\ +\x9f\x07\x9b\x8f\xd3\xaf\xdf\xfd\x02\xd6\xbd\xde\xdfp\xdb\x04\ +\x83\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xfa\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\ +\x00\x00\x00\xc1IDAT(S\xcd\x901\x0a\x840\ +\x10E\xc7\xceV\xb0\xd3F\x10o`\xe5\x01\xbcB@\ +\x0b\x9bt\x22\x11\xbc\x94\x9d'\xd2\x03x\x03\x03\x19\xf7\ +\x0f\xb8\xd9,l\xbf\x81Of\xde\xfc|\xc8P\x1c\xc7\ +LD\xa2(\x8a8\xcfs~\x1d\xc2\xfd\xc9\xd34e\ +\xd2ZsQ\x14\x02\x86a\xe0y\x9e\xc5\x8c\x1b=8\ +\xe6\xe382a\xa0\x94\x12\x88\xfa[\xe0\x98;\xe7B\ +3\xc0/3\xea\x7fJ\xee\xbaN\xcc\xd7u\x05\x0f\xd0\ +\x83\xf7}\xef\x93\xb1&\xc0}\xdf\x03\xf3q\x1c\xc2\x97\ +e\xf1\xc9\xeb\xba\x0a\x9c\xa6)0?!\xdb\xb6\xf9d\ +\xa8\xaek\x19\x94e\xc9m\xdbrUU\xd27M\xc3\ +\xd6Z\x9f\xfc\xc8\x18\xc3Y\x96\x89)I\x12\xc6_\xce\ +\xf3|o\xe9\x063 8\xcd\x08\x1exv\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01%\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\xdaIDATH\xc7\xed\x94A\x0e\ +\x820\x10E\x1fF8\x83w\xf0\xfe\x87\xf0\x1a^@\ +\xb1\xa5t\xa6\x1a\x5c\xb4\x04\x8c\xa2\x11\xca\xc2\xc4I\xd8\ +\xd0\xe4\xe5\xf5\xf7g\x8a\xb2,;\x16L\x08\xa1x\xf5\ +\x7f\x0b\xa0\xaa\xb3\xa0UUM\x9emXi\xfe\xe0\x1f\ +\x06o30\xbaU\xc0\xdd\xed\x0a7\x0f\xa1\x05u \ +\x96b\xb7\xcf`\x1c\x5c\x826\xa0\x16\xc4f\x8aB\xed\ +\x00\xf5\x16\xe4\x92\x09,\x97h)&~\x9a\xcb\xd8\xd7\ +\xe0\xcd\x08\xdcd\x02\xbb\xf3`\xaa9\xc1\xed9A\xfb\ +\xac\xcd\x00~\xb7\xfe>g\x5c\xc7\x8cC\x93\xe2H\x19\ +O-\xeaW\x95\xed\x8e\x87!KI\x96\xbe\x8e\xa6\x92\ +\x1a1\xeb\xf1\xfc)V\xaa\xefk\xb0 \xc9TG\x0f\ +\xf85\xb8M\xd7V\x03\xe2 \x98\xc7\xaa\xf5\xb7\x98\x05\ +\xd6\xde\xd4>\xf7W\x1a\xb8:\x00\x8a\xa5\xcbfj\xee\ +\x91a\xa9f\xc0\x0f\xb5]\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\x91\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00*\x00\x00\x00+\x01\x03\x00\x00\x004Q\x88\xbd\ +\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\ +\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\ +\x00\x009IDAT\x18Wc`\xc0\x05\x14 T\ +\x01\x84\xfa\x01&\x19\xff\x80)f\x08\x8f\xfd\x03\x98\xe2\ +\x7f\x00\xa6\xe4\x0f\x80)\xfb\x060U\x0f\xd1\xf6oP\ +k\xe3\x87hc\x83P,\x0c\x84\x00\x00\x91\xca\x1c\x09\ +\xf6#*\xfe\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x02\xf1\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00*\x00\x00\x00,\x08\x03\x00\x00\x00$D\xdat\ +\x00\x00\x012PLTE\xff\xff\xff\xfe\xfe\xfe\x01\x01\ +\x01\xbe\xbe\xbe\xfd\xfd\xfd\x00\x00\x00ddd\xd2\xd2\xd2\ +|||\xfb\xfb\xfb\xe7\xe7\xe7\x84\x84\x84\xd7\xd7\xd7\xe0\ +\xe0\xe0\xe1\xe1\xe1\x0c\x0c\x0c(((\xf5\xf5\xf5\xb3\xb3\ +\xb3\x02\x02\x02\x95\x95\x95...\x11\x11\x11kkk\ +\x03\x03\x03rrrIII\xfc\xfc\xfc\x13\x13\x13\x04\ +\x04\x04\x9f\x9f\x9f\xc4\xc4\xc4\xa9\xa9\xa9\x05\x05\x05WW\ +W\x17\x17\x17\xf6\xf6\xf6\x16\x16\x16\xa6\xa6\xa6\xa0\xa0\xa0\ +```$$$>>>###\xb7\xb7\xb7M\ +MM\xf8\xf8\xf8\xc0\xc0\xc0000\x09\x09\x09\xec\xec\ +\xec \x8a\x8a\x8a\xda\xda\xda\xf1\xf1\xf1\x0d\x0d\x0d\ +\x99\x99\x99\x19\x19\x19\xf9\xf9\xf9\xcd\xcd\xcd\xf4\xf4\xf49\ +99---;;;\x12\x12\x12CCC\xc2\xc2\ +\xc2\xa4\xa4\xa4\xdc\xdc\xdcUUUhhhZZZ\ +PPP\xf0\xf0\xf0\x06\x06\x06\x1f\x1f\x1fttt\xb1\ +\xb1\xb1]]]!!!666\x08\x08\x08\xea\xea\ +\xea\xdb\xdb\xdb\x81\x81\x81\x9c\x9c\x9c\x8b\x8b\x8buuu\ +\xf2\xf2\xf2%%%\xce\xce\xceHHHccc\xba\ +\xba\xbaSSS888\xf7\xf7\xf7\xe4\xe4\xe4\xa2\xa2\ +\xa2JJJ\xf3\xf3\xf3___\xf1i\x00\xec\x00\x00\ +\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x01mI\ +DATx^\xd5\x92\xc5v\xc30\x10E=\x92\x1d\ +f\xe6\x94\x99\x99\x99\x99\x99\xe1\xff\x7f\xa1\x9e\x89\x93S\ +\xa9\xb2Nvm\xdf\xf2\xea\xfa\xbdY\xd8\xf8+\xf10\ +\xeb[X\xcc\x047\x13<\x96\x10\xc6\xb5\xadB\xda\x9a\ +om\x0d@\xb3\xad,\xe8\xda\x1a\xe2\xb5\xf4\xd4\xddq\ +\xbf\xa1\x0d\x14{\x1b\xed\x09\xd0\xbb\x03\x0d\x93\x0d\xeaM\ +\xd8A+3\x82n.\xac5\xc39\xbb\x95\xe5\xbb\xa9\ +\xdb\xa7\xbd\xc0G\xcedG'~1;\xa7q\x87\xda\ +\xd1,\x00\xf8\xe8\xda\x16\xcd~\x17\x19\x09\xc3\x88\x94\xd1\ +]\xd5\xb4\xf6\xe1n\xbf\xdf66\xe9\x92\x90\xab\xeb\xa5\ +\xf7\x09\xdb\x84a\xea\xcf\xbb\xeeg\xd1\x1c\x1dC`\xa6\ +\xd1]\x89\xbb\x98S\xd3\xb8\xef\xa9\x81\x19Z\xa8\x80\xda\ +M\xd1\xeb<\xbd\xc2B\x06\xbf[T\x9b\xe6\x12\x9a\xcb\ +N\x0f\x1c\xd0\xb5w\xca\xfd5z[\xaf\x83\x8d$\xba\ +[\xca\x0b\xb6q_\x0a\x8b\xee*\xdc\xc0\x9e\xa5\x08K\ +)\xf6\x83\x962i\xf3\x87\xe9\xdfgj\xb7\x0a\xb2{\ +\xe8b\xb2#\xd9\x84\x02\xf2c.\xe4\x04\xd9\xe9\x99d\ +\x9eS\xc3\x85H/i\xe9\x0aDzmS\x96\x8c\x08\ +\x14n\xa2Ho\x8b\x02\x8d\x97\xb0\xf5\x1e\xa4\xad\x07\xda\ +z\x14XE\xfd\xd7W\xe9\x82'\xa1\xe1\x19\x97J/\ +r\xab\x19C^~\xads\xce\xf9\x1b}\xfd\xce1\x1f\ +\xe0`\xcc'\xademL\xcc\x12\xc2\xbcN#\x139\ +A\x89y\xc1P5\xfc~\xeb\xff\xca\x17Uq \xbb\ +\xd7\xbb.\xca\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\x1a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00*\x00\x00\x00+\x02\x03\x00\x00\x00s\xf1\xf2m\ +\x00\x00\x00\x0cPLTE\xff\xff\xff\x80\x80\x80\x00\x00\ +\x00\xff\xff\xffEJK8\x00\x00\x00\x01tRNS\ +\x00@\xe6\xd8f\x00\x00\x00\xbcIDATx^M\ +\xcb\xbd\x89\x041\x0c\x86a\xa1\xd0U8\x1c\xdc\x8f&\ +\xd8\x12\xa6\x0a\xb3\xe1\xe6N.2\x07\x02\xdb\x07[\xc0\ +\x96\xb4U\x9cG?3V\xf4!\xde\x07B\xcd\xe0\x17\ +F\xbd\xf6\xb6\xec\x1a\xef\xa6A\x024\xb2A\x80`$\ +\xcf\x9d\x9a\xee8\x8b~x\x83O~d\xb30hW\ +\x102t\x22\x05\x98\x91\x89\x0c\xe4P\x88\x0c\xd4D\xe4\ + \xce\xdc\xc1\x98\x89\x833q \x89\x02\xe4\x9d\x1d`\ +\xa1.@\xff\xe9\x02\xfd\xf1*\x0e\xd2\xfe{\x81P\xda\ +\x02\x8e\xef\x02>\x0bx\xb3l\x01\x7f]\x1a\x03f\x1d\ +4\x00\x03B\x15\xb0\xe4\x0a$7P$W\xc0\x92+\ +\xe8\x92\x1b\x90\xdc\x80\xe4\x0a$7\xf0so\x1cp_\ +[v<\xc7?\xd6Qh R\x85\xdb_\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x00\xf7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\ +\x00\x00\x00\xbeIDAT(S\x85\x911\x0e@@\ +\x10EWM$J7\xa1\xa4\x918\x85^t\xaa=\ +\x8aNT{\x80\xadun\xa0\xd1l\xe7\x12\xc4\x97\x19\ +\xb1!YQ\xfcb\xfe\xbc\xfc\x99\xcc\x08\x00\x82t\x1c\ +\x07\xa6i\x82\x10\xc2)\xcf\xf3.\xf0\xd68\x8e\xa8\xaa\ +\x8aU\x14\x05\x03I\x92X\xef\x05?\xd5u\x1d\xc3Z\ +k\xd0T\xf2\x9c 5\xeb\xbafx]W\xdc\xfeg\ +r\x9a\xa6\x88\xe3\x18O\xcf\x09n\xdb\x06\xdf\xf7Q\x96\ +\xa5]\xc1\x09Ss\x9eg^AJ\xf9\x9f<\x0c\x03\ +\xc3J\xa9\xff\xe4\xb6m\x19^\x96\xe5?9\xcfs\x84\ +a\x88}\xdf\xdf\xc9T\x18c\xec\xe1IA\x10 \x8a\ +\x22[7M\x03\x9b\xdc\xf7\xfd\xf5\xce\x8fWgY\xc6\ +\x13N\xfaWVX\xe8@\xda\xc6\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ " qt_resource_name = b"\ @@ -309,66 +309,66 @@ qt_resource_name = b"\ \x07\x03}\xc3\ \x00i\ \x00m\x00a\x00g\x00e\x00s\ -\x00\x0a\ -\x02\xfcBG\ -\x00i\ -\x00t\x00a\x00l\x00i\x00c\x00.\x00p\x00n\x00g\ -\x00\x0d\ -\x06C\xe3g\ -\x00f\ -\x00l\x00o\x00o\x00d\x00f\x00i\x00l\x00l\x00.\x00p\x00n\x00g\ -\x00\x0d\ -\x08\xd5\xc4\xe7\ -\x00u\ -\x00n\x00d\x00e\x00r\x00l\x00i\x00n\x00e\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x0a+\x97\xe7\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x06'Zg\ +\x00b\ +\x00o\x00l\x00d\x00.\x00p\x00n\x00g\ \x00\x0f\ \x00I\xdb\xa7\ \x00b\ \x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x002\x00.\x00p\x00n\x00g\ \x00\x0f\ -\x05\xaa\x0c\xc7\ -\x00t\ -\x00e\x00x\x00t\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ -\x00\x0e\ -\x0f\x0d\x22'\ -\x00s\ -\x00e\x00n\x00d\x00t\x00o\x00b\x00a\x00c\x00k\x00.\x00p\x00n\x00g\ -\x00\x0b\ -\x0a+\x97\xe7\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x03J#\xe7\ +\x00l\ +\x00i\x00n\x00e\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0c\xad\x0f\x07\ +\x00d\ +\x00e\x00l\x00e\x00t\x00e\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x00J\xdb\xa7\ +\x00b\ +\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x003\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x00K\xdb\xa7\ +\x00b\ +\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x004\x00.\x00p\x00n\x00g\ \x00\x0f\ \x00P\xdb\xa7\ \x00b\ \x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x001\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x0f\x0d\x22'\ +\x00s\ +\x00e\x00n\x00d\x00t\x00o\x00b\x00a\x00c\x00k\x00.\x00p\x00n\x00g\ \x00\x0d\ -\x05l\x22\xc7\ -\x00l\ -\x00i\x00n\x00e\x00c\x00o\x00l\x00o\x00r\x00.\x00p\x00n\x00g\ +\x08\xd5\xc4\xe7\ +\x00u\ +\x00n\x00d\x00e\x00r\x00l\x00i\x00n\x00e\x00.\x00p\x00n\x00g\ \x00\x10\ \x0f\x9b\x88g\ \x00b\ \x00r\x00i\x00n\x00g\x00t\x00o\x00f\x00r\x00o\x00n\x00t\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x00K\xdb\xa7\ -\x00b\ -\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x004\x00.\x00p\x00n\x00g\ -\x00\x0a\ -\x0c\xad\x0f\x07\ -\x00d\ -\x00e\x00l\x00e\x00t\x00e\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x03J#\xe7\ +\x00\x0d\ +\x05l\x22\xc7\ \x00l\ -\x00i\x00n\x00e\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ -\x00\x08\ -\x06'Zg\ -\x00b\ -\x00o\x00l\x00d\x00.\x00p\x00n\x00g\ +\x00i\x00n\x00e\x00c\x00o\x00l\x00o\x00r\x00.\x00p\x00n\x00g\ \x00\x0f\ -\x00J\xdb\xa7\ -\x00b\ -\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x003\x00.\x00p\x00n\x00g\ +\x05\xaa\x0c\xc7\ +\x00t\ +\x00e\x00x\x00t\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x06C\xe3g\ +\x00f\ +\x00l\x00o\x00o\x00d\x00f\x00i\x00l\x00l\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x02\xfcBG\ +\x00i\ +\x00t\x00a\x00l\x00i\x00c\x00.\x00p\x00n\x00g\ " qt_resource_struct = b"\ @@ -376,36 +376,36 @@ qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00l\x00\x00\x00\x00\x00\x01\x00\x00\x03\x17\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x0f\xf5\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xa7\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x08u\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ +\x00\x00\x00D\x00\x00\x00\x00\x00\x01\x00\x00\x01\xc7\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x06\x11\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00\x06\x89\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x00\x06\xed\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x0fr\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00h\x00\x00\x00\x00\x00\x01\x00\x00\x02=\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01z\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xca\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x0b_\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00.\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb1\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x0eT\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x00\x08\xa3\ +\x00\x00\x01z\xe7\xee'\x09\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x0eN\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\x16\x00\x00\x00\x00\x00\x01\x00\x00\x08\xe9\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x03\x8d\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xdf\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00,\x00\x00\x00\x00\x00\x01\x00\x00\x00\xfb\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00L\x00\x00\x00\x00\x00\x01\x00\x00\x02\x19\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x07\xc4\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x01\x80\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x0b\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x06\x82\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ -\x00\x00\x016\x00\x00\x00\x00\x00\x01\x00\x00\x09~\ -\x00\x00\x01e\xaf\x16\xd2\x9d\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x02\xce\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01\x12\x00\x00\x00\x00\x00\x01\x00\x00\x07a\ +\x00\x00\x01z\xe7\xee'\x09\ +\x00\x00\x01T\x00\x00\x00\x00\x00\x01\x00\x00\x09\xa1\ +\x00\x00\x01z\xe7\xee'\x09\ " def qInitResources(): |