def __getPreviewWidget(self): # return the preview image view widget if self.__previewWidget is None: self.__previewWidget = Preview(self) self.__previewWidget.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.Tool) self.__previewWidget.setAttribute(Qt.WA_ShowWithoutActivating) self.__previewWidget.setFocusPolicy(Qt.NoFocus) self.__previewWidget.installEventFilter(self) return self.__previewWidget
def __getPreviewWidget(self): # return the preview image view widget if self.__previewWidget is None: self.__previewWidget = Preview(self) self.__previewWidget.setWindowFlags( Qt.WindowStaysOnTopHint | Qt.Tool) self.__previewWidget.setAttribute( Qt.WA_ShowWithoutActivating) self.__previewWidget.setFocusPolicy(Qt.NoFocus) self.__previewWidget.installEventFilter(self) return self.__previewWidget
class ThumbnailView(QGraphicsView): """ A widget displaying a image thumbnail grid """ FixedColumnCount, AutoReflow = GraphicsThumbnailGrid.LayoutMode def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setRenderHint(QPainter.Antialiasing) self.setRenderHint(QPainter.TextAntialiasing) self.__layoutMode = ThumbnailView.AutoReflow self.__columnCount = -1 self.__grid = GraphicsThumbnailGrid() self.__grid.currentThumbnailChanged.connect( self.__onCurrentThumbnailChanged) self.__previewWidget = None scene = GraphicsScene(self) scene.addItem(self.__grid) scene.selectionRectPointChanged.connect(self.__ensureVisible, Qt.QueuedConnection) self.setScene(scene) sh = QShortcut(Qt.Key_Space, self, context=Qt.WidgetWithChildrenShortcut) sh.activated.connect(self.__previewToggle) self.__grid.geometryChanged.connect(self.__updateSceneRect) @proxydoc(GraphicsThumbnailGrid.addThumbnail) def addThumbnail(self, thumbnail): self.__grid.addThumbnail(thumbnail) @property def grid(self): return self.__grid @proxydoc(GraphicsThumbnailGrid.insertThumbnail) def insertThumbnail(self, index, thumbnail): self.__grid.insertThumbnail(index, thumbnail) @proxydoc(GraphicsThumbnailGrid.setFixedColumnCount) def setFixedColumnCount(self, count): self.__grid.setFixedColumnCount(count) @proxydoc(GraphicsThumbnailGrid.setFixedRowCount) def setFixedRowCount(self, count): self.__grid.setFixedRowCount(count) @proxydoc(GraphicsThumbnailGrid.setCrop) def setCrop(self, crop): self.__grid.setCrop(crop) @proxydoc(GraphicsThumbnailGrid.count) def count(self): return self.__grid.count() @proxydoc(GraphicsThumbnailGrid.grid_size) def grid_size(self): return self.__grid.grid_size() def clear(self): """ Clear all thumbnails and close/delete the preview window if used. """ self.__grid.clear() if self.__previewWidget is not None: self.__closePreview() def sizeHint(self): return QSize(480, 480) def __updateSceneRect(self): self.scene().setSceneRect(self.scene().itemsBoundingRect()) # Full viewport update, otherwise contents outside the new # sceneRect can persist on the viewport self.viewport().update() def resizeEvent(self, event): super().resizeEvent(event) if event.size().width() != event.oldSize().width(): width = event.size().width() - 2 self.__grid.setMaximumWidth(width) self.__grid.setMinimumWidth(width) if event.size().height() != event.oldSize().height(): height = event.size().height() - 2 self.__grid.setMaximumHeight(height) self.__grid.setMinimumHeight(height) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape and self.__previewWidget is not None: self.__closePreview() event.accept() return return super().keyPressEvent(event) def __previewToggle(self): if (self.__previewWidget is None and self.__grid.currentItem() is not None): focusitem = self.__grid.currentItem() preview = self.__getPreviewWidget() preview.show() preview.raise_() preview.setPixmap(focusitem.pixmap()) else: self.__closePreview() def __getPreviewWidget(self): # return the preview image view widget if self.__previewWidget is None: self.__previewWidget = Preview(self) self.__previewWidget.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.Tool) self.__previewWidget.setAttribute(Qt.WA_ShowWithoutActivating) self.__previewWidget.setFocusPolicy(Qt.NoFocus) self.__previewWidget.installEventFilter(self) return self.__previewWidget def __updatePreviewPixmap(self): current = self.__grid.currentItem() if isinstance(current, GraphicsThumbnailWidget) and \ current.parentItem() is self.__grid and \ self.__previewWidget is not None: self.__previewWidget.setPixmap(current.pixmap()) def __closePreview(self): if self.__previewWidget is not None: self.__previewWidget.close() self.__previewWidget.setPixmap(QPixmap()) self.__previewWidget.deleteLater() self.__previewWidget = None def eventFilter(self, receiver, event): if receiver is self.__previewWidget and \ event.type() == QEvent.KeyPress: if event.key() in [ Qt.Key_Left, Qt.Key_Right, Qt.Key_Down, Qt.Key_Up ]: self.__grid._moveCurrent(event.key()) event.accept() return True elif event.key() in [Qt.Key_Escape, Qt.Key_Space]: self.__closePreview() event.accept() return True return super().eventFilter(receiver, event) def hideEvent(self, event): super().hideEvent(event) self.__closePreview() def __onCurrentThumbnailChanged(self, thumbnail): if thumbnail is not None: self.__updatePreviewPixmap() else: self.__closePreview() @Slot(QPointF) def __ensureVisible(self, point): self.ensureVisible(QRectF(point, QSizeF(1, 1)), 5, 5),
class ThumbnailView(QGraphicsView): """ A widget displaying a image thumbnail grid """ FixedColumnCount, AutoReflow = GraphicsThumbnailGrid.LayoutMode def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setRenderHint(QPainter.Antialiasing) self.setRenderHint(QPainter.TextAntialiasing) self.__layoutMode = ThumbnailView.AutoReflow self.__columnCount = -1 self.__grid = GraphicsThumbnailGrid() self.__grid.currentThumbnailChanged.connect( self.__onCurrentThumbnailChanged ) self.__previewWidget = None scene = GraphicsScene(self) scene.addItem(self.__grid) scene.selectionRectPointChanged.connect( self.__ensureVisible, Qt.QueuedConnection ) self.setScene(scene) sh = QShortcut(Qt.Key_Space, self, context=Qt.WidgetWithChildrenShortcut) sh.activated.connect(self.__previewToggle) self.__grid.geometryChanged.connect(self.__updateSceneRect) @proxydoc(GraphicsThumbnailGrid.addThumbnail) def addThumbnail(self, thumbnail): self.__grid.addThumbnail(thumbnail) @proxydoc(GraphicsThumbnailGrid.insertThumbnail) def insertThumbnail(self, index, thumbnail): self.__grid.insertThumbnail(index, thumbnail) @proxydoc(GraphicsThumbnailGrid.setFixedColumnCount) def setFixedColumnCount(self, count): self.__grid.setFixedColumnCount(count) @proxydoc(GraphicsThumbnailGrid.setFixedRowCount) def setFixedRowCount(self, count): self.__grid.setFixedRowCount(count) @proxydoc(GraphicsThumbnailGrid.setCrop) def setCrop(self, crop): self.__grid.setCrop(crop) @proxydoc(GraphicsThumbnailGrid.count) def count(self): return self.__grid.count() @proxydoc(GraphicsThumbnailGrid.grid_size) def grid_size(self): return self.__grid.grid_size() def clear(self): """ Clear all thumbnails and close/delete the preview window if used. """ self.__grid.clear() if self.__previewWidget is not None: self.__closePreview() def sizeHint(self): return QSize(480, 480) def __updateSceneRect(self): self.scene().setSceneRect(self.scene().itemsBoundingRect()) # Full viewport update, otherwise contents outside the new # sceneRect can persist on the viewport self.viewport().update() def resizeEvent(self, event): super().resizeEvent(event) if event.size().width() != event.oldSize().width(): width = event.size().width() - 2 self.__grid.setMaximumWidth(width) self.__grid.setMinimumWidth(width) if event.size().height() != event.oldSize().height(): height = event.size().height() - 2 self.__grid.setMaximumHeight(height) self.__grid.setMinimumHeight(height) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape and self.__previewWidget is not None: self.__closePreview() event.accept() return return super().keyPressEvent(event) def __previewToggle(self): if self.__previewWidget is None and self.__grid.currentItem() is not None: focusitem = self.__grid.currentItem() preview = self.__getPreviewWidget() preview.show() preview.raise_() preview.setPixmap(focusitem.pixmap()) else: self.__closePreview() def __getPreviewWidget(self): # return the preview image view widget if self.__previewWidget is None: self.__previewWidget = Preview(self) self.__previewWidget.setWindowFlags( Qt.WindowStaysOnTopHint | Qt.Tool) self.__previewWidget.setAttribute( Qt.WA_ShowWithoutActivating) self.__previewWidget.setFocusPolicy(Qt.NoFocus) self.__previewWidget.installEventFilter(self) return self.__previewWidget def __updatePreviewPixmap(self): current = self.__grid.currentItem() if isinstance(current, GraphicsThumbnailWidget) and \ current.parentItem() is self.__grid and \ self.__previewWidget is not None: self.__previewWidget.setPixmap(current.pixmap()) def __closePreview(self): if self.__previewWidget is not None: self.__previewWidget.close() self.__previewWidget.setPixmap(QPixmap()) self.__previewWidget.deleteLater() self.__previewWidget = None def eventFilter(self, receiver, event): if receiver is self.__previewWidget and \ event.type() == QEvent.KeyPress: if event.key() in [Qt.Key_Left, Qt.Key_Right, Qt.Key_Down, Qt.Key_Up]: self.__grid._moveCurrent(event.key()) event.accept() return True elif event.key() in [Qt.Key_Escape, Qt.Key_Space]: self.__closePreview() event.accept() return True return super().eventFilter(receiver, event) def hideEvent(self, event): super().hideEvent(event) self.__closePreview() def __onCurrentThumbnailChanged(self, thumbnail): if thumbnail is not None: self.__updatePreviewPixmap() else: self.__closePreview() @Slot(QPointF) def __ensureVisible(self, point): self.ensureVisible(QRectF(point, QSizeF(1, 1)), 5, 5),