Skip to content

Commit

Permalink
Merge pull request #96 from barry-ran/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
barry-ran authored Mar 1, 2020
2 parents 9a67a57 + 5aeb9c1 commit 8ac5de9
Show file tree
Hide file tree
Showing 14 changed files with 227 additions and 92 deletions.
2 changes: 1 addition & 1 deletion QtScrcpy/QtScrcpy.pro
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ INCLUDEPATH += \
# 统一版本号入口,只修改这一个地方即可
VERSION_MAJOR = 1
VERSION_MINOR = 2
VERSION_PATCH = 0
VERSION_PATCH = 1

# qmake变量的方式定义版本号
VERSION = $${VERSION_MAJOR}.$${VERSION_MINOR}.$${VERSION_PATCH}
Expand Down
1 change: 0 additions & 1 deletion QtScrcpy/device/device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,6 @@ void Device::initSignals()
// update ui
if (m_videoForm) {
m_videoForm->setWindowTitle(deviceName);
m_videoForm->updateScreenRatio(size);
m_videoForm->updateShowSize(size);
}

Expand Down
160 changes: 105 additions & 55 deletions QtScrcpy/device/ui/videoform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <QMessageBox>

#include "videoform.h"
#include "qyuvopenglwidget.h"
#include "mousetap/mousetap.h"
#include "ui_videoform.h"
#include "iconhelper.h"
Expand Down Expand Up @@ -59,32 +60,37 @@ void VideoForm::initUI()
#endif
}

m_videoWidget = new QYUVOpenGLWidget();
m_videoWidget->hide();
ui->keepRadioWidget->setWidget(m_videoWidget);
ui->keepRadioWidget->setWidthHeightRadio(m_widthHeightRatio);

setMouseTracking(true);
ui->videoWidget->setMouseTracking(true);
ui->videoWidget->hide();
m_videoWidget->setMouseTracking(true);
ui->keepRadioWidget->setMouseTracking(true);
}

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
}

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]);
}

Expand All @@ -98,6 +104,18 @@ void VideoForm::showToolForm(bool show)
m_toolForm->setVisible(show);
}

void VideoForm::moveCenter()
{
QDesktopWidget* desktop = QApplication::desktop();
if (!desktop) {
qWarning() << "QApplication::desktop() is nullptr";
return;
}
QRect screenRect = desktop->availableGeometry();
// 窗口居中
move(screenRect.center() - QRect(0, 0, size().width(), size().height()).center());
}

