Sun, 15 Jan 2023 17:41:35 +0100
PDF Viewer
- finished 'Zoom' functions
--- a/src/eric7/PdfViewer/PdfPageSelector.py Sat Jan 14 18:25:26 2023 +0100 +++ b/src/eric7/PdfViewer/PdfPageSelector.py Sun Jan 15 17:41:35 2023 +0100 @@ -48,6 +48,7 @@ self.__pageButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextOnly) self.__pageEntry = QLineEdit() + self.__pageEntry.setMaximumWidth(50) self.__pageEntry.setMaxLength(10) self.__pageEntry.setAlignment(Qt.AlignmentFlag.AlignCenter) self.__pageEntry.setSizePolicy(
--- a/src/eric7/PdfViewer/PdfViewerWindow.py Sat Jan 14 18:25:26 2023 +0100 +++ b/src/eric7/PdfViewer/PdfViewerWindow.py Sun Jan 15 17:41:35 2023 +0100 @@ -8,12 +8,11 @@ """ import contextlib -import math import os import pathlib from PyQt6.QtCore import Qt, pyqtSignal, QSize, pyqtSlot, QPointF -from PyQt6.QtGui import QAction, QKeySequence +from PyQt6.QtGui import QAction, QKeySequence, QGuiApplication, QActionGroup from PyQt6.QtPdf import QPdfDocument from PyQt6.QtPdfWidgets import QPdfView from PyQt6.QtWidgets import ( @@ -33,9 +32,6 @@ from .PdfZoomSelector import PdfZoomSelector -# TODO: make this an eric widget - - class PdfViewerWindow(EricMainWindow): """ Class implementing the PDF viewer main window. @@ -49,8 +45,6 @@ maxMenuFilePathLen = 75 - ZoomMultiplier = math.sqrt(2.0) - def __init__(self, fileName="", parent=None, fromEric=False, project=None): """ Constructor @@ -71,6 +65,10 @@ self.__fromEric = fromEric self.setWindowIcon(EricPixmapCache.getIcon("ericPdf")) + self.__screenResolution = ( + QGuiApplication.primaryScreen().logicalDotsPerInch() / 72.0 + ) + if not self.__fromEric: self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet")) @@ -81,7 +79,6 @@ self.__cw.addWidget(self.__info) self.__view = QPdfView(self) self.__view.setDocument(self.__pdfDocument) - self.__view.setPageMode(QPdfView.PageMode.MultiPage) self.__cw.addWidget(self.__view) self.setCentralWidget(self.__cw) @@ -95,10 +92,6 @@ self.__pageSelector.gotoPage.connect(self.__gotoPage) self.__zoomSelector = PdfZoomSelector(self) - self.__zoomSelector.zoomModeChanged.connect(self.__view.setZoomMode) - ##self.__zoomSelector.zoomModeChanged.connect(self.__setFocusToView) - self.__zoomSelector.zoomFactorChanged.connect(self.__view.setZoomFactor) - ##self.__zoomSelector.zoomFactorChanged.connect(self.__setFocusToView) self.__zoomSelector.reset() g = Preferences.getGeometry("PdfViewerGeometry") @@ -114,13 +107,20 @@ self.__initToolbars() self.__createStatusBar() + self.__setDisplayMode() # needs to be done after actions have been created + self.__view.pageNavigator().backAvailableChanged.connect( self.backwardAct.setEnabled ) self.__view.pageNavigator().forwardAvailableChanged.connect( self.forwardAct.setEnabled ) + + self.__zoomSelector.zoomModeChanged.connect(self.__view.setZoomMode) + self.__zoomSelector.zoomModeChanged.connect(self.__zoomModeChanged) + self.__zoomSelector.zoomFactorChanged.connect(self.__view.setZoomFactor) self.__view.zoomFactorChanged.connect(self.__zoomSelector.setZoomFactor) + self.__view.zoomModeChanged.connect(self.__zoomSelector.setZoomMode) PdfViewerWindow.windows.append(self) @@ -390,8 +390,6 @@ """ Private method to define the view related user interface actions. """ - # Page Width (checkable, exclusive) - # Whole Page (checkable, exclusive) self.zoomInAct = EricAction( self.tr("Zoom in"), EricPixmapCache.getIcon("zoomIn"), @@ -428,6 +426,47 @@ self.zoomResetAct.triggered.connect(self.__zoomReset) self.__actions.append(self.zoomResetAct) + self.zoomPageWidthAct = EricAction( + self.tr("Page Width"), + EricPixmapCache.getIcon("zoomFitWidth"), + self.tr("Page &Width"), + 0, + 0, + self, + "pdfviewer_view_zoompagewidth", + ) + self.zoomPageWidthAct.triggered.connect(self.__zoomPageWidth) + self.zoomPageWidthAct.setCheckable(True) + self.__actions.append(self.zoomPageWidthAct) + + self.zoomWholePageAct = EricAction( + self.tr("Whole Page"), + EricPixmapCache.getIcon("zoomFitPage"), + self.tr("Whole &Page"), + 0, + 0, + self, + "pdfviewer_view_zoomwholePage", + ) + self.zoomWholePageAct.triggered.connect(self.__zoomWholePage) + self.zoomWholePageAct.setCheckable(True) + self.__actions.append(self.zoomWholePageAct) + + ##self.__displayModeActGrp = QActionGroup(self) +## + ##self.displayModeSingleAct = EricAction( + ##self.tr("Whole Page"), + ##EricPixmapCache.getIcon("zoomFitPage"), + ##self.tr("Whole &Page"), + ##0, + ##0, + ##self, + ##"pdfviewer_view_zoomwholePage", + ##) + ##self.displayModeSingleAct.triggered.connect(self.__zoomWholePage) + ##self.displayModeSingleAct.setCheckable(True) + ##self.__actions.append(self.displayModeSingleAct) + def __initHelpActions(self): """ Private method to create the Help actions. @@ -515,6 +554,8 @@ self.zoomInAct.setEnabled(ready) self.zoomOutAct.setEnabled(ready) self.zoomResetAct.setEnabled(ready) + self.zoomPageWidthAct.setEnabled(ready) + self.zoomWholePageAct.setEnabled(ready) self.__zoomSelector.setEnabled(ready) # TODO: not yet implemented @@ -562,7 +603,18 @@ menu.addAction(self.zoomInAct) menu.addAction(self.zoomOutAct) menu.addAction(self.zoomResetAct) - # TODO: not yet implemented + menu.addAction(self.zoomPageWidthAct) + menu.addAction(self.zoomWholePageAct) + menu.addSeparator() + modeMenu = menu.addMenu(self.tr("Display Mode")) + self.__singlePageAct = modeMenu.addAction(self.tr("Single Page")) + self.__singlePageAct.setCheckable(True) + self.__continuousPageAct = modeMenu.addAction(self.tr("Continuous")) + self.__continuousPageAct.setCheckable(True) + self.__displayModeActGrp = QActionGroup(self) + self.__displayModeActGrp.addAction(self.__singlePageAct) + self.__displayModeActGrp.addAction(self.__continuousPageAct) + modeMenu.triggered.connect(self.__displayModeSelected) menu = mb.addMenu(self.tr("&Go To")) menu.setTearOffEnabled(True) @@ -617,6 +669,8 @@ mainToolBar.addWidget(self.__zoomSelector) mainToolBar.addAction(self.zoomInAct) mainToolBar.addAction(self.zoomResetAct) + mainToolBar.addAction(self.zoomPageWidthAct) + mainToolBar.addAction(self.zoomWholePageAct) self.addToolBar(mainToolBar) self.addToolBarBreak() @@ -1033,29 +1087,51 @@ """ self.__view.pageNavigator().forward() - def __calculateZoomFactor(self): - if self.__view.ZoomMode == QPdfView.ZoomMode.FitToWidth: - pass + def __zoomInOut(self, zoomIn): + """ + Private method to zoom into or out of the view. + + @param zoomIn flag indicating to zoom into the view + @type bool + """ + zoomFactor = self.__zoomFactorForMode(self.__view.zoomMode()) + + factors = list(PdfZoomSelector.ZoomValues) + factors.append(self.__zoomFactorForMode(QPdfView.ZoomMode.FitInView)) + factors.append(self.__zoomFactorForMode(QPdfView.ZoomMode.FitToWidth)) + if zoomIn: + factors.sort() + if zoomFactor >= factors[-1]: + return + newIndex = next(x for x, val in enumerate(factors) if val > zoomFactor) else: - return self.__view.zoomFactor() - + factors.sort(reverse=True) + if zoomFactor <= factors[-1]: + return + newIndex = next(x for x, val in enumerate(factors) if val < zoomFactor) + newFactor = factors[newIndex] + if newFactor == self.__zoomFactorForMode(QPdfView.ZoomMode.FitInView): + self.__zoomWholePage(True) + elif newFactor == self.__zoomFactorForMode(QPdfView.ZoomMode.FitToWidth): + self.__zoomPageWidth(True) + else: + self.__view.setZoomFactor(newFactor) + self.__zoomSelector.setZoomFactor(newFactor) + self.__zoomModeChanged(QPdfView.ZoomMode.Custom) + @pyqtSlot() def __zoomIn(self): """ Private slot to zoom into the view. """ - self.__view.setZoomFactor( - self.__view.zoomFactor() * PdfViewerWindow.ZoomMultiplier - ) + self.__zoomInOut(True) @pyqtSlot() def __zoomOut(self): """ Private slot to zoom out of the view. """ - self.__view.setZoomFactor( - self.__view.zoomFactor() / PdfViewerWindow.ZoomMultiplier - ) + self.__zoomInOut(False) @pyqtSlot() def __zoomReset(self): @@ -1063,6 +1139,82 @@ Private slot to reset the zoom factor of the view. """ self.__view.setZoomFactor(1.0) + self.__zoomSelector.setZoomFactor(1.0) + self.__zoomModeChanged(QPdfView.ZoomMode.Custom) + + @pyqtSlot(bool) + def __zoomPageWidth(self, checked): + """ + Private slot to fit the page width. + + @param checked flag indicating the check state + @type bool + """ + if checked: + self.__view.setZoomMode(QPdfView.ZoomMode.FitToWidth) + self.zoomWholePageAct.setChecked(False) + + @pyqtSlot(bool) + def __zoomWholePage(self, checked): + """ + Private slot to fit the page width. + + @param checked flag indicating the check state + @type bool + """ + if checked: + self.__view.setZoomMode(QPdfView.ZoomMode.FitInView) + self.zoomPageWidthAct.setChecked(False) + + @pyqtSlot(QPdfView.ZoomMode) + def __zoomModeChanged(self, zoomMode): + """ + Private slot to handle a change of the zoom mode. + + @param zoomMode new zoom mode + @type QPdfView.ZoomMode + """ + self.zoomWholePageAct.setChecked(zoomMode == QPdfView.ZoomMode.FitInView) + self.zoomPageWidthAct.setChecked(zoomMode == QPdfView.ZoomMode.FitToWidth) + + def __zoomFactorForMode(self, zoomMode): + """ + Private method to calculate the zoom factor iaw. the current zoom mode. + + @param zoomMode zoom mode to get the zoom factor for + @type QPdfView.ZoomMode + @return zoom factor + @rtype float + """ + if zoomMode == QPdfView.ZoomMode.Custom: + return self.__view.zoomFactor() + else: + viewport = self.__view.viewport() + curPage = self.__view.pageNavigator().currentPage() + margins = self.__view.documentMargins() + if zoomMode == QPdfView.ZoomMode.FitToWidth: + pageSize = ( + self.__pdfDocument.pagePointSize(curPage) * self.__screenResolution + ).toSize() + factor = ( + viewport.width() - margins.left() - margins.right() + ) / pageSize.width() + pageSize *= factor + else: + # QPdfView.ZoomMode.FitInView + viewportSize = viewport.size() + QSize( + -margins.left() - margins.right(), -self.__view.pageSpacing() + ) + pageSize = ( + self.__pdfDocument.pagePointSize(curPage) * self.__screenResolution + ).toSize() + pageSize = pageSize.scaled( + viewportSize, Qt.AspectRatioMode.KeepAspectRatio + ) + zoomFactor = pageSize.width() / ( + self.__pdfDocument.pagePointSize(curPage) * self.__screenResolution + ).width() + return zoomFactor @pyqtSlot() def __setFocusToView(self): @@ -1070,3 +1222,29 @@ Private slot to set the focus to the PDF document view. """ self.__view.setFocus(Qt.FocusReason.OtherFocusReason) + + @pyqtSlot(QAction) + def __displayModeSelected(self, act): + """ + Private slot to handle the selection of a display mode. + + @param act reference to the triggering action + @type QAction + """ + if act is self.__singlePageAct: + Preferences.setPdfViewer("PdfViewerDisplayMode", "single") + else: + Preferences.setPdfViewer("PdfViewerDisplayMode", "continuous") + self.__setDisplayMode() + + def __setDisplayMode(self): + """ + Private method to set the display mode iaw. configuration. + """ + if Preferences.getPdfViewer("PdfViewerDisplayMode") == "single": + self.__view.setPageMode(QPdfView.PageMode.SinglePage) + self.__singlePageAct.setChecked(True) + else: + self.__view.setPageMode(QPdfView.PageMode.MultiPage) + self.__continuousPageAct.setChecked(True) + return
--- a/src/eric7/PdfViewer/PdfZoomSelector.py Sat Jan 14 18:25:26 2023 +0100 +++ b/src/eric7/PdfViewer/PdfZoomSelector.py Sun Jan 15 17:41:35 2023 +0100 @@ -22,6 +22,8 @@ zoomFactorChanged = pyqtSignal(float) zoomModeChanged = pyqtSignal(QPdfView.ZoomMode) + ZoomValues = (0.12, 0.25, 0.33, 0.5, 0.66, 0.75, 1.0, 1.25, 1.50, 2.0, 4.0, 8.0, 16.0, 25.0, 50.0) + def __init__(self, parent=None): """ Constructor @@ -34,27 +36,17 @@ self.setEditable(True) self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) - self.addItem(self.tr("Page Width")) - self.addItem(self.tr("Whole Page")) - self.addItem(self.tr("12%")) - self.addItem(self.tr("25%")) - self.addItem(self.tr("33%")) - self.addItem(self.tr("50%")) - self.addItem(self.tr("66%")) - self.addItem(self.tr("75%")) - self.addItem(self.tr("100%")) - self.addItem(self.tr("125%")) - self.addItem(self.tr("150%")) - self.addItem(self.tr("200%")) - self.addItem(self.tr("400%")) - self.addItem(self.tr("800%")) - self.addItem(self.tr("1600%")) - self.addItem(self.tr("2500%")) - self.addItem(self.tr("5000%")) + self.__pageWidthLabel = self.tr("Page Width") + self.__wholePageLabel = self.tr("Whole Page") + + self.addItem(self.__pageWidthLabel) + self.addItem(self.__wholePageLabel) + for val in PdfZoomSelector.ZoomValues: + self.addItem(self.tr("{0}%").format(int(val * 100))) self.lineEdit().setAlignment(Qt.AlignmentFlag.AlignCenter) - self.currentTextChanged.connect(self.__processText) + ##self.currentTextChanged.connect(self.__processText) self.lineEdit().editingFinished.connect(self.__editingFinished) @pyqtSlot() @@ -72,12 +64,12 @@ @param text text to be handled @type str """ - if text == self.tr("Page Width"): + if text == self.__pageWidthLabel: self.zoomModeChanged.emit(QPdfView.ZoomMode.FitToWidth) - elif text == self.tr("Whole Page"): + elif text == self.__wholePageLabel: self.zoomModeChanged.emit(QPdfView.ZoomMode.FitInView) else: - withoutPercent = text.replace("%", "") + withoutPercent = text.replace("%", "").replace("&", "") try: zoomLevel = int(withoutPercent) factor = zoomLevel / 100.0 @@ -93,6 +85,7 @@ Public slot to reset the zoom factor to 100%. """ self.setCurrentIndex(8) # index 8 is 100% + self.__editingFinished() @pyqtSlot(float) def setZoomFactor(self, zoomFactor): @@ -103,3 +96,21 @@ @type float """ self.setCurrentText(self.tr("{0}%").format(round(zoomFactor * 100))) + self.__editingFinished() + + @pyqtSlot(QPdfView.ZoomMode) + def setZoomMode(self, zoomMode): + """ + Public slot to set the zoom value iaw. the zoom mode. + + @param zoomMode current zoom mode + @type QPdfView.ZoomMode + """ + if zoomMode == QPdfView.ZoomMode.FitToWidth: + self.setCurrentIndex(0) # index 0 is 'Page Width' + elif zoomMode == QPdfView.ZoomMode.FitInView: + self.setCurrentIndex(1) # index 1 is 'Whole Page' + else: + # ignore Custom mode here + return + self.__editingFinished()
--- a/src/eric7/Preferences/__init__.py Sat Jan 14 18:25:26 2023 +0100 +++ b/src/eric7/Preferences/__init__.py Sun Jan 15 17:41:35 2023 +0100 @@ -1635,6 +1635,7 @@ "PdfViewerState": QByteArray(), "PdfViewerSplitterState": QByteArray(), "RecentNumber": 9, + "PdfViewerDisplayMode": "single" # single or continuous }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/icons/breeze-dark/zoomFitPage.svg Sun Jan 15 17:41:35 2023 +0100 @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + viewBox="0 0 22 22" + version="1.1" + id="svg6" + sodipodi:docname="zoomFitPage.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview8" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="29.272727" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-width="2580" + inkscape:window-height="1080" + inkscape:window-x="426" + inkscape:window-y="146" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <defs + id="defs3051"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Text { + color:#eff0f1; + } + </style> + </defs> + <path + style="fill:currentColor;fill-opacity:1;stroke:none;stroke-width:1.25" + d="M 1,1 V 2.25 6 H 2.25 V 2.25 H 6 V 1 H 2.25 Z M 11,1 8.5,3.5 h 5 z m 5,0 v 1.25 h 3.75 V 6 H 21 V 2.25 1 H 19.75 Z M 4.75,4.75 v 12.5 h 12.5 V 4.75 Z M 6,6 H 16 V 16 H 6 Z M 3.5,8.5 1,11 3.5,13.5 Z m 15,0 v 5 L 21,11 Z M 1,16 V 19.75 21 H 6 V 19.75 H 2.25 V 16 Z m 18.75,0 v 3.75 H 16 V 21 h 5 V 19.75 16 Z M 8.5,18.5 11,21 13.5,18.5 Z" + class="ColorScheme-Text" + id="path4" /> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/icons/breeze-dark/zoomFitWidth.svg Sun Jan 15 17:41:35 2023 +0100 @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + viewBox="0 0 22 22" + id="svg7" + sodipodi:docname="zoomFitWidth.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview9" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="29.272727" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-width="2580" + inkscape:window-height="1080" + inkscape:window-x="426" + inkscape:window-y="146" + inkscape:window-maximized="0" + inkscape:current-layer="svg7" /> + <defs + id="defs3"> + <style + id="current-color-scheme" + type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style> + </defs> + <path + style="fill:currentColor;fill-opacity:1;stroke:none;stroke-width:1.25" + class="ColorScheme-Text" + d="M 1,1 V 6 H 2.25 V 2.25 H 6 V 1 H 2.25 Z m 15,0 v 1.25 h 3.75 V 6 H 21 V 1 H 19.75 Z M 4.75,4.75 v 12.5 h 12.5 V 4.75 Z M 6,6 H 16 V 16 H 6 Z M 3.5,8.5 1,11 3.5,13.5 Z m 15,0 v 5 L 21,11 Z M 1,16 v 5 H 6 V 19.75 H 2.25 V 16 Z m 18.75,0 v 3.75 H 16 V 21 h 5 v -5 z" + id="path5" /> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/icons/breeze-light/zoomFitPage.svg Sun Jan 15 17:41:35 2023 +0100 @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + viewBox="0 0 22 22" + version="1.1" + id="svg6" + sodipodi:docname="zoomFitPage.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview8" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="29.272727" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-width="2580" + inkscape:window-height="1080" + inkscape:window-x="426" + inkscape:window-y="146" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <defs + id="defs3051"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Text { + color:#232629; + } + </style> + </defs> + <path + style="fill:currentColor;fill-opacity:1;stroke:none;stroke-width:1.25" + d="M 1,1 V 2.25 6 H 2.25 V 2.25 H 6 V 1 H 2.25 Z M 11,1 8.5,3.5 h 5 z m 5,0 v 1.25 h 3.75 V 6 H 21 V 2.25 1 H 19.75 Z M 4.75,4.75 v 12.5 h 12.5 V 4.75 Z M 6,6 H 16 V 16 H 6 Z M 3.5,8.5 1,11 3.5,13.5 Z m 15,0 v 5 L 21,11 Z M 1,16 V 19.75 21 H 6 V 19.75 H 2.25 V 16 Z m 18.75,0 v 3.75 H 16 V 21 h 5 V 19.75 16 Z M 8.5,18.5 11,21 13.5,18.5 Z" + class="ColorScheme-Text" + id="path4" /> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/icons/breeze-light/zoomFitWidth.svg Sun Jan 15 17:41:35 2023 +0100 @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + viewBox="0 0 22 22" + id="svg7" + sodipodi:docname="zoomFitWidth.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview9" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="29.272727" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-width="2580" + inkscape:window-height="1080" + inkscape:window-x="426" + inkscape:window-y="146" + inkscape:window-maximized="0" + inkscape:current-layer="svg7" /> + <defs + id="defs3"> + <style + id="current-color-scheme" + type="text/css">.ColorScheme-Text { + color:#232629; + }</style> + </defs> + <path + style="fill:currentColor;fill-opacity:1;stroke:none;stroke-width:1.25" + class="ColorScheme-Text" + d="M 1,1 V 6 H 2.25 V 2.25 H 6 V 1 H 2.25 Z m 15,0 v 1.25 h 3.75 V 6 H 21 V 1 H 19.75 Z M 4.75,4.75 v 12.5 h 12.5 V 4.75 Z M 6,6 H 16 V 16 H 6 Z M 3.5,8.5 1,11 3.5,13.5 Z m 15,0 v 5 L 21,11 Z M 1,16 v 5 H 6 V 19.75 H 2.25 V 16 Z m 18.75,0 v 3.75 H 16 V 21 h 5 v -5 z" + id="path5" /> +</svg>