From 07091f0c4279bd9d9564a7e6e381a0d6c40a7fd3 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:36:23 +0100 Subject: [PATCH 1/8] Add turbo mode icon --- res/icons/CMakeLists.txt | 3 ++- res/icons/turbo.svg | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 res/icons/turbo.svg diff --git a/res/icons/CMakeLists.txt b/res/icons/CMakeLists.txt index 48add58..b9e1f5a 100644 --- a/res/icons/CMakeLists.txt +++ b/res/icons/CMakeLists.txt @@ -10,5 +10,6 @@ qt_add_resources( PREFIX "/icons/scratchcpp/32x32" FILES green_flag.svg - stop.svg + stop.svg + turbo.svg ) diff --git a/res/icons/turbo.svg b/res/icons/turbo.svg new file mode 100644 index 0000000..64fd166 --- /dev/null +++ b/res/icons/turbo.svg @@ -0,0 +1,12 @@ + + + + turbo-bolt-icon + Created with Sketch. + + + + + + + \ No newline at end of file From 1c887264861a6bc0c814ba71216d87e75ff65bba Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:36:58 +0100 Subject: [PATCH 2/8] Add turbo mode menu option --- src/app/appmenubar.cpp | 29 ++++++++++++++++++++++++++++- src/app/appmenubar.h | 10 ++++++++++ src/app/main.qml | 18 ++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/app/appmenubar.cpp b/src/app/appmenubar.cpp index 9cedf46..e5a8e98 100644 --- a/src/app/appmenubar.cpp +++ b/src/app/appmenubar.cpp @@ -21,7 +21,7 @@ AppMenuBar::AppMenuBar(QObject *parent) : // File menu m_fileMenu = new MenuModel(m_model); - m_fileMenu->setTitle(tr("File")); + m_fileMenu->setTitle(tr("&File")); m_model->addMenu(m_fileMenu); // File -> Open @@ -33,6 +33,19 @@ AppMenuBar::AppMenuBar(QObject *parent) : #ifdef Q_OS_WASM connect(m_openFileDialog, &FileDialog::fileContentReady, this, &AppMenuBar::loadOpenedFile); #endif + + // Edit menu + m_editMenu = new MenuModel(m_model); + m_editMenu->setTitle(tr("&Edit")); + m_model->addMenu(m_editMenu); + + // Edit -> Turbo mode + m_turboModeItem = new MenuItemModel(m_editMenu); + m_turboModeItem->setText(tr("Turbo Mode")); + m_turboModeItem->setCheckable(true); + m_turboModeItem->setChecked(false); + m_editMenu->addItem(m_turboModeItem); + connect(m_turboModeItem, &MenuItemModel::checkedChanged, this, [this]() { setTurboMode(m_turboModeItem->checked()); }); } MenuBarModel *AppMenuBar::model() const @@ -68,3 +81,17 @@ void AppMenuBar::loadOpenedFile(const QByteArray &content) qWarning("Failed to create temporary file."); } #endif + +bool AppMenuBar::turboMode() const +{ + return m_turboMode; +} + +void AppMenuBar::setTurboMode(bool newTurboMode) +{ + if (m_turboMode == newTurboMode) + return; + + m_turboMode = newTurboMode; + emit turboModeChanged(); +} diff --git a/src/app/appmenubar.h b/src/app/appmenubar.h index 0936081..0a7df1e 100644 --- a/src/app/appmenubar.h +++ b/src/app/appmenubar.h @@ -27,15 +27,20 @@ class AppMenuBar : public QObject QML_ELEMENT QML_SINGLETON Q_PROPERTY(uicomponents::MenuBarModel *model READ model NOTIFY modelChanged) + Q_PROPERTY(bool turboMode READ turboMode WRITE setTurboMode NOTIFY turboModeChanged) public: explicit AppMenuBar(QObject *parent = nullptr); uicomponents::MenuBarModel *model() const; + bool turboMode() const; + void setTurboMode(bool newTurboMode); + signals: void modelChanged(); void fileOpened(const QString &fileName); + void turboModeChanged(); private: void openFile(); @@ -44,10 +49,15 @@ class AppMenuBar : public QObject #endif uicomponents::MenuBarModel *m_model = nullptr; + uicomponents::MenuModel *m_fileMenu = nullptr; uicomponents::MenuItemModel *m_openFileItem = nullptr; uicomponents::FileDialog *m_openFileDialog = nullptr; QTemporaryFile *m_tmpFile = nullptr; + + uicomponents::MenuModel *m_editMenu = nullptr; + uicomponents::MenuItemModel *m_turboModeItem = nullptr; + bool m_turboMode = false; }; } // namespace scratchcpp diff --git a/src/app/main.qml b/src/app/main.qml index c260dc6..2d2ce88 100644 --- a/src/app/main.qml +++ b/src/app/main.qml @@ -40,6 +40,7 @@ ApplicationWindow { Layout.fillWidth: true CustomToolButton { + id: greenFlagButton icon.name: "green_flag" icon.color: "transparent" onClicked: { @@ -57,6 +58,22 @@ ApplicationWindow { } } + IconLabel { + icon.name: "turbo" + icon.color: "transparent" + text: qsTr("Turbo Mode") + color: Qt.rgba(1, 0.67, 0.1, 1) + visible: AppMenuBar.turboMode + + font { + // Reuse the font from the green flag button + family: greenFlagButton.font.family + capitalization: Font.MixedCase + pointSize: 8 + bold: true + } + } + TextField { id: urlField Layout.fillWidth: true @@ -78,6 +95,7 @@ ApplicationWindow { activeFocusOnTab: true focus: true spriteFencing: false + turboMode: AppMenuBar.turboMode stageRect.border.color: Material.theme == Material.Dark ? Qt.rgba(1, 1, 1, 0.15) : Qt.rgba(0, 0, 0, 0.15) stageRect.border.width: 5 } From 5522821c62e4b30187ca874e638c9bb966907c91 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:05:09 +0100 Subject: [PATCH 3/8] Add include directories for modules --- build/module.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/module.cmake b/build/module.cmake index 7d39360..5bd299f 100644 --- a/build/module.cmake +++ b/build/module.cmake @@ -20,6 +20,8 @@ set(QML_IMPORT_PATH "${QML_IMPORT_PATH};${CMAKE_CURRENT_LIST_DIR}" ) target_link_libraries(${MODULE} PRIVATE ${QT_LIBS}) +target_include_directories(${MODULE} PRIVATE ${PROJECT_SOURCE_DIR}/src) +target_include_directories(${MODULE} PRIVATE ${PROJECT_SOURCE_DIR}/src/global) list(APPEND QML_IMPORT_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) list(REMOVE_DUPLICATES QML_IMPORT_PATH) From 7b4228e370793b864551d3f187666a32c78bb66f Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:06:05 +0100 Subject: [PATCH 4/8] Add keyboard module --- src/CMakeLists.txt | 1 + src/keyboard/CMakeLists.txt | 8 ++++++++ src/keyboard/keyboardmodule.cpp | 10 ++++++++++ src/keyboard/keyboardmodule.h | 16 ++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 src/keyboard/CMakeLists.txt create mode 100644 src/keyboard/keyboardmodule.cpp create mode 100644 src/keyboard/keyboardmodule.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e952081..35484ce 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(app) add_subdirectory(global) add_subdirectory(uicomponents) +add_subdirectory(keyboard) diff --git a/src/keyboard/CMakeLists.txt b/src/keyboard/CMakeLists.txt new file mode 100644 index 0000000..04e385d --- /dev/null +++ b/src/keyboard/CMakeLists.txt @@ -0,0 +1,8 @@ +set(MODULE keyboard) +set(MODULE_URI Keyboard) +set(MODULE_SRC + keyboardmodule.cpp + keyboardmodule.h +) + +include(${PROJECT_SOURCE_DIR}/build/module.cmake) diff --git a/src/keyboard/keyboardmodule.cpp b/src/keyboard/keyboardmodule.cpp new file mode 100644 index 0000000..18359e3 --- /dev/null +++ b/src/keyboard/keyboardmodule.cpp @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "keyboardmodule.h" + +using namespace scratchcpp; + +std::string KeyboardModule::moduleName() const +{ + return "keyboard"; +} diff --git a/src/keyboard/keyboardmodule.h b/src/keyboard/keyboardmodule.h new file mode 100644 index 0000000..2f50ef7 --- /dev/null +++ b/src/keyboard/keyboardmodule.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "modularity/imodulesetup.h" + +namespace scratchcpp +{ + +class KeyboardModule : public modularity::IModuleSetup +{ + public: + std::string moduleName() const override; +}; + +} // namespace scratchcpp From b8945b6486b2311bf19a1c95a09cfe74691b85e9 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 17:59:05 +0100 Subject: [PATCH 5/8] AppMenuBar: Connect the turboMode property with the menu item --- src/app/appmenubar.cpp | 9 ++++----- src/app/appmenubar.h | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/app/appmenubar.cpp b/src/app/appmenubar.cpp index e5a8e98..b92b543 100644 --- a/src/app/appmenubar.cpp +++ b/src/app/appmenubar.cpp @@ -45,7 +45,7 @@ AppMenuBar::AppMenuBar(QObject *parent) : m_turboModeItem->setCheckable(true); m_turboModeItem->setChecked(false); m_editMenu->addItem(m_turboModeItem); - connect(m_turboModeItem, &MenuItemModel::checkedChanged, this, [this]() { setTurboMode(m_turboModeItem->checked()); }); + connect(m_turboModeItem, &MenuItemModel::checkedChanged, this, &AppMenuBar::turboModeChanged); } MenuBarModel *AppMenuBar::model() const @@ -84,14 +84,13 @@ void AppMenuBar::loadOpenedFile(const QByteArray &content) bool AppMenuBar::turboMode() const { - return m_turboMode; + return m_turboModeItem->checked(); } void AppMenuBar::setTurboMode(bool newTurboMode) { - if (m_turboMode == newTurboMode) + if (m_turboModeItem->checked() == newTurboMode) return; - m_turboMode = newTurboMode; - emit turboModeChanged(); + m_turboModeItem->setChecked(newTurboMode); } diff --git a/src/app/appmenubar.h b/src/app/appmenubar.h index 0a7df1e..0933543 100644 --- a/src/app/appmenubar.h +++ b/src/app/appmenubar.h @@ -57,7 +57,6 @@ class AppMenuBar : public QObject uicomponents::MenuModel *m_editMenu = nullptr; uicomponents::MenuItemModel *m_turboModeItem = nullptr; - bool m_turboMode = false; }; } // namespace scratchcpp From de950dafaf2150c7e780f4fccc255052fc8e3c05 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 18:01:23 +0100 Subject: [PATCH 6/8] Add KeyboardInfo class --- src/keyboard/CMakeLists.txt | 3 +++ src/keyboard/ikeyboardinfo.h | 19 +++++++++++++++++++ src/keyboard/internal/keyboardinfo.cpp | 17 +++++++++++++++++ src/keyboard/internal/keyboardinfo.h | 24 ++++++++++++++++++++++++ src/keyboard/keyboardmodule.cpp | 15 ++++++++++++++- src/keyboard/keyboardmodule.h | 13 +++++++++++-- 6 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 src/keyboard/ikeyboardinfo.h create mode 100644 src/keyboard/internal/keyboardinfo.cpp create mode 100644 src/keyboard/internal/keyboardinfo.h diff --git a/src/keyboard/CMakeLists.txt b/src/keyboard/CMakeLists.txt index 04e385d..1986bb9 100644 --- a/src/keyboard/CMakeLists.txt +++ b/src/keyboard/CMakeLists.txt @@ -3,6 +3,9 @@ set(MODULE_URI Keyboard) set(MODULE_SRC keyboardmodule.cpp keyboardmodule.h + ikeyboardinfo.h + internal/keyboardinfo.cpp + internal/keyboardinfo.h ) include(${PROJECT_SOURCE_DIR}/build/module.cmake) diff --git a/src/keyboard/ikeyboardinfo.h b/src/keyboard/ikeyboardinfo.h new file mode 100644 index 0000000..df93b49 --- /dev/null +++ b/src/keyboard/ikeyboardinfo.h @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +namespace scratchcpp::keyboard +{ + +class IKeyboardInfo : MODULE_EXPORT_INTERFACE +{ + public: + virtual ~IKeyboardInfo() { } + + virtual Qt::KeyboardModifiers keyboardModifiers() const = 0; +}; + +} // namespace scratchcpp::keyboard diff --git a/src/keyboard/internal/keyboardinfo.cpp b/src/keyboard/internal/keyboardinfo.cpp new file mode 100644 index 0000000..2432ace --- /dev/null +++ b/src/keyboard/internal/keyboardinfo.cpp @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "keyboardinfo.h" + +using namespace scratchcpp::keyboard; + +KeyboardInfo::KeyboardInfo(QObject *parent) : + QObject(parent) +{ +} + +Qt::KeyboardModifiers KeyboardInfo::keyboardModifiers() const +{ + return QGuiApplication::keyboardModifiers(); +} diff --git a/src/keyboard/internal/keyboardinfo.h b/src/keyboard/internal/keyboardinfo.h new file mode 100644 index 0000000..1338d43 --- /dev/null +++ b/src/keyboard/internal/keyboardinfo.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include "ikeyboardinfo.h" + +namespace scratchcpp::keyboard +{ + +class KeyboardInfo + : public QObject + , public IKeyboardInfo +{ + Q_OBJECT + + public: + explicit KeyboardInfo(QObject *parent = nullptr); + + Q_INVOKABLE Qt::KeyboardModifiers keyboardModifiers() const override; +}; + +} // namespace scratchcpp::keyboard diff --git a/src/keyboard/keyboardmodule.cpp b/src/keyboard/keyboardmodule.cpp index 18359e3..a43b071 100644 --- a/src/keyboard/keyboardmodule.cpp +++ b/src/keyboard/keyboardmodule.cpp @@ -1,10 +1,23 @@ // SPDX-License-Identifier: GPL-3.0-or-later +#include + +#include "modularity/ioc.h" #include "keyboardmodule.h" +#include "internal/keyboardinfo.h" -using namespace scratchcpp; +using namespace scratchcpp::keyboard; std::string KeyboardModule::moduleName() const { return "keyboard"; } + +void KeyboardModule::registerExports() +{ + m_keyboardInfo = std::make_shared(); + + QQmlEngine::setObjectOwnership(m_keyboardInfo.get(), QQmlEngine::CppOwnership); + qmlRegisterSingletonInstance("ScratchCPP.Keyboard", 1, 0, "KeyboardInfo", m_keyboardInfo.get()); + modularity::ioc()->registerExport(m_keyboardInfo); +} diff --git a/src/keyboard/keyboardmodule.h b/src/keyboard/keyboardmodule.h index 2f50ef7..f36ca30 100644 --- a/src/keyboard/keyboardmodule.h +++ b/src/keyboard/keyboardmodule.h @@ -2,15 +2,24 @@ #pragma once +#include + #include "modularity/imodulesetup.h" -namespace scratchcpp +namespace scratchcpp::keyboard { +class KeyboardInfo; + class KeyboardModule : public modularity::IModuleSetup { public: std::string moduleName() const override; + + void registerExports() override; + + private: + std::shared_ptr m_keyboardInfo; }; -} // namespace scratchcpp +} // namespace scratchcpp::keyboard From 1f4303e93d12eecc22f744849253b4fd5aea9684 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 18:02:15 +0100 Subject: [PATCH 7/8] Register global and keyboard modules --- src/app/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/main.cpp b/src/app/main.cpp index 0f2df14..b1a3f30 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "app.h" +#include "globalmodule.h" +#include "keyboard/keyboardmodule.h" using namespace scratchcpp; int main(int argc, char *argv[]) { App app; + app.addModule(new GlobalModule); + app.addModule(new keyboard::KeyboardModule); return app.run(argc, argv); } From 14d7e406893474bea8e8488dbe558a24d60ecc3a Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 26 Feb 2024 18:02:49 +0100 Subject: [PATCH 8/8] Implement turbo mode shortcut --- src/app/main.qml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/app/main.qml b/src/app/main.qml index 2d2ce88..27b9642 100644 --- a/src/app/main.qml +++ b/src/app/main.qml @@ -6,6 +6,7 @@ import QtQuick.Layouts import ScratchCPP import ScratchCPP.UiComponents import ScratchCPP.Render +import ScratchCPP.Keyboard ApplicationWindow { id: root @@ -44,9 +45,13 @@ ApplicationWindow { icon.name: "green_flag" icon.color: "transparent" onClicked: { - player.stop() - player.start() - player.forceActiveFocus(Qt.TabFocusReason); + if (KeyboardInfo.keyboardModifiers() === Qt.ShiftModifier) + AppMenuBar.turboMode = !AppMenuBar.turboMode + else { + player.stop() + player.start() + player.forceActiveFocus(Qt.TabFocusReason); + } } }