diff -r e9e7eca7efee -r bf71ee032bb4 src/eric7/Graphics/SvgDiagram.py --- a/src/eric7/Graphics/SvgDiagram.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/Graphics/SvgDiagram.py Wed Jul 13 14:55:47 2022 +0200 @@ -25,19 +25,43 @@ """ Class implementing a dialog showing a SVG graphic. """ + ZoomLevels = [ - 1, 3, 5, 7, 9, - 10, 20, 30, 50, 67, 80, 90, + 1, + 3, + 5, + 7, + 9, + 10, + 20, + 30, + 50, + 67, + 80, + 90, 100, - 110, 120, 133, 150, 170, 200, 240, 300, 400, - 500, 600, 700, 800, 900, 1000, + 110, + 120, + 133, + 150, + 170, + 200, + 240, + 300, + 400, + 500, + 600, + 700, + 800, + 900, + 1000, ] ZoomLevelDefault = 100 - + def __init__(self, svgFile, parent=None, name=None): """ Constructor - + @param svgFile filename of a SVG graphics file to show @type str @param parent parent widget of the view @@ -51,62 +75,60 @@ else: self.setObjectName("SvgDiagram") self.setWindowTitle(self.tr("SVG-Viewer")) - + self.svgWidget = QSvgWidget() self.svgWidget.setObjectName("svgWidget") self.svgWidget.setBackgroundRole(QPalette.ColorRole.Base) self.svgWidget.setSizePolicy( - QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored) - + QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored + ) + self.svgView = QScrollArea() self.svgView.setObjectName("svgView") self.svgView.setBackgroundRole(QPalette.ColorRole.Dark) self.svgView.setWidget(self.svgWidget) - + self.setCentralWidget(self.svgView) - + self.__zoomWidget = EricZoomWidget( UI.PixmapCache.getPixmap("zoomOut"), UI.PixmapCache.getPixmap("zoomIn"), - UI.PixmapCache.getPixmap("zoomReset"), self) + UI.PixmapCache.getPixmap("zoomReset"), + self, + ) self.statusBar().addPermanentWidget(self.__zoomWidget) - self.__zoomWidget.setMapping( - SvgDiagram.ZoomLevels, SvgDiagram.ZoomLevelDefault) + self.__zoomWidget.setMapping(SvgDiagram.ZoomLevels, SvgDiagram.ZoomLevelDefault) self.__zoomWidget.valueChanged.connect(self.__doZoom) - + # polish up the dialog self.resize(QSize(800, 600).expandedTo(self.minimumSizeHint())) - + self.zoom = 1.0 self.svgFile = svgFile self.svgWidget.load(self.svgFile) self.svgWidget.resize(self.svgWidget.renderer().defaultSize()) - + self.__initActions() self.__initContextMenu() self.__initToolBars() - + self.grabGesture(Qt.GestureType.PinchGesture) - + def __initActions(self): """ Private method to initialize the view actions. """ - self.closeAct = QAction( - UI.PixmapCache.getIcon("close"), - self.tr("Close"), self) + self.closeAct = QAction(UI.PixmapCache.getIcon("close"), self.tr("Close"), self) self.closeAct.triggered.connect(self.close) - - self.printAct = QAction( - UI.PixmapCache.getIcon("print"), - self.tr("Print"), self) + + self.printAct = QAction(UI.PixmapCache.getIcon("print"), self.tr("Print"), self) self.printAct.triggered.connect(self.__printDiagram) - + self.printPreviewAct = QAction( - UI.PixmapCache.getIcon("printPreview"), - self.tr("Print Preview"), self) + UI.PixmapCache.getIcon("printPreview"), self.tr("Print Preview"), self + ) self.printPreviewAct.triggered.connect(self.__printPreviewDiagram) - + def __initContextMenu(self): """ Private method to initialize the context menu. @@ -116,19 +138,19 @@ self.__menu.addSeparator() self.__menu.addAction(self.printPreviewAct) self.__menu.addAction(self.printAct) - + self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.customContextMenuRequested.connect(self.__showContextMenu) - + def __showContextMenu(self, coord): """ Private slot to show the context menu of the listview. - + @param coord the position of the mouse pointer @type QPoint """ self.__menu.popup(self.mapToGlobal(coord)) - + def __initToolBars(self): """ Private method to populate the toolbars with our actions. @@ -136,28 +158,28 @@ self.windowToolBar = QToolBar(self.tr("Window"), self) self.windowToolBar.setIconSize(UI.Config.ToolBarIconSize) self.windowToolBar.addAction(self.closeAct) - + self.graphicsToolBar = QToolBar(self.tr("Graphics"), self) self.graphicsToolBar.setIconSize(UI.Config.ToolBarIconSize) self.graphicsToolBar.addAction(self.printPreviewAct) self.graphicsToolBar.addAction(self.printAct) - + self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.windowToolBar) self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.graphicsToolBar) - + def getDiagramName(self): """ Public method to retrieve a name for the diagram. - + @return name for the diagram @rtype str """ return self.svgFile - + def wheelEvent(self, evt): """ Protected method to handle wheel events. - + @param evt reference to the wheel event @type QWheelEvent """ @@ -169,13 +191,13 @@ self.__zoomIn() evt.accept() return - + super().wheelEvent(evt) - + def event(self, evt): """ Public method handling events. - + @param evt reference to the event @type QEvent @return flag indicating, if the event was handled @@ -184,13 +206,13 @@ if evt.type() == QEvent.Type.Gesture: self.gestureEvent(evt) return True - + return super().event(evt) - + def gestureEvent(self, evt): """ Protected method handling gesture events. - + @param evt reference to the gesture event @type QGestureEvent """ @@ -201,28 +223,28 @@ elif pinch.state() == Qt.GestureState.GestureUpdated: self.__doZoom(int(pinch.totalScaleFactor() * 100)) evt.accept() - + ########################################################################### ## Private menu handling methods below. ########################################################################### - + def __adjustScrollBar(self, scrollBar, factor): """ Private method to adjust a scrollbar by a certain factor. - + @param scrollBar reference to the scrollbar object @type QScrollBar @param factor factor to adjust by @type float """ scrollBar.setValue( - int(factor * scrollBar.value() + - ((factor - 1) * scrollBar.pageStep() / 2))) - + int(factor * scrollBar.value() + ((factor - 1) * scrollBar.pageStep() / 2)) + ) + def __levelForZoom(self, zoom): """ Private method determining the zoom level index given a zoom factor. - + @param zoom zoom factor @type int @return index of zoom factor @@ -235,24 +257,24 @@ if zoom <= SvgDiagram.ZoomLevels[index]: break return index - + def __doZoom(self, value): """ Private method to set the zoom value in percent. - + @param value zoom value in percent @type int """ oldValue = self.__zoom() if value != oldValue: self.svgWidget.resize(value / 100 * self.svgWidget.sizeHint()) - + factor = value / oldValue self.__adjustScrollBar(self.svgView.horizontalScrollBar(), factor) self.__adjustScrollBar(self.svgView.verticalScrollBar(), factor) - + self.__zoomWidget.setValue(value) - + def __zoomIn(self): """ Private method to zoom into the SVG. @@ -260,7 +282,7 @@ index = self.__levelForZoom(self.__zoom()) if index < len(SvgDiagram.ZoomLevels) - 1: self.__doZoom(SvgDiagram.ZoomLevels[index + 1]) - + def __zoomOut(self): """ Private method to zoom out of the SVG. @@ -268,23 +290,22 @@ index = self.__levelForZoom(self.__zoom()) if index > 0: self.__doZoom(SvgDiagram.ZoomLevels[index - 1]) - + def __zoomReset(self): """ Private method to reset the zoom value. """ self.__doZoom(SvgDiagram.ZoomLevels[SvgDiagram.ZoomLevelDefault]) - + def __zoom(self): """ Private method to get the current zoom factor in percent. - + @return current zoom factor in percent @rtype int """ - return int(self.svgWidget.width() / - self.svgWidget.sizeHint().width() * 100.0) - + return int(self.svgWidget.width() / self.svgWidget.sizeHint().width() * 100.0) + def __printDiagram(self): """ Private slot called to print the diagram. @@ -302,17 +323,17 @@ printerName = Preferences.getPrinter("PrinterName") if printerName: printer.setPrinterName(printerName) - + printDialog = QPrintDialog(printer, self) if printDialog.exec(): self.__print(printer) - + def __printPreviewDiagram(self): """ Private slot called to show a print preview of the diagram. """ from PyQt6.QtPrintSupport import QPrintPreviewDialog - + printer = QPrinter(mode=QPrinter.PrinterMode.ScreenResolution) printer.setFullPage(True) if Preferences.getPrinter("ColorMode"): @@ -323,25 +344,27 @@ printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst) else: printer.setPageOrder(QPrinter.PageOrder.LastPageFirst) - printer.setPageMargins(QMarginsF( - Preferences.getPrinter("LeftMargin") * 10, - Preferences.getPrinter("TopMargin") * 10, - Preferences.getPrinter("RightMargin") * 10, - Preferences.getPrinter("BottomMargin") * 10), - QPageLayout.Unit.Millimeter + printer.setPageMargins( + QMarginsF( + Preferences.getPrinter("LeftMargin") * 10, + Preferences.getPrinter("TopMargin") * 10, + Preferences.getPrinter("RightMargin") * 10, + Preferences.getPrinter("BottomMargin") * 10, + ), + QPageLayout.Unit.Millimeter, ) printerName = Preferences.getPrinter("PrinterName") if printerName: printer.setPrinterName(printerName) - + preview = QPrintPreviewDialog(printer, self) preview.paintRequested[QPrinter].connect(self.__print) preview.exec() - + def __print(self, printer): """ Private slot to the actual printing. - + @param printer reference to the printer object @type QPrinter """ @@ -354,31 +377,33 @@ fm = painter.fontMetrics() fontHeight = fm.lineSpacing() marginX = ( - printer.pageLayout().paintRectPixels(printer.resolution()).x() - - printer.pageLayout().fullRectPixels(printer.resolution()).x() + printer.pageLayout().paintRectPixels(printer.resolution()).x() + - printer.pageLayout().fullRectPixels(printer.resolution()).x() ) marginX = ( - Preferences.getPrinter("LeftMargin") * - int(printer.resolution() / 2.54) - marginX + Preferences.getPrinter("LeftMargin") * int(printer.resolution() / 2.54) + - marginX ) marginY = ( - printer.pageLayout().paintRectPixels(printer.resolution()).y() - - printer.pageLayout().fullRectPixels(printer.resolution()).y() + printer.pageLayout().paintRectPixels(printer.resolution()).y() + - printer.pageLayout().fullRectPixels(printer.resolution()).y() ) marginY = ( - Preferences.getPrinter("TopMargin") * - int(printer.resolution() / 2.54) - marginY + Preferences.getPrinter("TopMargin") * int(printer.resolution() / 2.54) + - marginY ) width = ( - printer.width() - marginX - - Preferences.getPrinter("RightMargin") * - int(printer.resolution() / 2.54) + printer.width() + - marginX + - Preferences.getPrinter("RightMargin") * int(printer.resolution() / 2.54) ) height = ( - printer.height() - fontHeight - 4 - marginY - - Preferences.getPrinter("BottomMargin") * - int(printer.resolution() / 2.54) + printer.height() + - fontHeight + - 4 + - marginY + - Preferences.getPrinter("BottomMargin") * int(printer.resolution() / 2.54) ) # write a foot note @@ -386,11 +411,18 @@ tc = QColor(50, 50, 50) painter.setPen(tc) painter.drawRect(marginX, marginY, width, height) - painter.drawLine(marginX, marginY + height + 2, - marginX + width, marginY + height + 2) + painter.drawLine( + marginX, marginY + height + 2, marginX + width, marginY + height + 2 + ) painter.setFont(font) - painter.drawText(marginX, marginY + height + 4, width, - fontHeight, Qt.AlignmentFlag.AlignRight, s) + painter.drawText( + marginX, + marginY + height + 4, + width, + fontHeight, + Qt.AlignmentFlag.AlignRight, + s, + ) # render the diagram painter.setViewport(marginX, marginY, width, height)