summaryrefslogtreecommitdiff
path: root/silx/gui/widgets/PrintPreview.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/widgets/PrintPreview.py')
-rw-r--r--silx/gui/widgets/PrintPreview.py728
1 files changed, 0 insertions, 728 deletions
diff --git a/silx/gui/widgets/PrintPreview.py b/silx/gui/widgets/PrintPreview.py
deleted file mode 100644
index 96af34b..0000000
--- a/silx/gui/widgets/PrintPreview.py
+++ /dev/null
@@ -1,728 +0,0 @@
-# coding: utf-8
-# /*##########################################################################
-#
-# Copyright (c) 2004-2018 European Synchrotron Radiation Facility
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# ###########################################################################*/
-"""This module implements a print preview dialog.
-
-The dialog provides methods to send images, pixmaps and SVG
-items to the page to be printed.
-
-The user can interactively move and resize the items.
-"""
-import sys
-import logging
-from silx.gui import qt, printer
-
-
-__authors__ = ["V.A. Sole", "P. Knobel"]
-__license__ = "MIT"
-__date__ = "11/07/2017"
-
-
-_logger = logging.getLogger(__name__)
-
-
-class PrintPreviewDialog(qt.QDialog):
- """Print preview dialog widget.
- """
- def __init__(self, parent=None, printer=None):
-
- qt.QDialog.__init__(self, parent)
- self.setWindowTitle("Print Preview")
- self.setModal(False)
- self.resize(400, 500)
-
- self.mainLayout = qt.QVBoxLayout(self)
- self.mainLayout.setContentsMargins(0, 0, 0, 0)
- self.mainLayout.setSpacing(0)
-
- self._buildToolbar()
-
- self.printer = printer
- # :class:`QPrinter` (paint device that paints on a printer).
- # :meth:`showEvent` has been reimplemented to enforce printer
- # setup.
-
- self.printDialog = None
- # :class:`QPrintDialog` (dialog for specifying the printer's
- # configuration)
-
- self.scene = None
- # :class:`QGraphicsScene` (surface for managing
- # 2D graphical items)
-
- self.page = None
- # :class:`QGraphicsRectItem` used as white background page on which
- # to display the print preview.
-
- self.view = None
- # :class:`QGraphicsView` widget for displaying :attr:`scene`
-
- self._svgItems = []
- # List storing :class:`QSvgRenderer` items to be printed, added in
- # :meth:`addSvgItem`, cleared in :meth:`_clearAll`.
- # This ensures that there is a reference pointing to the items,
- # which ensures they are not destroyed before being printed.
-
- self._viewScale = 1.0
- # Zoom level (1.0 is 100%)
-
- self._toBeCleared = False
- # Flag indicating that all items must be removed from :attr:`scene`
- # and from :attr:`_svgItems`.
- # Set to True after a successful printing. The widget is then hidden,
- # and it will be cleared the next time it is shown.
- # Reset to False after :meth:`_clearAll` has done its job.
-
- def _buildToolbar(self):
- toolBar = qt.QWidget(self)
- # a layout for the toolbar
- toolsLayout = qt.QHBoxLayout(toolBar)
- toolsLayout.setContentsMargins(0, 0, 0, 0)
- toolsLayout.setSpacing(0)
-
- hideBut = qt.QPushButton("Hide", toolBar)
- hideBut.setToolTip("Hide print preview dialog")
- hideBut.clicked.connect(self.hide)
-
- cancelBut = qt.QPushButton("Clear All", toolBar)
- cancelBut.setToolTip("Remove all items")
- cancelBut.clicked.connect(self._clearAll)
-
- removeBut = qt.QPushButton("Remove",
- toolBar)
- removeBut.setToolTip("Remove selected item (use left click to select)")
- removeBut.clicked.connect(self._remove)
-
- setupBut = qt.QPushButton("Setup", toolBar)
- setupBut.setToolTip("Select and configure a printer")
- setupBut.clicked.connect(self.setup)
-
- printBut = qt.QPushButton("Print", toolBar)
- printBut.setToolTip("Print page and close print preview")
- printBut.clicked.connect(self._print)
-
- zoomPlusBut = qt.QPushButton("Zoom +", toolBar)
- zoomPlusBut.clicked.connect(self._zoomPlus)
-
- zoomMinusBut = qt.QPushButton("Zoom -", toolBar)
- zoomMinusBut.clicked.connect(self._zoomMinus)
-
- toolsLayout.addWidget(hideBut)
- toolsLayout.addWidget(printBut)
- toolsLayout.addWidget(cancelBut)
- toolsLayout.addWidget(removeBut)
- toolsLayout.addWidget(setupBut)
- # toolsLayout.addStretch()
- # toolsLayout.addWidget(marginLabel)
- # toolsLayout.addWidget(self.marginSpin)
- toolsLayout.addStretch()
- # toolsLayout.addWidget(scaleLabel)
- # toolsLayout.addWidget(self.scaleCombo)
- toolsLayout.addWidget(zoomPlusBut)
- toolsLayout.addWidget(zoomMinusBut)
- # toolsLayout.addStretch()
- self.toolBar = toolBar
- self.mainLayout.addWidget(self.toolBar)
-
- def _buildStatusBar(self):
- """Create the status bar used to display the printer name
- or output file name."""
- # status bar
- statusBar = qt.QStatusBar(self)
- self.targetLabel = qt.QLabel(statusBar)
- self._updateTargetLabel()
- statusBar.addWidget(self.targetLabel)
- self.mainLayout.addWidget(statusBar)
-
- def _updateTargetLabel(self):
- """Update printer name or file name shown in the status bar."""
- if self.printer is None:
- self.targetLabel.setText("Undefined printer")
- return
- if self.printer.outputFileName():
- self.targetLabel.setText("File:" +
- self.printer.outputFileName())
- else:
- self.targetLabel.setText("Printer:" +
- self.printer.printerName())
-
- def _updatePrinter(self):
- """Resize :attr:`page`, :attr:`scene` and :attr:`view` to :attr:`printer`
- width and height."""
- printer = self.printer
- assert printer is not None, \
- "_updatePrinter should not be called unless a printer is defined"
- if self.scene is None:
- self.scene = qt.QGraphicsScene()
- self.scene.setBackgroundBrush(qt.QColor(qt.Qt.lightGray))
- self.scene.setSceneRect(qt.QRectF(0, 0, printer.width(), printer.height()))
-
- if self.page is None:
- self.page = qt.QGraphicsRectItem(0, 0, printer.width(), printer.height())
- self.page.setBrush(qt.QColor(qt.Qt.white))
- self.scene.addItem(self.page)
-
- self.scene.setSceneRect(qt.QRectF(0, 0, printer.width(), printer.height()))
- self.page.setPos(qt.QPointF(0.0, 0.0))
- self.page.setRect(qt.QRectF(0, 0, printer.width(), printer.height()))
-
- if self.view is None:
- self.view = qt.QGraphicsView(self.scene)
- self.mainLayout.addWidget(self.view)
- self._buildStatusBar()
- # self.view.scale(1./self._viewScale, 1./self._viewScale)
- self.view.fitInView(self.page.rect(), qt.Qt.KeepAspectRatio)
- self._viewScale = 1.00
- self._updateTargetLabel()
-
- # Public methods
- def addImage(self, image, title=None, comment=None, commentPosition=None):
- """Add an image to the print preview scene.
-
- :param QImage image: Image to be added to the scene
- :param str title: Title shown above (centered) the image
- :param str comment: Comment displayed below the image
- :param commentPosition: "CENTER" or "LEFT"
- """
- self.addPixmap(qt.QPixmap.fromImage(image),
- title=title, comment=comment,
- commentPosition=commentPosition)
-
- def addPixmap(self, pixmap, title=None, comment=None, commentPosition=None):
- """Add a pixmap to the print preview scene
-
- :param QPixmap pixmap: Pixmap to be added to the scene
- :param str title: Title shown above (centered) the pixmap
- :param str comment: Comment displayed below the pixmap
- :param commentPosition: "CENTER" or "LEFT"
- """
- if self._toBeCleared:
- self._clearAll()
- self.ensurePrinterIsSet()
- if self.printer is None:
- _logger.error("printer is not set, cannot add pixmap to page")
- return
- if title is None:
- title = ' ' * 88
- if comment is None:
- comment = ' ' * 88
- if commentPosition is None:
- commentPosition = "CENTER"
- if qt.qVersion() < "5.0":
- rectItem = qt.QGraphicsRectItem(self.page, self.scene)
- else:
- rectItem = qt.QGraphicsRectItem(self.page)
-
- rectItem.setRect(qt.QRectF(1, 1,
- pixmap.width(), pixmap.height()))
-
- pen = rectItem.pen()
- color = qt.QColor(qt.Qt.red)
- color.setAlpha(1)
- pen.setColor(color)
- rectItem.setPen(pen)
- rectItem.setZValue(1)
- rectItem.setFlag(qt.QGraphicsItem.ItemIsSelectable, True)
- rectItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True)
- rectItem.setFlag(qt.QGraphicsItem.ItemIsFocusable, False)
-
- rectItemResizeRect = _GraphicsResizeRectItem(rectItem, self.scene)
- rectItemResizeRect.setZValue(2)
-
- if qt.qVersion() < "5.0":
- pixmapItem = qt.QGraphicsPixmapItem(rectItem, self.scene)
- else:
- pixmapItem = qt.QGraphicsPixmapItem(rectItem)
- pixmapItem.setPixmap(pixmap)
- pixmapItem.setZValue(0)
-
- # I add the title
- if qt.qVersion() < "5.0":
- textItem = qt.QGraphicsTextItem(title, rectItem, self.scene)
- else:
- textItem = qt.QGraphicsTextItem(title, rectItem)
- textItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction)
- offset = 0.5 * textItem.boundingRect().width()
- textItem.moveBy(0.5 * pixmap.width() - offset, -20)
- textItem.setZValue(2)
-
- # I add the comment
- if qt.qVersion() < "5.0":
- commentItem = qt.QGraphicsTextItem(comment, rectItem, self.scene)
- else:
- commentItem = qt.QGraphicsTextItem(comment, rectItem)
- commentItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction)
- offset = 0.5 * commentItem.boundingRect().width()
- if commentPosition.upper() == "LEFT":
- x = 1
- else:
- x = 0.5 * pixmap.width() - offset
- commentItem.moveBy(x, pixmap.height() + 20)
- commentItem.setZValue(2)
-
- rectItem.moveBy(20, 40)
-
- def addSvgItem(self, item, title=None,
- comment=None, commentPosition=None,
- viewBox=None, keepRatio=True):
- """Add a SVG item to the scene.
-
- :param QSvgRenderer item: SVG item to be added to the scene.
- :param str title: Title shown above (centered) the SVG item.
- :param str comment: Comment displayed below the SVG item.
- :param str commentPosition: "CENTER" or "LEFT"
- :param QRectF viewBox: Bounding box for the item on the print page
- (xOffset, yOffset, width, height). If None, use original
- item size.
- :param bool keepRatio: If True, resizing the item will preserve its
- original aspect ratio.
- """
- if not qt.HAS_SVG:
- raise RuntimeError("Missing QtSvg library.")
- if not isinstance(item, qt.QSvgRenderer):
- raise TypeError("addSvgItem: QSvgRenderer expected")
- if self._toBeCleared:
- self._clearAll()
- self.ensurePrinterIsSet()
- if self.printer is None:
- _logger.error("printer is not set, cannot add SvgItem to page")
- return
-
- if title is None:
- title = 50 * ' '
- if comment is None:
- comment = 80 * ' '
- if commentPosition is None:
- commentPosition = "CENTER"
-
- if viewBox is None:
- if hasattr(item, "_viewBox"):
- # PyMca compatibility: viewbox attached to item
- viewBox = item._viewBox
- else:
- # try the original item viewbox
- viewBox = item.viewBoxF()
-
- svgItem = _GraphicsSvgRectItem(viewBox, self.page)
- svgItem.setSvgRenderer(item)
-
- svgItem.setCacheMode(qt.QGraphicsItem.NoCache)
- svgItem.setZValue(0)
- svgItem.setFlag(qt.QGraphicsItem.ItemIsSelectable, True)
- svgItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True)
- svgItem.setFlag(qt.QGraphicsItem.ItemIsFocusable, False)
-
- rectItemResizeRect = _GraphicsResizeRectItem(svgItem, self.scene,
- keepratio=keepRatio)
- rectItemResizeRect.setZValue(2)
-
- self._svgItems.append(item)
-
- # Comment / legend
- dummyComment = 80 * "1"
- if qt.qVersion() < '5.0':
- commentItem = qt.QGraphicsTextItem(dummyComment, svgItem, self.scene)
- else:
- commentItem = qt.QGraphicsTextItem(dummyComment, svgItem)
- commentItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction)
- # we scale the text to have the legend box have the same width as the graph
- scaleCalculationRect = qt.QRectF(commentItem.boundingRect())
- scale = svgItem.boundingRect().width() / scaleCalculationRect.width()
-
- commentItem.setPlainText(comment)
- commentItem.setZValue(1)
-
- commentItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True)
- if qt.qVersion() < "5.0":
- commentItem.scale(scale, scale)
- else:
- commentItem.setScale(scale)
-
- # align
- if commentPosition.upper() == "CENTER":
- alignment = qt.Qt.AlignCenter
- elif commentPosition.upper() == "RIGHT":
- alignment = qt.Qt.AlignRight
- else:
- alignment = qt.Qt.AlignLeft
- commentItem.setTextWidth(commentItem.boundingRect().width())
- center_format = qt.QTextBlockFormat()
- center_format.setAlignment(alignment)
- cursor = commentItem.textCursor()
- cursor.select(qt.QTextCursor.Document)
- cursor.mergeBlockFormat(center_format)
- cursor.clearSelection()
- commentItem.setTextCursor(cursor)
- if alignment == qt.Qt.AlignLeft:
- deltax = 0
- else:
- deltax = (svgItem.boundingRect().width() - commentItem.boundingRect().width()) / 2.
- commentItem.moveBy(svgItem.boundingRect().x() + deltax,
- svgItem.boundingRect().y() + svgItem.boundingRect().height())
-
- # Title
- if qt.qVersion() < '5.0':
- textItem = qt.QGraphicsTextItem(title, svgItem, self.scene)
- else:
- textItem = qt.QGraphicsTextItem(title, svgItem)
- textItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction)
- textItem.setZValue(1)
- textItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True)
-
- title_offset = 0.5 * textItem.boundingRect().width()
- textItem.moveBy(svgItem.boundingRect().x() +
- 0.5 * svgItem.boundingRect().width() - title_offset * scale,
- svgItem.boundingRect().y())
- if qt.qVersion() < "5.0":
- textItem.scale(scale, scale)
- else:
- textItem.setScale(scale)
-
- def setup(self):
- """Open a print dialog to ensure the :attr:`printer` is set.
-
- If the setting fails or is cancelled, :attr:`printer` is reset to
- *None*.
- """
- if self.printer is None:
- self.printer = printer.getDefaultPrinter()
- if self.printDialog is None:
- self.printDialog = qt.QPrintDialog(self.printer, self)
- if self.printDialog.exec_():
- if self.printer.width() <= 0 or self.printer.height() <= 0:
- self.message = qt.QMessageBox(self)
- self.message.setIcon(qt.QMessageBox.Critical)
- self.message.setText("Unknown library error \non printer initialization")
- self.message.setWindowTitle("Library Error")
- self.message.setModal(0)
- self.printer = None
- return
- self.printer.setFullPage(True)
- self._updatePrinter()
- else:
- # printer setup cancelled, check for a possible previous configuration
- if self.page is None:
- # not initialized
- self.printer = None
-
- def ensurePrinterIsSet(self):
- """If the printer is not already set, try to interactively
- setup the printer using a QPrintDialog.
- In case of failure, hide widget and log a warning.
-
- :return: True if printer was set. False if it failed or if the
- selection dialog was canceled.
- """
- if self.printer is None:
- self.setup()
- if self.printer is None:
- self.hide()
- _logger.warning("Printer setup failed or was cancelled, " +
- "but printer is required.")
- return self.printer is not None
-
- def setOutputFileName(self, name):
- """Set output filename.
-
- Setting a non-empty name enables printing to file.
-
- :param str name: File name (path)"""
- self.printer.setOutputFileName(name)
-
- # overloaded methods
- def exec_(self):
- if self._toBeCleared:
- self._clearAll()
- return qt.QDialog.exec_(self)
-
- def raise_(self):
- if self._toBeCleared:
- self._clearAll()
- return qt.QDialog.raise_(self)
-
- def showEvent(self, event):
- """Reimplemented to force printer setup.
- In case of failure, hide the widget."""
- if self._toBeCleared:
- self._clearAll()
- self.ensurePrinterIsSet()
-
- return super(PrintPreviewDialog, self).showEvent(event)
-
- # button callbacks
- def _print(self):
- """Do the printing, hide the print preview dialog,
- set :attr:`_toBeCleared` flag to True to trigger clearing the
- next time the dialog is shown.
-
- If the printer is not setup, do it first."""
- printer = self.printer
-
- painter = qt.QPainter()
- if not painter.begin(printer) or printer is None:
- _logger.error("Cannot initialize printer")
- return
- try:
- self.scene.render(painter, qt.QRectF(0, 0, printer.width(), printer.height()),
- qt.QRectF(self.page.rect().x(), self.page.rect().y(),
- self.page.rect().width(), self.page.rect().height()),
- qt.Qt.KeepAspectRatio)
- painter.end()
- self.hide()
- self.accept()
- self._toBeCleared = True
- except: # FIXME
- painter.end()
- qt.QMessageBox.critical(self, "ERROR",
- 'Printing problem:\n %s' % sys.exc_info()[1])
- _logger.error('printing problem:\n %s' % sys.exc_info()[1])
- return
-
- def _zoomPlus(self):
- self._viewScale *= 1.20
- self.view.scale(1.20, 1.20)
-
- def _zoomMinus(self):
- self._viewScale *= 0.80
- self.view.scale(0.80, 0.80)
-
- def _clearAll(self):
- """
- Clear the print preview window, remove all items
- but keep the page.
- """
- itemlist = self.scene.items()
- keep = self.page
- while len(itemlist) != 1:
- if itemlist.index(keep) == 0:
- self.scene.removeItem(itemlist[1])
- else:
- self.scene.removeItem(itemlist[0])
- itemlist = self.scene.items()
- self._svgItems = []
- self._toBeCleared = False
-
- def _remove(self):
- """Remove selected item in :attr:`scene`.
- """
- itemlist = self.scene.items()
-
- # this loop is not efficient if there are many items ...
- for item in itemlist:
- if item.isSelected():
- self.scene.removeItem(item)
-
-
-class SingletonPrintPreviewDialog(PrintPreviewDialog):
- """Singleton print preview dialog.
-
- All widgets in a program that instantiate this class will share
- a single print preview dialog. This enables sending
- multiple images to a single page to be printed.
- """
- _instance = None
-
- def __new__(self, *var, **kw):
- if self._instance is None:
- self._instance = PrintPreviewDialog(*var, **kw)
- return self._instance
-
-
-class _GraphicsSvgRectItem(qt.QGraphicsRectItem):
- """:class:`qt.QGraphicsRectItem` with an attached
- :class:`qt.QSvgRenderer`, and with a painter redefined to render
- the SVG item."""
- def setSvgRenderer(self, renderer):
- """
-
- :param QSvgRenderer renderer: svg renderer
- """
- self._renderer = renderer
-
- def paint(self, painter, *var, **kw):
- self._renderer.render(painter, self.boundingRect())
-
-
-class _GraphicsResizeRectItem(qt.QGraphicsRectItem):
- """Resizable QGraphicsRectItem."""
- def __init__(self, parent=None, scene=None, keepratio=True):
- if qt.qVersion() < '5.0':
- qt.QGraphicsRectItem.__init__(self, parent, scene)
- else:
- qt.QGraphicsRectItem.__init__(self, parent)
- rect = parent.boundingRect()
- x = rect.x()
- y = rect.y()
- w = rect.width()
- h = rect.height()
- self._newRect = None
- self.keepRatio = keepratio
- self.setRect(qt.QRectF(x + w - 40, y + h - 40, 40, 40))
- self.setAcceptHoverEvents(True)
- pen = qt.QPen()
- color = qt.QColor(qt.Qt.white)
- color.setAlpha(0)
- pen.setColor(color)
- pen.setStyle(qt.Qt.NoPen)
- self.setPen(pen)
- self.setBrush(color)
- self.setFlag(self.ItemIsMovable, True)
- self.show()
-
- def hoverEnterEvent(self, event):
- if self.parentItem().isSelected():
- self.parentItem().setSelected(False)
- if self.keepRatio:
- self.setCursor(qt.QCursor(qt.Qt.SizeFDiagCursor))
- else:
- self.setCursor(qt.QCursor(qt.Qt.SizeAllCursor))
- self.setBrush(qt.QBrush(qt.Qt.yellow, qt.Qt.SolidPattern))
- return qt.QGraphicsRectItem.hoverEnterEvent(self, event)
-
- def hoverLeaveEvent(self, event):
- self.setCursor(qt.QCursor(qt.Qt.ArrowCursor))
- pen = qt.QPen()
- color = qt.QColor(qt.Qt.white)
- color.setAlpha(0)
- pen.setColor(color)
- pen.setStyle(qt.Qt.NoPen)
- self.setPen(pen)
- self.setBrush(color)
- return qt.QGraphicsRectItem.hoverLeaveEvent(self, event)
-
- def mousePressEvent(self, event):
- if self._newRect is not None:
- self._newRect = None
- self._point0 = self.pos()
- parent = self.parentItem()
- scene = self.scene()
- # following line prevents dragging along the previously selected
- # item when resizing another one
- scene.clearSelection()
-
- rect = parent.boundingRect()
- self._x = rect.x()
- self._y = rect.y()
- self._w = rect.width()
- self._h = rect.height()
- self._ratio = self._w / self._h
- if qt.qVersion() < "5.0":
- self._newRect = qt.QGraphicsRectItem(parent, scene)
- else:
- self._newRect = qt.QGraphicsRectItem(parent)
- self._newRect.setRect(qt.QRectF(self._x,
- self._y,
- self._w,
- self._h))
- qt.QGraphicsRectItem.mousePressEvent(self, event)
-
- def mouseMoveEvent(self, event):
- point1 = self.pos()
- deltax = point1.x() - self._point0.x()
- deltay = point1.y() - self._point0.y()
- if self.keepRatio:
- r1 = (self._w + deltax) / self._w
- r2 = (self._h + deltay) / self._h
- if r1 < r2:
- self._newRect.setRect(qt.QRectF(self._x,
- self._y,
- self._w + deltax,
- (self._w + deltax) / self._ratio))
- else:
- self._newRect.setRect(qt.QRectF(self._x,
- self._y,
- (self._h + deltay) * self._ratio,
- self._h + deltay))
- else:
- self._newRect.setRect(qt.QRectF(self._x,
- self._y,
- self._w + deltax,
- self._h + deltay))
- qt.QGraphicsRectItem.mouseMoveEvent(self, event)
-
- def mouseReleaseEvent(self, event):
- point1 = self.pos()
- deltax = point1.x() - self._point0.x()
- deltay = point1.y() - self._point0.y()
- self.moveBy(-deltax, -deltay)
- parent = self.parentItem()
-
- # deduce scale from rectangle
- if (qt.qVersion() < "5.0") or self.keepRatio:
- scalex = self._newRect.rect().width() / self._w
- scaley = scalex
- else:
- scalex = self._newRect.rect().width() / self._w
- scaley = self._newRect.rect().height() / self._h
-
- if qt.qVersion() < "5.0":
- parent.scale(scalex, scaley)
- else:
- # apply the scale to the previous transformation matrix
- previousTransform = parent.transform()
- parent.setTransform(
- previousTransform.scale(scalex, scaley))
-
- self.scene().removeItem(self._newRect)
- self._newRect = None
- qt.QGraphicsRectItem.mouseReleaseEvent(self, event)
-
-
-def main():
- """
- """
- if len(sys.argv) < 2:
- print("give an image file as parameter please.")
- sys.exit(1)
-
- if len(sys.argv) > 2:
- print("only one parameter please.")
- sys.exit(1)
-
- filename = sys.argv[1]
- w = PrintPreviewDialog()
- w.resize(400, 500)
-
- comment = ""
- for i in range(20):
- comment += "Line number %d: En un lugar de La Mancha de cuyo nombre ...\n" % i
-
- if filename[-3:] == "svg":
- item = qt.QSvgRenderer(filename, w.page)
- w.addSvgItem(item, title=filename,
- comment=comment, commentPosition="CENTER")
- else:
- w.addPixmap(qt.QPixmap.fromImage(qt.QImage(filename)),
- title=filename,
- comment=comment,
- commentPosition="CENTER")
- w.addImage(qt.QImage(filename), comment=comment, commentPosition="LEFT")
-
- sys.exit(w.exec_())
-
-
-if __name__ == '__main__':
- a = qt.QApplication(sys.argv)
- main()
- a.exec_()