diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index e9a9c50..06f8776 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - qt-version: ['6.6'] + qt-version: ['6.7'] qt-target: ['desktop'] qt-modules: [''] arch: ['amd64'] @@ -37,10 +37,11 @@ jobs: ## Install Qt - if: contains(matrix.arch, 'amd64') name: Install Qt (Ubuntu) - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt-version }} host: 'linux' + arch: 'linux_gcc_64' target: ${{ matrix.qt-target }} modules: ${{ matrix.qt-modules }} - if: "!contains(matrix.arch, 'amd64')" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ffd700f..0d071b3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - qt-version: ['6.6'] + qt-version: ['6.7'] qt-target: ['desktop'] qt-modules: [''] arch: ['amd64'] @@ -48,10 +48,11 @@ jobs: # Install Qt - if: contains(matrix.arch, 'amd64') name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt-version }} host: 'linux' + arch: 'linux_gcc_64' target: ${{ matrix.qt-target }} modules: ${{ matrix.qt-modules }} - if: "!contains(matrix.arch, 'amd64')" @@ -91,7 +92,7 @@ jobs: runs-on: windows-latest strategy: matrix: - qt-version: ['6.6'] + qt-version: ['6.7'] qt-target: ['desktop'] qt-modules: [''] mingw-version: ['11.2.0'] @@ -123,7 +124,7 @@ jobs: shell: bash # Install Qt - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt-version }} host: 'windows' @@ -155,6 +156,12 @@ jobs: cd win_release windeployqt ${{ env.executable_name }}.exe --qmldir ..\win_build\src || exit 5 shell: cmd + - name: Copy libraries + run: | + cp ${QT_ROOT_DIR}/bin/libgcc_s_seh-1.dll win_release/ + cp ${QT_ROOT_DIR}/bin/libstdc++-6.dll win_release/ + cp ${QT_ROOT_DIR}/bin/libwinpthread-1.dll win_release/ + shell: bash # Update Windows repository - if: env.create_windows_installer == 1 && env.is_prerelease == 1 name: Do not update Windows repo if this is a pre-release diff --git a/.github/workflows/utests.yml b/.github/workflows/utests.yml index 34cbebc..c0ca8bc 100644 --- a/.github/workflows/utests.yml +++ b/.github/workflows/utests.yml @@ -24,9 +24,10 @@ jobs: sudo apt-get install -y nlohmann-json3-dev libutfcpp-dev xvfb libxcb-cursor0 shell: bash - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: - version: '6.6.*' + version: '6.7.*' + arch: 'linux_gcc_64' - name: Configure CMake run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSCRATCHCPP_PLAYER_BUILD_UNIT_TESTS=ON diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 1640596..f087c6a 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -12,7 +12,7 @@ jobs: runs-on: windows-latest strategy: matrix: - qt-version: ['6.6'] + qt-version: ['6.7'] qt-target: ['desktop'] qt-modules: [''] mingw-version: ['11.2.0'] @@ -35,7 +35,7 @@ jobs: shell: bash ## Install Qt - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt-version }} host: 'windows' @@ -67,6 +67,12 @@ jobs: cd win_release windeployqt ${{ env.executable_name }}.exe --qmldir ..\win_build\src || exit 5 shell: cmd + - name: Copy libraries + run: | + cp ${QT_ROOT_DIR}/bin/libgcc_s_seh-1.dll win_release/ + cp ${QT_ROOT_DIR}/bin/libstdc++-6.dll win_release/ + cp ${QT_ROOT_DIR}/bin/libwinpthread-1.dll win_release/ + shell: bash ## Upload - name: Upload artifacts uses: actions/upload-artifact@v3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 70dcac2..515ed40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(scratchcpp-player VERSION 0.2.0 LANGUAGES CXX) +project(scratchcpp-player VERSION 0.3.0 LANGUAGES CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/res/icons/CMakeLists.txt b/res/icons/CMakeLists.txt index b9e1f5a..1c144bc 100644 --- a/res/icons/CMakeLists.txt +++ b/res/icons/CMakeLists.txt @@ -12,4 +12,5 @@ qt_add_resources( green_flag.svg stop.svg turbo.svg + mute.svg ) diff --git a/res/icons/mute.svg b/res/icons/mute.svg new file mode 100644 index 0000000..6cdd71d --- /dev/null +++ b/res/icons/mute.svg @@ -0,0 +1,9 @@ + + + + Sound/Effects/Mute + Created with Sketch. + + + + diff --git a/scratchcpp-render b/scratchcpp-render index b10c34a..3b639b2 160000 --- a/scratchcpp-render +++ b/scratchcpp-render @@ -1 +1 @@ -Subproject commit b10c34a7c38061088021aea69a643dd74e1f749b +Subproject commit 3b639b29f495132a7fed206c6de0c821091c64fc diff --git a/src/app/appmenubar.cpp b/src/app/appmenubar.cpp index 783c7ea..24229c1 100644 --- a/src/app/appmenubar.cpp +++ b/src/app/appmenubar.cpp @@ -55,6 +55,14 @@ AppMenuBar::AppMenuBar(QObject *parent) : m_editMenu->addItem(m_fps60ModeItem); connect(m_fps60ModeItem, &MenuItemModel::checkedChanged, this, &AppMenuBar::fps60ModeChanged); + // Edit -> Mute + m_muteItem = new MenuItemModel(m_editMenu); + m_muteItem->setText(tr("Mute")); + m_muteItem->setCheckable(true); + m_muteItem->setChecked(false); + m_editMenu->addItem(m_muteItem); + connect(m_muteItem, &MenuItemModel::checkedChanged, this, &AppMenuBar::muteChanged); + // Edit -> Project settings m_projectSettingsItem = new MenuItemModel(m_editMenu); m_projectSettingsItem->setText(tr("Project settings...")); @@ -133,3 +141,17 @@ void AppMenuBar::setFps60Mode(bool newFps60Mode) m_fps60ModeItem->setChecked(newFps60Mode); emit fps60ModeChanged(); } + +bool AppMenuBar::mute() const +{ + return m_muteItem->checked(); +} + +void AppMenuBar::setMute(bool newMute) +{ + if (m_muteItem->checked() == newMute) + return; + + m_muteItem->setChecked(newMute); + emit muteChanged(); +} diff --git a/src/app/appmenubar.h b/src/app/appmenubar.h index 564ddc5..d957c84 100644 --- a/src/app/appmenubar.h +++ b/src/app/appmenubar.h @@ -29,6 +29,7 @@ class AppMenuBar : public QObject Q_PROPERTY(uicomponents::MenuBarModel *model READ model NOTIFY modelChanged) Q_PROPERTY(bool turboMode READ turboMode WRITE setTurboMode NOTIFY turboModeChanged) Q_PROPERTY(bool fps60Mode READ fps60Mode WRITE setFps60Mode NOTIFY fps60ModeChanged) + Q_PROPERTY(bool mute READ mute WRITE setMute NOTIFY muteChanged) public: explicit AppMenuBar(QObject *parent = nullptr); @@ -41,11 +42,15 @@ class AppMenuBar : public QObject bool fps60Mode() const; void setFps60Mode(bool newFps60Mode); + bool mute() const; + void setMute(bool newMute); + signals: void modelChanged(); void fileOpened(const QString &fileName); void turboModeChanged(); void fps60ModeChanged(); + void muteChanged(); void projectSettingsTriggered(); void aboutAppTriggered(); @@ -65,6 +70,7 @@ class AppMenuBar : public QObject uicomponents::MenuModel *m_editMenu = nullptr; uicomponents::MenuItemModel *m_turboModeItem = nullptr; uicomponents::MenuItemModel *m_fps60ModeItem = nullptr; + uicomponents::MenuItemModel *m_muteItem = nullptr; uicomponents::MenuItemModel *m_projectSettingsItem = nullptr; uicomponents::MenuModel *m_helpMenu = nullptr; diff --git a/src/app/qml/dialogs/ProjectSettingsDialog.qml b/src/app/qml/dialogs/ProjectSettingsDialog.qml index 68757d4..53fd2cd 100644 --- a/src/app/qml/dialogs/ProjectSettingsDialog.qml +++ b/src/app/qml/dialogs/ProjectSettingsDialog.qml @@ -38,6 +38,12 @@ CustomDialog { } } + CheckBox { + text: qsTr("High Quality Pen") + checked: projectPlayer.hqPen + onCheckedChanged: projectPlayer.hqPen = checked + } + // Remove limits Label { text: qsTr("Remove limits") diff --git a/src/app/qml/main.qml b/src/app/qml/main.qml index 4553e89..15e6c0a 100644 --- a/src/app/qml/main.qml +++ b/src/app/qml/main.qml @@ -79,6 +79,10 @@ ApplicationWindow { AppMenuBar.fps60Mode = !AppMenuBar.fps60Mode break; + case Qt.ControlModifier: + AppMenuBar.mute = !AppMenuBar.mute + break; + default: player.stop() player.start() @@ -96,6 +100,13 @@ ApplicationWindow { } } + IconLabel { + icon.name: "mute" + icon.color: "transparent" + text: "" + visible: AppMenuBar.mute + } + IconLabel { icon.name: "turbo" icon.color: "transparent" @@ -141,6 +152,7 @@ ApplicationWindow { activeFocusOnTab: true focus: true turboMode: AppMenuBar.turboMode + mute: AppMenuBar.mute } } }