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 */