#pragma once #include #include #include #include #include class QSlider; class QPushButton; class QLabel; class VideoPlayerEngine; /* Виджет отрисовки кадра (aspect-fit на чёрном фоне). */ class VideoRenderWidget : public QWidget { Q_OBJECT public: explicit VideoRenderWidget(QWidget* parent = nullptr); void setFrame(const QImage& img); void clearFrame(); protected: void paintEvent(QPaintEvent* event) override; private: QImage m_frame; }; /* Отдельное окно плеера без рамки: drag-перенос, dblclick/Alt+Enter — fullscreen, * Esc — выход/закрытие, timeline + play/pause/close. */ class VideoPlayerWindow : public QWidget { Q_OBJECT public: explicit VideoPlayerWindow(QWidget* parent = nullptr); ~VideoPlayerWindow() override; void playFile(const QString& path); signals: void closed(); protected: void keyPressEvent(QKeyEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void mouseDoubleClickEvent(QMouseEvent* event) override; void closeEvent(QCloseEvent* event) override; void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override; private slots: void onEngineOpened(int width, int height, qint64 durationMs, bool hasAudio); void onPositionChanged(qint64 ms); void onStateChanged(int state); void onError(const QString& msg); void onFramePresented(); void onSliderPressed(); void onSliderReleased(); void onPlayPause(); void onClose(); void onFinished(); void showControls(); void hideControls(); private: enum ResizeMode { ResizeNone = 0, ResizeLeft, ResizeRight, ResizeTop, ResizeBottom, ResizeTopLeft, ResizeTopRight, ResizeBottomLeft, ResizeBottomRight }; void toggleFullscreen(); void updateTimeLabels(qint64 posMs); void setControlsVisible(bool visible); QSize fitWindowSize(int vw, int vh) const; ResizeMode hitTestResize(const QPoint& localPos) const; void updateResizeCursor(const QPoint& localPos); void applyResize(const QPoint& globalPos); void beginResize(ResizeMode m, const QPoint& globalPos); VideoRenderWidget* m_render = nullptr; QWidget* m_controls = nullptr; QSlider* m_slider = nullptr; QPushButton* m_playBtn = nullptr; QPushButton* m_closeBtn = nullptr; QLabel* m_timeLabel = nullptr; VideoPlayerEngine* m_engine = nullptr; bool m_fullscreen = false; bool m_sliderDragging = false; bool m_dragging = false; QPoint m_dragStart; QPoint m_windowStart; ResizeMode m_resizeMode = ResizeNone; QRect m_resizeStartGeom; QPoint m_resizeStartGlobal; QTimer* m_hideTimer = nullptr; };