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: