100 lines
2.9 KiB
C++
100 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <QWidget>
|
|
#include <QImage>
|
|
#include <QString>
|
|
#include <QPoint>
|
|
#include <QTimer>
|
|
|
|
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;
|
|
};
|