From 871f46ced1d0033dbf928c5326b20d7b61cd69a1 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:32:49 +0100 Subject: [PATCH 1/3] Link against Qt DBus on Linux --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f784d0f..2ffd010 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,11 @@ option(SCRATCHCPP_PLAYER_BUILD_UNIT_TESTS "Build unit tests" ON) find_package(Qt6 6.6 COMPONENTS Quick QuickControls2 Widgets OpenGLWidgets REQUIRED) set(QT_LIBS Qt6::Quick Qt6::QuickControls2 Qt6::Widgets Qt6::OpenGLWidgets) +if (LINUX) + find_package(Qt6 6.6 COMPONENTS DBus REQUIRED) + set(QT_LIBS ${QT_LIBS} Qt6::DBus) +endif() + if (SCRATCHCPP_PLAYER_BUILD_UNIT_TESTS) set(GTEST_DIR thirdparty/googletest) add_subdirectory(${PROJECT_SOURCE_DIR}/${GTEST_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_DIR}) From e6534d60fd0614bf2526ca7ee5f3b0cfcd9f1bac Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:33:13 +0100 Subject: [PATCH 2/3] UiEngine: Add useNativeMenuBar() method --- src/ui/internal/uiengine.cpp | 25 +++++++++++++++++++++++++ src/ui/internal/uiengine.h | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/src/ui/internal/uiengine.cpp b/src/ui/internal/uiengine.cpp index 4ca1d0a..d4d3440 100644 --- a/src/ui/internal/uiengine.cpp +++ b/src/ui/internal/uiengine.cpp @@ -2,6 +2,10 @@ #include #include +#ifdef Q_OS_LINUX +#include +#include +#endif #include "uiengine.h" @@ -66,3 +70,24 @@ void UiEngine::setActiveFocusItem(QQuickItem *newActiveFocusItem) m_activeFocusItem = newActiveFocusItem; emit activeFocusItemChanged(); } + +bool UiEngine::useNativeMenuBar() const +{ +#if defined(Q_OS_MACOS) +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) + return true; +#else + // Since Qt 6.8, Qt Quick Controls menu bar is native + return false; +#endif +#elif defined(Q_OS_LINUX) + const QDBusConnection connection = QDBusConnection::sessionBus(); + static const QString registrarService = QStringLiteral("com.canonical.AppMenu.Registrar"); + if (const auto iface = connection.interface()) + return iface->isServiceRegistered(registrarService); + else + return false; +#else + return false; +#endif +} diff --git a/src/ui/internal/uiengine.h b/src/ui/internal/uiengine.h index 3d01231..f0d2389 100644 --- a/src/ui/internal/uiengine.h +++ b/src/ui/internal/uiengine.h @@ -19,6 +19,7 @@ class UiEngine { Q_OBJECT Q_PROPERTY(QQuickItem *activeFocusItem READ activeFocusItem WRITE setActiveFocusItem NOTIFY activeFocusItemChanged) + Q_PROPERTY(bool useNativeMenuBar READ useNativeMenuBar NOTIFY useNativeMenuBarChanged FINAL) public: explicit UiEngine(QObject *parent = nullptr); @@ -34,8 +35,11 @@ class UiEngine QQuickItem *activeFocusItem() const; void setActiveFocusItem(QQuickItem *newActiveFocusItem); + bool useNativeMenuBar() const; + signals: void activeFocusItemChanged(); + void useNativeMenuBarChanged(); private: static std::shared_ptr m_instance; From f5f0a80cc6f6a494f3c8edece52b4f564015cfa8 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:33:40 +0100 Subject: [PATCH 3/3] CustomMenuBar: Enable native menu bar code --- src/uicomponents/CustomMenuBar.qml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/uicomponents/CustomMenuBar.qml b/src/uicomponents/CustomMenuBar.qml index a495f24..3a789e1 100644 --- a/src/uicomponents/CustomMenuBar.qml +++ b/src/uicomponents/CustomMenuBar.qml @@ -2,6 +2,7 @@ import QtQuick import QtQuick.Controls +import Qt.labs.platform as Platform import ScratchCPP.Ui import ScratchCPP.UiComponents @@ -22,8 +23,7 @@ MenuBar { } function getComponentString(typeName) { - //var imports = "import QtQuick; import QtQuick.Controls; import Qt.labs.platform as Platform;" - var imports = "import QtQuick; import QtQuick.Controls;" + var imports = "import QtQuick; import QtQuick.Controls; import Qt.labs.platform as Platform;" return imports + " " + typeName + " {}"; } @@ -103,11 +103,11 @@ MenuBar { } function reload() { - /*if(nativeMenuBarEnabled) + if(UiEngine.useNativeMenuBar) { root.visible = false; return; - }*/ + } var oldObjects = []; @@ -132,14 +132,14 @@ MenuBar { Component.onCompleted: reload(); - /*onEnabledChanged: { + onEnabledChanged: { if(platformMenuBarLoader.active) platformMenuBarLoader.item.reload(); } Loader { id: platformMenuBarLoader - active: // whether the native menu bar is active + active: UiEngine.useNativeMenuBar sourceComponent: Platform.MenuBar { id: platformMenuBar @@ -149,14 +149,14 @@ MenuBar { createMenuBar(platformMenuBar, "Platform.Menu", "Platform.MenuItem", "Platform.MenuSeparator"); } - Connections { - target: QmlUtils + /*Connections { + target: // TODO: Add a class for the menu bar reload signal function onMenuBarReloadTriggered() { platformMenuBar.reload(); } - } + }*/ Component.onCompleted: reload(); } - }*/ + } }