File indexing completed on 2024-06-16 04:16:15
0001 /* 0002 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net> 0003 * SPDX-FileCopyrightText: 2014 Sven Langkamp <sven.langkamp@gmail.com> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 0009 #ifndef OVERVIEWWIDGET_H 0010 #define OVERVIEWWIDGET_H 0011 #include <QObject> 0012 #include <QWidget> 0013 #include <QPixmap> 0014 #include <QPointer> 0015 0016 #include "KisWidgetWithIdleTask.h" 0017 0018 #include <kis_canvas2.h> 0019 0020 class KisSignalCompressor; 0021 class KoCanvasBase; 0022 0023 class OverviewWidget : public KisWidgetWithIdleTask<QWidget> 0024 { 0025 Q_OBJECT 0026 0027 public: 0028 OverviewWidget(QWidget * parent = 0); 0029 0030 ~OverviewWidget() override; 0031 0032 void setCanvas(KisCanvas2 *canvas) override; 0033 0034 inline bool isDragging() const 0035 { 0036 return m_dragging; 0037 } 0038 0039 public Q_SLOTS: 0040 void startUpdateCanvasProjection(); 0041 void updateThumbnail(QImage pixmap); 0042 void slotThemeChanged(); 0043 0044 Q_SIGNALS: 0045 void signalDraggingStarted(); 0046 void signalDraggingFinished(); 0047 0048 protected: 0049 void resizeEvent(QResizeEvent *event) override; 0050 void paintEvent(QPaintEvent *event) override; 0051 0052 void mousePressEvent(QMouseEvent* event) override; 0053 void mouseMoveEvent(QMouseEvent* event) override; 0054 void mouseReleaseEvent(QMouseEvent* event) override; 0055 void wheelEvent(QWheelEvent* event) override; 0056 0057 private: 0058 void recalculatePreviewDimensions(); 0059 KisIdleTasksManager::TaskGuard registerIdleTask(KisCanvas2 *canvas) override; 0060 void clearCachedState() override; 0061 /// 0062 /// \brief isPixelArt checks if the preview is bigger than the image itself 0063 /// 0064 /// We assume that if the preview is bigger than the image itself, 0065 /// (1) the image is very small, 0066 /// (might not be true if the docker is huge and the user is on 4k display...) 0067 /// (2) the image is pixel art, so they would like to see pixels. 0068 /// In that case we'd like to use a different algorithm (Nearest Neighbour, called "Box") 0069 /// in the OverviewThumbnailStrokeStrategy. 0070 /// \return 0071 /// 0072 bool isPixelArt(); 0073 0074 QPointF calculatePreviewOrigin(QSize previewSize); 0075 QTransform canvasToPreviewTransform(); 0076 QTransform previewToCanvasTransform(); 0077 QPolygonF previewPolygon(); 0078 0079 qreal m_previewScale {1.0}; 0080 QPixmap m_oldPixmap; 0081 QPixmap m_pixmap; 0082 0083 QPointF m_previewOrigin; // in the same coordinates space as m_previewSize 0084 QSize m_previewSize {QSize(100, 100)}; 0085 0086 bool m_dragging {false}; 0087 QPointF m_lastPos {QPointF(0, 0)}; 0088 0089 QColor m_outlineColor; 0090 }; 0091 0092 0093 0094 #endif /* OVERVIEWWIDGET_H */