diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index d5f9a2f..c9c791c 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -1,31 +1,38 @@ name: macOS -on: [push] +on: + push: + branches: + - master + pull_request: + branches: + - master + workflow_dispatch: + env: targetName: danmaQ jobs: build: name: Build - runs-on: macos-10.15 + runs-on: macos-latest steps: - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v4 with: - version: 5.15.2 - modules: 'qtwebengine' - cached: 'false' - - uses: actions/checkout@v2 + version: 6.8.2 + modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine + cache: true + - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Build MacOS run: | - cmake . && make translations - cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release - cd build && make dmg - - uses: actions/upload-artifact@v2 + cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DQT_DEBUG_FIND_PACKAGE=ON + cd build && make dmg + - uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.macos.amd64.dmg path: build/${{ env.targetName }}.dmg - - name: uploadRelease + - name: Update to release if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 25b318f..c280359 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -1,5 +1,13 @@ name: Ubuntu -on: [push] +on: + push: + branches: + - master + pull_request: + branches: + - master + workflow_dispatch: + env: targetName: danmaQ jobs: @@ -8,38 +16,47 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04] - qt_ver: [5.15.2] + os: [ubuntu-latest] + qt_ver: [6.8.2] qt_arch: [gcc_64] steps: - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_ver }} - modules: 'qtcharts qtwebengine' - cached: 'false' - - name: ubuntu install - run: sudo apt-get install -y libqt5x11extras5-dev cmake flatpak flatpak-builder - - uses: actions/checkout@v2 + modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine + cache: true + - name: Install other dependencies + run: sudo apt-get install -y cmake ninja-build flatpak flatpak-builder + - uses: actions/checkout@v4 with: fetch-depth: 1 - - name: build flatpak + - name: Build native run: | - sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - sudo flatpak install flathub org.kde.Sdk//5.15 io.qt.qtwebengine.BaseApp//5.15 -y - sudo flatpak-builder --repo=repo --force-clean build-dir org.tuna.danmaQ.local.json - sudo flatpak build-bundle repo danmaQ.flatpak org.tuna.danmaQ - working-directory: flatpak - - uses: actions/upload-artifact@v2 + cmake -B build -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -GNinja -DQT_DEBUG_FIND_PACKAGE=ON + cmake --build build + - name: Upload build result + uses: actions/upload-artifact@v4 with: - name: ${{ env.targetName }}.linux.amd64.flatpak - path: flatpak/danmaQ.flatpak - - name: uploadRelease - if: startsWith(github.event.ref, 'refs/tags/') - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: flatpak/danmaQ.flatpak - asset_name: ${{ env.targetName }}.linux.amd64.flatpak - tag: ${{ github.ref }} - overwrite: true + name: ${{ env.targetName }}.linux.amd64 + path: build/src/danmaQ + # - name: Build flatpak + # run: | + # sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + # sudo flatpak install flathub org.kde.Sdk//5.15 io.qt.qtwebengine.BaseApp//5.15 -y + # sudo flatpak-builder --repo=repo --force-clean build-dir org.tuna.danmaQ.local.json + # sudo flatpak build-bundle repo danmaQ.flatpak org.tuna.danmaQ + # working-directory: flatpak + # - uses: actions/upload-artifact@v4 + # with: + # name: ${{ env.targetName }}.linux.amd64.flatpak + # path: flatpak/danmaQ.flatpak + # - name: Update to release + # if: startsWith(github.event.ref, 'refs/tags/') + # uses: svenstaro/upload-release-action@v2 + # with: + # repo_token: ${{ secrets.GITHUB_TOKEN }} + # file: flatpak/danmaQ.flatpak + # asset_name: ${{ env.targetName }}.linux.amd64.flatpak + # tag: ${{ github.ref }} + # overwrite: true diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 44a7cfe..ff47735 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -1,49 +1,57 @@ name: Windows -on: [push] +on: + push: + branches: + - master + pull_request: + branches: + - master + workflow_dispatch: + env: targetName: danmaQ jobs: build: name: Build - runs-on: windows-2019 + runs-on: windows-latest strategy: matrix: include: - - qt_ver: 5.15.2 - qt_arch: win64_msvc2019_64 + - qt_ver: 6.8.2 + qt_arch: win64_msvc2022_64 msvc_arch: x64 - qt_arch_install: msvc2019_64 steps: - name: Install Qt - uses: jurplel/install-qt-action@v2.13.0 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_ver }} - modules: 'qtwebengine' + modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine arch: ${{ matrix.qt_arch }} - - uses: actions/checkout@v2 + cache: true + - uses: actions/checkout@v4 with: fetch-depth: 1 - name: MSVC Build id: build shell: cmd run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }} - cmake -B . -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release - msbuild ALL_BUILD.vcxproj + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }} + cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DQT_DEBUG_FIND_PACKAGE=ON + cmake --build build - name: Package Qt env: - VCINSTALLDIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC' + VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC' shell: pwsh run: | New-Item -ItemType Directory ${env:targetName} - Copy-Item src\Debug\${{ env.targetName }}.exe ${env:targetName}\ + Copy-Item build\src\Debug\${{ env.targetName }}.exe ${env:targetName}\ windeployqt ${env:targetName}\${env:targetName}.exe Compress-Archive -Path ${env:targetName} ${env:targetName}'.zip' - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.win.${{ matrix.msvc_arch }}.zip path: ${{ env.targetName }}.zip - - name: Upload Release + - name: Update to release if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: diff --git a/.travisci/.travis.sh b/.travisci/.travis.sh deleted file mode 100755 index 41401c9..0000000 --- a/.travisci/.travis.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -mkdir build-release/ -cd build-release/ -cmake .. -DCMAKE_BUILD_TYPE=Release -make -cd .. - -mkdir build-debug/ -cd build-debug/ -cmake .. -DCMAKE_BUILD_TYPE=Debug -make -cd .. diff --git a/.travisci/Dockerfile.debian b/.travisci/Dockerfile.debian deleted file mode 100644 index fa1847d..0000000 --- a/.travisci/Dockerfile.debian +++ /dev/null @@ -1,18 +0,0 @@ -# Build Debian 8 image -FROM debian:8 - -# see https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/run -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - g++ \ - qt5-default \ - qttools5-dev \ - qttools5-dev-tools \ - libqt5x11extras5-dev \ - make \ - cmake - -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -COPY . /usr/src/app diff --git a/.travisci/Dockerfile.fedora b/.travisci/Dockerfile.fedora deleted file mode 100644 index f9d9e91..0000000 --- a/.travisci/Dockerfile.fedora +++ /dev/null @@ -1,14 +0,0 @@ -# Build Fedora 25 image -FROM fedora:25 - -RUN dnf -y install \ - gcc-c++ \ - qt5-qtx11extras-devel \ - qt5-linguist \ - qt5-devel \ - cmake - -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -COPY . /usr/src/app diff --git a/.travisci/Dockerfile.leap b/.travisci/Dockerfile.leap deleted file mode 100644 index ef5d162..0000000 --- a/.travisci/Dockerfile.leap +++ /dev/null @@ -1,15 +0,0 @@ - -# Build the latest openSUSE Leap (42.x) image -FROM opensuse:leap - -RUN zypper --non-interactive in --no-recommends \ - gcc-c++ \ - libqt5-qtx11extras-devel \ - libqt5-linguist-devel \ - libqt5-qtbase-devel \ - cmake - -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -COPY . /usr/src/app diff --git a/.travisci/Dockerfile.ubuntu b/.travisci/Dockerfile.ubuntu deleted file mode 100644 index 24e4e23..0000000 --- a/.travisci/Dockerfile.ubuntu +++ /dev/null @@ -1,17 +0,0 @@ -# Build Ubuntu 18.04 image -FROM ubuntu:18.04 - -# see https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/run -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - g++ \ - qt5-default \ - qttools5-dev-tools \ - libqt5x11extras5-dev \ - make \ - cmake - -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -COPY . /usr/src/app diff --git a/CMakeLists.txt b/CMakeLists.txt index 14811f7..f91e657 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.16) PROJECT(danmaQ) @@ -6,42 +6,21 @@ option(ENABLE_TEST "Enable test program build" Off) set(VERSION "0.3.0") -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_EXPORT_COMPILE_COMMANDS True) IF (WIN32 AND NOT MINGW AND NOT CYGWIN) set(CMAKE_PREFIX_PATH "$ENV{QTDIR} ${CMAKE_PREFIX_PATH}") ENDIF() -# From https://github.com/Homebrew/homebrew-core/issues/8392 -if(APPLE) -if(EXISTS /usr/local/opt/qt5) - # Because Qt5 is key-only, Homebrew installs Qt5 in - # /usr/local/qt5, ensure it can be found by CMake since - # it is not in the default /usr/local prefix. - list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/qt5") - set(CMAKE_MACDEPLOYQT_PATH "/usr/local/opt/qt5/bin/macdeployqt") - set(CMAKE_MACOSX_RPATH 1) - # set (_frameworks ${CMAKE_FRAMEWORK_PATH} $ENV{CMAKE_FRAMEWORK_PATH} ~/Library/Frameworks /usr/local/Frameworks ${CMAKE_SYSTEM_FRAMEWORK_PATH}) - # list (REMOVE_DUPLICATES _frameworks) - set(CMAKE_INSTALL_RPATH "$INSTALL_DIR/lib") - # set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1) -else() - set(CMAKE_MACDEPLOYQT_PATH "macdeployqt") -endif() -endif() - -find_package(Qt5Core) -find_package(Qt5Widgets) -find_package(Qt5Network) -find_package(Qt5WebEngineWidgets) +find_package(Qt6 REQUIRED COMPONENTS Core Widgets Network WebEngineWidgets LinguistTools) IF (UNIX) set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}") ENDIF () IF (WIN32 AND NOT MINGW AND NOT CYGWIN) - set(CMAKE_CXX_FLAGS "/permissive- /MP ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "/permissive- /MP /DNOMINMAX ${CMAKE_CXX_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"") ENDIF() @@ -71,14 +50,14 @@ if (APPLE) COMMAND mkdir -p ${CMAKE_PROJECT_NAME}.app/Contents/Resources COMMAND touch ${CMAKE_PROJECT_NAME}.app/Contents/Resources/empty.lproj COMMAND cp Icon.icns ${CMAKE_PROJECT_NAME}.app/Contents/Resources/ - COMMAND ${CMAKE_MACDEPLOYQT_PATH} ${CMAKE_PROJECT_NAME}.app -no-strip + COMMAND macdeployqt ${CMAKE_PROJECT_NAME}.app -no-strip DEPENDS ${CMAKE_BINARY_DIR}/src/${CMAKE_PROJECT_NAME} DEPENDS ${CMAKE_BINARY_DIR}/Icon.icns OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.app ) add_custom_command( COMMAND cp -r ${CMAKE_PROJECT_NAME}.app ${CMAKE_PROJECT_NAME}.app.bak - COMMAND ${CMAKE_MACDEPLOYQT_PATH} ${CMAKE_PROJECT_NAME}.app -dmg + COMMAND macdeployqt ${CMAKE_PROJECT_NAME}.app -dmg COMMAND rm -rf ${CMAKE_PROJECT_NAME}.app COMMAND mv ${CMAKE_PROJECT_NAME}.app.bak ${CMAKE_PROJECT_NAME}.app DEPENDS ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.app diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e0e36c1..eaa578c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,35 +18,24 @@ set(danmaQ_HEADERS common.h ) +qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES zh_CN zh_TW ja_JP) + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) -add_subdirectory(translations) add_subdirectory(resource) -set(danmaQ_RESOURCES icons.qrc i18n.qrc socket.qrc) - -add_custom_target(resources ALL DEPENDS ${danmaQ_RESOURCES}) -add_dependencies(resources translations) - -qt5_add_resources(danmaQ_RCC_SRCS ${danmaQ_RESOURCES}) - -add_executable(${CMAKE_PROJECT_NAME} ${danmaQ_SOURCES} ${danmaQ_HEADERS_MOC} ${danmaQ_RCC_SRCS}) -add_dependencies(${CMAKE_PROJECT_NAME} resources) - -set(DANMAQ_LIBRARIES Qt5::Widgets Qt5::Core Qt5::Network Qt5::WebEngineCore Qt5::WebEngineWidgets) - -if(CMAKE_SYSTEM_NAME STREQUAL Linux) - find_package(Qt5X11Extras REQUIRED) - set(DANMAQ_LIBRARIES ${DANMAQ_LIBRARIES} Qt5::X11Extras) +set(danmaQ_RESOURCES icons.qrc socket.qrc) +file(GLOB danmqQ_TRANSLATIONS translations/*.ts) - find_package(X11 REQUIRED) - set(DANMAQ_LIBRARIES ${DANMAQ_LIBRARIES} ${X11_LIBRARIES}) +qt_add_resources(danmaQ_RCC_SRCS ${danmaQ_RESOURCES}) +qt_add_executable(${CMAKE_PROJECT_NAME} ${danmaQ_SOURCES} ${danmaQ_HEADERS_MOC} ${danmaQ_RCC_SRCS}) +qt_add_translations(${CMAKE_PROJECT_NAME} + TS_FILES ${danmqQ_TRANSLATIONS} +) - # find_library(X_LIB X11 Xext) - # set(DANMAQ_LIBRARIES ${DANMAQ_LIBRARIES} ${X_LIB}) -endif() +set(DANMAQ_LIBRARIES Qt6::Widgets Qt6::Core Qt6::Network Qt6::WebEngineWidgets) -target_link_libraries(${CMAKE_PROJECT_NAME} ${DANMAQ_LIBRARIES}) +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${DANMAQ_LIBRARIES}) install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION bin) diff --git a/src/DMCanvas.cpp b/src/DMCanvas.cpp index 954c861..3779e6f 100644 --- a/src/DMCanvas.cpp +++ b/src/DMCanvas.cpp @@ -19,9 +19,8 @@ #include #include #include -#include #include -#include +#include #include #include @@ -155,9 +154,9 @@ int DMCanvas::slot_y(int slot) QString DMCanvas::escape_text(QString & text) { QString escaped = text.toHtmlEscaped(); - escaped.replace(QRegExp("([^\\\\])\\\\n"), "\\1
"); - escaped.replace(QRegExp("\\\\\\\\n"), "\\n"); - escaped.replace(QRegExp("\\[s\\](.+)\\[/s\\]"), "\\1"); + escaped.replace(QRegularExpression("([^\\\\])\\\\n"), "\\1
"); + escaped.replace(QRegularExpression("\\\\\\\\n"), "\\n"); + escaped.replace(QRegularExpression("\\[s\\](.+)\\[/s\\]"), "\\1"); return escaped; } diff --git a/src/DMMainWindow.cpp b/src/DMMainWindow.cpp index 5a74216..412c911 100644 --- a/src/DMMainWindow.cpp +++ b/src/DMMainWindow.cpp @@ -16,7 +16,6 @@ */ #include -#include #include #include #include diff --git a/src/Danmaku.cpp b/src/Danmaku.cpp index b350057..2ce2ad8 100644 --- a/src/Danmaku.cpp +++ b/src/Danmaku.cpp @@ -15,9 +15,9 @@ * along with this program. If not, see . */ + #include #include -#include #include #include #include diff --git a/src/i18n.qrc b/src/i18n.qrc deleted file mode 100644 index f786c66..0000000 --- a/src/i18n.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - translations/zh_CN.qm - translations/zh_TW.qm - translations/ja_JP.qm - - diff --git a/src/main.cpp b/src/main.cpp index 1a80a41..c1ecd26 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -35,19 +34,15 @@ #endif int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(i18n); -#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); -#endif QApplication app(argc, argv); std::srand(std::time(0)); - QDir dir(":translations"); + QDir dir(":/i18n"); QStringList fileNames = dir.entryList(QStringList("*.qm"), QDir::Files, QDir::Name); + myDebug << "Available translations:" << fileNames; QString systemLocale = QLocale::system().name(); - myDebug << "System locale:" << systemLocale; // if system language is zh_CN, then first look for zh_CN, then zh_* diff --git a/src/translations/CMakeLists.txt b/src/translations/CMakeLists.txt deleted file mode 100644 index 12922a2..0000000 --- a/src/translations/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -set(danmaQ_I18N_SRC - zh_CN.ts - zh_TW.ts - ja_JP.ts) - -find_package(Qt5LinguistTools) - -add_custom_target(update_all_ts_files ALL) -add_custom_target(create_all_qm_files ALL) -add_dependencies(create_all_qm_files update_all_ts_files) - -set(danmaQ_I18N_FILES) -foreach(I18N_SRC ${danmaQ_I18N_SRC}) - get_filename_component(I18N_NAME ${I18N_SRC} NAME_WE) - set(TS_TARGET_NAME "update_ts_file_${I18N_NAME}") - add_custom_target(${TS_TARGET_NAME} - COMMAND Qt5::lupdate ${CMAKE_SOURCE_DIR} -ts ${I18N_SRC}) - add_dependencies(update_all_ts_files ${TS_TARGET_NAME}) - set(QM_TARGET_NAME "create_qm_file_${I18N_NAME}") - set(QM_FILE "${CMAKE_CURRENT_BINARY_DIR}/${I18N_NAME}.qm") - add_custom_target(${QM_TARGET_NAME} - COMMAND Qt5::lrelease ${I18N_SRC} -qm ${QM_FILE} - BYPRODUCTS ${QM_FILE}) - add_dependencies(${QM_TARGET_NAME} ${TS_TARGET_NAME}) - add_dependencies(create_all_qm_files ${QM_TARGET_NAME}) - list(APPEND danmaQ_I18N_FILES ${QM_FILE}) -endforeach() -add_custom_target(translations ALL DEPENDS create_all_qm_files ${danmaQ_I18N_FILES}) \ No newline at end of file