/* Окно просмотра локального изображения: масштаб колесом, перенос мышью и fullscreen. * loadFile загружает изображение; closed сообщает владельцу о закрытии окна. */ #pragma once #include #include class QPushButton; class QLabel; class QTimer; class QPropertyAnimation; class QGraphicsOpacityEffect; class ImageViewerWindow : public QWidget { Q_OBJECT public: explicit ImageViewerWindow(QWidget *parent = nullptr); void loadFile(const QString& path); void loadImage(const QImage& image); void setPlaceholder(const QString& text) { m_placeholder = text; update(); } signals: void closed(); protected: void paintEvent(QPaintEvent *event) override; void wheelEvent(QWheelEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; void resizeEvent(QResizeEvent *event) override; private: void resetView(); void clampOffset(); void showOverlay(); void hideOverlay(); void fadeTo(QPropertyAnimation* anim, QGraphicsOpacityEffect* eff, int durMs, double target); QPixmap m_image; QString m_placeholder; double m_scale = 1.0; QPointF m_offset; /* смещение изображения в пикселях виджета */ bool m_dragging = false; QPointF m_dragStart; QPointF m_offsetStart; QPushButton* m_closeBtn = nullptr; QGraphicsOpacityEffect* m_closeEffect = nullptr; QPropertyAnimation* m_closeFade = nullptr; QLabel* m_hintLabel = nullptr; QGraphicsOpacityEffect* m_hintEffect = nullptr; QPropertyAnimation* m_hintFade = nullptr; QTimer* m_hideTimer = nullptr; };