From 4d889b34ed078f3e46357267448f0f022281524c Mon Sep 17 00:00:00 2001 From: reionwong Date: Fri, 30 Jul 2021 02:39:43 +0800 Subject: [PATCH] Improve the control dialog experience --- qml/ControlCenter.qml | 8 +++++--- qml/main.qml | 8 ++++---- src/controlcenterdialog.cpp | 39 ++++++++++++++++++++++++------------- src/controlcenterdialog.h | 11 ++++++----- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/qml/ControlCenter.qml b/qml/ControlCenter.qml index 5bbc6f6..175245e 100644 --- a/qml/ControlCenter.qml +++ b/qml/ControlCenter.qml @@ -31,9 +31,6 @@ import FishUI 1.0 as FishUI ControlCenterDialog { id: control - width: 450 - height: _mainLayout.implicitHeight + FishUI.Units.largeSpacing * 3 - property var margin: 4 * Screen.devicePixelRatio property point position: Qt.point(0, 0) @@ -52,6 +49,11 @@ ControlCenterDialog { LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true + onVisibleChanged: { + control.width = 450 + control.height = _mainLayout.implicitHeight + FishUI.Units.largeSpacing * 3 + } + Appearance { id: appearance } diff --git a/qml/main.qml b/qml/main.qml index 9916da8..c743c07 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -272,12 +272,12 @@ Item { function toggleDialog() { if (controlCenter.visible) - controlCenter.visible = false + controlCenter.close() else { // 先初始化,用户可能会通过Alt鼠标左键移动位置 controlCenter.position = Qt.point(0, 0) - controlCenter.visible = true controlCenter.position = mapToGlobal(0, 0) + controlCenter.open() } } @@ -380,8 +380,8 @@ Item { onActivatedChanged: { // TODO -// if (activated) -// acticity.move() + // if (activated) + // acticity.move() } onPressed: { diff --git a/src/controlcenterdialog.cpp b/src/controlcenterdialog.cpp index f879dd1..4b8f086 100644 --- a/src/controlcenterdialog.cpp +++ b/src/controlcenterdialog.cpp @@ -20,24 +20,37 @@ #include "controlcenterdialog.h" #include -ControlCenterDialog::ControlCenterDialog(QQuickView *parent) - : QQuickView(parent) +ControlCenterDialog::ControlCenterDialog(QQuickWindow *parent) + : QQuickWindow(parent) { - setFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); - - connect(this, &QQuickView::activeChanged, this, [=] { - if (!isActive()) - hide(); - }); + setFlags(Qt::Popup); + setColor(Qt::transparent); + installEventFilter(this); } -void ControlCenterDialog::showEvent(QShowEvent *event) +void ControlCenterDialog::open() { - KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher); - QQuickView::showEvent(event); + setVisible(true); + setMouseGrabEnabled(true); + setKeyboardGrabEnabled(true); } -void ControlCenterDialog::hideEvent(QHideEvent *event) +bool ControlCenterDialog::eventFilter(QObject *object, QEvent *event) { - QQuickView::hideEvent(event); + if (event->type() == QEvent::MouseButtonPress) { + if (QWindow *w = qobject_cast(object)) { + if (!w->geometry().contains(static_cast(event)->globalPos())) { + ControlCenterDialog::setVisible(false); + } + } + } else if (event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Escape) { + ControlCenterDialog::setVisible(false); + } + } else if (event->type() == QEvent::Show) { + KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher); + } + + return QObject::eventFilter(object, event); } diff --git a/src/controlcenterdialog.h b/src/controlcenterdialog.h index b456c7a..6ac82d7 100644 --- a/src/controlcenterdialog.h +++ b/src/controlcenterdialog.h @@ -20,19 +20,20 @@ #ifndef CONTROLCENTERDIALOG_H #define CONTROLCENTERDIALOG_H -#include +#include #include -class ControlCenterDialog : public QQuickView +class ControlCenterDialog : public QQuickWindow { Q_OBJECT public: - ControlCenterDialog(QQuickView *view = nullptr); + ControlCenterDialog(QQuickWindow *view = nullptr); + + Q_INVOKABLE void open(); protected: - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; + bool eventFilter(QObject *object, QEvent *event); }; #endif // CONTROLCENTERDIALOG_H