diff --git a/QtScrcpy/device/ui/videoform.cpp b/QtScrcpy/device/ui/videoform.cpp index 3c5dae7..48877be 100644 --- a/QtScrcpy/device/ui/videoform.cpp +++ b/QtScrcpy/device/ui/videoform.cpp @@ -10,6 +10,7 @@ #include #include "videoform.h" +#include "qyuvopenglwidget.h" #include "mousetap/mousetap.h" #include "ui_videoform.h" #include "iconhelper.h" @@ -60,14 +61,17 @@ void VideoForm::initUI() } setMouseTracking(true); - ui->videoWidget->setMouseTracking(true); - ui->videoWidget->hide(); + m_videoWidget = new QYUVOpenGLWidget(); + m_videoWidget->setMouseTracking(true); + m_videoWidget->hide(); + ui->keepRadioWidget->setWidget(m_videoWidget); + ui->keepRadioWidget->setWidthHeightRadio(m_widthHeightRatio); } void VideoForm::onGrabCursor(bool grab) { #if defined(Q_OS_WIN32) || defined(Q_OS_OSX) - MouseTap::getInstance()->enableMouseEventTap(ui->videoWidget, grab); + MouseTap::getInstance()->enableMouseEventTap(m_videoWidget, grab); #else Q_UNUSED(grab) #endif @@ -75,16 +79,16 @@ void VideoForm::onGrabCursor(bool grab) void VideoForm::updateRender(const AVFrame *frame) { - if (ui->videoWidget->isHidden()) { + if (m_videoWidget->isHidden()) { if (m_loadingWidget) { m_loadingWidget->close(); } - ui->videoWidget->show(); + m_videoWidget->show(); } updateShowSize(QSize(frame->width, frame->height)); - ui->videoWidget->setFrameSize(QSize(frame->width, frame->height)); - ui->videoWidget->updateTextures(frame->data[0], frame->data[1], frame->data[2], + m_videoWidget->setFrameSize(QSize(frame->width, frame->height)); + m_videoWidget->updateTextures(frame->data[0], frame->data[1], frame->data[2], frame->linesize[0], frame->linesize[1], frame->linesize[2]); } @@ -145,9 +149,11 @@ void VideoForm::updateShowSize(const QSize &newSize) { if (m_frameSize != newSize) { m_frameSize = newSize; - m_widthHeightRatio = 1.0f * newSize.width() / newSize.height(); - bool vertical = m_widthHeightRatio < 1 ? true : false; + m_widthHeightRatio = 1.0f * newSize.width() / newSize.height(); + ui->keepRadioWidget->setWidthHeightRadio(m_widthHeightRatio); + + bool vertical = m_widthHeightRatio < 1.0f ? true : false; QSize showSize = newSize; QDesktopWidget* desktop = QApplication::desktop(); if (!desktop) { @@ -262,12 +268,12 @@ void VideoForm::setController(Controller *controller) void VideoForm::mousePressEvent(QMouseEvent *event) { - if (ui->videoWidget->geometry().contains(event->pos())) { + if (m_videoWidget->geometry().contains(event->pos())) { if (!m_controller) { return; } - event->setLocalPos(ui->videoWidget->mapFrom(this, event->localPos().toPoint())); - m_controller->mouseEvent(event, ui->videoWidget->frameSize(), ui->videoWidget->size()); + event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint())); + m_controller->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); } else { if (event->button() == Qt::LeftButton) { m_dragPosition = event->globalPos() - frameGeometry().topLeft(); @@ -282,23 +288,23 @@ void VideoForm::mouseReleaseEvent(QMouseEvent *event) if (!m_controller) { return; } - event->setLocalPos(ui->videoWidget->mapFrom(this, event->localPos().toPoint())); + event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint())); // local check QPointF local = event->localPos(); if (local.x() < 0) { local.setX(0); } - if (local.x() > ui->videoWidget->width()) { - local.setX(ui->videoWidget->width()); + if (local.x() > m_videoWidget->width()) { + local.setX(m_videoWidget->width()); } if (local.y() < 0) { local.setY(0); } - if (local.y() > ui->videoWidget->height()) { - local.setY(ui->videoWidget->height()); + if (local.y() > m_videoWidget->height()) { + local.setY(m_videoWidget->height()); } event->setLocalPos(local); - m_controller->mouseEvent(event, ui->videoWidget->frameSize(), ui->videoWidget->size()); + m_controller->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); } else { m_dragPosition = QPoint(0, 0); } @@ -306,12 +312,12 @@ void VideoForm::mouseReleaseEvent(QMouseEvent *event) void VideoForm::mouseMoveEvent(QMouseEvent *event) { - if (ui->videoWidget->geometry().contains(event->pos())) { + if (m_videoWidget->geometry().contains(event->pos())) { if (!m_controller) { return; } - event->setLocalPos(ui->videoWidget->mapFrom(this, event->localPos().toPoint())); - m_controller->mouseEvent(event, ui->videoWidget->frameSize(), ui->videoWidget->size()); + event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint())); + m_controller->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); } else if (!m_dragPosition.isNull()){ if (event->buttons() & Qt::LeftButton) { move(event->globalPos() - m_dragPosition); @@ -322,11 +328,11 @@ void VideoForm::mouseMoveEvent(QMouseEvent *event) void VideoForm::wheelEvent(QWheelEvent *event) { - if (ui->videoWidget->geometry().contains(event->pos())) { + if (m_videoWidget->geometry().contains(event->pos())) { if (!m_controller) { return; } - QPointF pos = ui->videoWidget->mapFrom(this, event->pos()); + QPointF pos = m_videoWidget->mapFrom(this, event->pos()); /* QWheelEvent(const QPointF &pos, const QPointF& globalPos, int delta, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, @@ -334,7 +340,7 @@ void VideoForm::wheelEvent(QWheelEvent *event) */ QWheelEvent wheelEvent(pos, event->globalPosF(), event->delta(), event->buttons(), event->modifiers(), event->orientation()); - m_controller->wheelEvent(&wheelEvent, ui->videoWidget->frameSize(), ui->videoWidget->size()); + m_controller->wheelEvent(&wheelEvent, m_videoWidget->frameSize(), m_videoWidget->size()); } } @@ -360,7 +366,7 @@ void VideoForm::keyPressEvent(QKeyEvent *event) return; } - m_controller->keyEvent(event, ui->videoWidget->frameSize(), ui->videoWidget->size()); + m_controller->keyEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); } void VideoForm::keyReleaseEvent(QKeyEvent *event) @@ -368,7 +374,7 @@ void VideoForm::keyReleaseEvent(QKeyEvent *event) if (!m_controller) { return; } - m_controller->keyEvent(event, ui->videoWidget->frameSize(), ui->videoWidget->size()); + m_controller->keyEvent(event, m_videoWidget->frameSize(), m_videoWidget->size()); } void VideoForm::paintEvent(QPaintEvent *paint) @@ -388,6 +394,32 @@ void VideoForm::showEvent(QShowEvent *event) } } +void VideoForm::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event) + QSize goodSize = ui->keepRadioWidget->goodSize(); + if (goodSize.isEmpty()) { + return; + } + QSize curSize = size(); + // 限制VideoForm尺寸不能小于keepRadioWidget good size + if (m_widthHeightRatio > 1.0f) { + // hor + if (curSize.height() <= goodSize.height()) { + setMinimumHeight(goodSize.height()); + } else { + setMinimumHeight(0); + } + } else { + // ver + if (curSize.width() <= goodSize.width()) { + setMinimumWidth(goodSize.width()); + } else { + setMinimumWidth(0); + } + } +} + void VideoForm::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); diff --git a/QtScrcpy/device/ui/videoform.h b/QtScrcpy/device/ui/videoform.h index 7e52eab..aaf598a 100644 --- a/QtScrcpy/device/ui/videoform.h +++ b/QtScrcpy/device/ui/videoform.h @@ -12,6 +12,7 @@ struct AVFrame; class ToolForm; class Controller; class FileHandler; +class QYUVOpenGLWidget; class VideoForm : public QWidget { Q_OBJECT @@ -53,6 +54,7 @@ protected: void paintEvent(QPaintEvent *); void showEvent(QShowEvent *event); + void resizeEvent(QResizeEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); @@ -64,6 +66,7 @@ private: Ui::videoForm *ui; QPointer m_toolForm; QPointer m_loadingWidget; + QPointer m_videoWidget; //inside member QSize m_frameSize; diff --git a/QtScrcpy/device/ui/videoform.ui b/QtScrcpy/device/ui/videoform.ui index e0e2230..6de4468 100644 --- a/QtScrcpy/device/ui/videoform.ui +++ b/QtScrcpy/device/ui/videoform.ui @@ -39,15 +39,15 @@ 0 - + - QYUVOpenGLWidget + KeepRadioWidget QWidget -
qyuvopenglwidget.h
+
keepradiowidget.h
1
diff --git a/QtScrcpy/uibase/keepradiowidget.cpp b/QtScrcpy/uibase/keepradiowidget.cpp new file mode 100644 index 0000000..6517b77 --- /dev/null +++ b/QtScrcpy/uibase/keepradiowidget.cpp @@ -0,0 +1,74 @@ +#include + +#include "keepradiowidget.h" + +KeepRadioWidget::KeepRadioWidget(QWidget *parent) : + QWidget(parent) +{ + +} + +KeepRadioWidget::~KeepRadioWidget() +{ + +} + +void KeepRadioWidget::setWidget(QWidget *w) +{ + if (!w) { + return; + } + w->setParent(this); + m_subWidget = w; +} + +void KeepRadioWidget::setWidthHeightRadio(float widthHeightRadio) +{ + if (fabs(m_widthHeightRadio - widthHeightRadio) < 0.000001f) { + return; + } + m_widthHeightRadio = widthHeightRadio; + adjustSubWidget(); +} + +const QSize KeepRadioWidget::goodSize() +{ + if (!m_subWidget || m_widthHeightRadio < 0.0f) { + return QSize(); + } + return m_subWidget->size(); +} + +void KeepRadioWidget::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event) + adjustSubWidget(); +} + +void KeepRadioWidget::adjustSubWidget() +{ + if (!m_subWidget) { + return; + } + + QSize curSize = size(); + QPoint pos(0, 0); + int width = 0; + int height = 0; + if (m_widthHeightRadio > 1.0f) { + // base width + width = curSize.width(); + height = curSize.width() / m_widthHeightRadio; + pos.setY((curSize.height() - height) / 2); + } else if (m_widthHeightRadio > 0.0f) { + // base height + height = curSize.height(); + width = curSize.height() * m_widthHeightRadio; + pos.setX((curSize.width() - width) / 2); + } else { + // full widget + height = curSize.height(); + width = curSize.width(); + } + m_subWidget->setGeometry(pos.x(), pos.y(), width, height); +} diff --git a/QtScrcpy/uibase/keepradiowidget.h b/QtScrcpy/uibase/keepradiowidget.h new file mode 100644 index 0000000..8baa992 --- /dev/null +++ b/QtScrcpy/uibase/keepradiowidget.h @@ -0,0 +1,29 @@ +#ifndef KEEPRADIOWIDGET_H +#define KEEPRADIOWIDGET_H + +#include +#include + +class KeepRadioWidget : public QWidget +{ + Q_OBJECT +public: + explicit KeepRadioWidget(QWidget *parent = nullptr); + ~KeepRadioWidget(); + + void setWidget(QWidget* w); + void setWidthHeightRadio(float widthHeightRadio); + const QSize goodSize(); + +protected: + void resizeEvent(QResizeEvent *event); + void adjustSubWidget(); + +private: + float m_widthHeightRadio = -1.0f; + QPointer m_subWidget; + QSize m_goodSize; + +}; + +#endif // KEEPRADIOWIDGET_H diff --git a/QtScrcpy/uibase/magneticwidget.cpp b/QtScrcpy/uibase/magneticwidget.cpp index 7a61b81..6fd29be 100644 --- a/QtScrcpy/uibase/magneticwidget.cpp +++ b/QtScrcpy/uibase/magneticwidget.cpp @@ -3,7 +3,6 @@ #include #include "magneticwidget.h" -#include "ui_magneticwidget.h" MagneticWidget::MagneticWidget(QWidget* adsorbWidget, AdsorbPositions adsorbPos) : QWidget(Q_NULLPTR) diff --git a/QtScrcpy/uibase/magneticwidget.ui b/QtScrcpy/uibase/magneticwidget.ui deleted file mode 100644 index 0b3e9eb..0000000 --- a/QtScrcpy/uibase/magneticwidget.ui +++ /dev/null @@ -1,19 +0,0 @@ - - - MagneticWidget - - - - 0 - 0 - 400 - 300 - - - - - - - - - diff --git a/QtScrcpy/uibase/uibase.pri b/QtScrcpy/uibase/uibase.pri index 75c0643..ae4858b 100644 --- a/QtScrcpy/uibase/uibase.pri +++ b/QtScrcpy/uibase/uibase.pri @@ -1,8 +1,9 @@ -FORMS += \ - $$PWD/magneticwidget.ui +FORMS += HEADERS += \ + $$PWD/keepradiowidget.h \ $$PWD/magneticwidget.h SOURCES += \ + $$PWD/keepradiowidget.cpp \ $$PWD/magneticwidget.cpp diff --git a/config/config.ini b/config/config.ini index cce9f9a..babf875 100644 --- a/config/config.ini +++ b/config/config.ini @@ -8,7 +8,7 @@ PushFilePath=/sdcard/ # 最大fps(仅支持Android 10以上) MaxFps=60 # 是否显示手机皮肤,0不显示 -UseSkin=1 +UseSkin=0 # 是否渲染过期视频帧(跳过过期视频帧意味着更低的延迟) RenderExpiredFrames=0 # 视频解码方式:-1 自动,0 软解,1 dx硬解,2 opengl硬解