void VideoForm::updateStyleSheet(bool vertical)
{
if (vertical) {
Expand Down Expand Up @@ -129,60 +147,60 @@ QMargins VideoForm::getMargins(bool vertical)
return margins;
}

void VideoForm::updateScreenRatio(const QSize &newSize)
{
m_widthHeightRatio = 1.0f * qMin(newSize.width(),newSize.height()) / qMax(newSize.width(),newSize.height());
}

void VideoForm::updateShowSize(const QSize &newSize)
{
if (m_frameSize != newSize) {
m_frameSize = newSize;
bool vertical = newSize.height() > newSize.width();
QSize showSize = newSize;
QDesktopWidget* desktop = QApplication::desktop();
if (desktop) {
QRect screenRect = desktop->availableGeometry();
if (vertical) {
showSize.setHeight(qMin(newSize.height(), screenRect.height() - 200));
showSize.setWidth(showSize.height() * m_widthHeightRatio);
} else {
showSize.setWidth(qMin(newSize.width(), screenRect.width()/2));
showSize.setHeight(showSize.width() * m_widthHeightRatio);
}

if (isFullScreen()) {
switchFullScreen();
}
if (m_skin) {
QMargins m = getMargins(vertical);
showSize.setWidth(showSize.width() + m.left() + m.right());
showSize.setHeight(showSize.height() + m.top() + m.bottom());
}
m_widthHeightRatio = 1.0f * newSize.width() / newSize.height();
ui->keepRadioWidget->setWidthHeightRadio(m_widthHeightRatio);

// 窗口居中
move(screenRect.center() - QRect(0, 0, showSize.width(), showSize.height()).center());
bool vertical = m_widthHeightRatio < 1.0f ? true : false;
QSize showSize = newSize;
QDesktopWidget* desktop = QApplication::desktop();
if (!desktop) {
qWarning() << "QApplication::desktop() is nullptr";
return;
}
QRect screenRect = desktop->availableGeometry();
if (vertical) {
showSize.setHeight(qMin(newSize.height(), screenRect.height() - 200));
showSize.setWidth(showSize.height() * m_widthHeightRatio);
} else {
showSize.setWidth(qMin(newSize.width(), screenRect.width()/2));
showSize.setHeight(showSize.width() / m_widthHeightRatio);
}

if (!m_skin) {
// 减去标题栏高度
int titleBarHeight = style()->pixelMetric(QStyle::PM_TitleBarHeight);
showSize.setHeight(showSize.height() - titleBarHeight);
if (isFullScreen()) {
switchFullScreen();
}
if (m_skin) {
QMargins m = getMargins(vertical);
showSize.setWidth(showSize.width() + m.left() + m.right());
showSize.setHeight(showSize.height() + m.top() + m.bottom());
}

if (showSize != size()) {
resize(showSize);
if (m_skin) {
updateStyleSheet(vertical);
}
moveCenter();
}
}
}

void VideoForm::switchFullScreen()
{
if (isFullScreen()) {
// 横屏全屏铺满全屏,恢复时,恢复保持宽高比
if (m_widthHeightRatio > 1.0f) {
ui->keepRadioWidget->setWidthHeightRadio(m_widthHeightRatio);
}

showNormal();
// fullscreen window will move (0,0). qt bug?
move(m_fullScreenBeforePos);

#ifdef Q_OS_OSX
//setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
Expand All @@ -196,6 +214,12 @@ void VideoForm::switchFullScreen()
::SetThreadExecutionState(ES_CONTINUOUS);
#endif
} else {
// 横屏全屏铺满全屏,不保持宽高比
if (m_widthHeightRatio > 1.0f) {
ui->keepRadioWidget->setWidthHeightRadio(-1.0f);
}

m_fullScreenBeforePos = pos();
// 这种临时增加标题栏再全屏的方案会导致收不到mousemove事件,导致setmousetrack失效
// mac fullscreen must show title bar
#ifdef Q_OS_OSX
Expand Down Expand Up @@ -256,12 +280,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();
Expand All @@ -276,36 +300,36 @@ 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);
}
}

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);
Expand All @@ -316,19 +340,19 @@ 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,
Qt::Orientation orient = Qt::Vertical);
*/
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());
}
}

Expand All @@ -354,15 +378,15 @@ 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)
{
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)
Expand All @@ -382,6 +406,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();
Expand Down
6 changes: 5 additions & 1 deletion QtScrcpy/device/ui/videoform.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ struct AVFrame;
class ToolForm;
class Controller;
class FileHandler;
class QYUVOpenGLWidget;
class VideoForm : public QWidget
{
Q_OBJECT
Expand All @@ -21,7 +22,6 @@ class VideoForm : public QWidget

void switchFullScreen();
void staysOnTop(bool top = true);
void updateScreenRatio(const QSize &newSize);
void updateShowSize(const QSize &newSize);
void updateRender(const AVFrame *frame);
void setController(Controller *controller);
Expand All @@ -42,6 +42,7 @@ public slots:
void initUI();

void showToolForm(bool show = true);
void moveCenter();

protected:
void mousePressEvent(QMouseEvent *event);
Expand All @@ -53,6 +54,7 @@ public slots:

void paintEvent(QPaintEvent *);
void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event);

void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
Expand All @@ -64,12 +66,14 @@ public slots:
Ui::videoForm *ui;
QPointer<ToolForm> m_toolForm;
QPointer<QWidget> m_loadingWidget;
QPointer<QYUVOpenGLWidget> m_videoWidget;

//inside member
QSize m_frameSize;
QPoint m_dragPosition;
float m_widthHeightRatio = 0.5f;
bool m_skin = true;
QPoint m_fullScreenBeforePos;

//outside member
QString m_serial = "";
Expand Down
6 changes: 3 additions & 3 deletions QtScrcpy/device/ui/videoform.ui
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@
<number>0</number>
</property>
<item>
<widget class="QYUVOpenGLWidget" name="videoWidget" native="true"/>
<widget class="KeepRadioWidget" name="keepRadioWidget" native="true"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QYUVOpenGLWidget</class>
<class>KeepRadioWidget</class>
<extends>QWidget</extends>
<header>qyuvopenglwidget.h</header>
<header location="global">keepradiowidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
Expand Down
Loading

0 comments on commit 8ac5de9

Please sign in to comment.