From db3c8c76010974f3a618270ceef493c45ea1561c Mon Sep 17 00:00:00 2001 From: hewenfei Date: Wed, 8 Feb 2023 10:58:51 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BD=BF=E7=94=A8Quickview=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?Quickwindow=EF=BC=8C2.=E5=AE=8C=E6=88=90=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E8=A1=8C=E6=8E=A5=E5=8F=A3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qml/MenuMainWindow.qml | 41 ++++++++++++++ qml/main.qml | 18 +----- qml/qml.qrc | 1 + src/ukui-menu-application.cpp | 79 +++++++++++++++++--------- src/ukui-menu-application.h | 10 +++- src/windows/menu-main-window.cpp | 97 ++++++++++++++++++++++++++++++++ src/windows/menu-main-window.h | 35 ++++++++++++ 7 files changed, 235 insertions(+), 46 deletions(-) create mode 100644 qml/MenuMainWindow.qml diff --git a/qml/MenuMainWindow.qml b/qml/MenuMainWindow.qml new file mode 100644 index 0000000..c9b2ec6 --- /dev/null +++ b/qml/MenuMainWindow.qml @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2023, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +import QtQuick 2.12 +import org.ukui.menu.core 1.0 + +import AppUI 1.0 as AppUI + +MenuMainWindow { + id: mainWindow + visible: true + + Component.onCompleted: { + console.log("MenuMainWindow Completed."); + } + + onIsFullScreenChanged: { + console.log("full screen", isFullScreen) + //loader.source = isFullScreen ? "qrc:/qml/FullScreenUI.qml" : "qrc:/qml/NormalUI.qml"; + } + + AppUI.NormalUI { + parent: mainWindow.contentItem + anchors.fill: parent + } +} diff --git a/qml/main.qml b/qml/main.qml index d383f54..f65dcd7 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022, KylinSoft Co., Ltd. + * Copyright (C) 2023, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,25 +17,11 @@ */ import QtQuick 2.12 -import org.ukui.menu.core 1.0 import AppUI 1.0 as AppUI -MenuMainWindow { - id: mainWindow - visible: true - - Component.onCompleted: { - console.log("MenuMainWindow Completed."); - } - - onIsFullScreenChanged: { - console.log("full screen", isFullScreen) - //loader.source = isFullScreen ? "qrc:/qml/FullScreenUI.qml" : "qrc:/qml/NormalUI.qml"; - } - +Item { AppUI.NormalUI { - parent: mainWindow.contentItem anchors.fill: parent } } diff --git a/qml/qml.qrc b/qml/qml.qrc index 51b51d4..4ae3cd6 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -1,6 +1,7 @@ main.qml + MenuMainWindow.qml org/ukui/menu/extension/qmldir org/ukui/menu/extension/UkuiMenuExtension.qml AppUI/qmldir diff --git a/src/ukui-menu-application.cpp b/src/ukui-menu-application.cpp index fdcd789..f1cba61 100644 --- a/src/ukui-menu-application.cpp +++ b/src/ukui-menu-application.cpp @@ -44,6 +44,7 @@ UkuiMenuApplication::UkuiMenuApplication(MenuMessageProcessor *processor) : QObj void UkuiMenuApplication::startUkuiMenu() { initQmlEngine(); + loadMenuUI(); } void UkuiMenuApplication::registerQmlTypes() @@ -65,28 +66,36 @@ void UkuiMenuApplication::registerQmlTypes() } void UkuiMenuApplication::initQmlEngine() +{ + m_engine = new QQmlEngine(this); + m_engine->addImportPath("qrc:/qml"); + m_engine->addImageProvider("appicon", new AppIconProvider()); + + QQmlContext *context = m_engine->rootContext(); + context->setContextProperty("colorHelper", ColorHelper::instance()); + context->setContextProperty("themePalette", ThemePalette::getInstance()); + context->setContextProperty("menuSetting", MenuSetting::instance()); + context->setContextProperty("modelManager", new ModelManager(this)); + context->setContextProperty("extensionManager", MenuExtension::instance()); + + // MenuMainWindow +// const QUrl url(QStringLiteral("qrc:/qml/MenuMainWindow.qml")); +// QQmlApplicationEngine *m_applicationEngine{nullptr}; +// m_applicationEngine = new QQmlApplicationEngine(this); +// QObject::connect(m_applicationEngine, &QQmlApplicationEngine::objectCreated, +// this, [url](QObject *obj, const QUrl &objUrl) { +// if (!obj && url == objUrl) +// QCoreApplication::exit(-1); +// }, Qt::QueuedConnection); +// +// m_applicationEngine->load(url); +} + +void UkuiMenuApplication::loadMenuUI() { const QUrl url(QStringLiteral("qrc:/qml/main.qml")); - m_applicationEngine = new QQmlApplicationEngine(this); - - m_applicationEngine->addImportPath("qrc:/qml"); - - // icon provider - m_applicationEngine->addImageProvider("appicon", new AppIconProvider()); - - m_applicationEngine->rootContext()->setContextProperty("colorHelper", ColorHelper::instance()); - m_applicationEngine->rootContext()->setContextProperty("themePalette", ThemePalette::getInstance()); - m_applicationEngine->rootContext()->setContextProperty("menuSetting", MenuSetting::instance()); - m_applicationEngine->rootContext()->setContextProperty("modelManager", new ModelManager(this)); - m_applicationEngine->rootContext()->setContextProperty("extensionManager", MenuExtension::instance()); - - QObject::connect(m_applicationEngine, &QQmlApplicationEngine::objectCreated, - this, [url](QObject *obj, const QUrl &objUrl) { - if (!obj && url == objUrl) - QCoreApplication::exit(-1); - }, Qt::QueuedConnection); - - m_applicationEngine->load(url); + m_mainWindow = new MenuWindow(m_engine, nullptr); + m_mainWindow->setSource(url); } void UkuiMenuApplication::initDbusService() @@ -105,22 +114,38 @@ void UkuiMenuApplication::initDbusService() void UkuiMenuApplication::execCommand(Command command) { switch (command) { - case Active: - qDebug() << "=Active=>>" << Active; + case Active: { + if (m_mainWindow) { + m_mainWindow->setVisible(!m_mainWindow->isVisible()); + } break; - case Show: - qDebug() << "=Show=>>" << Show; + } + case Show: { + if (m_mainWindow) { + m_mainWindow->setVisible(true); + } break; - case Quit: - qDebug() << "=Quit=>>" << Quit; - m_applicationEngine->quit(); + } + case Quit: { + if (m_mainWindow) { + m_mainWindow->setVisible(false); + m_engine->quit(); + } QCoreApplication::quit(); break; + } default: break; } } +UkuiMenuApplication::~UkuiMenuApplication() +{ + if (m_mainWindow) { + m_mainWindow->deleteLater(); + } +} + // == MenuMessageProcessor == // MenuMessageProcessor::MenuMessageProcessor() : QObject(nullptr) {} diff --git a/src/ukui-menu-application.h b/src/ukui-menu-application.h index ed037a5..d20c6fe 100644 --- a/src/ukui-menu-application.h +++ b/src/ukui-menu-application.h @@ -20,11 +20,12 @@ #define UKUI_MENU_UKUI_MENU_APPLICATION_H #include "menu-dbus-service.h" -#include +#include namespace UkuiMenu { class MenuMessageProcessor; +class MenuWindow; class UkuiMenuApplication : public QObject { @@ -36,6 +37,7 @@ public: Quit }; explicit UkuiMenuApplication(MenuMessageProcessor *processor); + ~UkuiMenuApplication() override; UkuiMenuApplication() = delete; UkuiMenuApplication(const UkuiMenuApplication& obj) = delete; UkuiMenuApplication(const UkuiMenuApplication&& obj) = delete; @@ -47,13 +49,15 @@ private: static void registerQmlTypes(); void startUkuiMenu(); void initQmlEngine(); + void loadMenuUI(); //注册dubs void initDbusService(); private: - QQmlApplicationEngine *m_applicationEngine{nullptr}; - MenuDbusService *m_menuDbusService = nullptr; + QQmlEngine *m_engine{nullptr}; + MenuWindow *m_mainWindow{nullptr}; + MenuDbusService *m_menuDbusService{nullptr}; }; class MenuMessageProcessor : public QObject diff --git a/src/windows/menu-main-window.cpp b/src/windows/menu-main-window.cpp index dca4e0c..3e3e4ed 100644 --- a/src/windows/menu-main-window.cpp +++ b/src/windows/menu-main-window.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -89,6 +90,7 @@ void WindowHelper::setWindowAttribute(QWindow *window) } } +//======MenuMainWindow======// MenuMainWindow::MenuMainWindow(QWindow *parent) : QQuickWindow(parent), m_geometryHelper(new WindowGeometryHelper(this)) { init(); @@ -314,4 +316,99 @@ const QRect &WindowGeometryHelper::normalGeometry() return m_normalGeometry; } +//======MenuWindow======// +MenuWindow::MenuWindow(QWindow *parent) : QQuickView(parent), m_geometryHelper(new WindowGeometryHelper(this)) +{ + init(); +} + +MenuWindow::MenuWindow(QQmlEngine *engine, QWindow *parent) + : QQuickView(engine, parent), m_geometryHelper(new WindowGeometryHelper(this)) +{ + init(); +} + +void MenuWindow::init() +{ + setTitle(QCoreApplication::applicationName()); + setResizeMode(SizeRootObjectToView); + setColor("transparent"); + + // TODO 使用窗管接口设置无边框 + setFlags(Qt::FramelessWindowHint); + WindowHelper::setWindowAttribute(this); + + // 访问窗口api + rootContext()->setContextProperty("mainWindow", this); + connect(this, &QQuickView::activeFocusItemChanged, this, &MenuWindow::onActiveFocusItemChanged); +} + +void MenuWindow::updateGeometry() +{ + QRect rect = m_isFullScreen ? m_geometryHelper->fullScreenGeometry() : m_geometryHelper->normalGeometry(); + if (rect == geometry()) { + return; + } + + WindowHelper::setWindowGeometry(this, rect); +} + +bool MenuWindow::isFullScreen() const +{ + return m_isFullScreen; +} + +void MenuWindow::setFullScreen(bool isFullScreen) +{ + if (m_isFullScreen == isFullScreen) { + return; + } + + m_isFullScreen = isFullScreen; + QEvent event(QEvent::Resize); + QCoreApplication::sendEvent(this, &event); + + Q_EMIT fullScreenChanged(); +} + +void MenuWindow::exposeEvent(QExposeEvent *event) +{ + QQuickWindow::exposeEvent(event); +} + +void MenuWindow::resizeEvent(QResizeEvent *event) +{ + updateGeometry(); + QQuickView::resizeEvent(event); +} + +void MenuWindow::showEvent(QShowEvent *event) +{ + QQuickWindow::showEvent(event); +} + +void MenuWindow::focusOutEvent(QFocusEvent *event) +{ + //setVisible(false); + QQuickWindow::focusOutEvent(event); +} + +bool MenuWindow::event(QEvent *event) +{ + if (event->type() == QEvent::Move) { + updateGeometry(); + return true; + } + return QQuickView::event(event); +} + +void MenuWindow::onActiveFocusItemChanged() +{ + if (activeFocusItem()) { + return; + } + + setVisible(false); +} + } // UkuiMenu diff --git a/src/windows/menu-main-window.h b/src/windows/menu-main-window.h index 57dc094..c45a72f 100644 --- a/src/windows/menu-main-window.h +++ b/src/windows/menu-main-window.h @@ -22,6 +22,7 @@ #include #include #include +#include #include namespace UkuiMenu { @@ -98,6 +99,40 @@ private: WindowGeometryHelper *m_geometryHelper{nullptr}; }; +class MenuWindow : public QQuickView +{ + Q_OBJECT + Q_PROPERTY(bool isFullScreen READ isFullScreen WRITE setFullScreen NOTIFY fullScreenChanged) + +public: + explicit MenuWindow(QWindow *parent = nullptr); + MenuWindow(QQmlEngine* engine, QWindow *parent); + + bool isFullScreen() const; + void setFullScreen(bool isFullScreen); + +Q_SIGNALS: + void fullScreenChanged(); + +private Q_SLOTS: + void onActiveFocusItemChanged(); + +protected: + void exposeEvent(QExposeEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void showEvent(QShowEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; + bool event(QEvent *event) override; + +private: + void init(); + void updateGeometry(); + +private: + bool m_isFullScreen{false}; + WindowGeometryHelper *m_geometryHelper{nullptr}; +}; + } // UkuiMenu #endif //UKUI_MENU_MENU_MAIN_WINDOW_H