From f3b94e420ad91b655f3bcdc61d50fbefbcb6fa95 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 29 Mar 2026 22:15:43 +0200 Subject: [PATCH 01/19] find_package GuiPrivate explicitly --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d28ff285..767b5c2b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,7 @@ else() Core Core5Compat Gui + GuiPrivate LinguistTools Multimedia Network From 27c94bcb53478c06704cc0b5b957bee0a268fde5 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 29 Mar 2026 22:18:17 +0200 Subject: [PATCH 02/19] Add missing resource: yacreaderlibraryserver_images_rcc --- YACReaderLibraryServer/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index 9accc389f..f4a751692 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -19,6 +19,8 @@ target_compile_definitions(YACReaderLibraryServer PRIVATE YACREADER_LIBRARY ) +# Resources +qt_add_resources(yacreaderlibraryserver_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images.qrc") target_sources(YACReaderLibraryServer PRIVATE ${yacreaderlibraryserver_images_rcc}) # Translations From 52dd4e4c3cf204e2e2186ec3ac87555f94cea109 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 29 Mar 2026 22:55:16 +0200 Subject: [PATCH 03/19] Improve backends handling and make DECOMPRESSION_BACKEND and PDF_BACKEND settings easier to discover --- .github/workflows/build.yml | 6 +- CMakeLists.txt | 82 ++++++++++++++------- cmake/BackendHelpers.cmake | 44 ++++++++++++ cmake/PdfBackend.cmake | 100 ++++++++++++++++++-------- compileOSX.sh | 1 + compressed_archive/CMakeLists.txt | 116 ++++++++++++++++++------------ docker/Dockerfile | 1 + docker/Dockerfile.aarch64 | 1 + 8 files changed, 248 insertions(+), 103 deletions(-) create mode 100644 cmake/BackendHelpers.cmake diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 165f44aef..e0e532317 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -80,6 +80,7 @@ jobs: run: | cmake -B build \ -DDECOMPRESSION_BACKEND=unarr \ + -DPDF_BACKEND=poppler \ -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" \ -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel 2 @@ -113,6 +114,7 @@ jobs: run: | cmake -B build \ -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" \ -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel 2 @@ -201,7 +203,7 @@ jobs: run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\6.9.3\msvc2022_64\bin;%PATH% - cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_64 + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DPDF_BACKEND=pdfium -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_64 cmake --build build --parallel - name: Run tests @@ -346,7 +348,7 @@ jobs: run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64_arm64 set PATH=C:\Qt\6.9.3\msvc2022_arm64\bin;%PATH% - cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_arm64 -DQT_HOST_PATH=C:\Qt\6.9.3\msvc2022_64 -DCMAKE_SYSTEM_PROCESSOR=ARM64 + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DPDF_BACKEND=pdfium -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_arm64 -DQT_HOST_PATH=C:\Qt\6.9.3\msvc2022_64 -DCMAKE_SYSTEM_PROCESSOR=ARM64 cmake --build build --parallel - name: Upload executables for signing diff --git a/CMakeLists.txt b/CMakeLists.txt index 767b5c2b7..24048b26e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,21 +30,13 @@ endif() # Install paths include(GNUInstallDirs) -find_package(PkgConfig) +list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") # Compiler options (MSVC flags, NOMINMAX, etc.) include(cmake/CompilerOptions.cmake) # --- Build options --- -# Archive decompression backend (mutually exclusive) -set(DECOMPRESSION_BACKEND "" CACHE STRING "Archive backend: unarr | 7zip | libarchive") -set_property(CACHE DECOMPRESSION_BACKEND PROPERTY STRINGS "unarr" "7zip" "libarchive") - -# PDF rendering backend (mutually exclusive) -set(PDF_BACKEND "" CACHE STRING "PDF backend: pdfium | poppler | pdfkit | no_pdf") -set_property(CACHE PDF_BACKEND PROPERTY STRINGS "pdfium" "poppler" "pdfkit" "no_pdf") - # Build configuration option(BUILD_TESTS "Build tests" ON) option(BUILD_SERVER_STANDALONE "Server standalone install (Linux only)" OFF) @@ -52,25 +44,63 @@ option(BUILD_SERVER_STANDALONE "Server standalone install (Linux only)" OFF) # Build number (set by CI) set(BUILD_NUMBER "" CACHE STRING "CI build number") +set(YACREADER_DECOMPRESSION_BACKENDS unarr 7zip libarchive) +set(YACREADER_PDF_BACKENDS pdfium poppler pdfkit no_pdf) + # --- Platform defaults (mirrors config.pri) --- -if(NOT DECOMPRESSION_BACKEND OR DECOMPRESSION_BACKEND STREQUAL "") - if(UNIX AND NOT APPLE) - set(DECOMPRESSION_BACKEND "unarr") - else() - set(DECOMPRESSION_BACKEND "7zip") - endif() - message(STATUS "DECOMPRESSION_BACKEND defaulted to: ${DECOMPRESSION_BACKEND}") +if(UNIX AND NOT APPLE) + set(_default_decompression_backend "unarr") + set(_default_pdf_backend "poppler") +elseif(APPLE) + set(_default_decompression_backend "7zip") + set(_default_pdf_backend "pdfkit") +else() + set(_default_decompression_backend "7zip") + set(_default_pdf_backend "pdfium") endif() -if(NOT PDF_BACKEND OR PDF_BACKEND STREQUAL "") - if(UNIX AND NOT APPLE) - set(PDF_BACKEND "poppler") - elseif(APPLE) - set(PDF_BACKEND "pdfkit") - else() - set(PDF_BACKEND "pdfium") - endif() - message(STATUS "PDF_BACKEND defaulted to: ${PDF_BACKEND}") +# Archive decompression backend (mutually exclusive) +set(_decompression_backend_value "") +if(DEFINED CACHE{DECOMPRESSION_BACKEND}) + set(_decompression_backend_value "$CACHE{DECOMPRESSION_BACKEND}") +endif() +if(_decompression_backend_value STREQUAL "") + set(_decompression_backend_value "${_default_decompression_backend}") + string(JOIN ", " _available_decompression_backends ${YACREADER_DECOMPRESSION_BACKENDS}) + message(STATUS + "DECOMPRESSION_BACKEND not set, defaulting to ${_decompression_backend_value}. " + "Available: ${_available_decompression_backends}.") +endif() +set(DECOMPRESSION_BACKEND "${_decompression_backend_value}" CACHE STRING + "Archive backend: unarr | 7zip | libarchive" FORCE) +set_property(CACHE DECOMPRESSION_BACKEND PROPERTY STRINGS ${YACREADER_DECOMPRESSION_BACKENDS}) +if(NOT DECOMPRESSION_BACKEND IN_LIST YACREADER_DECOMPRESSION_BACKENDS) + string(JOIN ", " _valid_decompression_backends ${YACREADER_DECOMPRESSION_BACKENDS}) + message(FATAL_ERROR + "Unknown DECOMPRESSION_BACKEND: '${DECOMPRESSION_BACKEND}'. " + "Use one of: ${_valid_decompression_backends}") +endif() + +# PDF rendering backend (mutually exclusive) +set(_pdf_backend_value "") +if(DEFINED CACHE{PDF_BACKEND}) + set(_pdf_backend_value "$CACHE{PDF_BACKEND}") +endif() +if(_pdf_backend_value STREQUAL "") + set(_pdf_backend_value "${_default_pdf_backend}") + string(JOIN ", " _available_pdf_backends ${YACREADER_PDF_BACKENDS}) + message(STATUS + "PDF_BACKEND not set, defaulting to ${_pdf_backend_value}. " + "Available: ${_available_pdf_backends}.") +endif() +set(PDF_BACKEND "${_pdf_backend_value}" CACHE STRING + "PDF backend: pdfium | poppler | pdfkit | no_pdf" FORCE) +set_property(CACHE PDF_BACKEND PROPERTY STRINGS ${YACREADER_PDF_BACKENDS}) +if(NOT PDF_BACKEND IN_LIST YACREADER_PDF_BACKENDS) + string(JOIN ", " _valid_pdf_backends ${YACREADER_PDF_BACKENDS}) + message(FATAL_ERROR + "Unknown PDF_BACKEND: '${PDF_BACKEND}'. " + "Use one of: ${_valid_pdf_backends}") endif() # macOS universal binary default @@ -114,7 +144,7 @@ endif() qt_standard_project_setup() # PDF backend detection (creates pdf_backend_iface INTERFACE target) -include(cmake/PdfBackend.cmake) +include(PdfBackend) # Output directory set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") diff --git a/cmake/BackendHelpers.cmake b/cmake/BackendHelpers.cmake new file mode 100644 index 000000000..9f15fb1f9 --- /dev/null +++ b/cmake/BackendHelpers.cmake @@ -0,0 +1,44 @@ +include_guard(GLOBAL) + +function(yacreader_get_windows_arch_subdir out_var) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64" OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64") + set(_arch "arm64") + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(_arch "x86") + else() + set(_arch "x64") + endif() + + set(${out_var} "${_arch}" PARENT_SCOPE) +endfunction() + +function(yacreader_add_imported_library target_name) + set(options) + set(oneValueArgs TYPE LOCATION IMPORTED_IMPLIB INCLUDE_DIR) + set(multiValueArgs LINK_LIBRARIES) + cmake_parse_arguments(YR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT YR_TYPE) + set(YR_TYPE UNKNOWN) + endif() + + if(NOT TARGET "${target_name}") + add_library("${target_name}" ${YR_TYPE} IMPORTED GLOBAL) + endif() + + if(YR_LOCATION) + set_property(TARGET "${target_name}" PROPERTY IMPORTED_LOCATION "${YR_LOCATION}") + endif() + + if(YR_IMPORTED_IMPLIB) + set_property(TARGET "${target_name}" PROPERTY IMPORTED_IMPLIB "${YR_IMPORTED_IMPLIB}") + endif() + + if(YR_INCLUDE_DIR) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${YR_INCLUDE_DIR}") + endif() + + if(YR_LINK_LIBRARIES) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_LINK_LIBRARIES "${YR_LINK_LIBRARIES}") + endif() +endfunction() diff --git a/cmake/PdfBackend.cmake b/cmake/PdfBackend.cmake index a9f9ce1fd..2a0a3aa32 100644 --- a/cmake/PdfBackend.cmake +++ b/cmake/PdfBackend.cmake @@ -2,6 +2,8 @@ # Creates an INTERFACE target 'pdf_backend_iface' that propagates # compile definitions and link libraries based on PDF_BACKEND. +include(BackendHelpers) + add_library(pdf_backend_iface INTERFACE) if(PDF_BACKEND STREQUAL "no_pdf") @@ -12,35 +14,62 @@ elseif(PDF_BACKEND STREQUAL "pdfium") message(STATUS "PDF backend: pdfium") target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFIUM) - if(MSVC) - target_include_directories(pdf_backend_iface INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64" OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64") - target_link_directories(pdf_backend_iface INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/arm64") - else() - target_link_directories(pdf_backend_iface INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/x64") + if(WIN32) + yacreader_get_windows_arch_subdir(_pdfium_arch) + set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") + set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib") + set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll") + if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h" + OR NOT EXISTS "${_pdfium_implib}" + OR NOT EXISTS "${_pdfium_dll}") + message(FATAL_ERROR + "Could not find bundled pdfium for ${_pdfium_arch}. " + "Expected files under dependencies/pdfium/win/${_pdfium_arch}.") endif() - target_link_libraries(pdf_backend_iface INTERFACE pdfium) + + message(STATUS " Using bundled pdfium (${_pdfium_arch}, Windows)") + yacreader_add_imported_library(YACReader::pdfium + TYPE SHARED + LOCATION "${_pdfium_dll}" + IMPORTED_IMPLIB "${_pdfium_implib}" + INCLUDE_DIR "${_pdfium_include_dir}") + target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) elseif(APPLE) - target_include_directories(pdf_backend_iface INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include") - target_link_directories(pdf_backend_iface INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin") - target_link_libraries(pdf_backend_iface INTERFACE pdfium) + set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include") + set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a") + if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h" OR NOT EXISTS "${_pdfium_library}") + message(FATAL_ERROR "Could not find bundled pdfium under dependencies/pdfium/macx.") + endif() + + message(STATUS " Using bundled pdfium (macOS)") + yacreader_add_imported_library(YACReader::pdfium + TYPE STATIC + LOCATION "${_pdfium_library}" + INCLUDE_DIR "${_pdfium_include_dir}") + target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) else() - # Linux: try pkg-config first, then system path - pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium) - if(PDFIUM_FOUND) + # Linux: try pkg-config first, then a normal CMake search. + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium) + endif() + + if(TARGET PkgConfig::PDFIUM) message(STATUS " Found pdfium via pkg-config") target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::PDFIUM) - elseif(EXISTS "/usr/include/pdfium") - message(STATUS " Found pdfium at /usr/include/pdfium") - target_include_directories(pdf_backend_iface INTERFACE /usr/include/pdfium) - target_link_libraries(pdf_backend_iface INTERFACE pdfium) else() - message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") + find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium) + find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium) + if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY) + message(STATUS " Found pdfium via CMake search") + yacreader_add_imported_library(YACReader::pdfium + TYPE UNKNOWN + LOCATION "${PDFIUM_LIBRARY}" + INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}") + target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) + else() + message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") + endif() endif() endif() @@ -60,20 +89,31 @@ elseif(PDF_BACKEND STREQUAL "poppler") target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6) else() # Fall back to pkg-config (standard on Linux; on Windows requires vcpkg pkgconf) - pkg_check_modules(POPPLER QUIET IMPORTED_TARGET poppler-qt6) - if(POPPLER_FOUND) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(POPPLER QUIET IMPORTED_TARGET poppler-qt6) + endif() + + if(TARGET PkgConfig::POPPLER) message(STATUS " Found poppler-qt6 via pkg-config") target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::POPPLER) - elseif(NOT MSVC AND EXISTS "/usr/include/poppler/qt6") - message(STATUS " Found poppler-qt6 at /usr/include/poppler/qt6") - target_include_directories(pdf_backend_iface INTERFACE /usr/include/poppler/qt6) - target_link_libraries(pdf_backend_iface INTERFACE poppler-qt6) elseif(MSVC) message(FATAL_ERROR "Could not find poppler-qt6. " "Install via vcpkg: vcpkg install poppler[qt6]:x64-windows " "then configure cmake with the vcpkg toolchain file.") else() - message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") + find_path(POPPLER_QT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6) + find_library(POPPLER_QT6_LIBRARY NAMES poppler-qt6) + if(POPPLER_QT6_INCLUDE_DIR AND POPPLER_QT6_LIBRARY) + message(STATUS " Found poppler-qt6 via CMake search") + yacreader_add_imported_library(YACReader::poppler_qt6 + TYPE UNKNOWN + LOCATION "${POPPLER_QT6_LIBRARY}" + INCLUDE_DIR "${POPPLER_QT6_INCLUDE_DIR}") + target_link_libraries(pdf_backend_iface INTERFACE YACReader::poppler_qt6) + else() + message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") + endif() endif() endif() diff --git a/compileOSX.sh b/compileOSX.sh index b75e3f9eb..460c96846 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -33,6 +33,7 @@ echo "Configuring and building with CMake" cmake -B build \ -G Ninja \ -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=pdfkit \ -DBUILD_NUMBER="${BUILD_NUMBER}" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_OSX_ARCHITECTURES="${ARCHS}" \ diff --git a/compressed_archive/CMakeLists.txt b/compressed_archive/CMakeLists.txt index 215f45abd..948b766ca 100644 --- a/compressed_archive/CMakeLists.txt +++ b/compressed_archive/CMakeLists.txt @@ -1,6 +1,8 @@ # Comic archive decompression backend (cbx_backend) # Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive +include(BackendHelpers) + add_library(cbx_backend STATIC) if(DECOMPRESSION_BACKEND STREQUAL "unarr") @@ -14,45 +16,78 @@ if(DECOMPRESSION_BACKEND STREQUAL "unarr") target_include_directories(cbx_backend PUBLIC unarr) target_compile_definitions(cbx_backend PUBLIC use_unarr) - # Try CMake config first, then pkg-config, then system path - find_package(unarr QUIET) - if(unarr_FOUND) + # Try CMake config first, then pkg-config, then bundled/system libraries. + set(_unarr_target "") + + find_package(unarr QUIET CONFIG) + if(TARGET unarr::unarr) message(STATUS " Found unarr via CMake config") - target_link_libraries(cbx_backend PRIVATE unarr::unarr) - else() + set(_unarr_target unarr::unarr) + endif() + + if(NOT _unarr_target AND APPLE) + set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") + set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}") + message(STATUS " Using bundled unarr (macOS)") + yacreader_add_imported_library(YACReader::unarr + TYPE STATIC + LOCATION "${_unarr_library}" + INCLUDE_DIR "${_unarr_include_dir}" + LINK_LIBRARIES "z;bz2") + set(_unarr_target YACReader::unarr) + endif() + endif() + + if(NOT _unarr_target AND WIN32) + yacreader_get_windows_arch_subdir(_unarr_arch) + set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win") + set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib") + set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}") + message(STATUS " Using bundled unarr (${_unarr_arch}, Windows)") + yacreader_add_imported_library(YACReader::unarr + TYPE SHARED + LOCATION "${_unarr_dll}" + IMPORTED_IMPLIB "${_unarr_implib}" + INCLUDE_DIR "${_unarr_include_dir}") + set(_unarr_target YACReader::unarr) + target_compile_definitions(cbx_backend PRIVATE UNARR_IS_SHARED_LIBRARY) + endif() + endif() + + if(NOT _unarr_target) + find_package(PkgConfig QUIET) + endif() + + if(NOT _unarr_target AND PkgConfig_FOUND) pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr) - if(UNARR_FOUND) + if(TARGET PkgConfig::UNARR) message(STATUS " Found unarr via pkg-config") - target_link_libraries(cbx_backend PRIVATE PkgConfig::UNARR) - elseif(APPLE AND EXISTS "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a") - message(STATUS " Found prebuilt unarr in dependencies (macOS)") - target_include_directories(cbx_backend PRIVATE - "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") - target_link_directories(cbx_backend PRIVATE - "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") - target_link_libraries(cbx_backend PRIVATE unarr z bz2) - elseif(WIN32 AND EXISTS "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/unarr.h") - message(STATUS " Found prebuilt unarr in dependencies (Windows)") - target_include_directories(cbx_backend PRIVATE - "${CMAKE_SOURCE_DIR}/dependencies/unarr/win") - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - target_link_directories(cbx_backend PRIVATE - "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/arm64") - else() - target_link_directories(cbx_backend PRIVATE - "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/x64") - endif() - target_link_libraries(cbx_backend PRIVATE unarr) - target_compile_definitions(cbx_backend PRIVATE UNARR_IS_SHARED_LIBRARY) - elseif(EXISTS "/usr/include/unarr.h") - message(STATUS " Found system unarr at /usr/include") - target_link_libraries(cbx_backend PRIVATE unarr) - else() - message(FATAL_ERROR - "Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.") + set(_unarr_target PkgConfig::UNARR) + endif() + endif() + + if(NOT _unarr_target) + find_path(UNARR_INCLUDE_DIR NAMES unarr.h) + find_library(UNARR_LIBRARY NAMES unarr libunarr) + if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY) + message(STATUS " Found unarr via CMake search") + yacreader_add_imported_library(YACReader::unarr + TYPE UNKNOWN + LOCATION "${UNARR_LIBRARY}" + INCLUDE_DIR "${UNARR_INCLUDE_DIR}") + set(_unarr_target YACReader::unarr) endif() endif() + if(NOT _unarr_target) + message(FATAL_ERROR + "Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.") + endif() + + target_link_libraries(cbx_backend PRIVATE ${_unarr_target}) + elseif(DECOMPRESSION_BACKEND STREQUAL "7zip") message(STATUS "Decompression backend: 7zip (in-tree)") @@ -135,18 +170,9 @@ elseif(DECOMPRESSION_BACKEND STREQUAL "libarchive") target_include_directories(cbx_backend PUBLIC libarchive) target_compile_definitions(cbx_backend PUBLIC use_libarchive) - # Try pkg-config first, then system path - pkg_check_modules(LIBARCHIVE QUIET IMPORTED_TARGET libarchive) - if(LIBARCHIVE_FOUND) - message(STATUS " Found libarchive via pkg-config") - target_link_libraries(cbx_backend PRIVATE PkgConfig::LIBARCHIVE) - elseif(EXISTS "/usr/include/archive.h") - message(STATUS " Found system libarchive at /usr/include") - target_link_libraries(cbx_backend PRIVATE archive) - else() - message(FATAL_ERROR - "Could not find libarchive. Install it or use a different DECOMPRESSION_BACKEND.") - endif() + find_package(LibArchive REQUIRED) + message(STATUS " Found libarchive ${LibArchive_VERSION}") + target_link_libraries(cbx_backend PRIVATE LibArchive::LibArchive) else() message(FATAL_ERROR diff --git a/docker/Dockerfile b/docker/Dockerfile index 50629fc77..bf87ed6b4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -65,6 +65,7 @@ RUN cd /src/git && \ cmake -B build -G Ninja \ -DCMAKE_INSTALL_PREFIX=/app \ -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ -DBUILD_SERVER_STANDALONE=ON \ -DCMAKE_BUILD_TYPE=Release && \ cmake --build build --parallel && \ diff --git a/docker/Dockerfile.aarch64 b/docker/Dockerfile.aarch64 index aa75208bc..5bb39b361 100644 --- a/docker/Dockerfile.aarch64 +++ b/docker/Dockerfile.aarch64 @@ -62,6 +62,7 @@ RUN cd /src/git && \ cmake -B build -G Ninja \ -DCMAKE_INSTALL_PREFIX=/app \ -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ -DBUILD_SERVER_STANDALONE=ON \ -DCMAKE_BUILD_TYPE=Release && \ cmake --build build --parallel && \ From 268b23376be551fe41c80f0c7cae4d99b8d7f980 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 29 Mar 2026 23:15:24 +0200 Subject: [PATCH 04/19] Use Find*.cmake files for backend discovery --- cmake/BackendHelpers.cmake | 6 +- cmake/FindPopplerQt6.cmake | 43 ++++++++++++++ cmake/Findpdfium.cmake | 72 +++++++++++++++++++++++ cmake/Findunarr.cmake | 74 +++++++++++++++++++++++ cmake/PdfBackend.cmake | 98 ++++++------------------------- compressed_archive/CMakeLists.txt | 72 +++-------------------- 6 files changed, 221 insertions(+), 144 deletions(-) create mode 100644 cmake/FindPopplerQt6.cmake create mode 100644 cmake/Findpdfium.cmake create mode 100644 cmake/Findunarr.cmake diff --git a/cmake/BackendHelpers.cmake b/cmake/BackendHelpers.cmake index 9f15fb1f9..38e8b4d03 100644 --- a/cmake/BackendHelpers.cmake +++ b/cmake/BackendHelpers.cmake @@ -15,7 +15,7 @@ endfunction() function(yacreader_add_imported_library target_name) set(options) set(oneValueArgs TYPE LOCATION IMPORTED_IMPLIB INCLUDE_DIR) - set(multiValueArgs LINK_LIBRARIES) + set(multiValueArgs LINK_LIBRARIES COMPILE_DEFINITIONS) cmake_parse_arguments(YR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT YR_TYPE) @@ -41,4 +41,8 @@ function(yacreader_add_imported_library target_name) if(YR_LINK_LIBRARIES) set_property(TARGET "${target_name}" PROPERTY INTERFACE_LINK_LIBRARIES "${YR_LINK_LIBRARIES}") endif() + + if(YR_COMPILE_DEFINITIONS) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_COMPILE_DEFINITIONS "${YR_COMPILE_DEFINITIONS}") + endif() endfunction() diff --git a/cmake/FindPopplerQt6.cmake b/cmake/FindPopplerQt6.cmake new file mode 100644 index 000000000..1b79501f5 --- /dev/null +++ b/cmake/FindPopplerQt6.cmake @@ -0,0 +1,43 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(PopplerQt6_PROVIDER "") +set(PopplerQt6_TARGET "") +set(PopplerQt6_INCLUDE_DIRS "") +set(PopplerQt6_LIBRARIES "") + +if(NOT TARGET Poppler::Qt6) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(POPPLERQT6 QUIET IMPORTED_TARGET poppler-qt6) + if(TARGET PkgConfig::POPPLERQT6) + yacreader_add_imported_library(Poppler::Qt6 + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::POPPLERQT6") + set(PopplerQt6_PROVIDER "pkg-config") + set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET Poppler::Qt6) + find_path(POPPLERQT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6) + find_library(POPPLERQT6_LIBRARY NAMES poppler-qt6) + if(POPPLERQT6_INCLUDE_DIR AND POPPLERQT6_LIBRARY) + yacreader_add_imported_library(Poppler::Qt6 + TYPE UNKNOWN + LOCATION "${POPPLERQT6_LIBRARY}" + INCLUDE_DIR "${POPPLERQT6_INCLUDE_DIR}") + set(PopplerQt6_PROVIDER "CMake search") + set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIR}") + endif() +endif() + +if(TARGET Poppler::Qt6) + set(PopplerQt6_TARGET Poppler::Qt6) + set(PopplerQt6_LIBRARIES Poppler::Qt6) +endif() + +find_package_handle_standard_args(PopplerQt6 REQUIRED_VARS PopplerQt6_TARGET) + +mark_as_advanced(POPPLERQT6_INCLUDE_DIR POPPLERQT6_LIBRARY) diff --git a/cmake/Findpdfium.cmake b/cmake/Findpdfium.cmake new file mode 100644 index 000000000..17689ecf1 --- /dev/null +++ b/cmake/Findpdfium.cmake @@ -0,0 +1,72 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(pdfium_PROVIDER "") +set(pdfium_TARGET "") +set(pdfium_INCLUDE_DIRS "") +set(pdfium_LIBRARIES "") + +if(NOT TARGET pdfium::pdfium AND WIN32) + yacreader_get_windows_arch_subdir(_pdfium_arch) + set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") + set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib") + set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll") + if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_implib}" AND EXISTS "${_pdfium_dll}") + yacreader_add_imported_library(pdfium::pdfium + TYPE SHARED + LOCATION "${_pdfium_dll}" + IMPORTED_IMPLIB "${_pdfium_implib}" + INCLUDE_DIR "${_pdfium_include_dir}") + set(pdfium_PROVIDER "bundled dependencies (${_pdfium_arch}, Windows)") + set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}") + endif() +endif() + +if(NOT TARGET pdfium::pdfium AND APPLE) + set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include") + set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a") + if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_library}") + yacreader_add_imported_library(pdfium::pdfium + TYPE STATIC + LOCATION "${_pdfium_library}" + INCLUDE_DIR "${_pdfium_include_dir}") + set(pdfium_PROVIDER "bundled dependencies (macOS)") + set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}") + endif() +endif() + +if(NOT TARGET pdfium::pdfium) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium) + if(TARGET PkgConfig::PDFIUM) + yacreader_add_imported_library(pdfium::pdfium + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::PDFIUM") + set(pdfium_PROVIDER "pkg-config") + set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET pdfium::pdfium) + find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium) + find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium) + if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY) + yacreader_add_imported_library(pdfium::pdfium + TYPE UNKNOWN + LOCATION "${PDFIUM_LIBRARY}" + INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}") + set(pdfium_PROVIDER "CMake search") + set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIR}") + endif() +endif() + +if(TARGET pdfium::pdfium) + set(pdfium_TARGET pdfium::pdfium) + set(pdfium_LIBRARIES pdfium::pdfium) +endif() + +find_package_handle_standard_args(pdfium REQUIRED_VARS pdfium_TARGET) + +mark_as_advanced(PDFIUM_INCLUDE_DIR PDFIUM_LIBRARY) diff --git a/cmake/Findunarr.cmake b/cmake/Findunarr.cmake new file mode 100644 index 000000000..4aa9ef0ab --- /dev/null +++ b/cmake/Findunarr.cmake @@ -0,0 +1,74 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(unarr_PROVIDER "") +set(unarr_TARGET "") +set(unarr_INCLUDE_DIRS "") +set(unarr_LIBRARIES "") + +if(NOT TARGET unarr::unarr AND APPLE) + set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") + set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}") + yacreader_add_imported_library(unarr::unarr + TYPE STATIC + LOCATION "${_unarr_library}" + INCLUDE_DIR "${_unarr_include_dir}" + LINK_LIBRARIES "z;bz2") + set(unarr_PROVIDER "bundled dependencies (macOS)") + set(unarr_INCLUDE_DIRS "${_unarr_include_dir}") + endif() +endif() + +if(NOT TARGET unarr::unarr AND WIN32) + yacreader_get_windows_arch_subdir(_unarr_arch) + set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win") + set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib") + set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}") + yacreader_add_imported_library(unarr::unarr + TYPE SHARED + LOCATION "${_unarr_dll}" + IMPORTED_IMPLIB "${_unarr_implib}" + INCLUDE_DIR "${_unarr_include_dir}" + COMPILE_DEFINITIONS "UNARR_IS_SHARED_LIBRARY") + set(unarr_PROVIDER "bundled dependencies (${_unarr_arch}, Windows)") + set(unarr_INCLUDE_DIRS "${_unarr_include_dir}") + endif() +endif() + +if(NOT TARGET unarr::unarr) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr) + if(TARGET PkgConfig::UNARR) + yacreader_add_imported_library(unarr::unarr + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::UNARR") + set(unarr_PROVIDER "pkg-config") + set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET unarr::unarr) + find_path(UNARR_INCLUDE_DIR NAMES unarr.h) + find_library(UNARR_LIBRARY NAMES unarr libunarr) + if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY) + yacreader_add_imported_library(unarr::unarr + TYPE UNKNOWN + LOCATION "${UNARR_LIBRARY}" + INCLUDE_DIR "${UNARR_INCLUDE_DIR}") + set(unarr_PROVIDER "CMake search") + set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIR}") + endif() +endif() + +if(TARGET unarr::unarr) + set(unarr_TARGET unarr::unarr) + set(unarr_LIBRARIES unarr::unarr) +endif() + +find_package_handle_standard_args(unarr REQUIRED_VARS unarr_TARGET) + +mark_as_advanced(UNARR_INCLUDE_DIR UNARR_LIBRARY) diff --git a/cmake/PdfBackend.cmake b/cmake/PdfBackend.cmake index 2a0a3aa32..dc7f48b54 100644 --- a/cmake/PdfBackend.cmake +++ b/cmake/PdfBackend.cmake @@ -2,8 +2,6 @@ # Creates an INTERFACE target 'pdf_backend_iface' that propagates # compile definitions and link libraries based on PDF_BACKEND. -include(BackendHelpers) - add_library(pdf_backend_iface INTERFACE) if(PDF_BACKEND STREQUAL "no_pdf") @@ -14,65 +12,21 @@ elseif(PDF_BACKEND STREQUAL "pdfium") message(STATUS "PDF backend: pdfium") target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFIUM) - if(WIN32) - yacreader_get_windows_arch_subdir(_pdfium_arch) - set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") - set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib") - set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll") - if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h" - OR NOT EXISTS "${_pdfium_implib}" - OR NOT EXISTS "${_pdfium_dll}") - message(FATAL_ERROR - "Could not find bundled pdfium for ${_pdfium_arch}. " - "Expected files under dependencies/pdfium/win/${_pdfium_arch}.") - endif() - - message(STATUS " Using bundled pdfium (${_pdfium_arch}, Windows)") - yacreader_add_imported_library(YACReader::pdfium - TYPE SHARED - LOCATION "${_pdfium_dll}" - IMPORTED_IMPLIB "${_pdfium_implib}" - INCLUDE_DIR "${_pdfium_include_dir}") - target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) - elseif(APPLE) - set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include") - set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a") - if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h" OR NOT EXISTS "${_pdfium_library}") - message(FATAL_ERROR "Could not find bundled pdfium under dependencies/pdfium/macx.") - endif() - - message(STATUS " Using bundled pdfium (macOS)") - yacreader_add_imported_library(YACReader::pdfium - TYPE STATIC - LOCATION "${_pdfium_library}" - INCLUDE_DIR "${_pdfium_include_dir}") - target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) + find_package(pdfium QUIET CONFIG) + if(TARGET pdfium::pdfium) + message(STATUS " Found pdfium via CMake config") else() - # Linux: try pkg-config first, then a normal CMake search. - find_package(PkgConfig QUIET) - if(PkgConfig_FOUND) - pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium) + find_package(pdfium QUIET MODULE) + if(NOT TARGET pdfium::pdfium) + message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") endif() - - if(TARGET PkgConfig::PDFIUM) - message(STATUS " Found pdfium via pkg-config") - target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::PDFIUM) - else() - find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium) - find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium) - if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY) - message(STATUS " Found pdfium via CMake search") - yacreader_add_imported_library(YACReader::pdfium - TYPE UNKNOWN - LOCATION "${PDFIUM_LIBRARY}" - INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}") - target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium) - else() - message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") - endif() + if(pdfium_PROVIDER) + message(STATUS " Found pdfium via ${pdfium_PROVIDER}") endif() endif() + target_link_libraries(pdf_backend_iface INTERFACE pdfium::pdfium) + elseif(PDF_BACKEND STREQUAL "poppler") message(STATUS "PDF backend: poppler") target_compile_definitions(pdf_backend_iface INTERFACE USE_POPPLER) @@ -85,38 +39,24 @@ elseif(PDF_BACKEND STREQUAL "poppler") # On Windows: vcpkg install poppler[qt6]:x64-windows, then pass the vcpkg toolchain file find_package(Poppler QUIET CONFIG) if(TARGET Poppler::Qt6) - message(STATUS " Found poppler-qt6 via cmake config") - target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6) + message(STATUS " Found poppler-qt6 via CMake config") else() - # Fall back to pkg-config (standard on Linux; on Windows requires vcpkg pkgconf) - find_package(PkgConfig QUIET) - if(PkgConfig_FOUND) - pkg_check_modules(POPPLER QUIET IMPORTED_TARGET poppler-qt6) - endif() - - if(TARGET PkgConfig::POPPLER) - message(STATUS " Found poppler-qt6 via pkg-config") - target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::POPPLER) + find_package(PopplerQt6 QUIET MODULE) + if(TARGET Poppler::Qt6) + if(PopplerQt6_PROVIDER) + message(STATUS " Found poppler-qt6 via ${PopplerQt6_PROVIDER}") + endif() elseif(MSVC) message(FATAL_ERROR "Could not find poppler-qt6. " "Install via vcpkg: vcpkg install poppler[qt6]:x64-windows " "then configure cmake with the vcpkg toolchain file.") else() - find_path(POPPLER_QT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6) - find_library(POPPLER_QT6_LIBRARY NAMES poppler-qt6) - if(POPPLER_QT6_INCLUDE_DIR AND POPPLER_QT6_LIBRARY) - message(STATUS " Found poppler-qt6 via CMake search") - yacreader_add_imported_library(YACReader::poppler_qt6 - TYPE UNKNOWN - LOCATION "${POPPLER_QT6_LIBRARY}" - INCLUDE_DIR "${POPPLER_QT6_INCLUDE_DIR}") - target_link_libraries(pdf_backend_iface INTERFACE YACReader::poppler_qt6) - else() - message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") - endif() + message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") endif() endif() + target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6) + elseif(PDF_BACKEND STREQUAL "pdfkit") message(STATUS "PDF backend: pdfkit (macOS)") if(NOT APPLE) diff --git a/compressed_archive/CMakeLists.txt b/compressed_archive/CMakeLists.txt index 948b766ca..928fb622f 100644 --- a/compressed_archive/CMakeLists.txt +++ b/compressed_archive/CMakeLists.txt @@ -1,8 +1,6 @@ # Comic archive decompression backend (cbx_backend) # Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive -include(BackendHelpers) - add_library(cbx_backend STATIC) if(DECOMPRESSION_BACKEND STREQUAL "unarr") @@ -16,77 +14,23 @@ if(DECOMPRESSION_BACKEND STREQUAL "unarr") target_include_directories(cbx_backend PUBLIC unarr) target_compile_definitions(cbx_backend PUBLIC use_unarr) - # Try CMake config first, then pkg-config, then bundled/system libraries. - set(_unarr_target "") - find_package(unarr QUIET CONFIG) if(TARGET unarr::unarr) message(STATUS " Found unarr via CMake config") - set(_unarr_target unarr::unarr) - endif() - - if(NOT _unarr_target AND APPLE) - set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") - set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a") - if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}") - message(STATUS " Using bundled unarr (macOS)") - yacreader_add_imported_library(YACReader::unarr - TYPE STATIC - LOCATION "${_unarr_library}" - INCLUDE_DIR "${_unarr_include_dir}" - LINK_LIBRARIES "z;bz2") - set(_unarr_target YACReader::unarr) - endif() - endif() - - if(NOT _unarr_target AND WIN32) - yacreader_get_windows_arch_subdir(_unarr_arch) - set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win") - set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib") - set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll") - if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}") - message(STATUS " Using bundled unarr (${_unarr_arch}, Windows)") - yacreader_add_imported_library(YACReader::unarr - TYPE SHARED - LOCATION "${_unarr_dll}" - IMPORTED_IMPLIB "${_unarr_implib}" - INCLUDE_DIR "${_unarr_include_dir}") - set(_unarr_target YACReader::unarr) - target_compile_definitions(cbx_backend PRIVATE UNARR_IS_SHARED_LIBRARY) - endif() - endif() - - if(NOT _unarr_target) - find_package(PkgConfig QUIET) - endif() - - if(NOT _unarr_target AND PkgConfig_FOUND) - pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr) - if(TARGET PkgConfig::UNARR) - message(STATUS " Found unarr via pkg-config") - set(_unarr_target PkgConfig::UNARR) - endif() + else() + find_package(unarr QUIET MODULE) endif() - if(NOT _unarr_target) - find_path(UNARR_INCLUDE_DIR NAMES unarr.h) - find_library(UNARR_LIBRARY NAMES unarr libunarr) - if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY) - message(STATUS " Found unarr via CMake search") - yacreader_add_imported_library(YACReader::unarr - TYPE UNKNOWN - LOCATION "${UNARR_LIBRARY}" - INCLUDE_DIR "${UNARR_INCLUDE_DIR}") - set(_unarr_target YACReader::unarr) - endif() - endif() - - if(NOT _unarr_target) + if(NOT TARGET unarr::unarr) message(FATAL_ERROR "Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.") endif() - target_link_libraries(cbx_backend PRIVATE ${_unarr_target}) + if(unarr_PROVIDER) + message(STATUS " Found unarr via ${unarr_PROVIDER}") + endif() + + target_link_libraries(cbx_backend PRIVATE unarr::unarr) elseif(DECOMPRESSION_BACKEND STREQUAL "7zip") message(STATUS "Decompression backend: 7zip (in-tree)") From 4376a898764000f7785e57a9d4c904f27fc903c9 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 29 Mar 2026 23:28:47 +0200 Subject: [PATCH 05/19] Better linux install handling --- CMakeLists.txt | 23 ----------------------- YACReader/CMakeLists.txt | 10 ++++++++++ YACReaderLibrary/CMakeLists.txt | 12 +++++++++++- YACReaderLibraryServer/CMakeLists.txt | 4 ++-- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24048b26e..4be52589c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,29 +187,6 @@ if(BUILD_TESTS AND NOT BUILD_SERVER_STANDALONE) add_subdirectory(tests) endif() -# --- Linux top-level install rules --- -if(UNIX AND NOT APPLE) - # Man pages - if(EXISTS "${CMAKE_SOURCE_DIR}/YACReader.1") - install(FILES YACReader.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) - endif() - if(EXISTS "${CMAKE_SOURCE_DIR}/YACReaderLibrary.1") - install(FILES YACReaderLibrary.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) - endif() - - # Desktop files - if(EXISTS "${CMAKE_SOURCE_DIR}/YACReader.desktop") - install(FILES YACReader.desktop YACReaderLibrary.desktop - DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) - endif() - - # Icons - if(EXISTS "${CMAKE_SOURCE_DIR}/YACReader.svg") - install(FILES YACReader.svg YACReaderLibrary.svg - DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps) - endif() -endif() - # Summary message(STATUS "") message(STATUS "YACReader ${PROJECT_VERSION} build configuration:") diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt index 02f3cca52..dd20fed22 100644 --- a/YACReader/CMakeLists.txt +++ b/YACReader/CMakeLists.txt @@ -129,5 +129,15 @@ endif() if(UNIX AND NOT APPLE) target_compile_definitions(YACReader PRIVATE "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"") + install(TARGETS YACReader RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.1" + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.desktop" + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.svg" + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps) endif() diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt index 5fff54c74..97c87db38 100644 --- a/YACReaderLibrary/CMakeLists.txt +++ b/YACReaderLibrary/CMakeLists.txt @@ -303,11 +303,21 @@ if(UNIX AND NOT APPLE) "LIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"" "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"" "BINDIR=\"${CMAKE_INSTALL_FULL_BINDIR}\"") + install(TARGETS YACReaderLibrary RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.1" + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.desktop" + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.svg" + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps) # Server web files (for bundled server mode) if(NOT BUILD_SERVER_STANDALONE) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/release/server + install(DIRECTORY "${PROJECT_SOURCE_DIR}/release/server" DESTINATION ${CMAKE_INSTALL_DATADIR}/yacreader) endif() endif() diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index f4a751692..16df0ac9e 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -85,11 +85,11 @@ if(UNIX AND NOT APPLE) # Standalone server: install server web files alongside the binary if(BUILD_SERVER_STANDALONE) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/release/server + install(DIRECTORY "${PROJECT_SOURCE_DIR}/release/server" DESTINATION ${CMAKE_INSTALL_DATADIR}/yacreader) endif() # systemd service - install(FILES yacreaderlibraryserver.service + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/yacreaderlibraryserver.service" DESTINATION ${CMAKE_INSTALL_LIBDIR}/systemd/user) endif() From e40dd9b22a59ebf2b40dd3a2e8d3593150a91df8 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 08:32:20 +0200 Subject: [PATCH 06/19] Clean up CompilerOptions.cmake --- CMakeLists.txt | 2 +- cmake/CompilerOptions.cmake | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4be52589c..e000cfe6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ endif() include(GNUInstallDirs) list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -# Compiler options (MSVC flags, NOMINMAX, etc.) +# Compiler options (MSVC flags) include(cmake/CompilerOptions.cmake) # --- Build options --- diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake index 2b1378dc7..2ef38eb32 100644 --- a/cmake/CompilerOptions.cmake +++ b/cmake/CompilerOptions.cmake @@ -1,20 +1,11 @@ # Compiler options for YACReader -# Mirrors config.pri: C++20, NOMINMAX, MSVC conformance flags - -add_compile_definitions(NOMINMAX) if(MSVC) + # Prevent windows.h from defining min/max macros that conflict with + # std::min, std::max, std::numeric_limits::max(), etc. + add_compile_definitions(NOMINMAX) + # /Zc:__cplusplus: report correct __cplusplus value # /permissive-: strict standard conformance add_compile_options(/Zc:__cplusplus /permissive-) - - # Release optimizations (mirrors qmake QMAKE_CXXFLAGS_RELEASE) - string(APPEND CMAKE_CXX_FLAGS_RELEASE " /DNDEBUG") -elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - string(APPEND CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG") endif() - -# Qt deprecation warnings -add_compile_definitions( - QT_DEPRECATED_WARNINGS -) From be3f140aeadd0b499cec4f9f0778d40888c7cd50 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 08:44:58 +0200 Subject: [PATCH 07/19] Remove QT_DISABLE_DEPRECATED_BEFORE from PdfBackend.cmake --- cmake/PdfBackend.cmake | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cmake/PdfBackend.cmake b/cmake/PdfBackend.cmake index dc7f48b54..e27775945 100644 --- a/cmake/PdfBackend.cmake +++ b/cmake/PdfBackend.cmake @@ -67,11 +67,3 @@ elseif(PDF_BACKEND STREQUAL "pdfkit") else() message(FATAL_ERROR "Unknown PDF_BACKEND: '${PDF_BACKEND}'. Use: pdfium, poppler, pdfkit, or no_pdf") endif() - -# Set QT_DISABLE_DEPRECATED_BEFORE based on backend -# poppler requires older deprecated API -if(PDF_BACKEND STREQUAL "poppler") - target_compile_definitions(pdf_backend_iface INTERFACE QT_DISABLE_DEPRECATED_BEFORE=0x050900) -else() - target_compile_definitions(pdf_backend_iface INTERFACE QT_DISABLE_DEPRECATED_BEFORE=0x050F00) -endif() From 12a5949b16b6e3c4bc342f8ecaac2b9765c2ff9c Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 08:51:00 +0200 Subject: [PATCH 08/19] Use QT_DISABLE_DEPRECATED_UP_TO globally Set to 6.4 until we can bump up the minimum qt version in the server project. --- cmake/CompilerOptions.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake index 2ef38eb32..c90fa6f8d 100644 --- a/cmake/CompilerOptions.cmake +++ b/cmake/CompilerOptions.cmake @@ -9,3 +9,5 @@ if(MSVC) # /permissive-: strict standard conformance add_compile_options(/Zc:__cplusplus /permissive-) endif() + +add_compile_definitions(QT_DISABLE_DEPRECATED_UP_TO=0x060400) From e6cbfa634bfd6194c772964754882537d995f2ab Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 15:48:02 +0200 Subject: [PATCH 09/19] Fix all compilation issues after enabling QT_DISABLE_DEPRECATED_UP_TO --- YACReader/bookmarks_dialog.cpp | 4 +- YACReader/main.cpp | 6 -- YACReader/main_window_viewer.cpp | 4 +- YACReaderLibrary/comic_files_manager.cpp | 9 ++- ...comic_vine_all_volume_comics_retriever.cpp | 6 +- .../comic_vine/comic_vine_dialog.cpp | 12 +-- .../comic_vine/comic_vine_json_parser.cpp | 4 +- .../comic_vine/model/volume_comics_model.cpp | 2 +- .../comic_vine/sort_volume_comics.cpp | 4 +- YACReaderLibrary/comics_view.cpp | 6 +- .../current_comic_view_helper.cpp | 4 +- YACReaderLibrary/db/comic_model.cpp | 78 +++++++++++-------- YACReaderLibrary/db/data_base_management.cpp | 9 +-- YACReaderLibrary/db/folder_model.cpp | 10 +-- YACReaderLibrary/db/reading_list_model.cpp | 2 +- YACReaderLibrary/db_helper.cpp | 45 ++++++----- YACReaderLibrary/folder_content_view.cpp | 2 +- YACReaderLibrary/grid_comics_view.cpp | 2 +- YACReaderLibrary/import_widget.cpp | 4 +- YACReaderLibrary/info_comics_view.cpp | 2 +- YACReaderLibrary/library_creator.cpp | 6 +- YACReaderLibrary/library_window.cpp | 20 +++-- YACReaderLibrary/main.cpp | 6 -- .../controllers/v2/librariescontroller_v2.cpp | 2 +- .../controllers/v2/synccontroller_v2.cpp | 14 ++-- YACReaderLibrary/server/static.cpp | 4 +- YACReaderLibrary/yacreader_folders_view.cpp | 8 +- YACReaderLibrary/yacreader_libraries.cpp | 29 +++---- YACReaderLibrary/yacreader_libraries.h | 24 +++--- .../yacreader_reading_lists_view.cpp | 2 +- YACReaderLibraryServer/CMakeLists.txt | 4 - YACReaderLibraryServer/images.qrc | 6 -- YACReaderLibraryServer/libraries_updater.cpp | 4 +- common/bookmarks.cpp | 4 +- common/comic.cpp | 21 ++--- common/rhi/yacreader_comic_flow_rhi.cpp | 4 +- compressed_archive/compressed_archive.cpp | 4 +- custom_widgets/yacreader_macosx_toolbar.mm | 2 +- custom_widgets/yacreader_table_view.cpp | 2 +- custom_widgets/yacreader_treeview.cpp | 5 +- shortcuts_management/shortcuts_manager.cpp | 4 +- tests/compressed_archive_test/main.cpp | 5 +- .../unittest/QtTestUtil/TestRegistry.cpp | 7 +- third_party/QsLog/unittest/TestLog.h | 2 +- .../httpserver/httpconnectionhandlerpool.cpp | 7 +- .../QtWebApp/httpserver/httpcookie.cpp | 3 +- .../QtWebApp/httpserver/httprequest.cpp | 9 ++- .../QtWebApp/httpserver/httpresponse.cpp | 5 +- .../templateengine/templateloader.cpp | 5 +- 49 files changed, 228 insertions(+), 205 deletions(-) delete mode 100644 YACReaderLibraryServer/images.qrc diff --git a/YACReader/bookmarks_dialog.cpp b/YACReader/bookmarks_dialog.cpp index 1d3153945..6348d7016 100644 --- a/YACReader/bookmarks_dialog.cpp +++ b/YACReader/bookmarks_dialog.cpp @@ -9,6 +9,8 @@ #include #include +#include + BookmarksDialog::BookmarksDialog(QWidget *parent) : QDialog(parent) { @@ -28,7 +30,7 @@ BookmarksDialog::BookmarksDialog(QWidget *parent) QString labelsStyle = "QLabel {color:white;}"; - foreach (QLabel *label, pages) { + for (QLabel *const label : std::as_const(pages)) { label->setStyleSheet(labelsStyle); } diff --git a/YACReader/main.cpp b/YACReader/main.cpp index c4485b6c6..85437d982 100644 --- a/YACReader/main.cpp +++ b/YACReader/main.cpp @@ -92,12 +92,6 @@ int main(int argc, char *argv[]) { qInstallMessageHandler(messageHandler); - static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO"; - if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO) && !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) { - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - } - - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); QImageReader::setAllocationLimit(0); diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index 80a513c57..6070cd3c2 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -984,7 +984,7 @@ void MainWindowViewer::openFolderFromPath(QString pathDir, QString atFileName) std::sort(list.begin(), list.end(), naturalSortLessThanCI); int i = 0; - foreach (QString path, list) { + for (const QString &path : std::as_const(list)) { if (path.endsWith(atFileName)) break; i++; @@ -1554,7 +1554,7 @@ void MainWindowViewer::getSiblingComics(QString path, QString currentComic) txtS << path << '\n'; txtS << currentComic << '\n'; txtS << "Comic list count : " + list.count() << '\n'; - foreach(QString s, list){ + for (const QString &s : std::as_const(list)) { txtS << s << '\n'; } f.close(); diff --git a/YACReaderLibrary/comic_files_manager.cpp b/YACReaderLibrary/comic_files_manager.cpp index 517c4f121..9512def19 100644 --- a/YACReaderLibrary/comic_files_manager.cpp +++ b/YACReaderLibrary/comic_files_manager.cpp @@ -33,7 +33,7 @@ QList> ComicFilesManager::getDroppedFiles(const QList> dropedFiles; QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { currentPath = url.toLocalFile(); if (currentPath.endsWith('/')) currentPath = currentPath.remove(currentPath.length() - 1, 1); // QTBUG-35896 QUrl.toLocalFile inconsistency. @@ -44,7 +44,8 @@ QList> ComicFilesManager::getDroppedFiles(const QList source; - foreach (source, comics) { + const auto &comicSources = comics; + for (const auto &source : comicSources) { if (canceled) { if (successProcesingFiles) diff --git a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp index 58afc5a47..6e5092d38 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp @@ -54,7 +54,7 @@ QString ComicVineAllVolumeComicsRetriever::consolidateJSON() QJsonObject consolidatedJSON; QJsonArray comicsInfo; - foreach (QByteArray json, jsonResponses) { + for (const auto &json : jsonResponses) { QJsonDocument doc = QJsonDocument::fromJson(json); if (doc.isNull() || !doc.isObject() || doc.isEmpty()) { @@ -72,8 +72,8 @@ QString ComicVineAllVolumeComicsRetriever::consolidateJSON() continue; } - QJsonArray resultsArray = results.toArray(); - foreach (const QJsonValue &v, resultsArray) + const auto resultsArray = results.toArray(); + for (const auto &v : resultsArray) comicsInfo.append(v); } } diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp index 15effb3a2..ff4910e32 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp @@ -442,23 +442,23 @@ void ComicVineDialog::queryTimeOut() void ComicVineDialog::getComicsInfo(QList> matchingInfo, const SelectedVolumeInfo &volumeInfo) { - QPair p; QList comics; - foreach (p, matchingInfo) { + const auto &matches = matchingInfo; + for (auto match : matches) { auto comicVineClient = new ComicVineClient; // connect(comicVineClient,SIGNAL(searchResult(QString)),this,SLOT(debugClientResults(QString))); // connect(comicVineClient,SIGNAL(timeOut()),this,SLOT(queryTimeOut())); // connect(comicVineClient,SIGNAL(finished()),comicVineClient,SLOT(deleteLater())); bool error; bool timeout; - QByteArray result = comicVineClient->getComicDetail(p.second, error, timeout); // TODO check timeOut or Connection error + QByteArray result = comicVineClient->getComicDetail(match.second, error, timeout); // TODO check timeOut or Connection error if (error || timeout) continue; // TODO - ComicDB comic = YACReader::parseCVJSONComicInfo(p.first, result, volumeInfo); // TODO check result error - comic.info.comicVineID = p.second; + ComicDB comic = YACReader::parseCVJSONComicInfo(match.first, result, volumeInfo); // TODO check result error + comic.info.comicVineID = match.second; comics.push_back(comic); - setLoadingMessage(tr("Retrieving tags for : %1").arg(p.first.getFileName())); + setLoadingMessage(tr("Retrieving tags for : %1").arg(match.first.getFileName())); } DBHelper::updateComicsInfo(comics, databasePath); diff --git a/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp b/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp index 90ac8244a..1b0c93462 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp @@ -142,8 +142,8 @@ QMultiMap getAuthors(const QVariant &json_authors) QString authorName = resultsValue.value("name").toString(); - QStringList roles = resultsValue.value("role").toString().split(","); - foreach (QString role, roles) { + const QStringList roles = resultsValue.value("role").toString().split(","); + for (const auto &role : roles) { if (role.trimmed() == "writer") authors.insert("writer", authorName); else if (role.trimmed() == "inker") diff --git a/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp b/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp index d88700a92..579b6a642 100644 --- a/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp +++ b/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp @@ -47,7 +47,7 @@ void VolumeComicsModel::load(const QString &json) /*void VolumeComicsModel::load(const QStringList &jsonList) { - foreach (QString json, jsonList) { + for (const auto &json : jsonList) { load(json); } }*/ diff --git a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp index 16cf75c65..c6823bd75 100644 --- a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp +++ b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp @@ -247,13 +247,13 @@ void SortVolumeComics::showRemovedComicsSelector() QList> SortVolumeComics::getMatchingInfo() { - QList comicList = localComicsModel->getData(); + const auto comicList = localComicsModel->getData(); QList> l; int index = 0; QString id; - foreach (ComicDB c, comicList) { + for (const auto &c : comicList) { id = volumeComicsModel->getComicId(index); if (!c.getFileName().isEmpty() && !id.isEmpty()) // there is a valid comic, and valid comic ID { diff --git a/YACReaderLibrary/comics_view.cpp b/YACReaderLibrary/comics_view.cpp index c00d0aa4f..149b2057f 100644 --- a/YACReaderLibrary/comics_view.cpp +++ b/YACReaderLibrary/comics_view.cpp @@ -81,12 +81,10 @@ void ComicsView::dragEnterEvent(QDragEnterEvent *event) event->acceptProposedAction(); else { QLOG_TRACE() << "dragEnterEvent"; - QList urlList; - if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { - urlList = event->mimeData()->urls(); + const auto urlList = event->mimeData()->urls(); QString currentPath; - foreach (QUrl url, urlList) { + for (const auto &url : urlList) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { diff --git a/YACReaderLibrary/current_comic_view_helper.cpp b/YACReaderLibrary/current_comic_view_helper.cpp index 988190787..025502945 100644 --- a/YACReaderLibrary/current_comic_view_helper.cpp +++ b/YACReaderLibrary/current_comic_view_helper.cpp @@ -4,9 +4,9 @@ ComicDB currentComicFromModel(ComicModel *model, bool &found) { - auto comics = model->getAllComics(); + const auto comics = model->getAllComics(); - foreach (auto comic, comics) { + for (const auto &comic : comics) { if (comic.info.read == false) { found = true; return comic; diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index 01cf7039f..501d09520 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -74,17 +74,20 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int if (!data->formats().contains(YACReader::YACReaderLibrarComiscSelectionMimeDataFormat)) return false; - QList comicIds = YACReader::mimeDataToComicsIds(data); + const QList comicIds = YACReader::mimeDataToComicsIds(data); QList currentIndexes; int i; - foreach (qulonglong id, comicIds) { - i = 0; - foreach (ComicItem *item, _data) { - if (item->data(Id) == id) { - currentIndexes << i; - break; + { + const auto ¤tData = _data; + for (const auto id : comicIds) { + i = 0; + for (auto *item : currentData) { + if (item->data(Id) == id) { + currentIndexes << i; + break; + } + i++; } - i++; } } @@ -102,26 +105,30 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int QList newSorting; - i = 0; - foreach (ComicItem *item, _data) { - if (!currentIndexes.contains(i)) { - - if (item == destinationItem) { - foreach (int index, currentIndexes) { - resortedData << _data.at(index); - newSorting << index; + const auto ¤tIndexList = currentIndexes; + { + const auto ¤tData = _data; + i = 0; + for (auto *item : currentData) { + if (!currentIndexes.contains(i)) { + + if (item == destinationItem) { + for (const auto index : currentIndexList) { + resortedData << _data.at(index); + newSorting << index; + } } + + resortedData << item; + newSorting << i; } - resortedData << item; - newSorting << i; + i++; } - - i++; } if (destinationItem == 0) { - foreach (int index, currentIndexes) { + for (const auto index : currentIndexList) { resortedData << _data.at(index); newSorting << index; } @@ -134,9 +141,10 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int if (tempRow < 0) tempRow = _data.count(); - foreach (qulonglong id, comicIds) { + for (const auto id : comicIds) { int i = 0; - foreach (ComicItem *item, _data) { + const auto dataSnapshot = _data; + for (auto *item : dataSnapshot) { if (item->data(Id) == id) { beginMoveRows(parent, i, i, parent, tempRow); @@ -162,7 +170,8 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int // TODO fix selection QList allComicIds; - foreach (ComicItem *item, _data) { + const auto &allData = _data; + for (auto *item : allData) { allComicIds << item->data(Id).toULongLong(); } QString connectionName = ""; @@ -211,7 +220,7 @@ QMimeData *ComicModel::mimeData(const QModelIndexList &indexes) const // custom model data // application/yacreader-comics-ids + list of ids in a QByteArray QList ids; - foreach (QModelIndex index, indexes) { + for (const auto &index : indexes) { QLOG_DEBUG() << "dragging : " << index.data(IdRole).toULongLong(); ids << index.data(IdRole).toULongLong(); } @@ -605,7 +614,8 @@ QList ComicModel::createReadingListData(unsigned long long parentRe enableResorting = ids.length() == 1; // only resorting if no sublists exist - foreach (qulonglong id, ids) { + const auto &readingListIds = ids; + for (const auto id : readingListIds) { QSqlQuery selectQuery(db); selectQuery.prepare("SELECT " COMIC_MODEL_QUERY_FIELDS " " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " @@ -996,10 +1006,11 @@ QList ComicModel::getComics(QList list) QVector ComicModel::setComicsRead(QList list, YACReaderComicReadStatus read) { QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { if (read == YACReader::Read) { _data.value(mi.row())->setData(ComicModel::ReadColumn, QVariant(true)); bool found; @@ -1033,10 +1044,11 @@ QVector ComicModel::setComicsRead(QList l void ComicModel::setComicsType(QList list, FileType type) { QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { bool found; ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db, found); c.info.type = QVariant::fromValue(type); @@ -1047,7 +1059,7 @@ void ComicModel::setComicsType(QList list, FileType type) } QSqlDatabase::removeDatabase(connectionName); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { _data.value(mi.row())->setData(ComicModel::Type, QVariant::fromValue(type)); } @@ -1058,12 +1070,13 @@ qint64 ComicModel::asignNumbers(QList list, int startingNumber) { qint64 idFirst; QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); idFirst = _data.value(list[0].row())->data(ComicModel::Id).toULongLong(); int i = 0; - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { bool found; ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db, found); c.info.number = startingNumber + i; @@ -1097,7 +1110,7 @@ QList ComicModel::getIndexesFromIds(const QList &comicI { QList comicsIndexes; - foreach (qulonglong id, comicIds) + for (const auto id : comicIds) comicsIndexes << getIndexFromId(id); return comicsIndexes; @@ -1180,7 +1193,8 @@ void ComicModel::reload(const ComicDB &comic) { int row = 0; bool found = false; - foreach (ComicItem *item, _data) { + const auto ¤tData = _data; + for (auto *item : currentData) { if (item->data(ComicModel::Id).toULongLong() == comic.id) { found = true; item->setData(ComicModel::ReadColumn, comic.info.read); diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 05d1cceb1..767da97b4 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -753,8 +753,7 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest) } destDB.commit(); - QString hash; - foreach (hash, hashes) { + for (const auto &hash : hashes) { QSqlQuery getComic(destDB); getComic.prepare("SELECT c.path,ci.coverPage FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) where ci.hash = :hash"); getComic.bindValue(":hash", hash); @@ -860,7 +859,7 @@ bool DataBaseManagement::addColumns(const QString &tableName, const QStringList QString sql = "ALTER TABLE %1 ADD COLUMN %2"; bool returnValue = true; - foreach (QString columnDef, columnDefs) { + for (const auto &columnDef : columnDefs) { QSqlQuery alterTable(db); alterTable.prepare(sql.arg(tableName).arg(columnDef)); // alterTableComicInfo.bindValue(":column_def",columnDef); @@ -925,10 +924,10 @@ int DataBaseManagement::compareVersions(const QString &v1, const QString v2) QList v1il; QList v2il; - foreach (QString s, v1l) + for (const auto &s : v1l) v1il.append(s.toInt()); - foreach (QString s, v2l) + for (const auto &s : v2l) v2il.append(s.toInt()); for (int i = 0; i < qMin(v1il.length(), v2il.length()); i++) { diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index de9b6b7a8..3048f60fd 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -196,7 +196,7 @@ void FolderModel::reload() takeUpdatedChildrenInfo(rootItem, QModelIndex(), newModelData.rootItem); // copy items from newModelData to this model that are not in this model - foreach (auto key, newModelData.items.keys()) { + for (const auto key : newModelData.items.keys()) { if (!items.contains(key)) { items[key] = (newModelData.items[key]); } @@ -221,7 +221,7 @@ void FolderModel::reload() items = newModelData.items; // copy items from newModelData to this model that are not in this model - foreach (auto key, newModelData.items.keys()) { + for (const auto key : newModelData.items.keys()) { if (!items.contains(key)) { items[key] = (newModelData.items[key]); } @@ -605,7 +605,7 @@ void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); item->setData(FolderModel::Completed, status); @@ -629,7 +629,7 @@ void FolderModel::updateFolderFinishedStatus(const QModelIndexList &list, bool s { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); item->setData(FolderModel::Finished, status); @@ -653,7 +653,7 @@ void FolderModel::updateFolderType(const QModelIndexList &list, YACReader::FileT { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); std::function setType; diff --git a/YACReaderLibrary/db/reading_list_model.cpp b/YACReaderLibrary/db/reading_list_model.cpp index d503042ab..b3391658c 100644 --- a/YACReaderLibrary/db/reading_list_model.cpp +++ b/YACReaderLibrary/db/reading_list_model.cpp @@ -711,7 +711,7 @@ void ReadingListModel::reorderingChildren(QList children) { QList childrenIds; int i = 0; - foreach (ReadingListItem *item, children) { + for (auto *item : children) { item->setOrdering(i++); childrenIds << item->getId(); } diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index a0c4d4735..9e8afe145 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -436,7 +436,8 @@ QList DBHelper::getReadingListFullContent(qulonglong libraryId, qulongl while (subfolders.next()) ids << subfolders.value(0).toULongLong(); - foreach (qulonglong id, ids) { + const auto &subfolderIds = ids; + for (const auto id : subfolderIds) { QSqlQuery selectQuery(db); QString params; @@ -546,7 +547,7 @@ void DBHelper::deleteComicsFromFavorites(const QList &comicsList, QSqlD QSqlQuery query(db); query.prepare("DELETE FROM comic_default_reading_list WHERE comic_id = :comic_id AND default_reading_list_id = 1"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.exec(); } @@ -578,7 +579,7 @@ void DBHelper::deleteComicsFromLabel(const QList &comicsList, qulonglon QSqlQuery query(db); query.prepare("DELETE FROM comic_label WHERE comic_id = :comic_id AND label_id = :label_id"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":label_id", labelId); query.exec(); @@ -598,7 +599,7 @@ void DBHelper::deleteComicsFromReadingList(const QList &comicsList, qul QSqlQuery query(db); query.prepare("DELETE FROM comic_reading_list WHERE comic_id = :comic_id AND reading_list_id = :reading_list_id"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":reading_list_id", readingListId); query.exec(); @@ -1086,7 +1087,8 @@ QMap> DBHelper::updateFromRemoteClient(const QMap> moreRecentComics; - foreach (qulonglong libraryId, comics.keys()) { + const auto libraryIds = comics.keys(); + for (const auto libraryId : libraryIds) { QList libraryMoreRecentComics; QString libraryPath = DBHelper::getLibraries().getPath(libraryId); @@ -1108,7 +1110,8 @@ QMap> DBHelper::updateFromRemoteClient(const QMap comicInfo.id contains comic id ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found); @@ -1193,11 +1196,10 @@ QMap> DBHelper::updateFromRemoteClient(const QMap &comics) { - YACReaderLibraries libraries = DBHelper::getLibraries(); + const YACReaderLibraries libraries = DBHelper::getLibraries(); + const QStringList names = libraries.getNames(); - QStringList names = libraries.getNames(); - - foreach (QString name, names) { + for (const auto &name : names) { QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name)); QString connectionName = ""; { @@ -1214,7 +1216,7 @@ void DBHelper::updateFromRemoteClientWithHash(const QList &comics) "rating = :rating" " WHERE id = :id "); - foreach (ComicInfo comicInfo, comics) { + for (const auto &comicInfo : comics) { ComicInfo info = loadComicInfo(comicInfo.hash, db); if (!info.existOnDb) { @@ -1285,7 +1287,8 @@ void DBHelper::reasignOrderToSublists(QList ids, QSqlDatabase &db) "WHERE id = :id"); db.transaction(); int order = 0; - foreach (qulonglong id, ids) { + const auto &readingListIds = ids; + for (const auto id : readingListIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":id", id); updateOrdering.exec(); @@ -1302,7 +1305,8 @@ void DBHelper::reasignOrderToComicsInFavorites(QList comicIds, QSqlD "WHERE comic_id = :comic_id AND default_reading_list_id = 1"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &favoriteComicIds = comicIds; + for (const auto id : favoriteComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.exec(); @@ -1319,7 +1323,8 @@ void DBHelper::reasignOrderToComicsInLabel(qulonglong labelId, QList "WHERE comic_id = :comic_id AND label_id = :label_id"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &labelComicIds = comicIds; + for (const auto id : labelComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.bindValue(":label_id", labelId); @@ -1337,7 +1342,8 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList "WHERE comic_id = :comic_id AND reading_list_id = :reading_list_id"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &readingListComicIds = comicIds; + for (const auto id : readingListComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.bindValue(":reading_list_id", readingListId); @@ -1355,7 +1361,8 @@ void DBHelper::updateComicsInfo(QList &comics, const QString &databaseP QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); db.open(); db.transaction(); - foreach (ComicDB comic, comics) { + const auto &comicsRef = comics; + for (auto comic : comicsRef) { DBHelper::update(&(comic.info), db); } db.commit(); @@ -1487,7 +1494,7 @@ void DBHelper::insertComicsInFavorites(const QList &comicsList, QSqlDat query.prepare("INSERT INTO comic_default_reading_list (default_reading_list_id, comic_id, ordering) " "VALUES (1, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); query.exec(); @@ -1511,7 +1518,7 @@ void DBHelper::insertComicsInLabel(const QList &comicsList, qulonglong query.prepare("INSERT INTO comic_label (label_id, comic_id, ordering) " "VALUES (:label_id, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":label_id", labelId); query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); @@ -1536,7 +1543,7 @@ void DBHelper::insertComicsInReadingList(const QList &comicsList, qulon query.prepare("INSERT INTO comic_reading_list (reading_list_id, comic_id, ordering) " "VALUES (:reading_list_id, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":reading_list_id", readingListId); query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); diff --git a/YACReaderLibrary/folder_content_view.cpp b/YACReaderLibrary/folder_content_view.cpp index ec6a5d27b..b14e51871 100644 --- a/YACReaderLibrary/folder_content_view.cpp +++ b/YACReaderLibrary/folder_content_view.cpp @@ -236,7 +236,7 @@ bool FolderContentView::canDropUrls(const QList &urls, Qt::DropAction acti { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) diff --git a/YACReaderLibrary/grid_comics_view.cpp b/YACReaderLibrary/grid_comics_view.cpp index 804891e93..26fd4aaf4 100644 --- a/YACReaderLibrary/grid_comics_view.cpp +++ b/YACReaderLibrary/grid_comics_view.cpp @@ -452,7 +452,7 @@ bool GridComicsView::canDropUrls(const QList &urls, Qt::DropAction action) { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) diff --git a/YACReaderLibrary/import_widget.cpp b/YACReaderLibrary/import_widget.cpp index 9dafa3958..522e46568 100644 --- a/YACReaderLibrary/import_widget.cpp +++ b/YACReaderLibrary/import_widget.cpp @@ -215,7 +215,7 @@ void ImportWidget::newComic(const QString &path, const QString &coverPath) previousWidth += 10 + p.width(); - foreach (QGraphicsItem *itemToRemove, coversScene->items()) { + for (auto *itemToRemove : coversScene->items()) { auto last = dynamic_cast(itemToRemove); if ((last->pos().x() + last->pixmap().width()) < coversView->horizontalScrollBar()->value()) // TODO check this @@ -263,7 +263,7 @@ void ImportWidget::addCoverTest() } else j++; - foreach (QGraphicsItem *itemToMove, coversScene->items()) { + for (auto *itemToMove : coversScene->items()) { auto timer = new QTimeLine(/*350*/ 1000); timer->setFrameRange(0, 60); diff --git a/YACReaderLibrary/info_comics_view.cpp b/YACReaderLibrary/info_comics_view.cpp index 47d118cba..f86327d52 100644 --- a/YACReaderLibrary/info_comics_view.cpp +++ b/YACReaderLibrary/info_comics_view.cpp @@ -189,7 +189,7 @@ bool InfoComicsView::canDropUrls(const QList &urls, Qt::DropAction action) { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 4bfdfffb9..3b55c3af3 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -100,7 +100,7 @@ void LibraryCreator::updateFolder(const QString &source, const QString &target, _currentPathFolders.append(rootFolder(db)); - foreach (QString folderName, folders) { + for (const auto &folderName : folders) { if (folderName.isEmpty()) { break; } @@ -472,7 +472,7 @@ void LibraryCreator::update(QDir dirS) listS.append(listSFolders); listS.append(listSFiles); // QLOG_DEBUG() << "---------------------------------------------------------"; - // foreach(QFileInfo info,listS) + // for (const QFileInfo &info : listS) // QLOG_DEBUG() << info.fileName(); // QLOG_TRACE() << "END Getting info from dir" << dirS.absolutePath(); @@ -488,7 +488,7 @@ void LibraryCreator::update(QDir dirS) listD.append(folders); listD.append(comics); // QLOG_DEBUG() << "---------------------------------------------------------"; - // foreach(LibraryItem * info,listD) + // for (auto *info : listD) // QLOG_DEBUG() << info->name; // QLOG_DEBUG() << "---------------------------------------------------------"; int lenghtS = listS.size(); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 8e455b950..f7ceb3743 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -1582,7 +1582,7 @@ void LibraryWindow::setupAddToSubmenu(QMenu &menu) const QList labels = listsModel->getLabels(); if (labels.count() > 0) menu.addSeparator(); - foreach (LabelItem *label, labels) { + for (auto *label : labels) { auto action = new QAction(this); action->setIcon(label->getIcon()); action->setText(label->name()); @@ -1621,8 +1621,8 @@ void LibraryWindow::saveSelectedCoversTo() QFileDialog saveDialog; QString folderPath = saveDialog.getExistingDirectory(this, tr("Save covers"), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); if (!folderPath.isEmpty()) { - QModelIndexList comics = getSelectedComics(); - foreach (QModelIndex comic, comics) { + const auto comics = getSelectedComics(); + for (const auto &comic : comics) { QString origin = comic.data(ComicModel::CoverPathRole).toString().remove("file:///").remove("file:"); QString destination = QDir(folderPath).filePath(comic.data(ComicModel::FileNameRole).toString() + ".jpg"); @@ -1803,7 +1803,8 @@ void LibraryWindow::openLibrary(QString path, QString name) void LibraryWindow::loadLibraries() { libraries.load(); - foreach (QString name, libraries.getNames()) + const auto libraryNames = libraries.getNames(); + for (const auto &name : libraryNames) selectedLibrary->addItem(name, libraries.getPath(name)); } @@ -1848,9 +1849,12 @@ void LibraryWindow::deleteCurrentLibrary() void LibraryWindow::removeLibrary() { QString currentLibrary = selectedLibrary->currentText(); - QMessageBox *messageBox = new QMessageBox(tr("Are you sure?"), tr("Do you want remove ") + currentLibrary + tr(" library?"), QMessageBox::Question, QMessageBox::Yes, QMessageBox::YesToAll, QMessageBox::No); + QMessageBox *messageBox = new QMessageBox(QMessageBox::Question, + tr("Are you sure?"), + tr("Do you want remove ") + currentLibrary + tr(" library?"), + QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No, + this); messageBox->button(QMessageBox::YesToAll)->setText(tr("Remove and delete metadata")); - messageBox->setParent(this); messageBox->setWindowModality(Qt::WindowModal); int ret = messageBox->exec(); if (ret == QMessageBox::Yes) { @@ -2141,7 +2145,7 @@ void LibraryWindow::showComicVineScraper() if (s.contains(COMIC_VINE_API_KEY)) { QModelIndexList indexList = getSelectedComics(); - QList comics = comicsModel->getComics(indexList); + const auto comics = comicsModel->getComics(indexList); ComicDB c = comics[0]; _comicIdEdited = c.id; // static_cast(indexList[0].internalPointer())->data(4).toULongLong(); @@ -2507,7 +2511,7 @@ void LibraryWindow::deleteComicsFromDisk() QList paths; QString libraryPath = currentPath(); - foreach (ComicDB comic, comics) { + for (const auto &comic : comics) { paths.append(libraryPath + comic.path); QLOG_TRACE() << comic.path; QLOG_TRACE() << comic.id; diff --git a/YACReaderLibrary/main.cpp b/YACReaderLibrary/main.cpp index 2494fc6d9..a77c4925d 100644 --- a/YACReaderLibrary/main.cpp +++ b/YACReaderLibrary/main.cpp @@ -125,12 +125,6 @@ int main(int argc, char **argv) { qInstallMessageHandler(messageHandler); - static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO"; - if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO) && !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) { - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - } - - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); QImageReader::setAllocationLimit(0); diff --git a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp index 9eb737398..4039ef2c8 100644 --- a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp @@ -16,7 +16,7 @@ void LibrariesControllerV2::service(HttpRequest & /* request */, HttpResponse &r QJsonArray librariesJson; - foreach (YACReaderLibrary library, libraries) { + for (const auto &library : libraries) { QJsonObject libraryJson; libraryJson["name"] = library.getName(); diff --git a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp index edba69f9a..23f6d92bb 100644 --- a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp @@ -24,7 +24,7 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) QLOG_TRACE() << "POST DATA: " << postData; if (postData.length() > 0) { - QList data = postData.split("\n"); + const auto data = postData.split("\n"); qulonglong libraryId; qulonglong comicId; @@ -35,17 +35,17 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) QMap> comics; QList comicsWithNoLibrary; - auto libraries = DBHelper::getLibraries(); + const auto libraries = DBHelper::getLibraries(); bool clientSendsHasBeenOpened = false; bool clientSendsImageFilters = false; - foreach (QString comicInfo, data) { + for (const auto &comicInfo : data) { if (comicInfo.isEmpty()) { continue; } - QList comicInfoProgress = comicInfo.split("\t"); + const auto comicInfoProgress = comicInfo.split("\t"); if (comicInfoProgress.isEmpty()) { continue; @@ -166,11 +166,13 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) if (!comics.isEmpty()) { auto moreRecentComicsFound = DBHelper::updateFromRemoteClient(comics, clientSendsHasBeenOpened, clientSendsImageFilters); + const auto libraryIds = moreRecentComicsFound.keys(); - foreach (qulonglong libraryId, moreRecentComicsFound.keys()) { + for (const auto libraryId : libraryIds) { auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(libraryId); + const auto &libraryComics = moreRecentComicsFound[libraryId]; - foreach (ComicDB comic, moreRecentComicsFound[libraryId]) { + for (const auto &comic : libraryComics) { items.append(YACReaderServerDataHelper::fullComicToJSON(libraryId, libraryUuid, comic)); } } diff --git a/YACReaderLibrary/server/static.cpp b/YACReaderLibrary/server/static.cpp index fd8a563af..9610df738 100644 --- a/YACReaderLibrary/server/static.cpp +++ b/YACReaderLibrary/server/static.cpp @@ -45,7 +45,7 @@ QString Static::getConfigDir() searchList.append(QDir::rootPath() + "etc/opt"); searchList.append(QDir::rootPath() + "etc"); - foreach (QString dir, searchList) { + for (const auto &dir : searchList) { QFile file(dir + "/" + configFileName); if (file.exists()) { // found @@ -56,7 +56,7 @@ QString Static::getConfigDir() } // not found - foreach (QString dir, searchList) { + for (const auto &dir : searchList) { qWarning("%s/%s not found", qPrintable(dir), qPrintable(configFileName)); } qWarning("Cannot find config file %s", qPrintable(configFileName)); // TODO establecer los valores por defecto diff --git a/YACReaderLibrary/yacreader_folders_view.cpp b/YACReaderLibrary/yacreader_folders_view.cpp index 54d413be9..18a63e9d5 100644 --- a/YACReaderLibrary/yacreader_folders_view.cpp +++ b/YACReaderLibrary/yacreader_folders_view.cpp @@ -16,12 +16,10 @@ void YACReaderFoldersView::dragEnterEvent(QDragEnterEvent *event) { YACReaderTreeView::dragEnterEvent(event); - QList urlList; - if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { - urlList = event->mimeData()->urls(); + const auto urlList = event->mimeData()->urls(); QString currentPath; - foreach (QUrl url, urlList) { + for (const auto &url : urlList) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { @@ -53,7 +51,7 @@ void YACReaderFoldersView::dropEvent(QDropEvent *event) if (validAction) { QList> droppedFiles = ComicFilesManager::getDroppedFiles(event->mimeData()->urls()); - QModelIndex destinationIndex = indexAt(event->pos()); + QModelIndex destinationIndex = indexAt(event->position().toPoint()); if (event->dropAction() == Qt::CopyAction) { QLOG_DEBUG() << "copy - tree :" << droppedFiles; diff --git a/YACReaderLibrary/yacreader_libraries.cpp b/YACReaderLibrary/yacreader_libraries.cpp index 54fea2fe7..6e16d97d2 100644 --- a/YACReaderLibrary/yacreader_libraries.cpp +++ b/YACReaderLibrary/yacreader_libraries.cpp @@ -38,54 +38,54 @@ YACReaderLibraries::YACReaderLibraries(const YACReaderLibraries &source) { } -QList YACReaderLibraries::getNames() +QList YACReaderLibraries::getNames() const { QList names; std::transform(libraries.cbegin(), libraries.cend(), std::back_inserter(names), [](const YACReaderLibrary &library) { return library.getName(); }); return names; } -QString YACReaderLibraries::getPath(const QString &name) +QString YACReaderLibraries::getPath(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getPath(int id) +QString YACReaderLibraries::getPath(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getPath(const QUuid &id) +QString YACReaderLibraries::getPath(const QUuid &id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getId() == id; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getDBPath(int id) +QString YACReaderLibraries::getDBPath(int id) const { return LibraryPaths::libraryDataPath(getPath(id)); } -QString YACReaderLibraries::getName(int id) +QString YACReaderLibraries::getName(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend() ? library->getName() : ""; } -bool YACReaderLibraries::isEmpty() +bool YACReaderLibraries::isEmpty() const { return libraries.isEmpty(); } -bool YACReaderLibraries::contains(const QString &name) +bool YACReaderLibraries::contains(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend(); } -bool YACReaderLibraries::contains(int id) +bool YACReaderLibraries::contains(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend(); @@ -104,19 +104,19 @@ void YACReaderLibraries::rename(const QString &oldName, const QString &newName) libraries.append(YACReaderLibrary(newName, library->getPath(), library->getLegacyId(), library->getId())); } -int YACReaderLibraries::getId(const QString &name) +int YACReaderLibraries::getId(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getLegacyId() : -1; } -QUuid YACReaderLibraries::getUuid(const QString &name) +QUuid YACReaderLibraries::getUuid(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getId() : QUuid(); } -int YACReaderLibraries::getIdFromUuid(const QUuid &uuid) +int YACReaderLibraries::getIdFromUuid(const QUuid &uuid) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [uuid](const YACReaderLibrary &library) { return library.getId() == uuid; }); return library != libraries.cend() ? library->getLegacyId() : -1; @@ -149,8 +149,9 @@ QUuid YACReaderLibraries::getLibraryIdFromLegacyId(int legacyId) const void YACReaderLibraries::addLibrary(const QString &name, const QString &path) { int legacyId = 0; - foreach (YACReaderLibrary l, libraries) - legacyId = qMax(legacyId, l.getLegacyId()); + const auto &existingLibraries = libraries; + for (const auto &library : existingLibraries) + legacyId = qMax(legacyId, library.getLegacyId()); legacyId++; auto id = readFromLibraryFolder(path); diff --git a/YACReaderLibrary/yacreader_libraries.h b/YACReaderLibrary/yacreader_libraries.h index e7e8c86d2..c370eb4f2 100644 --- a/YACReaderLibrary/yacreader_libraries.h +++ b/YACReaderLibrary/yacreader_libraries.h @@ -12,20 +12,20 @@ class YACReaderLibraries : public QObject public: YACReaderLibraries(); YACReaderLibraries(const YACReaderLibraries &source); - QList getNames(); - QString getPath(const QString &name); - QString getPath(int id); - QString getPath(const QUuid &id); - QString getDBPath(int id); - QString getName(int id); - bool isEmpty(); - bool contains(const QString &name); - bool contains(int id); + QList getNames() const; + QString getPath(const QString &name) const; + QString getPath(int id) const; + QString getPath(const QUuid &id) const; + QString getDBPath(int id) const; + QString getName(int id) const; + bool isEmpty() const; + bool contains(const QString &name) const; + bool contains(int id) const; void remove(const QString &name); void rename(const QString &oldName, const QString &newName); - int getId(const QString &name); - QUuid getUuid(const QString &name); - int getIdFromUuid(const QUuid &uuid); + int getId(const QString &name) const; + QUuid getUuid(const QString &name) const; + int getIdFromUuid(const QUuid &uuid) const; YACReaderLibraries &operator=(const YACReaderLibraries &source); QList getLibraries() const; QList sortedLibraries() const; diff --git a/YACReaderLibrary/yacreader_reading_lists_view.cpp b/YACReaderLibrary/yacreader_reading_lists_view.cpp index 080845569..7f4c37225 100644 --- a/YACReaderLibrary/yacreader_reading_lists_view.cpp +++ b/YACReaderLibrary/yacreader_reading_lists_view.cpp @@ -24,7 +24,7 @@ void YACReaderReadingListsView::dragEnterEvent(QDragEnterEvent *event) void YACReaderReadingListsView::dragMoveEvent(QDragMoveEvent *event) { YACReaderTreeView::dragMoveEvent(event); - QModelIndex destinationIndex = indexAt(event->pos()); + QModelIndex destinationIndex = indexAt(event->position().toPoint()); if (model()->canDropMimeData(event->mimeData(), event->proposedAction(), destinationIndex.row(), destinationIndex.column(), destinationIndex.parent())) event->acceptProposedAction(); } diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index 16df0ac9e..94081193c 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -19,10 +19,6 @@ target_compile_definitions(YACReaderLibraryServer PRIVATE YACREADER_LIBRARY ) -# Resources -qt_add_resources(yacreaderlibraryserver_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images.qrc") -target_sources(YACReaderLibraryServer PRIVATE ${yacreaderlibraryserver_images_rcc}) - # Translations qt_add_translations(YACReaderLibraryServer TS_FILES diff --git a/YACReaderLibraryServer/images.qrc b/YACReaderLibraryServer/images.qrc deleted file mode 100644 index 1ea3a08e0..000000000 --- a/YACReaderLibraryServer/images.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - ../images/f_overlayed.png - ../images/f_overlayed_retina.png - - diff --git a/YACReaderLibraryServer/libraries_updater.cpp b/YACReaderLibraryServer/libraries_updater.cpp index a2c1d625c..1b2631eb8 100644 --- a/YACReaderLibraryServer/libraries_updater.cpp +++ b/YACReaderLibraryServer/libraries_updater.cpp @@ -4,6 +4,8 @@ #include "yacreader_global.h" #include "yacreader_libraries.h" +#include + LibrariesUpdater::LibrariesUpdater() { } @@ -14,7 +16,7 @@ void LibrariesUpdater::updateIfNeeded() libraries.load(); - foreach (QString name, libraries.getNames()) { + for (const QString &name : libraries.getNames()) { QString libraryPath = libraries.getPath(name); QString libraryDataPath = YACReader::LibraryPaths::libraryDataPath(libraryPath); QString databasePath = YACReader::LibraryPaths::libraryDatabasePath(libraryPath); diff --git a/common/bookmarks.cpp b/common/bookmarks.cpp index 83bad65e1..e357411ba 100644 --- a/common/bookmarks.cpp +++ b/common/bookmarks.cpp @@ -8,6 +8,8 @@ #include #include +#include + Bookmarks::Bookmarks() : lastPageIndex(0) { @@ -93,7 +95,7 @@ void Bookmarks::clear() bool Bookmarks::load(const QList &bookmarkIndexes, int lastPage) { lastPageIndex = lastPage; - foreach (int b, bookmarkIndexes) + for (const int b : std::as_const(bookmarkIndexes)) if (b != -1) { latestBookmarks.push_back(b); bookmarks.insert(b, QImage()); diff --git a/common/comic.cpp b/common/comic.cpp index 7351bd14b..6d9bbfeff 100644 --- a/common/comic.cpp +++ b/common/comic.cpp @@ -15,6 +15,7 @@ #include #include +#include enum YACReaderPageSortingMode { YACReaderNumericalSorting, @@ -304,7 +305,7 @@ QList Comic::findValidComicFiles(const QList &list) QLOG_DEBUG() << "-findValidComicFiles-"; QList validComicFiles; QString currentPath; - foreach (QUrl url, list) { + for (const QUrl &url : std::as_const(list)) { currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath)) { validComicFiles << currentPath; @@ -330,7 +331,7 @@ QList Comic::findValidComicFilesInFolder(const QString &path) QFileInfoList folderContent = folder.entryInfoList(); QString currentPath; - foreach (QFileInfo info, folderContent) { + for (const QFileInfo &info : std::as_const(folderContent)) { currentPath = info.absoluteFilePath(); if (info.isDir()) { validComicFiles << findValidComicFilesInFolder(currentPath); // find comics recursively @@ -415,10 +416,10 @@ QList FileComic::filter(const QList &src) QList filtered; bool fileAccepted = false; - foreach (QString fileName, src) { + for (const QString &fileName : std::as_const(src)) { fileAccepted = false; if (!fileName.contains("__MACOSX")) { - foreach (QString extension, extensions) { + for (const QString &extension : std::as_const(extensions)) { if (fileName.endsWith(extension, Qt::CaseInsensitive)) { fileAccepted = true; break; @@ -473,7 +474,7 @@ bool FileComic::isCancelled() QList> FileComic::getSections(int §ionIndex) { QVector sortedIndexes; - foreach (QString name, _fileNames) { + for (const QString &name : std::as_const(_fileNames)) { sortedIndexes.append(_order.indexOf(name)); } QList> sections; @@ -483,7 +484,7 @@ QList> FileComic::getSections(int §ionIndex) QVector section; int idx = 0; unsigned int realIdx; - foreach (quint32 i, sortedIndexes) { + for (const quint32 i : std::as_const(sortedIndexes)) { if (_firstPage == idx) { sectionIndex = sectionCount; @@ -499,7 +500,7 @@ QList> FileComic::getSections(int §ionIndex) if (section.indexOf(realIdx) != 0) { QVector section1; QVector section2; - foreach (quint32 si, section) { + for (const quint32 si : std::as_const(section)) { if (si < realIdx) { section1.append(si); } else { @@ -532,7 +533,7 @@ QList> FileComic::getSections(int §ionIndex) if (section.indexOf(realIdx) != 0) { QVector section1; QVector section2; - foreach (quint32 si, section) { + for (const quint32 si : std::as_const(section)) { if (si < realIdx) { section1.append(si); } else { @@ -626,7 +627,7 @@ void FileComic::process() } // archive.getAllData(QVector(),this); /* - foreach(QString name,_fileNames) + for (const auto &name : _fileNames) { index = _order.indexOf(name); sortedIndex = _fileNames.indexOf(name); @@ -1017,7 +1018,7 @@ void get_double_pages(const QList &pageNames, QList &singlePag QString mostCommonPrefix = get_most_common_prefix(pageNames); - foreach (const QString &pageName, pageNames) { + for (const QString &pageName : std::as_const(pageNames)) { if (is_double_page(pageName.split('/').last(), mostCommonPrefix, maxExpectedDoublePagesNumberLenght)) { doublePageNames.append(pageName); } else { diff --git a/common/rhi/yacreader_comic_flow_rhi.cpp b/common/rhi/yacreader_comic_flow_rhi.cpp index abf3ab587..bba348df3 100644 --- a/common/rhi/yacreader_comic_flow_rhi.cpp +++ b/common/rhi/yacreader_comic_flow_rhi.cpp @@ -2,6 +2,8 @@ #include +#include + // YACReaderComicFlow3D implementation YACReaderComicFlow3D::YACReaderComicFlow3D(QWidget *parent, struct Preset p) : YACReaderFlow3D(parent, p) @@ -126,7 +128,7 @@ void YACReaderComicFlow3D::resortCovers(QList newOrder) QVector imagesNew; int index = 0; - foreach (int i, newOrder) { + for (const int i : std::as_const(newOrder)) { if (i < 0 || i >= images.size()) { continue; } diff --git a/compressed_archive/compressed_archive.cpp b/compressed_archive/compressed_archive.cpp index 65aff55fa..dd878007b 100644 --- a/compressed_archive/compressed_archive.cpp +++ b/compressed_archive/compressed_archive.cpp @@ -12,6 +12,8 @@ #include #include +#include + #define _MY_WINAPI WINAPI typedef quint32(_MY_WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject); @@ -235,7 +237,7 @@ QVector CompressedArchive::translateIndexes(const QVector &ind { QVector translatedIndexes; - foreach (quint32 i, indexes) { + for (const quint32 i : std::as_const(indexes)) { if (i < (quint32)offsets.length()) translatedIndexes.append(offsets.at(i)); } diff --git a/custom_widgets/yacreader_macosx_toolbar.mm b/custom_widgets/yacreader_macosx_toolbar.mm index 2338eb30b..483177ac5 100644 --- a/custom_widgets/yacreader_macosx_toolbar.mm +++ b/custom_widgets/yacreader_macosx_toolbar.mm @@ -198,7 +198,7 @@ - (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar NSMutableArray *array = [[NSMutableArray alloc] init]; QList items = mytoolbar->items(); - foreach (const QMacToolBarItem * item, items) { + for (const auto *item : items) { [array addObject : item->nativeToolBarItem().itemIdentifier]; } return array; diff --git a/custom_widgets/yacreader_table_view.cpp b/custom_widgets/yacreader_table_view.cpp index d434fb47d..9d3b1bffd 100644 --- a/custom_widgets/yacreader_table_view.cpp +++ b/custom_widgets/yacreader_table_view.cpp @@ -407,7 +407,7 @@ void StarEditor::leaveEvent(QEvent *event) void StarEditor::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { - int star = starAtPosition(event->x()); + int star = starAtPosition(event->position().x()); if (star != myStarRating.starCount() && star != -1) { myStarRating.setStarCount(star); diff --git a/custom_widgets/yacreader_treeview.cpp b/custom_widgets/yacreader_treeview.cpp index 5ddaadcfd..63c3e33da 100644 --- a/custom_widgets/yacreader_treeview.cpp +++ b/custom_widgets/yacreader_treeview.cpp @@ -66,9 +66,10 @@ void YACReaderTreeView::dragMoveEvent(QDragMoveEvent *event) QTreeView::dragMoveEvent(event); // fix for drop auto expand - QModelIndex underMouse = indexAt(event->pos()); + auto point = event->position().toPoint(); + QModelIndex underMouse = indexAt(point); if (underMouse.isValid()) { - expandPos = event->pos(); + expandPos = point; connect(&expandTimer, &QTimer::timeout, this, &YACReaderTreeView::expandCurrent); expandTimer.setSingleShot(true); expandTimer.start(500); diff --git a/shortcuts_management/shortcuts_manager.cpp b/shortcuts_management/shortcuts_manager.cpp index 6ca75c216..87eca2b8f 100644 --- a/shortcuts_management/shortcuts_manager.cpp +++ b/shortcuts_management/shortcuts_manager.cpp @@ -5,6 +5,8 @@ #include #include +#include + ShortcutsManager::ShortcutsManager() { initDefaultShorcuts(); @@ -127,7 +129,7 @@ bool ShortcutsManager::checkConflicts(const QKeySequence &shortcut, const QActio if (shortcut.isEmpty()) return false; - foreach (QAction *action, actions) { + for (QAction *action : std::as_const(actions)) { if (action != dest) // if the same shortcut is setted there is no conflict if (action->shortcut() == shortcut) return true; diff --git a/tests/compressed_archive_test/main.cpp b/tests/compressed_archive_test/main.cpp index 4f681c9fa..44177efd4 100644 --- a/tests/compressed_archive_test/main.cpp +++ b/tests/compressed_archive_test/main.cpp @@ -6,6 +6,7 @@ #include #include +#include using namespace std; @@ -36,7 +37,7 @@ int main(int argc, char *argv[]) timer.start(); quint32 totalFiles = 0; - foreach (QString format, supportedFormats) { + for (const QString &format : std::as_const(supportedFormats)) { QDir rootDir(s); if (!rootDir.cd(format)) { cout << "Folder for format '" << format.toStdString() << "' not found" << endl; @@ -49,7 +50,7 @@ int main(int argc, char *argv[]) quint32 errors = 0; quint64 init = timer.elapsed(); - foreach (QFileInfo fileInfo, files) { + for (const QFileInfo &fileInfo : std::as_const(files)) { totalFiles++; totalFormat++; CompressedArchive archive(fileInfo.filePath()); diff --git a/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp b/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp index 5460f4052..d4de9ee19 100644 --- a/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp +++ b/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp @@ -21,9 +21,10 @@ void TestRegistry::registerTest(QObject* test) { int TestRegistry::runTests(int argc, char* argv[]) { int result = 0; - foreach(QObject* test, tests_) { - result |= QTest::qExec(test, argc, argv); - } + const auto &tests = tests_; + for (auto *test : tests) { + result |= QTest::qExec(test, argc, argv); + } return result; } diff --git a/third_party/QsLog/unittest/TestLog.h b/third_party/QsLog/unittest/TestLog.h index ba3df1922..edc665834 100644 --- a/third_party/QsLog/unittest/TestLog.h +++ b/third_party/QsLog/unittest/TestLog.h @@ -63,7 +63,7 @@ class MockDestination : public QsLogging::Destination bool hasMessage(const QString &messageContent, QsLogging::Level level) const { - Q_FOREACH (const Message &m, mMessages) { + for (const auto &m : mMessages) { if (m.level == level && m.text.contains(messageContent)) return true; } diff --git a/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp b/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp index 5a03d0ce5..240d0f92d 100644 --- a/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp +++ b/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp @@ -5,6 +5,7 @@ #include #endif #include +#include #include "httpconnectionhandlerpool.h" using namespace stefanfrings; @@ -25,7 +26,7 @@ HttpConnectionHandlerPool::HttpConnectionHandlerPool(const QSettings *settings, HttpConnectionHandlerPool::~HttpConnectionHandlerPool() { // delete all connection handlers and wait until their threads are closed - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { delete handler; } @@ -39,7 +40,7 @@ HttpConnectionHandler* HttpConnectionHandlerPool::getConnectionHandler() HttpConnectionHandler* freeHandler=0; mutex.lock(); // find a free handler in pool - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { if (!handler->isBusy()) { @@ -69,7 +70,7 @@ void HttpConnectionHandlerPool::cleanup() int maxIdleHandlers=settings->value("minThreads",1).toInt(); int idleCounter=0; mutex.lock(); - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { if (!handler->isBusy()) { diff --git a/third_party/QtWebApp/httpserver/httpcookie.cpp b/third_party/QtWebApp/httpserver/httpcookie.cpp index d85232e83..bde70caac 100644 --- a/third_party/QtWebApp/httpserver/httpcookie.cpp +++ b/third_party/QtWebApp/httpserver/httpcookie.cpp @@ -4,6 +4,7 @@ */ #include "httpcookie.h" +#include using namespace stefanfrings; @@ -37,7 +38,7 @@ HttpCookie::HttpCookie(const QByteArray source) secure=false; httpOnly=false; QList list=splitCSV(source); - foreach(QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { // Split the part into name and value diff --git a/third_party/QtWebApp/httpserver/httprequest.cpp b/third_party/QtWebApp/httpserver/httprequest.cpp index c9294b7a4..c076c5d9b 100644 --- a/third_party/QtWebApp/httpserver/httprequest.cpp +++ b/third_party/QtWebApp/httpserver/httprequest.cpp @@ -6,6 +6,7 @@ #include "httprequest.h" #include #include +#include #include "httpcookie.h" using namespace stefanfrings; @@ -239,7 +240,7 @@ void HttpRequest::decodeRequestParams() } // Split the parameters into pairs of value and name QList list=rawParameters.split('&'); - foreach (QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { int equalsChar=part.indexOf('='); if (equalsChar>=0) @@ -261,10 +262,10 @@ void HttpRequest::extractCookies() #ifdef SUPERVERBOSE qDebug("HttpRequest: extract cookies"); #endif - foreach(QByteArray cookieStr, headers.values("cookie")) + for (const QByteArray &cookieStr : headers.values("cookie")) { QList list=HttpCookie::splitCSV(cookieStr); - foreach(QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { #ifdef SUPERVERBOSE qDebug("HttpRequest: found cookie %s",part.data()); @@ -532,7 +533,7 @@ void HttpRequest::parseMultiPartFile() HttpRequest::~HttpRequest() { - foreach(QByteArray key, uploadedFiles.keys()) + for (const QByteArray &key : uploadedFiles.keys()) { QTemporaryFile* file=uploadedFiles.value(key); if (file->isOpen()) diff --git a/third_party/QtWebApp/httpserver/httpresponse.cpp b/third_party/QtWebApp/httpserver/httpresponse.cpp index a2afba89c..597be0f4f 100644 --- a/third_party/QtWebApp/httpserver/httpresponse.cpp +++ b/third_party/QtWebApp/httpserver/httpresponse.cpp @@ -4,6 +4,7 @@ */ #include "httpresponse.h" +#include using namespace stefanfrings; @@ -54,14 +55,14 @@ void HttpResponse::writeHeaders() buffer.append(' '); buffer.append(statusText); buffer.append("\r\n"); - foreach(QByteArray name, headers.keys()) + for (const QByteArray &name : headers.keys()) { buffer.append(name); buffer.append(": "); buffer.append(headers.value(name)); buffer.append("\r\n"); } - foreach(HttpCookie cookie,cookies.values()) + for (const HttpCookie &cookie : cookies.values()) { buffer.append("Set-Cookie: "); buffer.append(cookie.toByteArray()); diff --git a/third_party/QtWebApp/templateengine/templateloader.cpp b/third_party/QtWebApp/templateengine/templateloader.cpp index 0db3115b2..1dda0d7c8 100644 --- a/third_party/QtWebApp/templateengine/templateloader.cpp +++ b/third_party/QtWebApp/templateengine/templateloader.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #else @@ -81,7 +82,7 @@ Template TemplateLoader::getTemplate(QString templateName, QString locales) #endif // Search for exact match - foreach (QString loc,locs) + for (QString loc : std::as_const(locs)) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) loc.replace(QRegularExpression(";.*"),""); @@ -102,7 +103,7 @@ Template TemplateLoader::getTemplate(QString templateName, QString locales) } // Search for correct language but any country - foreach (QString loc,locs) + for (QString loc : std::as_const(locs)) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) loc.replace(QRegularExpression("[;_-].*"),""); From 8cc9ffc35582c20a8f680daae905618395b5a837 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 15:56:27 +0200 Subject: [PATCH 10/19] Sanitize CMake source directory references --- CMakeLists.txt | 2 +- YACReader/CMakeLists.txt | 6 +++--- YACReaderLibrary/CMakeLists.txt | 6 +++--- YACReaderLibrary/comic_vine/CMakeLists.txt | 4 ++-- YACReaderLibraryServer/CMakeLists.txt | 4 ++-- cmake/Findpdfium.cmake | 12 +++++++----- cmake/Findunarr.cmake | 12 +++++++----- custom_widgets/CMakeLists.txt | 8 ++++---- shortcuts_management/CMakeLists.txt | 4 ++-- 9 files changed, 31 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e000cfe6e..095fd242a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ endif() # Install paths include(GNUInstallDirs) -list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # Compiler options (MSVC flags) include(cmake/CompilerOptions.cmake) diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt index dd20fed22..070fb9dd5 100644 --- a/YACReader/CMakeLists.txt +++ b/YACReader/CMakeLists.txt @@ -42,8 +42,8 @@ qt_add_executable(YACReader WIN32 themes/theme.h themes/theme_factory.h themes/theme_factory.cpp - ${CMAKE_SOURCE_DIR}/common/themes/theme_manager.h - ${CMAKE_SOURCE_DIR}/common/themes/theme_manager.cpp + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp ) target_include_directories(YACReader PRIVATE @@ -57,7 +57,7 @@ target_compile_definitions(YACReader PRIVATE YACREADER) qt_add_resources(yacreader_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/yacreader_images.qrc") qt_add_resources(yacreader_files_rcc "${CMAKE_CURRENT_SOURCE_DIR}/yacreader_files.qrc") qt_add_resources(yacreader_themes_rcc "${CMAKE_CURRENT_SOURCE_DIR}/themes/themes.qrc") -qt_add_resources(yacreader_common_images_rcc "${CMAKE_SOURCE_DIR}/common/themes/appearance_config_images.qrc") +qt_add_resources(yacreader_common_images_rcc "${PROJECT_SOURCE_DIR}/common/themes/appearance_config_images.qrc") target_sources(YACReader PRIVATE ${yacreader_images_rcc} ${yacreader_files_rcc} diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt index 97c87db38..a86629faf 100644 --- a/YACReaderLibrary/CMakeLists.txt +++ b/YACReaderLibrary/CMakeLists.txt @@ -176,8 +176,8 @@ qt_add_executable(YACReaderLibrary WIN32 themes/theme.h themes/theme_factory.h themes/theme_factory.cpp - ${CMAKE_SOURCE_DIR}/common/themes/theme_manager.h - ${CMAKE_SOURCE_DIR}/common/themes/theme_manager.cpp + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp ) # macOS-specific sources @@ -204,7 +204,7 @@ qt_add_resources(yacreaderlibrary_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images qt_add_resources(yacreaderlibrary_files_rcc "${CMAKE_CURRENT_SOURCE_DIR}/files.qrc") qt_add_resources(yacreaderlibrary_qml_rcc "${CMAKE_CURRENT_SOURCE_DIR}/qml.qrc") qt_add_resources(yacreaderlibrary_themes_rcc "${CMAKE_CURRENT_SOURCE_DIR}/themes/themes.qrc") -qt_add_resources(yacreaderlibrary_common_images_rcc "${CMAKE_SOURCE_DIR}/common/themes/appearance_config_images.qrc") +qt_add_resources(yacreaderlibrary_common_images_rcc "${PROJECT_SOURCE_DIR}/common/themes/appearance_config_images.qrc") target_sources(YACReaderLibrary PRIVATE ${yacreaderlibrary_images_rcc} ${yacreaderlibrary_files_rcc} diff --git a/YACReaderLibrary/comic_vine/CMakeLists.txt b/YACReaderLibrary/comic_vine/CMakeLists.txt index e6ea50d69..cc0ca1a10 100644 --- a/YACReaderLibrary/comic_vine/CMakeLists.txt +++ b/YACReaderLibrary/comic_vine/CMakeLists.txt @@ -56,8 +56,8 @@ target_include_directories(comic_vine PUBLIC ) # App-specific theme.h needed for themable.h → theme_manager.h → theme.h chain target_include_directories(comic_vine PRIVATE - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/themes - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/db + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db ) target_link_libraries(comic_vine PUBLIC Qt::Core diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index 94081193c..42b5a27b4 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -10,8 +10,8 @@ qt_add_executable(YACReaderLibraryServer target_include_directories(YACReaderLibraryServer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/YACReaderLibrary - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/db + ${PROJECT_SOURCE_DIR}/YACReaderLibrary + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db ) target_compile_definitions(YACReaderLibraryServer PRIVATE diff --git a/cmake/Findpdfium.cmake b/cmake/Findpdfium.cmake index 17689ecf1..526991066 100644 --- a/cmake/Findpdfium.cmake +++ b/cmake/Findpdfium.cmake @@ -6,11 +6,13 @@ set(pdfium_TARGET "") set(pdfium_INCLUDE_DIRS "") set(pdfium_LIBRARIES "") +get_filename_component(_pdfium_bundled_root "${CMAKE_CURRENT_LIST_DIR}/../dependencies/pdfium" ABSOLUTE) + if(NOT TARGET pdfium::pdfium AND WIN32) yacreader_get_windows_arch_subdir(_pdfium_arch) - set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") - set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib") - set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll") + set(_pdfium_include_dir "${_pdfium_bundled_root}/win/public") + set(_pdfium_implib "${_pdfium_bundled_root}/win/${_pdfium_arch}/pdfium.lib") + set(_pdfium_dll "${_pdfium_bundled_root}/win/${_pdfium_arch}/pdfium.dll") if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_implib}" AND EXISTS "${_pdfium_dll}") yacreader_add_imported_library(pdfium::pdfium TYPE SHARED @@ -23,8 +25,8 @@ if(NOT TARGET pdfium::pdfium AND WIN32) endif() if(NOT TARGET pdfium::pdfium AND APPLE) - set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include") - set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a") + set(_pdfium_include_dir "${_pdfium_bundled_root}/macx/include") + set(_pdfium_library "${_pdfium_bundled_root}/macx/bin/libpdfium.a") if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_library}") yacreader_add_imported_library(pdfium::pdfium TYPE STATIC diff --git a/cmake/Findunarr.cmake b/cmake/Findunarr.cmake index 4aa9ef0ab..aa0cb1702 100644 --- a/cmake/Findunarr.cmake +++ b/cmake/Findunarr.cmake @@ -6,9 +6,11 @@ set(unarr_TARGET "") set(unarr_INCLUDE_DIRS "") set(unarr_LIBRARIES "") +get_filename_component(_unarr_bundled_root "${CMAKE_CURRENT_LIST_DIR}/../dependencies/unarr" ABSOLUTE) + if(NOT TARGET unarr::unarr AND APPLE) - set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx") - set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a") + set(_unarr_include_dir "${_unarr_bundled_root}/macx") + set(_unarr_library "${_unarr_bundled_root}/macx/libunarr.a") if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}") yacreader_add_imported_library(unarr::unarr TYPE STATIC @@ -22,9 +24,9 @@ endif() if(NOT TARGET unarr::unarr AND WIN32) yacreader_get_windows_arch_subdir(_unarr_arch) - set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win") - set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib") - set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll") + set(_unarr_include_dir "${_unarr_bundled_root}/win") + set(_unarr_implib "${_unarr_bundled_root}/win/${_unarr_arch}/unarr.lib") + set(_unarr_dll "${_unarr_bundled_root}/win/${_unarr_arch}/unarr.dll") if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}") yacreader_add_imported_library(unarr::unarr TYPE SHARED diff --git a/custom_widgets/CMakeLists.txt b/custom_widgets/CMakeLists.txt index 4e5b6f1d6..aaa7ec25a 100644 --- a/custom_widgets/CMakeLists.txt +++ b/custom_widgets/CMakeLists.txt @@ -40,7 +40,7 @@ add_library(custom_widgets_reader STATIC ${WIDGETS_COMMON_SOURCES}) target_include_directories(custom_widgets_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # App-specific theme.h needed because themable.h → theme_manager.h → theme.h target_include_directories(custom_widgets_reader PRIVATE - ${CMAKE_SOURCE_DIR}/YACReader/themes + ${PROJECT_SOURCE_DIR}/YACReader/themes ) target_compile_definitions(custom_widgets_reader PRIVATE YACREADER) target_link_libraries(custom_widgets_reader PUBLIC @@ -85,9 +85,9 @@ add_library(custom_widgets_library STATIC target_include_directories(custom_widgets_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # App-specific theme.h + YACReaderLibrary headers needed by macosx_toolbar target_include_directories(custom_widgets_library PRIVATE - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/themes - ${CMAKE_SOURCE_DIR}/YACReaderLibrary - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/db + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes + ${PROJECT_SOURCE_DIR}/YACReaderLibrary + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db ) target_compile_definitions(custom_widgets_library PRIVATE YACREADER_LIBRARY) target_link_libraries(custom_widgets_library PUBLIC diff --git a/shortcuts_management/CMakeLists.txt b/shortcuts_management/CMakeLists.txt index a658e4128..4cbbd7217 100644 --- a/shortcuts_management/CMakeLists.txt +++ b/shortcuts_management/CMakeLists.txt @@ -19,7 +19,7 @@ add_library(shortcuts_reader STATIC ${SHORTCUTS_SOURCES}) target_include_directories(shortcuts_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # App-specific theme.h needed because themable.h → theme_manager.h → theme.h target_include_directories(shortcuts_reader PRIVATE - ${CMAKE_SOURCE_DIR}/YACReader/themes + ${PROJECT_SOURCE_DIR}/YACReader/themes ) target_compile_definitions(shortcuts_reader PRIVATE YACREADER) target_link_libraries(shortcuts_reader PUBLIC Qt::Core Qt::Widgets yr_global common_gui) @@ -28,7 +28,7 @@ target_link_libraries(shortcuts_reader PUBLIC Qt::Core Qt::Widgets yr_global com add_library(shortcuts_library STATIC ${SHORTCUTS_SOURCES}) target_include_directories(shortcuts_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(shortcuts_library PRIVATE - ${CMAKE_SOURCE_DIR}/YACReaderLibrary/themes + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes ) target_compile_definitions(shortcuts_library PRIVATE YACREADER_LIBRARY) target_link_libraries(shortcuts_library PUBLIC Qt::Core Qt::Widgets yr_global common_gui) From 586c748b42852a1c9c6624eb740f71825d74df27 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 16:14:15 +0200 Subject: [PATCH 11/19] Set the maximum upper cmake version tested --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 095fd242a..82d1f7574 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.25) +cmake_minimum_required(VERSION 3.25...4.3.1) project(YACReader VERSION 10.0.0 From 1a28111dae93e7750630827fe39e54427c9c9c21 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 16:34:02 +0200 Subject: [PATCH 12/19] Migrate qt_add_resources to the Qt6 target-based approach --- YACReader/CMakeLists.txt | 166 ++++++++++++- YACReader/themes/themes.qrc | 16 -- YACReader/yacreader_files.qrc | 12 - YACReader/yacreader_images.qrc | 92 ------- YACReaderLibrary/CMakeLists.txt | 264 +++++++++++++++++++-- YACReaderLibrary/files.qrc | 12 - YACReaderLibrary/images.qrc | 122 ---------- YACReaderLibrary/images_osx.qrc | 5 - YACReaderLibrary/images_win.qrc | 6 - YACReaderLibrary/qml.qrc | 24 -- YACReaderLibrary/themes/themes.qrc | 16 -- common/themes/appearance_config_images.qrc | 8 - 12 files changed, 404 insertions(+), 339 deletions(-) delete mode 100644 YACReader/themes/themes.qrc delete mode 100644 YACReader/yacreader_files.qrc delete mode 100644 YACReader/yacreader_images.qrc delete mode 100644 YACReaderLibrary/files.qrc delete mode 100644 YACReaderLibrary/images.qrc delete mode 100644 YACReaderLibrary/images_osx.qrc delete mode 100644 YACReaderLibrary/images_win.qrc delete mode 100644 YACReaderLibrary/qml.qrc delete mode 100644 YACReaderLibrary/themes/themes.qrc delete mode 100644 common/themes/appearance_config_images.qrc diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt index 070fb9dd5..e6f74b0ae 100644 --- a/YACReader/CMakeLists.txt +++ b/YACReader/CMakeLists.txt @@ -54,15 +54,163 @@ target_include_directories(YACReader PRIVATE target_compile_definitions(YACReader PRIVATE YACREADER) # Resources -qt_add_resources(yacreader_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/yacreader_images.qrc") -qt_add_resources(yacreader_files_rcc "${CMAKE_CURRENT_SOURCE_DIR}/yacreader_files.qrc") -qt_add_resources(yacreader_themes_rcc "${CMAKE_CURRENT_SOURCE_DIR}/themes/themes.qrc") -qt_add_resources(yacreader_common_images_rcc "${PROJECT_SOURCE_DIR}/common/themes/appearance_config_images.qrc") -target_sources(YACReader PRIVATE - ${yacreader_images_rcc} - ${yacreader_files_rcc} - ${yacreader_themes_rcc} - ${yacreader_common_images_rcc} +set(yacreader_image_files + ${PROJECT_SOURCE_DIR}/images/icon-new.svg + ${PROJECT_SOURCE_DIR}/images/goto.svg + ${PROJECT_SOURCE_DIR}/images/find_folder.svg + ${PROJECT_SOURCE_DIR}/images/flow1.png + ${PROJECT_SOURCE_DIR}/images/flow2.png + ${PROJECT_SOURCE_DIR}/images/flow3.png + ${PROJECT_SOURCE_DIR}/images/flow4.png + ${PROJECT_SOURCE_DIR}/images/flow5.png + ${PROJECT_SOURCE_DIR}/images/notCover.png + ${PROJECT_SOURCE_DIR}/images/close.svg + ${PROJECT_SOURCE_DIR}/images/centerFlow.svg + ${PROJECT_SOURCE_DIR}/images/gotoFlow.svg + ${PROJECT_SOURCE_DIR}/images/defaultCover.png + ${PROJECT_SOURCE_DIR}/images/translator/close.svg + ${PROJECT_SOURCE_DIR}/images/translator/dropDownArrow.svg + ${PROJECT_SOURCE_DIR}/images/translator/fromTo.svg + ${PROJECT_SOURCE_DIR}/images/translator/speaker.svg + ${PROJECT_SOURCE_DIR}/images/translator/translatorSearch.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/clear_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/accept_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_comics.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_folders.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_general.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_libraries.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_mglass.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_page.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_reading.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_visualization.svg + ${PROJECT_SOURCE_DIR}/images/custom_dialog/custom_close_button.svg + ${PROJECT_SOURCE_DIR}/images/whats_new/whatsnew_header.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/bookmark.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doublePage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doubleMangaPage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/fitToPage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/flow.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/full.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/goto.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/help.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/info.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/magnifyingGlass.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/next.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/open.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openFolder.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openNext.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openPrevious.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/options.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/previous.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateL.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateR.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/save.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/shortcuts.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/showBookmarks.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toHeight.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toContinuousScroll.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toWidth.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/translator.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/zoom.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/bookmark_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doublePage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doubleMangaPage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/fitToPage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/flow_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/full_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/goto_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/help_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/info_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/magnifyingGlass_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/next_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/open_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openFolder_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openNext_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openPrevious_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/options_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/previous_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateL_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateR_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/save_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/shortcuts_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/showBookmarks_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toHeight_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toContinuousScroll_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toWidth_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/translator_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/zoom_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/menuArrow.svg +) +set(yacreader_file_files + ${PROJECT_SOURCE_DIR}/files/about.html + ${PROJECT_SOURCE_DIR}/files/helpYACReader.html + ${PROJECT_SOURCE_DIR}/files/shortcuts.html +) +set(yacreader_file_files_es + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + ${PROJECT_SOURCE_DIR}/files/helpYACReader_es_ES.html +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "about.html" +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/helpYACReader_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "helpYACReader.html" +) +set(yacreader_theme_files + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_classic.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light4.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light5.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark4.json +) +set(yacreader_common_theme_image_files + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-system.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-light.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-dark.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-custom.svg +) + +qt_add_resources(YACReader "yacreader_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreader_image_files} +) +qt_add_resources(YACReader "yacreader_files" + PREFIX "/files" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreader_file_files} +) +qt_add_resources(YACReader "yacreader_files_es" + PREFIX "/files" + LANG "es_ES" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreader_file_files_es} +) +qt_add_resources(YACReader "yacreader_themes" + PREFIX "/themes" + BASE "${CMAKE_CURRENT_SOURCE_DIR}/themes" + FILES + ${yacreader_theme_files} +) +qt_add_resources(YACReader "yacreader_common_theme_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreader_common_theme_image_files} ) # Translations diff --git a/YACReader/themes/themes.qrc b/YACReader/themes/themes.qrc deleted file mode 100644 index d96de307d..000000000 --- a/YACReader/themes/themes.qrc +++ /dev/null @@ -1,16 +0,0 @@ - - - builtin_classic.json - builtin_light.json - builtin_light1.json - builtin_light2.json - builtin_light3.json - builtin_light4.json - builtin_light5.json - builtin_dark.json - builtin_dark1.json - builtin_dark2.json - builtin_dark3.json - builtin_dark4.json - - diff --git a/YACReader/yacreader_files.qrc b/YACReader/yacreader_files.qrc deleted file mode 100644 index b75403122..000000000 --- a/YACReader/yacreader_files.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - ../files/about.html - ../files/helpYACReader.html - ../files/shortcuts.html - - - - ../files/about_es_ES.html - ../files/helpYACReader_es_ES.html - - diff --git a/YACReader/yacreader_images.qrc b/YACReader/yacreader_images.qrc deleted file mode 100644 index a573b9fb3..000000000 --- a/YACReader/yacreader_images.qrc +++ /dev/null @@ -1,92 +0,0 @@ - - - ../images/icon-new.svg - ../images/goto.svg - ../images/find_folder.svg - ../images/flow1.png - ../images/flow2.png - ../images/flow3.png - ../images/flow4.png - ../images/flow5.png - ../images/notCover.png - ../images/close.svg - ../images/centerFlow.svg - ../images/gotoFlow.svg - ../images/defaultCover.png - - ../images/translator/close.svg - ../images/translator/dropDownArrow.svg - ../images/translator/fromTo.svg - ../images/translator/speaker.svg - ../images/translator/translatorSearch.svg - ../images/shortcuts/clear_shortcut.svg - ../images/shortcuts/accept_shortcut.svg - ../images/shortcuts/shortcuts_group_comics.svg - ../images/shortcuts/shortcuts_group_folders.svg - ../images/shortcuts/shortcuts_group_general.svg - ../images/shortcuts/shortcuts_group_libraries.svg - ../images/shortcuts/shortcuts_group_mglass.svg - ../images/shortcuts/shortcuts_group_page.svg - ../images/shortcuts/shortcuts_group_reading.svg - ../images/shortcuts/shortcuts_group_visualization.svg - ../images/custom_dialog/custom_close_button.svg - ../images/whats_new/whatsnew_header.svg - ../images/viewer_toolbar/bookmark.svg - ../images/viewer_toolbar/close.svg - ../images/viewer_toolbar/doublePage.svg - ../images/viewer_toolbar/doubleMangaPage.svg - ../images/viewer_toolbar/fitToPage.svg - ../images/viewer_toolbar/flow.svg - ../images/viewer_toolbar/full.svg - ../images/viewer_toolbar/goto.svg - ../images/viewer_toolbar/help.svg - ../images/viewer_toolbar/info.svg - ../images/viewer_toolbar/magnifyingGlass.svg - ../images/viewer_toolbar/next.svg - ../images/viewer_toolbar/open.svg - ../images/viewer_toolbar/openFolder.svg - ../images/viewer_toolbar/openNext.svg - ../images/viewer_toolbar/openPrevious.svg - ../images/viewer_toolbar/options.svg - ../images/viewer_toolbar/previous.svg - ../images/viewer_toolbar/rotateL.svg - ../images/viewer_toolbar/rotateR.svg - ../images/viewer_toolbar/save.svg - ../images/viewer_toolbar/shortcuts.svg - ../images/viewer_toolbar/showBookmarks.svg - ../images/viewer_toolbar/toHeight.svg - ../images/viewer_toolbar/toContinuousScroll.svg - ../images/viewer_toolbar/toWidth.svg - ../images/viewer_toolbar/translator.svg - ../images/viewer_toolbar/zoom.svg - ../images/viewer_toolbar/bookmark_18x18.svg - ../images/viewer_toolbar/close_18x18.svg - ../images/viewer_toolbar/doublePage_18x18.svg - ../images/viewer_toolbar/doubleMangaPage_18x18.svg - ../images/viewer_toolbar/fitToPage_18x18.svg - ../images/viewer_toolbar/flow_18x18.svg - ../images/viewer_toolbar/full_18x18.svg - ../images/viewer_toolbar/goto_18x18.svg - ../images/viewer_toolbar/help_18x18.svg - ../images/viewer_toolbar/info_18x18.svg - ../images/viewer_toolbar/magnifyingGlass_18x18.svg - ../images/viewer_toolbar/next_18x18.svg - ../images/viewer_toolbar/open_18x18.svg - ../images/viewer_toolbar/openFolder_18x18.svg - ../images/viewer_toolbar/openNext_18x18.svg - ../images/viewer_toolbar/openPrevious_18x18.svg - ../images/viewer_toolbar/options_18x18.svg - ../images/viewer_toolbar/previous_18x18.svg - ../images/viewer_toolbar/rotateL_18x18.svg - ../images/viewer_toolbar/rotateR_18x18.svg - ../images/viewer_toolbar/save_18x18.svg - ../images/viewer_toolbar/shortcuts_18x18.svg - ../images/viewer_toolbar/showBookmarks_18x18.svg - ../images/viewer_toolbar/toHeight_18x18.svg - ../images/viewer_toolbar/toContinuousScroll_18x18.svg - ../images/viewer_toolbar/toWidth_18x18.svg - ../images/viewer_toolbar/translator_18x18.svg - ../images/viewer_toolbar/zoom_18x18.svg - ../images/viewer_toolbar/menuArrow.svg - - diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt index a86629faf..ef562b5e3 100644 --- a/YACReaderLibrary/CMakeLists.txt +++ b/YACReaderLibrary/CMakeLists.txt @@ -200,32 +200,262 @@ target_compile_definitions(YACReaderLibrary PRIVATE ) # Resources -qt_add_resources(yacreaderlibrary_images_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images.qrc") -qt_add_resources(yacreaderlibrary_files_rcc "${CMAKE_CURRENT_SOURCE_DIR}/files.qrc") -qt_add_resources(yacreaderlibrary_qml_rcc "${CMAKE_CURRENT_SOURCE_DIR}/qml.qrc") -qt_add_resources(yacreaderlibrary_themes_rcc "${CMAKE_CURRENT_SOURCE_DIR}/themes/themes.qrc") -qt_add_resources(yacreaderlibrary_common_images_rcc "${PROJECT_SOURCE_DIR}/common/themes/appearance_config_images.qrc") -target_sources(YACReaderLibrary PRIVATE - ${yacreaderlibrary_images_rcc} - ${yacreaderlibrary_files_rcc} - ${yacreaderlibrary_qml_rcc} - ${yacreaderlibrary_themes_rcc} - ${yacreaderlibrary_common_images_rcc} +set(yacreaderlibrary_image_files + ${PROJECT_SOURCE_DIR}/images/shortcuts/accept_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/clear_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/downArrow.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/nextPage.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/previousPage.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/radioChecked.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/radioUnchecked.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/rowDown.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/rowUp.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/upArrow.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/checkBoxTick.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/asignNumber.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/big_size_grid_zoom.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/editComic.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/getInfo.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/hideComicFlow.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/openInYACReader.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/selectAll.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setReadButton.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setUnread.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/showMarks.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/small_size_grid_zoom.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/trash.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/show_comic_info.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setManga.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setNormal.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/showRecentIndicator.svg + ${PROJECT_SOURCE_DIR}/images/defaultCover.png + ${PROJECT_SOURCE_DIR}/images/library_dialogs/edit.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_current_readings.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_favorites.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_folder.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_label.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_reading_list.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/exportComicsInfo.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/exportLibrary.svg + ${PROJECT_SOURCE_DIR}/images/find_folder.svg + ${PROJECT_SOURCE_DIR}/images/flow1.png + ${PROJECT_SOURCE_DIR}/images/flow2.png + ${PROJECT_SOURCE_DIR}/images/flow3.png + ${PROJECT_SOURCE_DIR}/images/flow4.png + ${PROJECT_SOURCE_DIR}/images/flow5.png + ${PROJECT_SOURCE_DIR}/images/glowLine.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/loadCustomCover.svg + ${PROJECT_SOURCE_DIR}/images/import/coversToggle.svg + ${PROJECT_SOURCE_DIR}/images/icon-new.svg + ${PROJECT_SOURCE_DIR}/images/iconLibrary.png + ${PROJECT_SOURCE_DIR}/images/import/importBottomCoversDecoration.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/importComicsInfo.svg + ${PROJECT_SOURCE_DIR}/images/import/importingIcon.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/importLibrary.svg + ${PROJECT_SOURCE_DIR}/images/import/importTopCoversDecoration.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/back.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/forward.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/settings.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/server.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/help.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/fullscreen.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/flow.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/grid.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/info.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/divider.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/editIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/exportComicsInfoIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/exportLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/importComicsInfoIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/importLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/removeLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/updateLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/open_containing_folder.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/update_current_folder.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/new.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/nextCoverPage.svg + ${PROJECT_SOURCE_DIR}/images/noLibrariesIcon.svg + ${PROJECT_SOURCE_DIR}/images/noLibrariesLine.svg + ${PROJECT_SOURCE_DIR}/images/notCover.png + ${PROJECT_SOURCE_DIR}/images/library_dialogs/openLibrary.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/previousCoverPage.svg + ${PROJECT_SOURCE_DIR}/images/readingRibbon.svg + ${PROJECT_SOURCE_DIR}/images/readRibbon.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/resetCover.svg + ${PROJECT_SOURCE_DIR}/images/search_result.svg + ${PROJECT_SOURCE_DIR}/images/serverConfigBackground.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_comics.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_folders.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_general.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_libraries.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_mglass.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_page.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_reading.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_visualization.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/setRoot.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/expand.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/colapse.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/newLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/openLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/addNew_sidebar.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/delete_sidebar.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/addLabelIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/renameListIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/branch-closed.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/branch-open.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder_finished.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder_read_overlay.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryIconSelected.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryOptions.svg + ${PROJECT_SOURCE_DIR}/images/import/updatingIcon.svg + ${PROJECT_SOURCE_DIR}/images/custom_dialog/custom_close_button.svg + ${PROJECT_SOURCE_DIR}/images/whats_new/whatsnew_header.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_0.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_1.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_2.svg + ${PROJECT_SOURCE_DIR}/images/lists/label_template.svg + ${PROJECT_SOURCE_DIR}/images/lists/list.svg + ${PROJECT_SOURCE_DIR}/images/clearSearchNew.svg + ${PROJECT_SOURCE_DIR}/images/iconSearchNew.svg +) +set(yacreaderlibrary_file_files + ${PROJECT_SOURCE_DIR}/files/about.html + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary.html +) +set(yacreaderlibrary_file_files_es + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary_es_ES.html +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "about.html" +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "helpYACReaderLibrary.html" +) +set(yacreaderlibrary_qml_files + ${CMAKE_CURRENT_SOURCE_DIR}/qml/GridComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FolderContentView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FlowView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoTick.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoFavorites.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoRating.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/tick.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/reading.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/star.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/page.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-indicator.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-shadow.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-top-shadow.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/ComicInfoView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-favorites.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-rating.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-tag.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-tick.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/prerendered_cover_shadow.png +) +set(yacreaderlibrary_qml_translation_files + ${CMAKE_CURRENT_SOURCE_DIR}/qml/GridComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FolderContentView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FlowView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoTick.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoFavorites.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoRating.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/ComicInfoView.qml +) +set(yacreaderlibrary_theme_files + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_classic.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light4.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light5.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark4.json +) +set(yacreaderlibrary_common_theme_image_files + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-system.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-light.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-dark.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-custom.svg +) + +qt_add_resources(YACReaderLibrary "yacreaderlibrary_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_image_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_files" + PREFIX "/files" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreaderlibrary_file_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_files_es" + PREFIX "/files" + LANG "es_ES" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreaderlibrary_file_files_es} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_qml" + PREFIX "/" + BASE "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_qml_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_themes" + PREFIX "/themes" + BASE "${CMAKE_CURRENT_SOURCE_DIR}/themes" + FILES + ${yacreaderlibrary_theme_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_common_theme_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_common_theme_image_files} ) if(WIN32 OR (UNIX AND NOT APPLE)) - qt_add_resources(yacreaderlibrary_images_win_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images_win.qrc") - target_sources(YACReaderLibrary PRIVATE ${yacreaderlibrary_images_win_rcc}) + set(yacreaderlibrary_windows_resource_files + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close.svg + ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico + ) + set_source_files_properties( + ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico + PROPERTIES QT_RESOURCE_ALIAS "icon.ico" + ) + qt_add_resources(YACReaderLibrary "yacreaderlibrary_windows_resources" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_windows_resource_files} + ) endif() if(APPLE) - qt_add_resources(yacreaderlibrary_images_osx_rcc "${CMAKE_CURRENT_SOURCE_DIR}/images_osx.qrc") - target_sources(YACReaderLibrary PRIVATE ${yacreaderlibrary_images_osx_rcc}) + qt_add_resources(YACReaderLibrary "yacreaderlibrary_macos_resources" + PREFIX "/" + BASE "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/macostrayicon.svg + ) endif() # Translations qt_add_translations(YACReaderLibrary SOURCE_TARGETS YACReaderLibrary - # Keep full C++ extraction via SOURCE_TARGETS and add qml.qrc as extra input + # Keep full C++ extraction via SOURCE_TARGETS and add the QML files directly # so qsTr() strings in QML are collected too. TS_FILES yacreaderlibrary_es.ts @@ -242,7 +472,7 @@ qt_add_translations(YACReaderLibrary yacreaderlibrary_source.ts yacreaderlibrary_en.ts SOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/qml.qrc + ${yacreaderlibrary_qml_translation_files} ) target_link_libraries(YACReaderLibrary PRIVATE diff --git a/YACReaderLibrary/files.qrc b/YACReaderLibrary/files.qrc deleted file mode 100644 index 7a37b2ec1..000000000 --- a/YACReaderLibrary/files.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - ../files/about.html - ../files/helpYACReaderLibrary.html - - - - ../files/about_es_ES.html - ../files/helpYACReaderLibrary_es_ES.html - - - diff --git a/YACReaderLibrary/images.qrc b/YACReaderLibrary/images.qrc deleted file mode 100644 index 86783e830..000000000 --- a/YACReaderLibrary/images.qrc +++ /dev/null @@ -1,122 +0,0 @@ - - - ../images/shortcuts/accept_shortcut.svg - ../images/shortcuts/clear_shortcut.svg - ../images/comic_vine/downArrow.svg - ../images/comic_vine/nextPage.svg - ../images/comic_vine/previousPage.svg - ../images/comic_vine/radioChecked.svg - ../images/comic_vine/radioUnchecked.svg - ../images/comic_vine/rowDown.svg - ../images/comic_vine/rowUp.svg - ../images/comic_vine/upArrow.svg - ../images/comic_vine/checkBoxTick.svg - ../images/comics_view_toolbar/asignNumber.svg - ../images/comics_view_toolbar/big_size_grid_zoom.svg - ../images/comics_view_toolbar/editComic.svg - ../images/comics_view_toolbar/getInfo.svg - ../images/comics_view_toolbar/hideComicFlow.svg - ../images/comics_view_toolbar/openInYACReader.svg - ../images/comics_view_toolbar/selectAll.svg - ../images/comics_view_toolbar/setReadButton.svg - ../images/comics_view_toolbar/setUnread.svg - ../images/comics_view_toolbar/showMarks.svg - ../images/comics_view_toolbar/small_size_grid_zoom.svg - ../images/comics_view_toolbar/trash.svg - ../images/comics_view_toolbar/show_comic_info.svg - ../images/comics_view_toolbar/setManga.svg - ../images/comics_view_toolbar/setNormal.svg - ../images/comics_view_toolbar/showRecentIndicator.svg - ../images/defaultCover.png - ../images/library_dialogs/edit.svg - ../images/empty_container/empty_current_readings.svg - ../images/empty_container/empty_favorites.svg - ../images/empty_container/empty_folder.svg - ../images/empty_container/empty_label.svg - ../images/empty_container/empty_reading_list.svg - ../images/library_dialogs/exportComicsInfo.svg - ../images/library_dialogs/exportLibrary.svg - ../images/find_folder.svg - ../images/flow1.png - ../images/flow2.png - ../images/flow3.png - ../images/flow4.png - ../images/flow5.png - ../images/glowLine.svg - ../images/metadata_dialog/loadCustomCover.svg - ../images/import/coversToggle.svg - ../images/icon-new.svg - ../images/iconLibrary.png - ../images/import/importBottomCoversDecoration.svg - ../images/library_dialogs/importComicsInfo.svg - ../images/import/importingIcon.svg - ../images/library_dialogs/importLibrary.svg - ../images/import/importTopCoversDecoration.svg - ../images/main_toolbar/back.svg - ../images/main_toolbar/forward.svg - ../images/main_toolbar/settings.svg - ../images/main_toolbar/server.svg - ../images/main_toolbar/help.svg - ../images/main_toolbar/fullscreen.svg - ../images/main_toolbar/flow.svg - ../images/main_toolbar/grid.svg - ../images/main_toolbar/info.svg - ../images/main_toolbar/divider.svg - ../images/menus_icons/editIcon.svg - ../images/menus_icons/exportComicsInfoIcon.svg - ../images/menus_icons/exportLibraryIcon.svg - ../images/menus_icons/importComicsInfoIcon.svg - ../images/menus_icons/importLibraryIcon.svg - ../images/menus_icons/removeLibraryIcon.svg - ../images/menus_icons/updateLibraryIcon.svg - ../images/menus_icons/open_containing_folder.svg - ../images/menus_icons/update_current_folder.svg - ../images/library_dialogs/new.svg - ../images/metadata_dialog/nextCoverPage.svg - ../images/noLibrariesIcon.svg - ../images/noLibrariesLine.svg - ../images/notCover.png - ../images/library_dialogs/openLibrary.svg - ../images/metadata_dialog/previousCoverPage.svg - ../images/readingRibbon.svg - ../images/readRibbon.svg - ../images/metadata_dialog/resetCover.svg - ../images/search_result.svg - ../images/serverConfigBackground.svg - ../images/shortcuts/shortcuts_group_comics.svg - ../images/shortcuts/shortcuts_group_folders.svg - ../images/shortcuts/shortcuts_group_general.svg - ../images/shortcuts/shortcuts_group_libraries.svg - ../images/shortcuts/shortcuts_group_mglass.svg - ../images/shortcuts/shortcuts_group_page.svg - ../images/shortcuts/shortcuts_group_reading.svg - ../images/shortcuts/shortcuts_group_visualization.svg - ../images/sidebar/libraryIcon.svg - ../images/sidebar/setRoot.svg - ../images/sidebar/expand.svg - ../images/sidebar/colapse.svg - ../images/sidebar/newLibraryIcon.svg - ../images/sidebar/openLibraryIcon.svg - ../images/sidebar/addNew_sidebar.svg - ../images/sidebar/delete_sidebar.svg - ../images/sidebar/addLabelIcon.svg - ../images/sidebar/renameListIcon.svg - ../images/sidebar/branch-closed.svg - ../images/sidebar/branch-open.svg - ../images/sidebar/folder.svg - ../images/sidebar/folder_finished.svg - ../images/sidebar/folder_read_overlay.svg - ../images/sidebar/libraryIconSelected.svg - ../images/sidebar/libraryOptions.svg - ../images/import/updatingIcon.svg - ../images/custom_dialog/custom_close_button.svg - ../images/whats_new/whatsnew_header.svg - ../images/lists/default_0.svg - ../images/lists/default_1.svg - ../images/lists/default_2.svg - ../images/lists/label_template.svg - ../images/lists/list.svg - ../images/clearSearchNew.svg - ../images/iconSearchNew.svg - - diff --git a/YACReaderLibrary/images_osx.qrc b/YACReaderLibrary/images_osx.qrc deleted file mode 100644 index a26df5b0f..000000000 --- a/YACReaderLibrary/images_osx.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - macostrayicon.svg - - diff --git a/YACReaderLibrary/images_win.qrc b/YACReaderLibrary/images_win.qrc deleted file mode 100644 index 9eb496efc..000000000 --- a/YACReaderLibrary/images_win.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - ../images/viewer_toolbar/close.svg - icon.ico - - diff --git a/YACReaderLibrary/qml.qrc b/YACReaderLibrary/qml.qrc deleted file mode 100644 index 2d767d062..000000000 --- a/YACReaderLibrary/qml.qrc +++ /dev/null @@ -1,24 +0,0 @@ - - - qml/GridComicsView.qml - qml/FolderContentView.qml - qml/FlowView.qml - qml/InfoTick.qml - qml/InfoFavorites.qml - qml/InfoRating.qml - qml/InfoComicsView.qml - qml/tick.svg - qml/reading.svg - qml/star.svg - qml/page.svg - qml/info-indicator.svg - qml/info-shadow.svg - qml/info-top-shadow.svg - qml/ComicInfoView.qml - qml/info-favorites.svg - qml/info-rating.svg - qml/info-tag.svg - qml/info-tick.svg - qml/prerendered_cover_shadow.png - - diff --git a/YACReaderLibrary/themes/themes.qrc b/YACReaderLibrary/themes/themes.qrc deleted file mode 100644 index d96de307d..000000000 --- a/YACReaderLibrary/themes/themes.qrc +++ /dev/null @@ -1,16 +0,0 @@ - - - builtin_classic.json - builtin_light.json - builtin_light1.json - builtin_light2.json - builtin_light3.json - builtin_light4.json - builtin_light5.json - builtin_dark.json - builtin_dark1.json - builtin_dark2.json - builtin_dark3.json - builtin_dark4.json - - diff --git a/common/themes/appearance_config_images.qrc b/common/themes/appearance_config_images.qrc deleted file mode 100644 index b67edae76..000000000 --- a/common/themes/appearance_config_images.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - ../../images/appearance_config/theme-mode-system.svg - ../../images/appearance_config/theme-mode-light.svg - ../../images/appearance_config/theme-mode-dark.svg - ../../images/appearance_config/theme-mode-custom.svg - - From 74aebffd9baf9eb6af8ca4b7bd796892712d9af0 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 16:41:54 +0200 Subject: [PATCH 13/19] Don't use CMAKE_RUNTIME_OUTPUT_DIRECTORY for Linux Windows and macos installer scripts are still used and they rely on that folder --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82d1f7574..aa4e6da73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,7 +147,9 @@ qt_standard_project_setup() include(PdfBackend) # Output directory -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +if(WIN32 OR APPLE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +endif() # Build number define if(BUILD_NUMBER) From 79a8acbd4291fba8a0647454f2ead41993aca7e6 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 17:19:40 +0200 Subject: [PATCH 14/19] Extract VERSION to avoid duplication --- .github/workflows/build.yml | 8 ++++---- CMakeLists.txt | 8 +++++++- VERSION | 1 + ci/win/create_installer.cmd | 6 +----- common/CMakeLists.txt | 15 +++++++++++++- common/check_new_version.cpp | 39 ++++++++---------------------------- common/version.h.in | 6 ++++++ common/yacreader_global.h | 5 ++++- compileOSX.sh | 2 +- 9 files changed, 46 insertions(+), 44 deletions(-) create mode 100644 VERSION create mode 100644 common/version.h.in diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e0e532317..b846abfd4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -153,7 +153,7 @@ jobs: env: MACOSX_DEPLOYMENT_TARGET: "11" run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + VERSION="$(tr -d '\r\n' < VERSION)" SKIP_CODESIGN="${{ env.IS_FORK }}" SKIP_CODESIGN=$(echo "$SKIP_CODESIGN" | tr '[:upper:]' '[:lower:]') ./compileOSX.sh $VERSION ${{ needs.initialization.outputs.build_number }} $SKIP_CODESIGN Qt6 universal @@ -510,7 +510,7 @@ jobs: - name: Get version id: version run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' ).${{ needs.initialization.outputs.build_number }}" + VERSION="$(tr -d '\r\n' < VERSION).${{ needs.initialization.outputs.build_number }}" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" @@ -577,7 +577,7 @@ jobs: - name: Get version id: version run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + VERSION="$(tr -d '\r\n' < VERSION)" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" @@ -648,7 +648,7 @@ jobs: - name: Get version id: version run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' ).${{ needs.initialization.outputs.build_number }}" + VERSION="$(tr -d '\r\n' < VERSION).${{ needs.initialization.outputs.build_number }}" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" diff --git a/CMakeLists.txt b/CMakeLists.txt index aa4e6da73..84c86400e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,13 @@ cmake_minimum_required(VERSION 3.25...4.3.1) +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" YACREADER_VERSION) +string(STRIP "${YACREADER_VERSION}" YACREADER_VERSION) +if(NOT YACREADER_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$") + message(FATAL_ERROR "VERSION must contain a semantic version like x.y.z") +endif() + project(YACReader - VERSION 10.0.0 + VERSION ${YACREADER_VERSION} LANGUAGES C CXX ) diff --git a/VERSION b/VERSION new file mode 100644 index 000000000..95c4e8d27 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +10.0.0 \ No newline at end of file diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 2a6580737..2c710359a 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -52,12 +52,8 @@ for /r %src_path%\build %%f in (*.qm) do ( copy %src_path%\vc_redist.%ARCH%.exe . -type %src_path%\common\yacreader_global.h | findstr /R /C:"#define VERSION " > tmp -set /p VERSION= < tmp -set VERSION=%VERSION:#define VERSION "=% -set VERSION=%VERSION:"=% +set /p VERSION=<%src_path%\VERSION echo %VERSION% -del tmp echo "iscc start" iscc /DVERSION=%VERSION% /DPLATFORM=%ARCH% /DCOMPRESSED_ARCHIVE_BACKEND=%COMPRESSION% /DBUILD_NUMBER=%BUILD_NUMBER% build_installer_qt6.iss || exit /b diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 47729aad8..96125dd69 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -1,12 +1,23 @@ # Common libraries for YACReader # Fine-grained STATIC targets per concern +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/version.h + @ONLY +) + # --- yr_global (no GUI, used by all 3 apps) --- add_library(yr_global STATIC + ${CMAKE_CURRENT_BINARY_DIR}/version.h + version.h.in yacreader_global.h yacreader_global.cpp ) -target_include_directories(yr_global PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(yr_global PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) target_link_libraries(yr_global PUBLIC Qt::Core) if(UNIX AND NOT APPLE) target_compile_definitions(yr_global PRIVATE @@ -171,6 +182,7 @@ target_link_libraries(rhi_flow_reader PUBLIC Qt::Gui Qt::GuiPrivate Qt::Widgets + yr_global ) qt_add_shaders(rhi_flow_reader "flow_shaders_reader" BASE rhi/shaders @@ -194,6 +206,7 @@ target_link_libraries(rhi_flow_library PUBLIC Qt::Gui Qt::GuiPrivate Qt::Widgets + yr_global ) qt_add_shaders(rhi_flow_library "flow_shaders_library" BASE rhi/shaders diff --git a/common/check_new_version.cpp b/common/check_new_version.cpp index 18646a5cc..d8a8bf9e5 100644 --- a/common/check_new_version.cpp +++ b/common/check_new_version.cpp @@ -6,16 +6,15 @@ #include #include #include -#include -#include #include #include +#include #include #define PREVIOUS_VERSION_TESTING "6.0.0" HttpVersionChecker::HttpVersionChecker() - : HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/common/yacreader_global.h", DEFAULT_USER_AGENT) + : HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/VERSION", DEFAULT_USER_AGENT) { connect(this, &HttpVersionChecker::dataReady, this, QOverload::of(&HttpVersionChecker::checkNewVersion)); } @@ -27,39 +26,17 @@ void HttpVersionChecker::checkNewVersion(const QByteArray &data) bool HttpVersionChecker::checkNewVersion(QString sourceContent) { - QRegExp rx("#define VERSION \"([0-9]+).([0-9]+).([0-9]+)\""); - - bool newVersion = false; - bool sameVersion = true; - // bool currentVersionIsNewer = false; #ifdef QT_DEBUG - QString version(PREVIOUS_VERSION_TESTING); + const auto currentVersion = QVersionNumber::fromString(PREVIOUS_VERSION_TESTING); #else - QString version(VERSION); + const auto currentVersion = QVersionNumber::fromString(QString::fromLatin1(VERSION)); #endif - QStringList sl = version.split("."); - if (rx.indexIn(sourceContent) != -1) { - int length = qMin(sl.size(), (rx.cap(4) != "") ? 4 : 3); - for (int i = 0; i < length; i++) { - if (rx.cap(i + 1).toInt() < sl.at(i).toInt()) { - return false; - } - if (rx.cap(i + 1).toInt() > sl.at(i).toInt()) { - newVersion = true; - break; - } else - sameVersion = sameVersion && rx.cap(i + 1).toInt() == sl.at(i).toInt(); - } - if (!newVersion && sameVersion) { - if ((sl.size() == 3) && (rx.cap(4) != "")) - newVersion = true; - } - } + const auto latestVersion = QVersionNumber::fromString(sourceContent.trimmed()); - if (newVersion == true) { + if (!currentVersion.isNull() && !latestVersion.isNull() && QVersionNumber::compare(latestVersion, currentVersion) > 0) { emit newVersionDetected(); return true; - } else { - return false; } + + return false; } diff --git a/common/version.h.in b/common/version.h.in new file mode 100644 index 000000000..07b9f88d0 --- /dev/null +++ b/common/version.h.in @@ -0,0 +1,6 @@ +#ifndef YACREADER_VERSION_H +#define YACREADER_VERSION_H + +#define VERSION "@PROJECT_VERSION@" + +#endif diff --git a/common/yacreader_global.h b/common/yacreader_global.h index 750e6c9a2..810878628 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -9,7 +9,10 @@ class QLibrary; -#define VERSION "10.0.0" +// Compatibility for already released apps that still parse this file for update checks. +// TODO: remove after old releases have migrated away from scraping this header. +// #define VERSION "10.0.0" +#include "version.h" // Used to check if the database needs to be updated, the version is stored in the database. // This value is only incremented when the database structure changes. diff --git a/compileOSX.sh b/compileOSX.sh index 460c96846..519624dfb 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -1,7 +1,7 @@ #! /bin/bash set -e -VERSION=${1:-"9.9.1"} +VERSION=${1:-$(tr -d '\r\n' < VERSION)} BUILD_NUMBER=${2:-"0"} From e2ddb7eaafb2423486f2ab6fe6a56babcb8222b6 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 17:48:33 +0200 Subject: [PATCH 15/19] Use Qt6:: syntax for Qt modules --- YACReader/CMakeLists.txt | 18 ++++---- YACReaderLibrary/CMakeLists.txt | 38 ++++++++-------- YACReaderLibrary/comic_vine/CMakeLists.txt | 6 +-- YACReaderLibrary/server/CMakeLists.txt | 6 +-- YACReaderLibraryServer/CMakeLists.txt | 8 ++-- common/CMakeLists.txt | 46 ++++++++++---------- compressed_archive/CMakeLists.txt | 2 +- custom_widgets/CMakeLists.txt | 12 ++--- shortcuts_management/CMakeLists.txt | 4 +- tests/compressed_archive_test/CMakeLists.txt | 2 +- tests/concurrent_queue_test/CMakeLists.txt | 4 +- third_party/CMakeLists.txt | 8 ++-- 12 files changed, 77 insertions(+), 77 deletions(-) diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt index e6f74b0ae..a6fcded6f 100644 --- a/YACReader/CMakeLists.txt +++ b/YACReader/CMakeLists.txt @@ -232,15 +232,15 @@ qt_add_translations(YACReader ) target_link_libraries(YACReader PRIVATE - Qt::Core - Qt::Gui - Qt::GuiPrivate - Qt::Network - Qt::Widgets - Qt::Multimedia - Qt::TextToSpeech - Qt::Svg - Qt::Core5Compat + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Network + Qt6::Widgets + Qt6::Multimedia + Qt6::TextToSpeech + Qt6::Svg + Qt6::Core5Compat comic_backend common_gui rhi_flow_reader diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt index ef562b5e3..d8586d480 100644 --- a/YACReaderLibrary/CMakeLists.txt +++ b/YACReaderLibrary/CMakeLists.txt @@ -32,10 +32,10 @@ target_include_directories(library_common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/db ) target_link_libraries(library_common PUBLIC - Qt::Core - Qt::Core5Compat - Qt::Network - Qt::Sql + Qt6::Core + Qt6::Core5Compat + Qt6::Network + Qt6::Sql common_all comic_backend cbx_backend @@ -63,14 +63,14 @@ target_include_directories(db_helper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/db ) target_link_libraries(db_helper PUBLIC - Qt::Core - Qt::Sql + Qt6::Core + Qt6::Sql common_all QsLog ) # When BUILD_SERVER_STANDALONE=ON, only library_common and db_helper are built. -# The full YACReaderLibrary GUI app requires Qt::Widgets and other full-build components. +# The full YACReaderLibrary GUI app requires Qt6::Widgets and other full-build components. if(NOT BUILD_SERVER_STANDALONE) # --- YACReaderLibrary executable --- @@ -476,18 +476,18 @@ qt_add_translations(YACReaderLibrary ) target_link_libraries(YACReaderLibrary PRIVATE - Qt::Core - Qt::Gui - Qt::GuiPrivate - Qt::Network - Qt::Widgets - Qt::Sql - Qt::Svg - Qt::Quick - Qt::Qml - Qt::QuickWidgets - Qt::QuickControls2 - Qt::Core5Compat + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Network + Qt6::Widgets + Qt6::Sql + Qt6::Svg + Qt6::Quick + Qt6::Qml + Qt6::QuickWidgets + Qt6::QuickControls2 + Qt6::Core5Compat library_common db_helper comic_backend diff --git a/YACReaderLibrary/comic_vine/CMakeLists.txt b/YACReaderLibrary/comic_vine/CMakeLists.txt index cc0ca1a10..947d01b6b 100644 --- a/YACReaderLibrary/comic_vine/CMakeLists.txt +++ b/YACReaderLibrary/comic_vine/CMakeLists.txt @@ -60,9 +60,9 @@ target_include_directories(comic_vine PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db ) target_link_libraries(comic_vine PUBLIC - Qt::Core - Qt::Widgets - Qt::Network + Qt6::Core + Qt6::Widgets + Qt6::Network common_all common_gui custom_widgets_library diff --git a/YACReaderLibrary/server/CMakeLists.txt b/YACReaderLibrary/server/CMakeLists.txt index 5a78620cb..af7b337e1 100644 --- a/YACReaderLibrary/server/CMakeLists.txt +++ b/YACReaderLibrary/server/CMakeLists.txt @@ -73,9 +73,9 @@ if(UNIX AND NOT APPLE) "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"") endif() target_link_libraries(server PUBLIC - Qt::Core - Qt::Network - Qt::Sql + Qt6::Core + Qt6::Network + Qt6::Sql QtWebApp_httpserver QtWebApp_templateengine QsLog diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index 42b5a27b4..efaf364a5 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -36,10 +36,10 @@ qt_add_translations(YACReaderLibraryServer ) target_link_libraries(YACReaderLibraryServer PRIVATE - Qt::Core - Qt::Network - Qt::Sql - Qt::Core5Compat + Qt6::Core + Qt6::Network + Qt6::Sql + Qt6::Core5Compat library_common db_helper comic_backend diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 96125dd69..d8017a655 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -18,7 +18,7 @@ target_include_directories(yr_global PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) -target_link_libraries(yr_global PUBLIC Qt::Core) +target_link_libraries(yr_global PUBLIC Qt6::Core) if(UNIX AND NOT APPLE) target_compile_definitions(yr_global PRIVATE "LIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"") @@ -30,7 +30,7 @@ add_library(naturalsort STATIC qnaturalsorting.cpp ) target_include_directories(naturalsort PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(naturalsort PUBLIC Qt::Core) +target_link_libraries(naturalsort PUBLIC Qt6::Core) # --- concurrent_queue --- add_library(concurrent_queue STATIC @@ -38,7 +38,7 @@ add_library(concurrent_queue STATIC concurrent_queue.cpp ) target_include_directories(concurrent_queue PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(concurrent_queue PUBLIC Qt::Core) +target_link_libraries(concurrent_queue PUBLIC Qt6::Core) # --- worker (header-only thread helpers) --- add_library(worker INTERFACE) @@ -67,10 +67,10 @@ add_library(common_all STATIC ) target_include_directories(common_all PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(common_all PUBLIC - Qt::Core - Qt::Gui - Qt::Sql - Qt::Network + Qt6::Core + Qt6::Gui + Qt6::Sql + Qt6::Network yr_global naturalsort pdf_backend_iface @@ -92,8 +92,8 @@ endif() target_include_directories(comic_backend PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(comic_backend PUBLIC - Qt::Core - Qt::Gui + Qt6::Core + Qt6::Gui common_all pdf_backend_iface cbx_backend @@ -101,7 +101,7 @@ target_link_libraries(comic_backend PUBLIC ) # GUI-only targets: not needed for server-standalone builds (Qt 6.4+) which -# lack Qt::Widgets, Qt::ShaderTools, Qt::GuiPrivate, etc. +# lack Qt6::Widgets, Qt6::ShaderTools, Qt6::GuiPrivate, etc. if(NOT BUILD_SERVER_STANDALONE) # --- common_gui (GUI-only code: widgets, version check, themes infrastructure) --- @@ -146,11 +146,11 @@ target_include_directories(common_gui PUBLIC ) target_link_libraries(common_gui PUBLIC - Qt::Core - Qt::Core5Compat - Qt::Widgets - Qt::Network - Qt::Svg + Qt6::Core + Qt6::Core5Compat + Qt6::Widgets + Qt6::Network + Qt6::Svg common_all yr_global QsLog @@ -178,10 +178,10 @@ target_include_directories(rhi_flow_reader PUBLIC ) target_compile_definitions(rhi_flow_reader PRIVATE YACREADER) target_link_libraries(rhi_flow_reader PUBLIC - Qt::Core - Qt::Gui - Qt::GuiPrivate - Qt::Widgets + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Widgets yr_global ) qt_add_shaders(rhi_flow_reader "flow_shaders_reader" @@ -202,10 +202,10 @@ target_include_directories(rhi_flow_library PUBLIC ) target_compile_definitions(rhi_flow_library PRIVATE YACREADER_LIBRARY) target_link_libraries(rhi_flow_library PUBLIC - Qt::Core - Qt::Gui - Qt::GuiPrivate - Qt::Widgets + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Widgets yr_global ) qt_add_shaders(rhi_flow_library "flow_shaders_library" diff --git a/compressed_archive/CMakeLists.txt b/compressed_archive/CMakeLists.txt index 928fb622f..a5f5ba5c3 100644 --- a/compressed_archive/CMakeLists.txt +++ b/compressed_archive/CMakeLists.txt @@ -125,4 +125,4 @@ else() endif() # Qt, yr_global, and QsLog are needed by all backends -target_link_libraries(cbx_backend PRIVATE Qt::Core yr_global QsLog) +target_link_libraries(cbx_backend PRIVATE Qt6::Core yr_global QsLog) diff --git a/custom_widgets/CMakeLists.txt b/custom_widgets/CMakeLists.txt index aaa7ec25a..84590dad2 100644 --- a/custom_widgets/CMakeLists.txt +++ b/custom_widgets/CMakeLists.txt @@ -44,9 +44,9 @@ target_include_directories(custom_widgets_reader PRIVATE ) target_compile_definitions(custom_widgets_reader PRIVATE YACREADER) target_link_libraries(custom_widgets_reader PUBLIC - Qt::Core - Qt::Widgets - Qt::Network + Qt6::Core + Qt6::Widgets + Qt6::Network common_gui rhi_flow_reader QsLog @@ -91,9 +91,9 @@ target_include_directories(custom_widgets_library PRIVATE ) target_compile_definitions(custom_widgets_library PRIVATE YACREADER_LIBRARY) target_link_libraries(custom_widgets_library PUBLIC - Qt::Core - Qt::Widgets - Qt::Network + Qt6::Core + Qt6::Widgets + Qt6::Network common_gui rhi_flow_library QsLog diff --git a/shortcuts_management/CMakeLists.txt b/shortcuts_management/CMakeLists.txt index 4cbbd7217..3c893d060 100644 --- a/shortcuts_management/CMakeLists.txt +++ b/shortcuts_management/CMakeLists.txt @@ -22,7 +22,7 @@ target_include_directories(shortcuts_reader PRIVATE ${PROJECT_SOURCE_DIR}/YACReader/themes ) target_compile_definitions(shortcuts_reader PRIVATE YACREADER) -target_link_libraries(shortcuts_reader PUBLIC Qt::Core Qt::Widgets yr_global common_gui) +target_link_libraries(shortcuts_reader PUBLIC Qt6::Core Qt6::Widgets yr_global common_gui) # --- shortcuts_library (YACREADER_LIBRARY define) --- add_library(shortcuts_library STATIC ${SHORTCUTS_SOURCES}) @@ -31,4 +31,4 @@ target_include_directories(shortcuts_library PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes ) target_compile_definitions(shortcuts_library PRIVATE YACREADER_LIBRARY) -target_link_libraries(shortcuts_library PUBLIC Qt::Core Qt::Widgets yr_global common_gui) +target_link_libraries(shortcuts_library PUBLIC Qt6::Core Qt6::Widgets yr_global common_gui) diff --git a/tests/compressed_archive_test/CMakeLists.txt b/tests/compressed_archive_test/CMakeLists.txt index 7b3e40b03..4f0e1c476 100644 --- a/tests/compressed_archive_test/CMakeLists.txt +++ b/tests/compressed_archive_test/CMakeLists.txt @@ -4,7 +4,7 @@ qt_add_executable(compressed_archive_test main.cpp ) target_link_libraries(compressed_archive_test PRIVATE - Qt::Core + Qt6::Core cbx_backend ) if(WIN32) diff --git a/tests/concurrent_queue_test/CMakeLists.txt b/tests/concurrent_queue_test/CMakeLists.txt index b6c490937..380e52b5e 100644 --- a/tests/concurrent_queue_test/CMakeLists.txt +++ b/tests/concurrent_queue_test/CMakeLists.txt @@ -4,8 +4,8 @@ qt_add_executable(concurrent_queue_test concurrent_queue_test.cpp ) target_link_libraries(concurrent_queue_test PRIVATE - Qt::Core - Qt::Test + Qt6::Core + Qt6::Test concurrent_queue ) add_test(NAME concurrent_queue_test diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index d4804f55b..512e57457 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -21,7 +21,7 @@ add_library(QsLog STATIC ) target_include_directories(QsLog PUBLIC QsLog) target_compile_definitions(QsLog PUBLIC QS_LOG_SEPARATE_THREAD) -target_link_libraries(QsLog PUBLIC Qt::Core) +target_link_libraries(QsLog PUBLIC Qt6::Core) # --- QrCode (QR code generation, no Qt dependency) --- add_library(QrCode STATIC @@ -56,7 +56,7 @@ add_library(QtWebApp_httpserver STATIC QtWebApp/httpserver/staticfilecontroller.h ) target_include_directories(QtWebApp_httpserver PUBLIC QtWebApp/httpserver) -target_link_libraries(QtWebApp_httpserver PUBLIC Qt::Network) +target_link_libraries(QtWebApp_httpserver PUBLIC Qt6::Network) # --- QtWebApp template engine --- add_library(QtWebApp_templateengine STATIC @@ -69,7 +69,7 @@ add_library(QtWebApp_templateengine STATIC QtWebApp/templateengine/templatecache.h ) target_include_directories(QtWebApp_templateengine PUBLIC QtWebApp/templateengine) -target_link_libraries(QtWebApp_templateengine PUBLIC Qt::Core5Compat) +target_link_libraries(QtWebApp_templateengine PUBLIC Qt6::Core5Compat) # --- KDSignalThrottler (from KDToolBox) --- add_library(KDSignalThrottler STATIC @@ -77,4 +77,4 @@ add_library(KDSignalThrottler STATIC KDToolBox/KDSignalThrottler.h ) target_include_directories(KDSignalThrottler PUBLIC KDToolBox) -target_link_libraries(KDSignalThrottler PUBLIC Qt::Core) +target_link_libraries(KDSignalThrottler PUBLIC Qt6::Core) From 042e4299965a108a666141e4a5f684ac9e9f0fa8 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 18:24:58 +0200 Subject: [PATCH 16/19] Scope compiler defines and remove forced 7zip NDEBUG --- CMakeLists.txt | 5 --- YACReader/CMakeLists.txt | 1 + YACReaderLibrary/CMakeLists.txt | 3 ++ YACReaderLibrary/comic_vine/CMakeLists.txt | 1 + YACReaderLibrary/server/CMakeLists.txt | 1 + YACReaderLibraryServer/CMakeLists.txt | 4 +++ cmake/CompilerOptions.cmake | 34 +++++++++++++++----- common/CMakeLists.txt | 8 +++++ compressed_archive/CMakeLists.txt | 5 +-- custom_widgets/CMakeLists.txt | 8 +++++ image_processing/CMakeLists.txt | 3 +- shortcuts_management/CMakeLists.txt | 2 ++ tests/compressed_archive_test/CMakeLists.txt | 1 + tests/concurrent_queue_test/CMakeLists.txt | 1 + 14 files changed, 61 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 84c86400e..16d12f22a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,11 +157,6 @@ if(WIN32 OR APPLE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") endif() -# Build number define -if(BUILD_NUMBER) - add_compile_definitions("BUILD_NUMBER=\"${BUILD_NUMBER}\"") -endif() - # --- Subdirectories (dependency order) --- add_subdirectory(third_party) add_subdirectory(compressed_archive) diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt index a6fcded6f..ea9322df8 100644 --- a/YACReader/CMakeLists.txt +++ b/YACReader/CMakeLists.txt @@ -45,6 +45,7 @@ qt_add_executable(YACReader WIN32 ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp ) +yacreader_apply_build_options(YACReader) target_include_directories(YACReader PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt index d8586d480..38faf04c8 100644 --- a/YACReaderLibrary/CMakeLists.txt +++ b/YACReaderLibrary/CMakeLists.txt @@ -31,6 +31,7 @@ target_include_directories(library_common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/db ) +yacreader_apply_build_options(library_common) target_link_libraries(library_common PUBLIC Qt6::Core Qt6::Core5Compat @@ -62,6 +63,7 @@ target_include_directories(db_helper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/db ) +yacreader_apply_build_options(db_helper) target_link_libraries(db_helper PUBLIC Qt6::Core Qt6::Sql @@ -179,6 +181,7 @@ qt_add_executable(YACReaderLibrary WIN32 ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp ) +yacreader_apply_build_options(YACReaderLibrary) # macOS-specific sources if(APPLE) diff --git a/YACReaderLibrary/comic_vine/CMakeLists.txt b/YACReaderLibrary/comic_vine/CMakeLists.txt index 947d01b6b..382e3f0f9 100644 --- a/YACReaderLibrary/comic_vine/CMakeLists.txt +++ b/YACReaderLibrary/comic_vine/CMakeLists.txt @@ -54,6 +54,7 @@ target_include_directories(comic_vine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/model ) +yacreader_apply_build_options(comic_vine) # App-specific theme.h needed for themable.h → theme_manager.h → theme.h chain target_include_directories(comic_vine PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes diff --git a/YACReaderLibrary/server/CMakeLists.txt b/YACReaderLibrary/server/CMakeLists.txt index af7b337e1..839072efe 100644 --- a/YACReaderLibrary/server/CMakeLists.txt +++ b/YACReaderLibrary/server/CMakeLists.txt @@ -67,6 +67,7 @@ target_include_directories(server PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/controllers ${CMAKE_CURRENT_SOURCE_DIR}/controllers/v2 ) +yacreader_apply_build_options(server) target_compile_definitions(server PUBLIC SERVER_VERSION_NUMBER="2.1") if(UNIX AND NOT APPLE) target_compile_definitions(server PRIVATE diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt index efaf364a5..ed45d4535 100644 --- a/YACReaderLibraryServer/CMakeLists.txt +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -7,6 +7,7 @@ qt_add_executable(YACReaderLibraryServer libraries_updater.h libraries_updater.cpp ) +yacreader_apply_build_options(YACReaderLibraryServer) target_include_directories(YACReaderLibraryServer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} @@ -18,6 +19,9 @@ target_compile_definitions(YACReaderLibraryServer PRIVATE SERVER_RELEASE YACREADER_LIBRARY ) +if(BUILD_NUMBER) + target_compile_definitions(YACReaderLibraryServer PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() # Translations qt_add_translations(YACReaderLibraryServer diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake index c90fa6f8d..429cf9954 100644 --- a/cmake/CompilerOptions.cmake +++ b/cmake/CompilerOptions.cmake @@ -1,13 +1,31 @@ -# Compiler options for YACReader +# Compiler policy for YACReader-owned targets. +# Keep this target internal so third-party code does not inherit our rules. +add_library(yacreader_build_options INTERFACE) + +target_compile_definitions(yacreader_build_options INTERFACE + QT_DISABLE_DEPRECATED_UP_TO=0x060400 +) if(MSVC) - # Prevent windows.h from defining min/max macros that conflict with - # std::min, std::max, std::numeric_limits::max(), etc. - add_compile_definitions(NOMINMAX) + target_compile_definitions(yacreader_build_options INTERFACE + # Prevent windows.h from defining min/max macros that conflict with + # std::min, std::max, std::numeric_limits::max(), etc. + NOMINMAX + ) - # /Zc:__cplusplus: report correct __cplusplus value - # /permissive-: strict standard conformance - add_compile_options(/Zc:__cplusplus /permissive-) + target_compile_options(yacreader_build_options INTERFACE + # /Zc:__cplusplus: report correct __cplusplus value + # /permissive-: strict standard conformance + $<$:/Zc:__cplusplus> + $<$:/permissive-> + ) endif() -add_compile_definitions(QT_DISABLE_DEPRECATED_UP_TO=0x060400) +function(yacreader_apply_build_options) + foreach(target_name IN LISTS ARGN) + if(NOT TARGET "${target_name}") + message(FATAL_ERROR "yacreader_apply_build_options(): unknown target '${target_name}'") + endif() + target_link_libraries("${target_name}" PRIVATE yacreader_build_options) + endforeach() +endfunction() diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index d8017a655..ba76f7cf3 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -18,6 +18,7 @@ target_include_directories(yr_global PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) +yacreader_apply_build_options(yr_global) target_link_libraries(yr_global PUBLIC Qt6::Core) if(UNIX AND NOT APPLE) target_compile_definitions(yr_global PRIVATE @@ -30,6 +31,7 @@ add_library(naturalsort STATIC qnaturalsorting.cpp ) target_include_directories(naturalsort PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(naturalsort) target_link_libraries(naturalsort PUBLIC Qt6::Core) # --- concurrent_queue --- @@ -38,6 +40,7 @@ add_library(concurrent_queue STATIC concurrent_queue.cpp ) target_include_directories(concurrent_queue PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(concurrent_queue) target_link_libraries(concurrent_queue PUBLIC Qt6::Core) # --- worker (header-only thread helpers) --- @@ -66,6 +69,7 @@ add_library(common_all STATIC global_info_provider.cpp ) target_include_directories(common_all PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(common_all) target_link_libraries(common_all PUBLIC Qt6::Core Qt6::Gui @@ -82,6 +86,7 @@ add_library(comic_backend STATIC comic.cpp pdf_comic.h ) +yacreader_apply_build_options(comic_backend) # PDF source depends on backend if(PDF_BACKEND STREQUAL "pdfkit") @@ -144,6 +149,7 @@ target_include_directories(common_gui PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/themes ${CMAKE_CURRENT_SOURCE_DIR}/themes/shared ) +yacreader_apply_build_options(common_gui) target_link_libraries(common_gui PUBLIC Qt6::Core @@ -176,6 +182,7 @@ target_include_directories(rhi_flow_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/rhi ) +yacreader_apply_build_options(rhi_flow_reader) target_compile_definitions(rhi_flow_reader PRIVATE YACREADER) target_link_libraries(rhi_flow_reader PUBLIC Qt6::Core @@ -200,6 +207,7 @@ target_include_directories(rhi_flow_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/rhi ) +yacreader_apply_build_options(rhi_flow_library) target_compile_definitions(rhi_flow_library PRIVATE YACREADER_LIBRARY) target_link_libraries(rhi_flow_library PUBLIC Qt6::Core diff --git a/compressed_archive/CMakeLists.txt b/compressed_archive/CMakeLists.txt index a5f5ba5c3..6fd5adcf9 100644 --- a/compressed_archive/CMakeLists.txt +++ b/compressed_archive/CMakeLists.txt @@ -2,6 +2,7 @@ # Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive add_library(cbx_backend STATIC) +yacreader_apply_build_options(cbx_backend) if(DECOMPRESSION_BACKEND STREQUAL "unarr") message(STATUS "Decompression backend: unarr") @@ -88,14 +89,14 @@ elseif(DECOMPRESSION_BACKEND STREQUAL "7zip") if(APPLE) target_compile_definitions(cbx_backend PRIVATE - _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE NDEBUG _REENTRANT + _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _REENTRANT ENV_UNIX _7ZIP_LARGE_PAGES ENV_MACOSX _TCHAR_DEFINED UNICODE _UNICODE UNIX_USE_WIN_FILE) target_link_libraries(cbx_backend PRIVATE "-framework IOKit" "-framework CoreFoundation") elseif(UNIX) target_compile_definitions(cbx_backend PRIVATE - _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE NDEBUG _REENTRANT + _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _REENTRANT ENV_UNIX _7ZIP_LARGE_PAGES UNICODE _UNICODE UNIX_USE_WIN_FILE) endif() diff --git a/custom_widgets/CMakeLists.txt b/custom_widgets/CMakeLists.txt index 84590dad2..4e35aa059 100644 --- a/custom_widgets/CMakeLists.txt +++ b/custom_widgets/CMakeLists.txt @@ -38,11 +38,15 @@ endif() # --- custom_widgets_reader (YACReader-specific) --- add_library(custom_widgets_reader STATIC ${WIDGETS_COMMON_SOURCES}) target_include_directories(custom_widgets_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(custom_widgets_reader) # App-specific theme.h needed because themable.h → theme_manager.h → theme.h target_include_directories(custom_widgets_reader PRIVATE ${PROJECT_SOURCE_DIR}/YACReader/themes ) target_compile_definitions(custom_widgets_reader PRIVATE YACREADER) +if(BUILD_NUMBER) + target_compile_definitions(custom_widgets_reader PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() target_link_libraries(custom_widgets_reader PUBLIC Qt6::Core Qt6::Widgets @@ -83,6 +87,7 @@ add_library(custom_widgets_library STATIC ${LIBRARY_EXTRA_WIDGETS} ) target_include_directories(custom_widgets_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(custom_widgets_library) # App-specific theme.h + YACReaderLibrary headers needed by macosx_toolbar target_include_directories(custom_widgets_library PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes @@ -90,6 +95,9 @@ target_include_directories(custom_widgets_library PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db ) target_compile_definitions(custom_widgets_library PRIVATE YACREADER_LIBRARY) +if(BUILD_NUMBER) + target_compile_definitions(custom_widgets_library PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() target_link_libraries(custom_widgets_library PUBLIC Qt6::Core Qt6::Widgets diff --git a/image_processing/CMakeLists.txt b/image_processing/CMakeLists.txt index 7421e7e1d..86079aa44 100644 --- a/image_processing/CMakeLists.txt +++ b/image_processing/CMakeLists.txt @@ -5,5 +5,6 @@ add_library(image_processing STATIC ) target_include_directories(image_processing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(image_processing) -target_link_libraries(image_processing PRIVATE Qt::Gui) +target_link_libraries(image_processing PRIVATE Qt6::Gui) diff --git a/shortcuts_management/CMakeLists.txt b/shortcuts_management/CMakeLists.txt index 3c893d060..88fab140c 100644 --- a/shortcuts_management/CMakeLists.txt +++ b/shortcuts_management/CMakeLists.txt @@ -17,6 +17,7 @@ set(SHORTCUTS_SOURCES # --- shortcuts_reader (YACREADER define) --- add_library(shortcuts_reader STATIC ${SHORTCUTS_SOURCES}) target_include_directories(shortcuts_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(shortcuts_reader) # App-specific theme.h needed because themable.h → theme_manager.h → theme.h target_include_directories(shortcuts_reader PRIVATE ${PROJECT_SOURCE_DIR}/YACReader/themes @@ -27,6 +28,7 @@ target_link_libraries(shortcuts_reader PUBLIC Qt6::Core Qt6::Widgets yr_global c # --- shortcuts_library (YACREADER_LIBRARY define) --- add_library(shortcuts_library STATIC ${SHORTCUTS_SOURCES}) target_include_directories(shortcuts_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(shortcuts_library) target_include_directories(shortcuts_library PRIVATE ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes ) diff --git a/tests/compressed_archive_test/CMakeLists.txt b/tests/compressed_archive_test/CMakeLists.txt index 4f0e1c476..ad7f4ac89 100644 --- a/tests/compressed_archive_test/CMakeLists.txt +++ b/tests/compressed_archive_test/CMakeLists.txt @@ -3,6 +3,7 @@ qt_add_executable(compressed_archive_test main.cpp ) +yacreader_apply_build_options(compressed_archive_test) target_link_libraries(compressed_archive_test PRIVATE Qt6::Core cbx_backend diff --git a/tests/concurrent_queue_test/CMakeLists.txt b/tests/concurrent_queue_test/CMakeLists.txt index 380e52b5e..4df4df025 100644 --- a/tests/concurrent_queue_test/CMakeLists.txt +++ b/tests/concurrent_queue_test/CMakeLists.txt @@ -3,6 +3,7 @@ qt_add_executable(concurrent_queue_test concurrent_queue_test.cpp ) +yacreader_apply_build_options(concurrent_queue_test) target_link_libraries(concurrent_queue_test PRIVATE Qt6::Core Qt6::Test From 8ddf1a8f907c13082774dcbeea55545b240b9141 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 18:30:57 +0200 Subject: [PATCH 17/19] Improve Summary --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16d12f22a..ed3108de4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,13 +191,20 @@ if(BUILD_TESTS AND NOT BUILD_SERVER_STANDALONE) endif() # Summary +if(CMAKE_CONFIGURATION_TYPES) + string(JOIN ", " _configured_build_types ${CMAKE_CONFIGURATION_TYPES}) + set(_build_type_summary "multi-config (${_configured_build_types})") +else() + set(_build_type_summary "${CMAKE_BUILD_TYPE}") +endif() + message(STATUS "") message(STATUS "YACReader ${PROJECT_VERSION} build configuration:") message(STATUS " Decompression backend: ${DECOMPRESSION_BACKEND}") message(STATUS " PDF backend: ${PDF_BACKEND}") message(STATUS " Build tests: ${BUILD_TESTS}") message(STATUS " Server standalone: ${BUILD_SERVER_STANDALONE}") -message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") +message(STATUS " Build type: ${_build_type_summary}") if(BUILD_NUMBER) message(STATUS " Build number: ${BUILD_NUMBER}") endif() From a8c936ee6fb5cd0f2df362e54f2f3b3ee1597755 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 18:32:27 +0200 Subject: [PATCH 18/19] Update AGENTS.md --- AGENTS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 847f487d3..6debdc6dc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,8 +46,8 @@ cmake --build build --config Release --target release_translations ``` Important: -- Do not run `lupdate` only on `qml.qrc` (or only on a subset of files), because that can mark unrelated translations as obsolete. -- In `YACReaderLibrary`, `qt_add_translations(...)` is configured to scan full target sources and include QML from `qml.qrc`. +- Do not run `lupdate` only on a hand-picked subset of QML files, because that can mark unrelated translations as obsolete. +- In `YACReaderLibrary`, `qt_add_translations(...)` is configured to scan full target sources and include the QML files directly. - `update_translations` updates both locale TS files and `*_source.ts` template files for all apps. - `*_source.ts` files are translator base templates and must not be treated as shipped locales. From 9dfc35527b20ef44846578259452f7cd6fe58d7b Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 30 Mar 2026 20:17:05 +0200 Subject: [PATCH 19/19] Fix version checking --- common/check_new_version.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/common/check_new_version.cpp b/common/check_new_version.cpp index d8a8bf9e5..00e3c0fcf 100644 --- a/common/check_new_version.cpp +++ b/common/check_new_version.cpp @@ -11,8 +11,6 @@ #include #include -#define PREVIOUS_VERSION_TESTING "6.0.0" - HttpVersionChecker::HttpVersionChecker() : HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/VERSION", DEFAULT_USER_AGENT) { @@ -26,12 +24,17 @@ void HttpVersionChecker::checkNewVersion(const QByteArray &data) bool HttpVersionChecker::checkNewVersion(QString sourceContent) { -#ifdef QT_DEBUG - const auto currentVersion = QVersionNumber::fromString(PREVIOUS_VERSION_TESTING); -#else + const auto currentVersion = QVersionNumber::fromString(QString::fromLatin1(VERSION)); -#endif - const auto latestVersion = QVersionNumber::fromString(sourceContent.trimmed()); + const auto trimmedSourceContent = sourceContent.trimmed(); + qsizetype suffixIndex = 0; + const auto latestVersion = QVersionNumber::fromString(trimmedSourceContent, &suffixIndex); + + if (trimmedSourceContent.isEmpty() || + suffixIndex != trimmedSourceContent.size() || + latestVersion.segments().size() != 3) { + return false; + } if (!currentVersion.isNull() && !latestVersion.isNull() && QVersionNumber::compare(latestVersion, currentVersion) > 0) { emit newVersionDetected();