File indexing completed on 2024-04-28 15:39:45

0001 // SPDX-FileCopyrightText: 2003-2010 Jesper K. Pedersen <blackie@kde.org>
0002 // SPDX-FileCopyrightText: 2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 #ifndef IMAGEPREVIEW_H
0007 #define IMAGEPREVIEW_H
0008 #include <DB/ImageInfo.h>
0009 #include <ImageManager/ImageClientInterface.h>
0010 
0011 #include <QLabel>
0012 #include <QTimer>
0013 
0014 class QResizeEvent;
0015 class QRubberBand;
0016 
0017 namespace AnnotationDialog
0018 {
0019 class ResizableFrame;
0020 
0021 class ImagePreview : public QLabel, public ImageManager::ImageClientInterface
0022 {
0023     Q_OBJECT
0024 public:
0025     explicit ImagePreview(QWidget *parent);
0026     int heightForWidth(int width) const override;
0027     QSize sizeHint() const override;
0028     void rotate(int angle);
0029     void setImage(const DB::ImageInfo &info);
0030     void setImage(const QString &fileName);
0031     int angle() const;
0032     void anticipate(DB::ImageInfo &info1);
0033     void pixmapLoaded(ImageManager::ImageRequest *request, const QImage &image) override;
0034     QRect areaPreviewToActual(QRect area) const;
0035     QRect minMaxAreaPreview() const;
0036     void createTaggedArea(QString category, QString tag, QRect geometry, bool showArea);
0037     QSize getActualImageSize();
0038     void acceptProposedTag(QPair<QString, QString> tagData, ResizableFrame *area);
0039     QPixmap grabAreaImage(QRect area);
0040 
0041 public Q_SLOTS:
0042     void setAreaCreationEnabled(bool state);
0043 
0044 Q_SIGNALS:
0045     void areaCreated(ResizableFrame *area);
0046     void proposedTagSelected(QString category, QString tag);
0047 
0048 protected:
0049     void resizeEvent(QResizeEvent *) override;
0050     void mousePressEvent(QMouseEvent *event) override;
0051     void mouseMoveEvent(QMouseEvent *event) override;
0052     void mouseReleaseEvent(QMouseEvent *event) override;
0053     void reload();
0054     void setCurrentImage(const QImage &image);
0055     QImage rotateAndScale(QImage, int width, int height, int angle) const;
0056     void updateScaleFactors();
0057 
0058     QRect areaActualToPreview(QRect area) const;
0059     void processNewArea();
0060     void remapAreas();
0061     void rotateAreas(int angle);
0062 
0063     class PreviewImage
0064     {
0065     public:
0066         bool has(const DB::FileName &fileName, int angle) const;
0067         QImage &getImage();
0068         void set(const DB::FileName &fileName, const QImage &image, int angle);
0069         void set(const PreviewImage &other);
0070         void setAngle(int angle);
0071         void reset();
0072 
0073     protected:
0074         DB::FileName m_fileName;
0075         QImage m_image;
0076         int m_angle;
0077     };
0078 
0079     struct PreloadInfo {
0080         PreloadInfo();
0081         void set(const DB::FileName &fileName, int angle);
0082         DB::FileName m_fileName;
0083         int m_angle;
0084     };
0085 
0086     class PreviewLoader : public ImageManager::ImageClientInterface, public PreviewImage
0087     {
0088     public:
0089         void preloadImage(const DB::FileName &fileName, int width, int height, int angle);
0090         void cancelPreload();
0091         void pixmapLoaded(ImageManager::ImageRequest *request, const QImage &image) override;
0092     };
0093     PreviewLoader m_preloader;
0094 
0095 protected Q_SLOTS:
0096     void resizeFinished();
0097 
0098 private:
0099     DB::ImageInfo m_info;
0100     QString m_fileName;
0101     PreviewImage m_currentImage, m_lastImage;
0102     PreloadInfo m_anticipated;
0103     int m_angle = 0;
0104     int m_minX = 0;
0105     int m_maxX = 0;
0106     int m_minY = 0;
0107     int m_maxY = 0;
0108     QPoint m_areaStart;
0109     QPoint m_areaEnd;
0110     QPoint m_currentPos;
0111     QRubberBand *m_selectionRect = nullptr;
0112     double m_scaleWidth = 0;
0113     double m_scaleHeight = 0;
0114     double m_aspectRatio = 1;
0115     QTimer *m_reloadTimer = nullptr;
0116     bool m_areaCreationEnabled = false;
0117     QImage m_fullSizeImage;
0118 
0119     void createNewArea(QRect geometry, QRect actualGeometry);
0120     QRect rotateArea(QRect originalAreaGeometry, int angle);
0121     void fetchFullSizeImage();
0122     bool fuzzyAreaExists(QList<QRect> &existingAreas, QRect area);
0123     float distance(QPoint point1, QPoint point2);
0124 };
0125 }
0126 
0127 #endif /* IMAGEPREVIEW_H */
0128 
0129 // vi:expandtab:tabstop=4 shiftwidth=4: