diff --git a/.clang-format b/.clang-format index e33eb0e1..4dfac7ad 100644 --- a/.clang-format +++ b/.clang-format @@ -91,10 +91,12 @@ PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Left -RawStringFormats: - - Delimiter: pb - Language: TextProto - BasedOnStyle: google +RawStringFormats: + - Language: TextProto + Delimiters: + - 'pb' + - 'proto' + BasedOnStyle: google ReflowComments: true SortIncludes: true SortUsingDeclarations: true @@ -112,5 +114,6 @@ SpacesInSquareBrackets: true Standard: Cpp11 TabWidth: 4 UseTab: Never +UseCRLF: Always ... diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 00000000..111586f1 --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,459 @@ +name: CMake Build Matrix + +# Directories +# - $GITHUB_WORKSPACE/qskinny_source : Checkout directory for qskinny sources +# - $GITHUB_WORKSPACE/qskinny_build : Build directory for QSkinny CMake +# - $GITHUB_WORKSPACE/qskinny_install : Install directory for QSkinny package +# - $GITHUB_WORKSPACE/qskinny_build_test : Build directory for QSkinny CMake integration test + +on: + push: + branches: [cmake] + pull_request: + branches: [master] + +jobs: + build: + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} + strategy: + fail-fast: false + matrix: + config: + - { + name: "Windows Latest MSVC Qt5", + os: windows-latest, + artifact: "windows_msvc.7z", + build_type: "Release", + cc: "cl", + cxx: "cl", + environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + archiver: "7z a", + generators: "Visual Studio 17 2022", + cmake: + { + qtversion: "5.15.2", + qtdirkey: "Qt5_DIR", + qtdirvalue: "../Qt/5.15.2/msvc2019_64/lib/cmake/Qt5", + qtprefixpath: "../Qt/5.15.2/msvc2019_64", + }, + screenshot_filename: "windows-latest-msvc-qt-5-15-2.jpg", + } + - { + name: "Windows Latest MSVC Qt6", + os: windows-latest, + artifact: "windows_msvc.7z", + build_type: "Release", + cc: "cl", + cxx: "cl", + environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + archiver: "7z a", + generators: "Visual Studio 17 2022", + cmake: + { + qtversion: "6.2.4", + qtdirkey: "Qt6_DIR", + qtdirvalue: "../Qt/6.2.4/msvc2019_64/lib/cmake/Qt6", + qtprefixpath: "../Qt/6.2.4/msvc2019_64", + }, + screenshot_filename: "windows-latest-msvc-qt-6-2-4.jpg", + } + - { + name: "Windows 2019 MSVC Qt5", + os: windows-2019, + artifact: "windows_msvc.7z", + build_type: "Release", + cc: "cl", + cxx: "cl", + environment_script: "C:/Program Files/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + archiver: "7z a", + generators: "Visual Studio 16 2019", + cmake: + { + qtversion: "5.15.2", + qtdirkey: "Qt5_DIR", + qtdirvalue: "../Qt/5.15.2/msvc2019_64/lib/cmake/Qt5", + qtprefixpath: "../Qt/5.15.2/msvc2019_64", + }, + screenshot_filename: "windows-2019-msvc-qt-5-15-2.jpg", + } + - { + name: "Windows 2019 MSVC Qt6", + os: windows-2019, + artifact: "windows_msvc.7z", + build_type: "Release", + cc: "cl", + cxx: "cl", + environment_script: "C:/Program Files/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + archiver: "7z a", + generators: "Visual Studio 16 2019", + cmake: + { + qtversion: "6.2.4", + qtdirkey: "Qt6_DIR", + qtdirvalue: "../Qt/6.2.4/msvc2019_64/lib/cmake/Qt6", + qtprefixpath: "../Qt/6.2.4/msvc2019_64", + }, + screenshot_filename: "windows-2019-msvc-qt-6-2-4.jpg", + } + - { + name: "Ubuntu Latest GCC Qt5", + os: ubuntu-latest, + artifact: "ubuntu_gcc.7z", + build_type: "Release", + cc: "gcc", + cxx: "g++", + archiver: "7z a", + generators: "Ninja", + env: { DISPLAY: ":1" }, + cmake: + { + qtversion: "5.15.2", + qtdirkey: "Qt5_DIR", + qtdirvalue: "../Qt/5.15.2/gcc_64/lib/cmake/Qt5", + qtprefixpath: "../Qt/5.15.2/gcc_64", + }, + screenshot_filename: "ubuntu-latest-gcc-qt-5-15-2.jpg", + } + - { + name: "Ubuntu Latest GCC Qt6", + os: ubuntu-latest, + artifact: "ubuntu_gcc.7z", + build_type: "Release", + cc: "gcc", + cxx: "g++", + archiver: "7z a", + generators: "Ninja", + env: { DISPLAY: ":1" }, + cmake: + { + qtversion: "6.2.4", + qtdirkey: "Qt6_DIR", + qtdirvalue: "../Qt/6.2.4/gcc_64/lib/cmake/Qt6", + qtprefixpath: "../Qt/6.2.4/gcc_64", + }, + screenshot_filename: "ubuntu-latest-gcc-qt-6-2-4.jpg", + } + - { + name: "Ubuntu GCC 9 Qt5", + os: ubuntu-latest, + artifact: "ubuntu_gcc9.7z", + build_type: "Release", + cc: "gcc", + cxx: "g++", + archiver: "7z a", + generators: "Ninja", + env: { DISPLAY: ":1" }, + cmake: + { + qtversion: "5.15.2", + qtdirkey: "Qt5_DIR", + qtdirvalue: "../Qt/5.15.2/gcc_64/lib/cmake/Qt5", + qtprefixpath: "../Qt/5.15.2/gcc_64", + }, + screenshot_filename: "ubuntu-latest-gcc-9-qt-5-15-2.jpg", + } + - { + name: "Ubuntu GCC 9 Qt6", + os: ubuntu-latest, + artifact: "ubuntu_gcc9.7z", + build_type: "Release", + cc: "gcc", + cxx: "g++", + archiver: "7z a", + generators: "Ninja", + env: { DISPLAY: ":1" }, + cmake: + { + qtversion: "6.2.4", + qtdirkey: "Qt6_DIR", + qtdirvalue: "../Qt/6.2.4/gcc_64/lib/cmake/Qt6", + qtprefixpath: "../Qt/6.2.4/gcc_64", + }, + screenshot_filename: "ubuntu-latest-gcc-9-qt-6-2-4.jpg", + } + - { + name: "macOS Latest Clang Qt5", + os: macos-latest, + artifact: "macos_clang.7z", + build_type: "Release", + cc: "clang", + cxx: "clang++", + archiver: "7za a", + generators: "Ninja", + cmake: + { + qtversion: "5.15.2", + qtdirkey: "Qt5_DIR", + qtdirvalue: "../Qt/5.15.2/clang_64/lib/cmake/Qt5", + qtprefixpath: "../Qt/5.15.2/clang_64", + }, + screenshot_filename: "macos-latest-clang-qt-5-15-2.jpg", + } + - { + name: "macOS Latest Clang Qt6", + os: macos-latest, + artifact: "macos_clang.7z", + build_type: "Release", + cc: "clang", + cxx: "clang++", + archiver: "7za a", + generators: "Ninja", + cmake: + { + qtversion: "6.2.4", + qtdirkey: "Qt6_DIR", + qtdirvalue: "../Qt/6.2.4/clang_64/lib/cmake/Qt6", + qtprefixpath: "../Qt/6.2.4/clang_64", + }, + screenshot_filename: "macos-latest-clang-qt-6-2-4.jpg", + } + + steps: + - name: Git Checkout + uses: actions/checkout@v3 + with: + path: qskinny_source + + - name: Print env + run: | + echo github.event.action: ${{ github.event.action }} + echo github.event_name: ${{ github.event_name }} + + - name: Install dependencies on windows + if: startsWith(matrix.config.os, 'windows') + run: | + choco install ninja + choco install cmake --version=3.16.3 + ninja --version + cmake --version + + - name: Install dependencies on ubuntu + if: startsWith(matrix.config.name, 'Ubuntu Latest GCC') + run: | + sudo apt-get update + sudo apt-get install ninja-build cmake + ninja --version + cmake --version + gcc --version + + - name: Install dependencies on ubuntu9 + if: startsWith(matrix.config.name, 'Ubuntu GCC 9') + run: | + echo Update gcc-9 ======================================================================= + echo gcc version before + gcc --version + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install ninja-build cmake gcc-9 g++-9 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 + echo gcc version after + gcc --version + echo Update ninja ======================================================================= + echo ninja version before + ninja --version + # wget https://github.com/ninja-build/ninja/releases/download/v1.10.0/ninja-linux.zip + wget https://github.com/ninja-build/ninja/releases/latest/download/ninja-linux.zip + sudo unzip ninja-linux.zip -d /usr/local/bin/ + sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force + echo ninja version after + ninja --version + echo Update cmake ======================================================================= + echo cmake version before + cmake --version + # curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2 + # wget https://github.com/Kitware/CMake/releases/latest/download/cmake-3.16.5-Linux-x86_64.sh + cmake_version=$(curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2 | cut -c 2-) + echo cmake download latest v$cmake_version version + wget https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version-Linux-x86_64.sh + chmod +x cmake-$cmake_version-Linux-x86_64.sh + sudo mkdir /opt/cmake + sudo ./cmake-$cmake_version-Linux-x86_64.sh --prefix=/opt/cmake --skip-license + sudo update-alternatives --install /usr/bin/cmake cmake /opt/cmake/bin/cmake 1 --force + echo cmake version after + cmake --version + + - name: Install dependencies on macos + if: startsWith(matrix.config.os, 'macos') + run: | + brew install p7zip cmake ninja + ninja --version + cmake --version + + - name: Install needed xkbcommon symlink + if: startsWith(matrix.config.name, 'Ubuntu') && endsWith(matrix.config.name, 'Qt6') + run: sudo apt-get install libxkbcommon-dev -y + + - name: Install hunspell for Ubuntu + if: false && startsWith(matrix.config.name, 'Ubuntu') + run: | + sudo apt-get install -y libhunspell-dev + + - name: Install pinyin for Ubuntu + if: false && startsWith(matrix.config.name, 'Ubuntu') + run: | + sudo apt-get install -y libimepinyin-dev + + - name: Install imagemagick for Ubuntu + if: startsWith(matrix.config.name, 'Ubuntu') + run: | + sudo apt-get install -y imagemagick + + - name: Cache Qt5 + if: endsWith(matrix.config.name, 'Qt5') + id: cache-qt-5-15 + uses: actions/cache@v1 # not v2! + with: + path: ../Qt/5.15.2 + key: ${{ runner.os }}-QtCache-Qt5 + + - name: Cache Qt6 + if: endsWith(matrix.config.name, 'Qt6') + id: cache-qt-6-2 + uses: actions/cache@v1 # not v2! + with: + path: ../Qt/6.2.4 + key: ${{ runner.os }}-QtCache-Qt6 + + - name: Install Qt5 + if: endsWith(matrix.config.name, 'Qt5') + uses: jurplel/install-qt-action@v3 + with: + version: "5.15.2" + target: "desktop" + install-deps: "true" + modules: "qtwebengine" + cached: ${{ steps.cache-qt-5-15.outputs.cache-hit }} + setup-python: "false" + tools: "" + set-env: "true" + tools-only: "false" + + - name: Install Qt6 + if: endsWith(matrix.config.name, 'Qt6') + uses: jurplel/install-qt-action@v3 + with: + version: "6.2.4" + target: "desktop" + install-deps: "true" + modules: "qtwebengine" + cached: ${{ steps.cache-qt-6-2.outputs.cache-hit }} + setup-python: "false" + tools: "" + set-env: "true" + tools-only: "false" + + - name: Configure ( QSkinny ) + shell: bash + run: | + mkdir qskinny_build + mkdir qskinny_install + cmake \ + -S qskinny_source \ + -B qskinny_build \ + -G "${{ matrix.config.generators }}" \ + -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ + -DCMAKE_INSTALL_PREFIX:PATH=qskinny_install \ + -DCMAKE_PREFIX_PATH:PATH="${{ matrix.config.cmake.qtprefixpath }}" \ + -D${{ matrix.config.cmake.qtdirkey }}:PATH="${{ matrix.config.cmake.qtdirvalue }}" + + - name: Build ( QSkinny ) + shell: bash + run: cmake --build qskinny_build --config ${{ matrix.config.build_type }} + + #- name: Tests + # shell: bash + # run: ctest -j14 -C Release -T test --output-on-failure + + - name: Install ( QSkinny ) Strip + shell: bash + run: cmake --install qskinny_build --prefix qskinny_install --strip --config ${{ matrix.config.build_type }} + + - name: Smoke test ( QSkinny ) on MacOS + if: startsWith(matrix.config.name, 'macOS') + run: | + echo "starting iotdashboard" + DYLD_LIBRARY_PATH=./qskinny_install/lib:./qskinny_install/plugins/skins ./qskinny_build/examples/iotdashboard/iotdashboard.app/Contents/MacOS/iotdashboard -qwindowgeometry 1024x600+75+100 & + sleep 10 + + - name: Smoke Test ( QSkinny ) on Windows + if: startsWith(matrix.config.name, 'Windows') + run: | + $Env:PATH += ";qskinny_install/lib" + $Env:PATH += ";qskinny_install/plugins/skins" + echo "starting iotdashboard" + Start-Process qskinny_build\examples\iotdashboard\Release\iotdashboard.exe -ArgumentList "-qwindowgeometry 1024x600+0+0" + Start-Sleep -s 10 + + - name: Smoke test ( QSkinny ) on Ubuntu + if: startsWith(matrix.config.name, 'Ubuntu') + env: + DISPLAY: ":1" + run: | + echo starting Xvfb + Xvfb :1 & + sleep 10 + echo starting iotdashboard + ./qskinny_build/examples/iotdashboard/iotdashboard & + sleep 10 + + - uses: OrbitalOwen/desktop-screenshot-action@0.1 + with: + file-name: ${{ matrix.config.screenshot_filename }} + + - name: Smoke Test Cleanup ( QSkinny ) on Windows + if: startsWith(matrix.config.name, 'Windows') + run: | + taskkill /IM iotdashboard.exe /T + + - name: Smoke Test Cleanup ( QSkinny ) on MacOS + if: startsWith(matrix.config.name, 'macOS') + run: | + killall iotdashboard + + - name: Smoke Test Cleanup ( QSkinny ) on Ubuntu + if: startsWith(matrix.config.name, 'Ubuntu') + run: | + killall iotdashboard + killall Xvfb + + - name: Configure ( CMake Integration Test ) + shell: bash + run: | + mkdir qskinny_build_test + cmake \ + -S qskinny_source/examples/iotdashboard_smoketest \ + -B qskinny_build_test \ + -G "${{ matrix.config.generators }}" \ + -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ + -DCMAKE_PREFIX_PATH:PATH="${{ matrix.config.cmake.qtprefixpath }}" \ + -D${{ matrix.config.cmake.qtdirkey }}:PATH="${{ matrix.config.cmake.qtdirvalue }}" \ + -DQSkinny_DIR:PATH=$GITHUB_WORKSPACE/qskinny_install/lib/cmake/QSkinny + + - name: Build ( CMake Integration Test ) + shell: bash + run: cmake --build qskinny_build_test --config ${{ matrix.config.build_type }} + + # - name: Pack + # shell: bash + # working-directory: instdir + # run: | + # ls -laR + # ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} . + + # - name: Upload + # uses: actions/upload-artifact@v1 + # with: + # path: ./${{ matrix.config.artifact }} + # name: ${{ matrix.config.artifact }} + + # - name: Upload release asset + # if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'created') + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ github.event.release.upload_url }} + # asset_path: ./${{ matrix.config.artifact }} + # asset_name: ${{ matrix.config.artifact }}.zip + # asset_content_type: application/zip diff --git a/.gitignore b/.gitignore index 6d51d27d..32698b35 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ qskinny.pro.user *.log html tags +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..1ca34ba3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,130 @@ +cmake_minimum_required(VERSION 3.16.3) + +project(QSkinny VERSION 999.99.9) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +include(${CMAKE_SOURCE_DIR}/features/qskconfig.cmake) + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) +if(QT_VERSION_MAJOR VERSION_EQUAL "5") + find_package(Qt5 5.15 REQUIRED COMPONENTS Core Gui OpenGL Quick Svg Widgets) + find_package(Qt5 5.15 OPTIONAL_COMPONENTS QuickWidgets WebEngine WebEngineCore) + message(WARNING "using QSkinny's 'qt_add_executable()'") + function(qt_add_executable) + add_executable(${ARGV}) + endfunction(qt_add_executable) + message(WARNING "using QSkinny's 'qt_add_library()'") + function(qt_add_library) + add_library(${ARGV}) + endfunction(qt_add_library) +elseif(QT_VERSION_MAJOR VERSION_EQUAL "6") + find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL Quick QuickWidgets Svg Widgets) + find_package(Qt6 OPTIONAL_COMPONENTS QuickWidgets WebEngineCore WebEngineQuick) +else() + message(FATAL_ERROR "Couldn't find any Qt version!") +endif() + +# optional package hunspell +if(NOT LINUX AND ENABLE_HUNSPELL) + message(WARNING "Feature 'hunspell' only available for UNIX!") + unset(ENABLE_HUNSPELL CACHE) +endif() + +# optional package pinyin +if(NOT LINUX AND ENABLE_PINYIN) + message(WARNING "Feature 'pinyin' only available for UNIX!") + unset(ENABLE_PINYIN CACHE) +endif() + +if(ENABLE_HUNSPELL) + include(cmake/QSkinnyOptionalHunspell.cmake) +endif() + +if(ENABLE_PINYIN) + include(cmake/QSkinnyOptionalPinyin.cmake) +endif() + +# define install directories +set(QSK_INSTALL_DOCS doc) +set(QSK_INSTALL_HEADERS include) +set(QSK_INSTALL_LIBS lib) +set(QSK_INSTALL_BINS bin) +set(QSK_INSTALL_PLUGINS plugins) +set(QSK_INSTALL_EXAMPLES examples) + +# define debug postfix globally +set(CMAKE_DEBUG_POSTFIX d) +# define binary install directory globally +set(CMAKE_INSTALL_BINDIR ${QSK_INSTALL_BINS}$<$:/debug>) + +add_subdirectory(src) +add_subdirectory(skins) +add_subdirectory(inputcontext) +add_subdirectory(qmlexport) +add_subdirectory(tools) +add_subdirectory(support) +if(BUILD_EXAMPLES) + add_subdirectory(examples) +endif() +if(BUILD_PLAYGROUND) + add_subdirectory(playground) +endif() + +#TODO add doxygen support +#OTHER_FILES = +#doc / Doxyfile +#doc/*.dox +# doc/*.metadox +# doc/classes/*.dox +# doc/classes/*.metadox + +set(PACKAGE_NAME ${PROJECT_NAME}) +set(PACKAGE_VERSION ${CMAKE_PROJECT_VERSION}) +set(PACKAGE_NAMESPACE Qsk) +set(PACKAGE_LOCATION lib/cmake/${PROJECT_NAME}) + +install(TARGETS qskinny EXPORT ${PACKAGE_NAME}Targets + LIBRARY DESTINATION ${QSK_INSTALL_LIBS} + ARCHIVE DESTINATION ${QSK_INSTALL_LIBS} + RUNTIME DESTINATION ${QSK_INSTALL_LIBS} + INCLUDES DESTINATION ${QSK_INSTALL_HEADERS} + PUBLIC_HEADER DESTINATION ${QSK_INSTALL_HEADERS}) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}ConfigVersion.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY AnyNewerVersion) + +export(EXPORT ${PACKAGE_NAME}Targets + FILE ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Targets.cmake + NAMESPACE ${PACKAGE_NAMESPACE}::) + +configure_file(cmake/${PACKAGE_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}Config.cmake + COPYONLY) + +install(EXPORT ${PACKAGE_NAME}Targets + FILE + ${PACKAGE_NAME}Targets.cmake + NAMESPACE + ${PACKAGE_NAMESPACE}:: + DESTINATION + ${PACKAGE_LOCATION}) + +install( + FILES + cmake/${PACKAGE_NAME}Config.cmake + cmake/${PACKAGE_NAME}Macros.cmake + cmake/${PACKAGE_NAME}OptionalHunspell.cmake + cmake/${PACKAGE_NAME}OptionalPinyin.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}/${PACKAGE_NAME}ConfigVersion.cmake + DESTINATION + ${PACKAGE_LOCATION} + COMPONENT + Devel) \ No newline at end of file diff --git a/README.md b/README.md index 89e64fb8..8b6dae4d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ ![](https://github.com/uwerat/qskinny/workflows/CI/badge.svg) +[![CMake Build Matrix](https://github.com/vrcomputing/qskinny/actions/workflows/cmake.yml/badge.svg)](https://github.com/vrcomputing/qskinny/actions/workflows/cmake.yml) + The (Q)Skinny library is a framework built on top of the Qt scene graph and very few core classes from Qt/Quick. It offers a set of lightweight controls, that can be used from C++ and/or QML. @@ -37,6 +39,10 @@ On debian bullseye these packages need to be installed: `build-essential qt-qmake qtbase5-dev qtbase5-private-dev qtdeclarative5-dev qtdeclarative5-private-dev libqt5svg5-dev`. +> Optional: When enabling the `hunspell` feature the following package needs to be installed: `libhunspell-dev` + +> Optional: When enabling the `pinyin` feature the following package needs to be installed: `libimepinyin-dev` + If you want to know more about QSkinny - or even like to give it a specific direction - please contact support@qskinny.org. diff --git a/cmake/QSkinnyConfig.cmake b/cmake/QSkinnyConfig.cmake new file mode 100644 index 00000000..8bb2b05b --- /dev/null +++ b/cmake/QSkinnyConfig.cmake @@ -0,0 +1,2 @@ +include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyMacros.cmake") \ No newline at end of file diff --git a/cmake/QSkinnyMacros.cmake b/cmake/QSkinnyMacros.cmake new file mode 100644 index 00000000..d332b82b --- /dev/null +++ b/cmake/QSkinnyMacros.cmake @@ -0,0 +1,14 @@ +if(TARGET ${Qt}::Svg) + ## @param SVG_FILENAME absolute filename to the svg + ## @param QVG_FILENAME absolute filename to the qvg + function(qsk_svg2qvg SVG_FILENAME QVG_FILENAME) + get_filename_component(QVG_FILENAME ${QVG_FILENAME} ABSOLUTE) + get_filename_component(SVG_FILENAME ${SVG_FILENAME} ABSOLUTE) + add_custom_command( + COMMAND svg2qvg ${SVG_FILENAME} ${QVG_FILENAME} + OUTPUT ${QVG_FILENAME} + DEPENDS ${SVG_FILENAME} + WORKING_DIRECTORY $ + COMMENT "Compiling ${SVG_FILENAME} to ${QVG_FILENAME}") + endfunction() +endif() \ No newline at end of file diff --git a/cmake/QSkinnyOptionalHunspell.cmake b/cmake/QSkinnyOptionalHunspell.cmake new file mode 100644 index 00000000..3b382be0 --- /dev/null +++ b/cmake/QSkinnyOptionalHunspell.cmake @@ -0,0 +1,20 @@ +find_package(PkgConfig) +pkg_check_modules(PKG_HUNSPELL QUIET hunspell) +find_path(HUNSPELL_INCLUDE_DIRS + NAMES hunspell.hxx + PATH_SUFFIXES hunspell + HINTS ${PKG_HUNSPELL_INCLUDE_DIRS}) +find_library(HUNSPELL_LIBRARIES + NAMES ${PKG_HUNSPELL_LIBRARIES} hunspell hunspell-1.8 hunspell-1.7 hunspell-1.6 libhunspell + HINTS ${PKG_HUNSPELL_LIBRARY_DIRS}) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(HUNSPELL + REQUIRED_VARS HUNSPELL_LIBRARIES HUNSPELL_INCLUDE_DIRS + VERSION_VAR PKG_HUNSPELL_VERSION) +mark_as_advanced(HUNSPELL_INCLUDE_DIRS HUNSPELL_LIBRARIES) + +add_library(hunspell SHARED IMPORTED GLOBAL) +set_target_properties(hunspell PROPERTIES IMPORTED_LOCATION ${HUNSPELL_LIBRARIES}) +target_include_directories(hunspell + INTERFACE + ${HUNSPELL_INCLUDE_DIRS}) \ No newline at end of file diff --git a/cmake/QSkinnyOptionalPinyin.cmake b/cmake/QSkinnyOptionalPinyin.cmake new file mode 100644 index 00000000..73eacd14 --- /dev/null +++ b/cmake/QSkinnyOptionalPinyin.cmake @@ -0,0 +1,23 @@ +find_package(PkgConfig) +pkg_check_modules(PKG_PINYIN QUIET pinyin) +find_path(PINYIN_INCLUDE_DIRS + NAMES pinyinime.h + PATH_SUFFIXES pinyin LibIME LibIME/libime/pinyin + HINTS ${PKG_PINYIN_INCLUDE_DIRS}) +find_library(PINYIN_LIBRARIES + NAMES ${PKG_PINYIN_LIBRARIES} IMEPinyin imepinyin ime libime libimepinyin + HINTS ${PKG_PINYIN_LIBRARY_DIRS}) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PINYIN + REQUIRED_VARS PINYIN_LIBRARIES PINYIN_INCLUDE_DIRS + VERSION_VAR PKG_PINYIN_VERSION) +mark_as_advanced(PINYIN_INCLUDE_DIRS PINYIN_LIBRARIES) + +add_library(pinyin SHARED IMPORTED GLOBAL) +set_target_properties(pinyin PROPERTIES IMPORTED_LOCATION ${PINYIN_LIBRARIES}) +target_include_directories(pinyin + INTERFACE + ${PINYIN_INCLUDE_DIRS}) + +find_package(LibIMEPinyin REQUIRED) +find_package(Fcitx5Utils REQUIRED) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 00000000..ede5df3e --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,18 @@ +#c++ +add_subdirectory(desktop) +add_subdirectory(gallery) +add_subdirectory(layouts) +add_subdirectory(listbox) +add_subdirectory(messagebox) +add_subdirectory(mycontrols) +add_subdirectory(qvgviewer) +add_subdirectory(thumbnails) +add_subdirectory(tabview) +add_subdirectory(iotdashboard) + +#qml +add_subdirectory(boxes) +add_subdirectory(buttons) +add_subdirectory(frames) +add_subdirectory(glabels) +add_subdirectory(messageboxQml) \ No newline at end of file diff --git a/examples/boxes/CMakeLists.txt b/examples/boxes/CMakeLists.txt new file mode 100644 index 00000000..de145119 --- /dev/null +++ b/examples/boxes/CMakeLists.txt @@ -0,0 +1,20 @@ +list(APPEND TARGET_HEADERS + Box.h) + +list(APPEND TARGET_SOURCES + Box.cpp + main.cpp) + +set(TARGET_NAME boxes) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/buttons/CMakeLists.txt b/examples/buttons/CMakeLists.txt new file mode 100644 index 00000000..1efe622b --- /dev/null +++ b/examples/buttons/CMakeLists.txt @@ -0,0 +1,21 @@ +list(APPEND TARGET_RESSOURCES + buttons.qrc) + +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME buttons) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + qskqmlexport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) \ No newline at end of file diff --git a/examples/desktop/CMakeLists.txt b/examples/desktop/CMakeLists.txt new file mode 100644 index 00000000..97a461c5 --- /dev/null +++ b/examples/desktop/CMakeLists.txt @@ -0,0 +1,16 @@ +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME desktop) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/frames/CMakeLists.txt b/examples/frames/CMakeLists.txt new file mode 100644 index 00000000..a72b6c94 --- /dev/null +++ b/examples/frames/CMakeLists.txt @@ -0,0 +1,25 @@ +list(APPEND TARGET_RESSOURCES + frames.qrc) + +list(APPEND TARGET_HEADERS + Frame.h) + +list(APPEND TARGET_SOURCES + Frame.cpp + main.cpp) + +set(TARGET_NAME frames) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + qskqmlexport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) \ No newline at end of file diff --git a/examples/gallery/CMakeLists.txt b/examples/gallery/CMakeLists.txt new file mode 100644 index 00000000..379fbb4d --- /dev/null +++ b/examples/gallery/CMakeLists.txt @@ -0,0 +1,66 @@ +list(APPEND TARGET_HEADERS + label/LabelPage.h) + +list(APPEND TARGET_SOURCES + label/LabelPage.cpp) + +list(APPEND TARGET_HEADERS + slider/SliderPage.h) + +list(APPEND TARGET_SOURCES + slider/SliderPage.cpp) + +list(APPEND TARGET_HEADERS + progressbar/ProgressBarPage.h) + +list(APPEND TARGET_SOURCES + progressbar/ProgressBarPage.cpp) + +list(APPEND TARGET_HEADERS + button/ButtonPage.h) + +list(APPEND TARGET_SOURCES + button/ButtonPage.cpp) + +list(APPEND TARGET_HEADERS + textinput/TextInputPage.h) + +list(APPEND TARGET_SOURCES + textinput/TextInputPage.cpp) + +list(APPEND TARGET_HEADERS + selector/SelectorPage.h) + +list(APPEND TARGET_SOURCES + selector/SelectorPage.cpp) + +list(APPEND TARGET_HEADERS + dialog/DialogPage.h) + +list(APPEND TARGET_SOURCES + dialog/DialogPage.cpp) + +list(APPEND TARGET_HEADERS + Page.h) + +list(APPEND TARGET_SOURCES + Page.cpp + main.cpp) + +set(TARGET_NAME gallery) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}) \ No newline at end of file diff --git a/examples/glabels/CMakeLists.txt b/examples/glabels/CMakeLists.txt new file mode 100644 index 00000000..c43253c6 --- /dev/null +++ b/examples/glabels/CMakeLists.txt @@ -0,0 +1,21 @@ +list(APPEND TARGET_RESSOURCES + glabels.qrc) + +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME glabels) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + qskqmlexport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) \ No newline at end of file diff --git a/examples/iotdashboard/CMakeLists.txt b/examples/iotdashboard/CMakeLists.txt new file mode 100644 index 00000000..5b04432f --- /dev/null +++ b/examples/iotdashboard/CMakeLists.txt @@ -0,0 +1,101 @@ +list(APPEND TARGET_SOURCES + Box.cpp + BoxWithButtons.cpp + CircularProgressBar.cpp + CircularProgressBarSkinlet.cpp + DashboardPage.cpp + Diagram.cpp + DiagramSkinlet.cpp + GraphicProvider.cpp + GridBox.cpp + LightDisplaySkinlet.cpp + LightDisplay.cpp + MainItem.cpp + MenuBar.cpp + MyDevices.cpp + PieChart.cpp + PieChartPainted.cpp + PieChartSkinlet.cpp + RoomsPage.cpp + RoundedIcon.cpp + Skin.cpp + TopBar.cpp + RoundButton.cpp + UsageBox.cpp + UsageDiagram.cpp + MainWindow.cpp + main.cpp) + +list(APPEND TARGET_SOURCES + nodes/DiagramDataNode.cpp + nodes/DiagramSegmentsNode.cpp + nodes/RadialTickmarksNode.cpp) + +list(APPEND TARGET_HEADERS + Box.h + BoxWithButtons.h + CircularProgressBar.h + CircularProgressBarSkinlet.h + Diagram.h + DiagramSkinlet.h + GraphicProvider.h + GridBox.h + LightDisplaySkinlet.h + LightDisplay.h + DashboardPage.h + MainItem.h + MainWindow.h + MenuBar.h + MyDevices.h + PieChart.h + PieChartPainted.h + PieChartSkinlet.h + RoomsPage.h + RoundedIcon.h + Skin.h + TopBar.h + RoundButton.h + UsageBox.h + UsageDiagram.h) + +list(APPEND TARGET_HEADERS + nodes/DiagramDataNode.h + nodes/DiagramSegmentsNode.h + nodes/RadialTickmarksNode.h) + +list(APPEND TARGET_RESSOURCES + images.qrc + fonts.qrc) + +set(TARGET_NAME iotdashboard) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS} + ${TARGET_RESSOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +if(TARGET Qsk::qskinny) + # integration test + # - qsktestsupport doesn't exists + # - qskinny has a namespace Qsk + target_link_libraries(${TARGET_NAME} + PRIVATE + Qsk::qskinny + Qt::Svg) +else() + target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + Qt::Svg) + + target_compile_definitions(${TARGET_NAME} + PRIVATE + USE_SHORTCUTS) +endif() \ No newline at end of file diff --git a/examples/iotdashboard/main.cpp b/examples/iotdashboard/main.cpp index 78b71d87..86d42373 100644 --- a/examples/iotdashboard/main.cpp +++ b/examples/iotdashboard/main.cpp @@ -7,7 +7,9 @@ #include "GraphicProvider.h" #include "Skin.h" +#ifdef USE_SHORTCUTS #include +#endif #include #include @@ -75,9 +77,11 @@ int main( int argc, char* argv[] ) qskSetup->setSkin( "DaytimeSkin" ); +#ifdef USE_SHORTCUTS // With CTRL-B you can rotate a couple of visual debug modes SkinnyShortcut::enable( SkinnyShortcut::RotateSkin | SkinnyShortcut::DebugBackground | SkinnyShortcut::DebugStatistics | SkinnyShortcut::Quit ); +#endif MainWindow window; window.show(); diff --git a/examples/iotdashboard_smoketest/CMakeLists.txt b/examples/iotdashboard_smoketest/CMakeLists.txt new file mode 100644 index 00000000..2ee64519 --- /dev/null +++ b/examples/iotdashboard_smoketest/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.18) + +project(iotdashboard_smoketest) + +find_package(QSkinny REQUIRED) + +find_package(Qt6 COMPONENTS Core QUIET) +if (NOT Qt6_FOUND) + find_package(Qt5 5.15 REQUIRED COMPONENTS Core Gui OpenGL Quick Svg Widgets) + find_package(Qt5 5.15 OPTIONAL_COMPONENTS QuickWidgets WebEngine WebEngineCore) + message(WARNING "using QSkinny's 'qt_add_executable()'") + function(qt_add_executable) + add_executable(${ARGV}) + endfunction(qt_add_executable) + message(WARNING "using QSkinny's 'qt_add_library()'") + function(qt_add_library) + add_library(${ARGV}) + endfunction(qt_add_library) +else() + find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL Quick QuickWidgets Svg Widgets) + find_package(Qt6 OPTIONAL_COMPONENTS QuickWidgets WebEngineCore WebEngineQuick) +endif() + +add_subdirectory(../iotdashboard ${CMAKE_CURRENT_BINARY_DIR}/../iotdashboard) \ No newline at end of file diff --git a/examples/layouts/CMakeLists.txt b/examples/layouts/CMakeLists.txt new file mode 100644 index 00000000..f6af2099 --- /dev/null +++ b/examples/layouts/CMakeLists.txt @@ -0,0 +1,37 @@ +list(APPEND TARGET_RESSOURCES + layouts.qrc) + +list(APPEND TARGET_HEADERS + TestRectangle.h + ButtonBox.h + FlowLayoutPage.h + GridLayoutPage.h + LinearLayoutPage.h + DynamicConstraintsPage.h + StackLayoutPage.h) + +list(APPEND TARGET_SOURCES + TestRectangle.cpp + ButtonBox.cpp + FlowLayoutPage.cpp + GridLayoutPage.cpp + LinearLayoutPage.cpp + DynamicConstraintsPage.cpp + StackLayoutPage.cpp + main.cpp) + +set(TARGET_NAME layouts) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESSOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qskqmlexport + qsktestsupport) \ No newline at end of file diff --git a/examples/listbox/CMakeLists.txt b/examples/listbox/CMakeLists.txt new file mode 100644 index 00000000..5ab4c420 --- /dev/null +++ b/examples/listbox/CMakeLists.txt @@ -0,0 +1,17 @@ +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME listbox) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESSOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/messagebox/CMakeLists.txt b/examples/messagebox/CMakeLists.txt new file mode 100644 index 00000000..3801e403 --- /dev/null +++ b/examples/messagebox/CMakeLists.txt @@ -0,0 +1,17 @@ +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME messagebox) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/messageboxQml/CMakeLists.txt b/examples/messageboxQml/CMakeLists.txt new file mode 100644 index 00000000..eda4b65f --- /dev/null +++ b/examples/messageboxQml/CMakeLists.txt @@ -0,0 +1,21 @@ +list(APPEND TARGET_RESSOURCES + messagebox.qrc) + +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME messageboxQml) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + qskqmlexport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) \ No newline at end of file diff --git a/examples/mycontrols/CMakeLists.txt b/examples/mycontrols/CMakeLists.txt new file mode 100644 index 00000000..c99f285c --- /dev/null +++ b/examples/mycontrols/CMakeLists.txt @@ -0,0 +1,25 @@ +list(APPEND TARGET_SOURCES + MySkin.cpp + MyToggleButton.cpp + MyToggleButtonSkinlet.cpp + main.cpp) + +list(APPEND TARGET_HEADERS + MyToggleButton.h + MyToggleButtonSkinlet.h + MySkin.h) + +set(TARGET_NAME mycontrols) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/qvgviewer/CMakeLists.txt b/examples/qvgviewer/CMakeLists.txt new file mode 100644 index 00000000..87ea3e66 --- /dev/null +++ b/examples/qvgviewer/CMakeLists.txt @@ -0,0 +1,60 @@ +list(APPEND TARGET_HEADERS + MainWindow.h) + +list(APPEND TARGET_SOURCES + MainWindow.cpp + main.cpp) + +list(APPEND TARGET_RESSOURCES + qvgviewer.qrc) + +list(APPEND TARGET_SVGS + svg/01.01.10.svg + svg/01.03.04q.svg + svg/01.08.05q.svg + svg/01.25.18.svg) + +list(APPEND TARGET_QVGS + qvg/01.01.10.qvg + qvg/01.03.04q.qvg + qvg/01.08.05q.qvg + qvg/01.25.18.qvg) + +set(TARGET_NAME qvgviewer) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS} + ${TARGET_RESSOURCES} + ${TARGET_SVGS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +if(ENABLE_AUTOQVG) + qsk_svg2qvg(${CMAKE_CURRENT_LIST_DIR}/svg/01.01.10.svg + ${CMAKE_CURRENT_LIST_DIR}/qvg/01.01.10.qvg) + qsk_svg2qvg(${CMAKE_CURRENT_LIST_DIR}/svg/01.03.04q.svg + ${CMAKE_CURRENT_LIST_DIR}/qvg/01.03.04q.qvg) + qsk_svg2qvg(${CMAKE_CURRENT_LIST_DIR}/svg/01.08.05q.svg + ${CMAKE_CURRENT_LIST_DIR}/qvg/01.08.05q.qvg) + qsk_svg2qvg(${CMAKE_CURRENT_LIST_DIR}/svg/01.25.18.svg + ${CMAKE_CURRENT_LIST_DIR}/qvg/01.25.18.qvg) +else() + # When cross compiling we need to have the svg2qvg tool being + # compiled for the build environment - not for the one of the target. + # So we better have precompiled qvg files in the repository to + # make the build process much easier +endif() + +target_sources(${TARGET_NAME} PRIVATE ${TARGET_QVGS}) +source_group("generated" FILES ${TARGET_QVGS}) +source_group("svg" FILES ${TARGET_SVGS}) \ No newline at end of file diff --git a/examples/tabview/CMakeLists.txt b/examples/tabview/CMakeLists.txt new file mode 100644 index 00000000..c421f75f --- /dev/null +++ b/examples/tabview/CMakeLists.txt @@ -0,0 +1,24 @@ +list(APPEND TARGET_HEADERS + CustomSlider.h + CustomSliderSkinlet.h + OtherSlider.h) + +list(APPEND TARGET_SOURCES + CustomSlider.cpp + CustomSliderSkinlet.cpp + OtherSlider.cpp + main.cpp) + +set(TARGET_NAME tabview) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/examples/thumbnails/CMakeLists.txt b/examples/thumbnails/CMakeLists.txt new file mode 100644 index 00000000..d294a19a --- /dev/null +++ b/examples/thumbnails/CMakeLists.txt @@ -0,0 +1,16 @@ +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME thumbnails) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER examples) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) \ No newline at end of file diff --git a/features/qskconfig.cmake b/features/qskconfig.cmake new file mode 100644 index 00000000..62fd0854 --- /dev/null +++ b/features/qskconfig.cmake @@ -0,0 +1,173 @@ +############################################################################ +# QSkinny - Copyright (C) 2016 Uwe Rathmann +# This file may be used under the terms of the QSkinny License, Version 1.0 +############################################################################ + +set(QSK_VERSION ${CMAKE_PROJECT_VERSION}) + +# trying the PREFIX environment variable first +set(QSK_INSTALL_PREFIX $ENV{PREFIX}) # TODO still required? + +if("${QSK_INSTALL_PREFIX}" STREQUAL "") + set(QSK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") # TODO where does QT_INSTALL_PREFIX come from? + + if (UNIX) + set(QSK_INSTALL_PREFIX /usr/local/qskinny-${QSK_VERSION}) + endif() + + if (MSVC) + set(QSK_INSTALL_PREFIX C:/Qskinny-${QSK_VERSION}) + endif() +endif() + +# TODO find compiler flag equivalent +list(APPEND CONFIG no_private_qt_headers_warning) +list(APPEND CONFIG warn_on) +list(APPEND CONFIG no_keywords) +list(APPEND CONFIG silent) +#list(APPEND CONFIG -= depend_includepath) # TODO was -= +list(APPEND CONFIG strict_c++) +list(APPEND CONFIG c++11) +list(APPEND CONFIG pedantic) +list(APPEND CONFIG hide_symbols) +#list(APPEND CONFIG += debug) +#list(APPEND CONFIG += sanitize) + +# TODO +# use_no_rpath { +# CONFIG -= use_local_rpath use_install_rpath +# } else { +# cross_compile { +# CONFIG *= use_install_rpath +# QMAKE_RPATHLINKDIR *= $${QSK_PLUGIN_DIR}/skins +# } else { +# !use_install_rpath: CONFIG *= use_local_rpath +# } +# } + +option(BUILD_QSKDLL "Build qskinny as shared library" ON) +option(BUILD_EXAMPLES "Build qskinny examples" ON) +option(BUILD_PLAYGROUND "Build qskinny playground" ON) +option(BUILD_SVG2QVG_STANDALONE "If 'ON' application won't be linked against qskinny library" ON) +option(ENABLE_PINYIN "UNIX ONLY OPTION: Enable romanization system for standard mandarin chinese" OFF) +option(ENABLE_HUNSPELL "UNIX ONLY OPTION: Enable spell checker" OFF) +option(ENABLE_FONT_CONFIG "Enable font config for font caching" ON) +option(ENABLE_ENSURE_SKINS "Enabling fall back code, that inserts some skin factories manually when not finding skin factories as plugins" ON) +option(ENABLE_AUTOQVG "enable automatic qvg compilation" OFF) + +if(UNIX AND NOT APPLE) + set(LINUX TRUE) +endif() + +if(LINUX) + + if ("pedantic" IN_LIST CONFIG) + + add_compile_definitions(QT_STRICT_ITERATORS) + + # Qt headers do not stand pedantic checks, so it's better + # to exclude them by declaring them as system includes + + list(APPEND CONFIG qtassysteminclude) + endif() + + if ("qtassysteminclude" IN_LIST CONFIG) + + # As most distros set QT_INSTALL_HEADERS to /usr/include we + # would run into gcc compiler errors and better drop it + # from the list below. Should be no problem as we don't + # add the Qt module to our includes and therefore don't + # need this path. + + # TODO find solution for all platforms + # QMAKE_CXXFLAGS += \ + # -isystem $$[QT_INSTALL_HEADERS]/QtCore \ + # -isystem $$[QT_INSTALL_HEADERS]/QtCore/$$[QT_VERSION]/QtCore \ + # -isystem $$[QT_INSTALL_HEADERS]/QtGui \ + # -isystem $$[QT_INSTALL_HEADERS]/QtGui/$$[QT_VERSION]/QtGui \ + # -isystem $$[QT_INSTALL_HEADERS]/QtQuick \ + # -isystem $$[QT_INSTALL_HEADERS]/QtQuick/$$[QT_VERSION]/QtQuick \ + # -isystem $$[QT_INSTALL_HEADERS]/QtQml \ + # -isystem $$[QT_INSTALL_HEADERS]/QtQml/$$[QT_VERSION]/QtQml \ + endif() +endif() + +if ("${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+" OR "${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+-64") + # --- optional optimzations + if (CMAKE_BUILD_TYPE EQUAL "Debug") + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O0) # TODO check if still required + else() + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3 -ffast-math) # TODO check if still required + endif() +endif() + +if ("pedantic" IN_LIST CONFIG) + if ("${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+" OR "${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+-64") + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -pedantic-errors) + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wextra) + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Werror=format-security) + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wsuggest-override) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wlogical-op) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wconversion) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wfloat-equal) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wshadow) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wsuggest-final-types) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wsuggest-final-methods) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fanalyzer) + endif() + + if ("${CMAKE_CXX_COMPILER}" MATCHES ".*linux-clang") + + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -pedantic-errors) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Weverything) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-c++98-compat-pedantic) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-global-constructors) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-exit-time-destructors) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-padded) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-float-equal) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-undefined-reinterpret-cast) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-deprecated) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-switch-enum) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-keyword-macro) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-old-style-cast) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-used-but-marked-unused) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-weak-vtables) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-shadow) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-double-promotion) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-conversion) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-documentation-unknown-command) + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wno-unused-macros) + endif() +endif() + +if ("sanitize" IN_LIST CONFIG) + + list(APPEND CONFIG sanitizer) + list(APPEND CONFIG sanitize_address) + # CONFIG *= sanitize_undefined + + if ("${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+" OR "${CMAKE_CXX_COMPILER}" MATCHES ".*linux-g\\+\\+-64") + # set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fsanitize-address-use-after-scope) + #QMAKE_LFLAGS *= -fsanitize-address-use-after-scope + endif() +endif() + +if (CMAKE_BUILD_TYPE EQUAL "Debug") + add_compile_definitions(ITEM_STATISTICS=1) +endif() + +# DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000 + +set(LOCAL_PRI $ENV{QSK_LOCAL_PRI}) + +if (${LOCAL_PRI}) # TODO not empty check + + if(EXISTS ${LOCAL_PRI}) + + # When not working with the Qt/Creator it is often more convenient + # to include the specific options of your local build, than passing + # them all on the command line + + include(${LOCAL_PRI}) + endif() +endif() \ No newline at end of file diff --git a/inputcontext/CMakeLists.txt b/inputcontext/CMakeLists.txt new file mode 100644 index 00000000..fc6012bb --- /dev/null +++ b/inputcontext/CMakeLists.txt @@ -0,0 +1,55 @@ +set(TARGET_NAME qskinputcontext) + +list(APPEND TARGET_HEADERS + QskInputContextGlobal.h) + +list(APPEND TARGET_SOURCES + QskInputContextPlugin.cpp) + +list(APPEND TARGET_OTHER_FILES + metadata.json) + +if(ENABLE_PINYIN) + list(APPEND TARGET_HEADERS + ${CMAKE_SOURCE_DIR}/src/inputpanel/QskPinyinTextPredictor.h) + list(APPEND TARGET_SOURCES + ${CMAKE_SOURCE_DIR}/src/inputpanel/QskPinyinTextPredictor.cpp) +endif() + +if(ENABLE_HUNSPELL) + list(APPEND TARGET_HEADERS + ${CMAKE_SOURCE_DIR}/src/inputpanel/QskHunspellTextPredictor.h) + list(APPEND TARGET_SOURCES + ${CMAKE_SOURCE_DIR}/src/inputpanel/QskHunspellTextPredictor.cpp) +endif() + +qt_add_library(${TARGET_NAME} SHARED ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_OTHER_FILES}) + +if(ENABLE_PINYIN) + target_link_libraries(${TARGET_NAME} + PRIVATE + pinyin + Fcitx5::Utils) +endif() + +if(ENABLE_HUNSPELL) + target_link_libraries(${TARGET_NAME} + PRIVATE + hunspell) +endif() + +if(BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PRIVATE + QSK_INPUTCONTEXT_MAKEDLL) +endif() + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + Qt::GuiPrivate) + +set_target_properties(${TARGET_NAME} PROPERTIES + AUTOMOC ON) + +install(TARGETS ${TARGET_NAME} DESTINATION ${QSK_INSTALL_PLUGINS}/platforminputcontexts) \ No newline at end of file diff --git a/playground/CMakeLists.txt b/playground/CMakeLists.txt new file mode 100644 index 00000000..de8abd04 --- /dev/null +++ b/playground/CMakeLists.txt @@ -0,0 +1,23 @@ +add_subdirectory(anchors) +add_subdirectory(dials) +add_subdirectory(dialogbuttons) +add_subdirectory(invoker) +add_subdirectory(inputpanel) +add_subdirectory(images) +add_subdirectory(shadows) + +if (QT_VERSION_MAJOR VERSION_EQUAL "6") + if(TARGET Qt::WebEngineCore) + if(TARGET Qt::WebEngineQuick) + add_subdirectory(webview) + endif() + endif() +elseif(Qt_VERSION VERSION_EQUAL "5") + if(TARGET Qt::WebEngine) + add_subdirectory(webview) + endif() +endif() + +if(TARGET Qt::QuickWidgets) + add_subdirectory(grids) +endif() diff --git a/playground/anchors/CMakeLists.txt b/playground/anchors/CMakeLists.txt new file mode 100644 index 00000000..201d3305 --- /dev/null +++ b/playground/anchors/CMakeLists.txt @@ -0,0 +1,36 @@ +list(APPEND TARGET_HEADERS + kiwi/Constraint.h + kiwi/Expression.h + kiwi/Solver.h + kiwi/Strength.h + kiwi/Term.h + kiwi/Variable.h) + +list(APPEND TARGET_SOURCES + kiwi/Expression.cpp + kiwi/Constraint.cpp + kiwi/Solver.cpp) + +list(APPEND TARGET_HEADERS + AnchorBox.h) + +list(APPEND TARGET_SOURCES + AnchorBox.cpp + main.cpp) + +set(TARGET_NAME anchors) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS} + ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/dialogbuttons/CMakeLists.txt b/playground/dialogbuttons/CMakeLists.txt new file mode 100644 index 00000000..7109270c --- /dev/null +++ b/playground/dialogbuttons/CMakeLists.txt @@ -0,0 +1,20 @@ +set(TARGET_NAME qskexample) + +list(APPEND TARGET_HEADERS + Window.h) + +list(APPEND TARGET_SOURCES + Window.cpp + main.cpp) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE ${TARGET_SOURCES} ${TARGET_HEADERS}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/dials/CMakeLists.txt b/playground/dials/CMakeLists.txt new file mode 100644 index 00000000..d10a209a --- /dev/null +++ b/playground/dials/CMakeLists.txt @@ -0,0 +1,32 @@ +list(APPEND TARGET_HEADERS + SkinFactory.h + Dial.h + DialSkinlet.h + Dashboard.h) + +list(APPEND TARGET_SOURCES + SkinFactory.cpp + Dial.cpp + DialSkinlet.cpp + Dashboard.cpp + main.cpp) + +list(APPEND TARGET_RESSOURCES + images.qrc) + +set(TARGET_NAME dials) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS} + ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/grids/CMakeLists.txt b/playground/grids/CMakeLists.txt new file mode 100644 index 00000000..62fdf9b5 --- /dev/null +++ b/playground/grids/CMakeLists.txt @@ -0,0 +1,34 @@ + +list(APPEND TARGET_HEADERS + GridAccessor.h + GridSkinny.h + GridWidgets.h + GridGraphics.h + GridQuick.h + TestBox.h) + +list(APPEND TARGET_SOURCES + GridAccessor.cpp + GridSkinny.cpp + GridWidgets.cpp + GridGraphics.cpp + GridQuick.cpp + TestBox.cpp + main.cpp) + +set(TARGET_NAME grid) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport + Qt::QuickWidgets) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/images/CMakeLists.txt b/playground/images/CMakeLists.txt new file mode 100644 index 00000000..47acbc84 --- /dev/null +++ b/playground/images/CMakeLists.txt @@ -0,0 +1,27 @@ +list(APPEND TARGET_RESSOURCES + images.qrc) + +list(APPEND TARGET_HEADERS + Image.h) + +list(APPEND TARGET_SOURCES + Image.cpp + main.cpp) + +set(TARGET_NAME images) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS} + ${TARGET_RESSOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qskqmlexport + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/inputpanel/CMakeLists.txt b/playground/inputpanel/CMakeLists.txt new file mode 100644 index 00000000..b06ceeac --- /dev/null +++ b/playground/inputpanel/CMakeLists.txt @@ -0,0 +1,17 @@ +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME inputpanel) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) diff --git a/playground/invoker/CMakeLists.txt b/playground/invoker/CMakeLists.txt new file mode 100644 index 00000000..ef4afc3a --- /dev/null +++ b/playground/invoker/CMakeLists.txt @@ -0,0 +1,24 @@ +list(APPEND TARGET_HEADERS + Callback.h + Invoker.h) + +list(APPEND TARGET_SOURCES + Callback.cpp + Invoker.cpp + main.cpp) + +set(TARGET_NAME invoker) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES} + ${TARGET_HEADERS}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTOMOC_MOC_OPTIONS -nw + FOLDER playground) \ No newline at end of file diff --git a/playground/shadows/CMakeLists.txt b/playground/shadows/CMakeLists.txt new file mode 100644 index 00000000..054bdfbf --- /dev/null +++ b/playground/shadows/CMakeLists.txt @@ -0,0 +1,22 @@ +list(APPEND TARGET_HEADERS + ShadowedBox.h) + +list(APPEND TARGET_SOURCES + ShadowedBox.cpp + main.cpp) + +set(TARGET_NAME shadows) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_HEADERS} + ${TARGET_SOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/webview/CMakeLists.txt b/playground/webview/CMakeLists.txt new file mode 100644 index 00000000..686c538c --- /dev/null +++ b/playground/webview/CMakeLists.txt @@ -0,0 +1,30 @@ + +list(APPEND TARGET_SOURCES + main.cpp) + +set(TARGET_NAME webview) + +qt_add_executable(${TARGET_NAME} WIN32 MACOSX_BUNDLE + ${TARGET_SOURCES}) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + qsktestsupport) + +if (QT_VERSION_MAJOR VERSION_GREATER "5") + target_link_libraries(${TARGET_NAME} + PRIVATE + Qt::WebEngineQuick + Qt::WebEngineQuickPrivate) +else() + target_link_libraries(${TARGET_NAME} + PRIVATE + Qt::WebEngine + Qt::WebEnginePrivate) +endif() + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + FOLDER playground) \ No newline at end of file diff --git a/playground/webview/main.cpp b/playground/webview/main.cpp index 454e3639..2e1437fa 100644 --- a/playground/webview/main.cpp +++ b/playground/webview/main.cpp @@ -37,7 +37,10 @@ int main( int argc, char* argv[] ) QskObjectCounter counter( true ); #endif +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + // namespace QtWebEngine doesn't exist in Qt6: https://doc.qt.io/qt-5/qtwebengine.html QtWebEngine::initialize(); +#endif QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app( argc, argv ); diff --git a/qmlexport/CMakeLists.txt b/qmlexport/CMakeLists.txt new file mode 100644 index 00000000..82894705 --- /dev/null +++ b/qmlexport/CMakeLists.txt @@ -0,0 +1,36 @@ +set(TARGET_NAME qskqmlexport) + +list(APPEND TARGET_HEADERS + QskQmlGlobal.h + QskShortcutQml.h + QskLayoutQml.h + QskMainQml.h + QskQml.h) + +list(APPEND TARGET_SOURCES + QskShortcutQml.cpp + QskLayoutQml.cpp + QskMainQml.cpp + QskQml.cpp) + +qt_add_library(${TARGET_NAME} SHARED ${TARGET_SOURCES} ${TARGET_HEADERS}) + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON) + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny) + +target_include_directories(${TARGET_NAME} + PUBLIC + ${CMAKE_CURRENT_LIST_DIR}) + +if(BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PRIVATE + QSK_QML_MAKEDLL) +endif() + +install(TARGETS ${TARGET_NAME} DESTINATION qmlexport) \ No newline at end of file diff --git a/skins/CMakeLists.txt b/skins/CMakeLists.txt new file mode 100644 index 00000000..37ca7925 --- /dev/null +++ b/skins/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(squiek) +add_subdirectory(material3) \ No newline at end of file diff --git a/skins/material3/CMakeLists.txt b/skins/material3/CMakeLists.txt new file mode 100644 index 00000000..0df4d1f2 --- /dev/null +++ b/skins/material3/CMakeLists.txt @@ -0,0 +1,35 @@ +set(QSK_PLUGIN_SUBDIR skins) + +set(TARGET_NAME material3skin) + +list(APPEND TARGET_HEADERS + QskMaterial3Global.h + QskMaterial3Skin.h + QskMaterial3SkinFactory.h) + +list(APPEND TARGET_SOURCES + QskMaterial3Skin.cpp + QskMaterial3SkinFactory.cpp) + +list(APPEND TARGET_OTHER_FILES + metadata.json) + +if(BUILD_QSKDLL) + qt_add_library(${TARGET_NAME} SHARED ${TARGET_HEADERS} ${TARGET_SOURCES} ${TARGET_OTHER_FILES}) +else() + qt_add_library(${TARGET_NAME} STATIC ${TARGET_HEADERS} ${TARGET_SOURCES} ${TARGET_OTHER_FILES}) +endif() + +target_link_libraries(${TARGET_NAME} PRIVATE qskinny) + +if(BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PRIVATE + QSK_MATERIAL3_MAKEDLL) +endif() + +set_target_properties(${TARGET_NAME} PROPERTIES + AUTOMOC ON + FOLDER skins) + +install(TARGETS ${TARGET_NAME} DESTINATION ${QSK_INSTALL_PLUGINS}/${QSK_PLUGIN_SUBDIR}) diff --git a/skins/material3/QskMaterial3SkinFactory.h b/skins/material3/QskMaterial3SkinFactory.h index 9727a329..f7edf8a4 100644 --- a/skins/material3/QskMaterial3SkinFactory.h +++ b/skins/material3/QskMaterial3SkinFactory.h @@ -12,9 +12,10 @@ class QSK_MATERIAL3_EXPORT QskMaterial3SkinFactory : public QskSkinFactory { Q_OBJECT - +#if defined( QSK_MATERIAL3_MAKEDLL ) Q_PLUGIN_METADATA( IID QskSkinFactoryIID FILE "metadata.json" ) Q_INTERFACES( QskSkinFactory ) +#endif public: QskMaterial3SkinFactory( QObject* parent = nullptr ); diff --git a/skins/squiek/CMakeLists.txt b/skins/squiek/CMakeLists.txt new file mode 100644 index 00000000..1adabe6c --- /dev/null +++ b/skins/squiek/CMakeLists.txt @@ -0,0 +1,37 @@ +set(QSK_PLUGIN_SUBDIR skins) + +set(TARGET_NAME squiekskin) + +list(APPEND TARGET_HEADERS + QskSquiekGlobal.h + QskSquiekSkin.h + QskSquiekSkinFactory.h) + +list(APPEND TARGET_SOURCES + QskSquiekSkin.cpp + QskSquiekSkinFactory.cpp) + +list(APPEND TARGET_OTHER_FILES + metadata.json) + +if(BUILD_QSKDLL) + qt_add_library(${TARGET_NAME} SHARED ${TARGET_HEADERS} ${TARGET_SOURCES} ${TARGET_OTHER_FILES}) +else() + qt_add_library(${TARGET_NAME} STATIC ${TARGET_HEADERS} ${TARGET_SOURCES} ${TARGET_OTHER_FILES}) +endif() + +target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny) + +if(BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PRIVATE + QSK_SQUIEK_MAKEDLL) +endif() + +set_target_properties(${TARGET_NAME} PROPERTIES + AUTOMOC ON + FOLDER skins) + +install(TARGETS ${TARGET_NAME} DESTINATION ${QSK_INSTALL_PLUGINS}/${QSK_PLUGIN_SUBDIR}) diff --git a/skins/squiek/QskSquiekSkinFactory.h b/skins/squiek/QskSquiekSkinFactory.h index 280135bb..73f3f936 100644 --- a/skins/squiek/QskSquiekSkinFactory.h +++ b/skins/squiek/QskSquiekSkinFactory.h @@ -13,8 +13,10 @@ class QSK_SQUIEK_EXPORT QskSquiekSkinFactory : public QskSkinFactory { Q_OBJECT +#if defined( QSK_SQUIEK_MAKEDLL ) Q_PLUGIN_METADATA( IID QskSkinFactoryIID FILE "metadata.json" ) Q_INTERFACES( QskSkinFactory ) +#endif public: QskSquiekSkinFactory( QObject* parent = nullptr ); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..ec44ccc9 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,456 @@ +include(${CMAKE_SOURCE_DIR}/cmake/QSkinnyMacros.cmake) + +list(APPEND TARGET_HEADERS + common/QskArcMetrics.h + common/QskAspect.h + common/QskBoxBorderColors.h + common/QskBoxBorderMetrics.h + common/QskBoxShapeMetrics.h + common/QskBoxHints.h + common/QskFunctions.h + common/QskGlobal.h + common/QskGradient.h + common/QskGradientStop.h + common/QskHctColor.h + common/QskIntervalF.h + common/QskMargins.h + common/QskMetaFunction.h + common/QskMetaFunction.hpp + common/QskMetaInvokable.h + common/QskNamespace.h + common/QskObjectCounter.h + common/QskPlacementPolicy.h + common/QskPlatform.h + common/QskRgbValue.h + common/QskScaleEngine.h + common/QskScaleTickmarks.h + common/QskShadowMetrics.h + common/QskSizePolicy.h + common/QskStateCombination.h + common/QskTextColors.h + common/QskTextOptions.h) + +list(APPEND TARGET_SOURCES + common/QskArcMetrics.cpp + common/QskAspect.cpp + common/QskBoxBorderColors.cpp + common/QskBoxBorderMetrics.cpp + common/QskBoxShapeMetrics.cpp + common/QskBoxHints.cpp + common/QskFunctions.cpp + common/QskGradient.cpp + common/QskGradientStop.cpp + common/QskHctColor.cpp + common/QskIntervalF.cpp + common/QskMargins.cpp + common/QskMetaFunction.cpp + common/QskMetaInvokable.cpp + common/QskObjectCounter.cpp + common/QskPlatform.cpp + common/QskPlacementPolicy.cpp + common/QskRgbValue.cpp + common/QskScaleEngine.cpp + common/QskScaleTickmarks.cpp + common/QskShadowMetrics.cpp + common/QskSizePolicy.cpp + common/QskTextColors.cpp + common/QskTextOptions.cpp) + +list(APPEND TARGET_HEADERS + graphic/QskColorFilter.h + graphic/QskGraphic.h + graphic/QskGraphicImageProvider.h + graphic/QskGraphicIO.h + graphic/QskGraphicPaintEngine.h + graphic/QskGraphicProvider.h + graphic/QskGraphicProviderMap.h + graphic/QskGraphicTextureFactory.h + graphic/QskPainterCommand.h + graphic/QskStandardSymbol.h) + +list(APPEND TARGET_SOURCES + graphic/QskColorFilter.cpp + graphic/QskGraphic.cpp + graphic/QskGraphicImageProvider.cpp + graphic/QskGraphicIO.cpp + graphic/QskGraphicPaintEngine.cpp + graphic/QskGraphicProvider.cpp + graphic/QskGraphicProviderMap.cpp + graphic/QskGraphicTextureFactory.cpp + graphic/QskPainterCommand.cpp + graphic/QskStandardSymbol.cpp) + +list(APPEND TARGET_HEADERS + nodes/QskArcNode.h + nodes/QskArcRenderer.h + nodes/QskBoxNode.h + nodes/QskBoxClipNode.h + nodes/QskBoxRenderer.h + nodes/QskBoxRendererColorMap.h + nodes/QskBoxShadowNode.h + nodes/QskGraphicNode.h + nodes/QskPaintedNode.h + nodes/QskPlainTextRenderer.h + nodes/QskRichTextRenderer.h + nodes/QskScaleRenderer.h + nodes/QskSGNode.h + nodes/QskShadedBoxNode.h + nodes/QskTextNode.h + nodes/QskTextRenderer.h + nodes/QskTextureRenderer.h + nodes/QskTickmarksNode.h + nodes/QskVertex.h) + +list(APPEND TARGET_SOURCES + nodes/QskArcNode.cpp + nodes/QskArcRenderer.cpp + nodes/QskBoxNode.cpp + nodes/QskBoxClipNode.cpp + nodes/QskBoxRendererRect.cpp + nodes/QskBoxRendererEllipse.cpp + nodes/QskBoxRendererDEllipse.cpp + nodes/QskBoxShadowNode.cpp + nodes/QskGraphicNode.cpp + nodes/QskPaintedNode.cpp + nodes/QskPlainTextRenderer.cpp + nodes/QskRichTextRenderer.cpp + nodes/QskScaleRenderer.cpp + nodes/QskSGNode.cpp + nodes/QskShadedBoxNode.cpp + nodes/QskTextNode.cpp + nodes/QskTextRenderer.cpp + nodes/QskTextureRenderer.cpp + nodes/QskTickmarksNode.cpp + nodes/QskVertex.cpp) + +list(APPEND TARGET_RESSOURCES + nodes/shaders.qrc) + +list(APPEND TARGET_HEADERS + controls/QskAbstractButton.h + controls/QskAnimationHint.h + controls/QskAnimator.h + controls/QskApplicationView.h + controls/QskBoundedControl.h + controls/QskBoundedInput.h + controls/QskBoundedRangeInput.h + controls/QskBoundedValueInput.h + controls/QskBox.h + controls/QskBoxSkinlet.h + controls/QskCheckBox.h + controls/QskCheckBoxSkinlet.h + controls/QskControl.h + controls/QskControlPrivate.h + controls/QskDirtyItemFilter.h + controls/QskEvent.h + controls/QskFlickAnimator.h + controls/QskFocusIndicator.h + controls/QskFocusIndicatorSkinlet.h + controls/QskGesture.h + controls/QskGestureRecognizer.h + controls/QskGraphicLabel.h + controls/QskGraphicLabelSkinlet.h + controls/QskHintAnimator.h + controls/QskInputGrabber.h + controls/QskListView.h + controls/QskListViewSkinlet.h + controls/QskMenu.h + controls/QskMenuSkinlet.h + controls/QskObjectTree.h + controls/QskPageIndicator.h + controls/QskPageIndicatorSkinlet.h + controls/QskPanGestureRecognizer.h + controls/QskPopup.h + controls/QskPopupSkinlet.h + controls/QskPushButton.h + controls/QskPushButtonSkinlet.h + controls/QskProgressBar.h + controls/QskProgressBarSkinlet.h + controls/QskQuick.h + controls/QskQuickItem.h + controls/QskQuickItemPrivate.h + controls/QskScrollArea.h + controls/QskScrollBox.h + controls/QskScrollView.h + controls/QskScrollViewSkinlet.h + controls/QskSegmentedBar.h + controls/QskSegmentedBarSkinlet.h + controls/QskSeparator.h + controls/QskSeparatorSkinlet.h + controls/QskSetup.h + controls/QskShortcutMap.h + controls/QskSimpleListBox.h + controls/QskSkin.h + controls/QskSkinFactory.h + controls/QskSkinHintTable.h + controls/QskSkinHintTableEditor.h + controls/QskSkinManager.h + controls/QskSkinStateChanger.h + controls/QskSkinTransition.h + controls/QskSkinlet.h + controls/QskSkinnable.h + controls/QskSlider.h + controls/QskSliderSkinlet.h + controls/QskStatusIndicator.h + controls/QskStatusIndicatorSkinlet.h + controls/QskSubWindowArea.h + controls/QskSubWindowAreaSkinlet.h + controls/QskSubWindow.h + controls/QskSubWindowSkinlet.h + controls/QskSwitchButton.h + controls/QskSwitchButtonSkinlet.h + controls/QskTabBar.h + controls/QskTabButton.h + controls/QskTabButtonSkinlet.h + controls/QskTabView.h + controls/QskTabViewSkinlet.h + controls/QskTextInput.h + controls/QskTextInputSkinlet.h + controls/QskTextLabel.h + controls/QskTextLabelSkinlet.h + controls/QskVariantAnimator.h + controls/QskWindow.h) + +list(APPEND TARGET_SOURCES + controls/QskAbstractButton.cpp + controls/QskAnimator.cpp + controls/QskAnimationHint.cpp + controls/QskApplicationView.cpp + controls/QskBoundedControl.cpp + controls/QskBoundedInput.cpp + controls/QskBoundedRangeInput.cpp + controls/QskBoundedValueInput.cpp + controls/QskBox.cpp + controls/QskBoxSkinlet.cpp + controls/QskCheckBox.cpp + controls/QskCheckBoxSkinlet.cpp + controls/QskControl.cpp + controls/QskControlPrivate.cpp + controls/QskDirtyItemFilter.cpp + controls/QskEvent.cpp + controls/QskFlickAnimator.cpp + controls/QskFocusIndicator.cpp + controls/QskFocusIndicatorSkinlet.cpp + controls/QskGesture.cpp + controls/QskGestureRecognizer.cpp + controls/QskGraphicLabel.cpp + controls/QskGraphicLabelSkinlet.cpp + controls/QskHintAnimator.cpp + controls/QskInputGrabber.cpp + controls/QskListView.cpp + controls/QskListViewSkinlet.cpp + controls/QskMenuSkinlet.cpp + controls/QskMenu.cpp + controls/QskObjectTree.cpp + controls/QskPageIndicator.cpp + controls/QskPageIndicatorSkinlet.cpp + controls/QskPanGestureRecognizer.cpp + controls/QskPopup.cpp + controls/QskPopupSkinlet.cpp + controls/QskPushButton.cpp + controls/QskPushButtonSkinlet.cpp + controls/QskProgressBar.cpp + controls/QskProgressBarSkinlet.cpp + controls/QskQuick.cpp + controls/QskQuickItem.cpp + controls/QskQuickItemPrivate.cpp + controls/QskScrollArea.cpp + controls/QskScrollBox.cpp + controls/QskScrollView.cpp + controls/QskScrollViewSkinlet.cpp + controls/QskSegmentedBar.cpp + controls/QskSegmentedBarSkinlet.cpp + controls/QskSeparator.cpp + controls/QskSeparatorSkinlet.cpp + controls/QskSetup.cpp + controls/QskShortcutMap.cpp + controls/QskSimpleListBox.cpp + controls/QskSkin.cpp + controls/QskSkinHintTable.cpp + controls/QskSkinHintTableEditor.cpp + controls/QskSkinFactory.cpp + controls/QskSkinManager.cpp + controls/QskSkinTransition.cpp + controls/QskSkinlet.cpp + controls/QskSkinnable.cpp + controls/QskSlider.cpp + controls/QskSliderSkinlet.cpp + controls/QskStatusIndicator.cpp + controls/QskStatusIndicatorSkinlet.cpp + controls/QskSubWindowArea.cpp + controls/QskSubWindowAreaSkinlet.cpp + controls/QskSubWindow.cpp + controls/QskSubWindowSkinlet.cpp + controls/QskSwitchButton.cpp + controls/QskSwitchButtonSkinlet.cpp + controls/QskTabBar.cpp + controls/QskTabButton.cpp + controls/QskTabButtonSkinlet.cpp + controls/QskTabView.cpp + controls/QskTabViewSkinlet.cpp + controls/QskTextInput.cpp + controls/QskTextInputSkinlet.cpp + controls/QskTextLabel.cpp + controls/QskTextLabelSkinlet.cpp + controls/QskVariantAnimator.cpp + controls/QskWindow.cpp) + +list(APPEND TARGET_HEADERS + layouts/QskGridBox.h + layouts/QskGridLayoutEngine.h + layouts/QskIndexedLayoutBox.h + layouts/QskLayoutChain.h + layouts/QskLayoutEngine2D.h + layouts/QskLayoutElement.h + layouts/QskLayoutMetrics.h + layouts/QskLinearBox.h + layouts/QskLinearLayoutEngine.h + layouts/QskStackBoxAnimator.h + layouts/QskStackBox.h + layouts/QskSubcontrolLayoutEngine.h) + +list(APPEND TARGET_SOURCES + layouts/QskGridBox.cpp + layouts/QskGridLayoutEngine.cpp + layouts/QskIndexedLayoutBox.cpp + layouts/QskLayoutChain.cpp + layouts/QskLayoutEngine2D.cpp + layouts/QskLayoutElement.cpp + layouts/QskLayoutMetrics.cpp + layouts/QskLinearBox.cpp + layouts/QskLinearLayoutEngine.cpp + layouts/QskStackBoxAnimator.cpp + layouts/QskStackBox.cpp + layouts/QskSubcontrolLayoutEngine.cpp) + +list(APPEND TARGET_HEADERS + dialogs/QskDialog.h + dialogs/QskDialogButton.h + dialogs/QskDialogButtonBox.h + dialogs/QskDialogSubWindow.h + dialogs/QskDialogWindow.h + dialogs/QskMessageSubWindow.h + dialogs/QskMessageWindow.h + dialogs/QskSelectionSubWindow.h + dialogs/QskSelectionWindow.h) + +list(APPEND TARGET_SOURCES + dialogs/QskDialogButton.cpp + dialogs/QskDialogButtonBox.cpp + dialogs/QskDialog.cpp + dialogs/QskDialogSubWindow.cpp + dialogs/QskDialogWindow.cpp + dialogs/QskMessageSubWindow.cpp + dialogs/QskMessageWindow.cpp + dialogs/QskSelectionSubWindow.cpp + dialogs/QskSelectionWindow.cpp) + +list(APPEND TARGET_HEADERS + inputpanel/QskTextPredictor.h + inputpanel/QskInputContext.h + inputpanel/QskInputPanel.h + inputpanel/QskInputPanelBox.h + inputpanel/QskInputPredictionBar.h + inputpanel/QskVirtualKeyboard.h) + +list(APPEND TARGET_SOURCES + inputpanel/QskTextPredictor.cpp + inputpanel/QskInputContext.cpp + inputpanel/QskInputPanel.cpp + inputpanel/QskInputPanelBox.cpp + inputpanel/QskInputPredictionBar.cpp + inputpanel/QskVirtualKeyboard.cpp) + +if(ENABLE_PINYIN) + list(APPEND TARGET_HEADERS + inputpanel/QskPinyinTextPredictor.h) + + list(APPEND TARGET_SOURCES + inputpanel/QskPinyinTextPredictor.cpp) +endif() + +if(ENABLE_HUNSPELL) + list(APPEND TARGET_HEADERS + inputpanel/QskHunspellTextPredictor.h) + list(APPEND TARGET_SOURCES + inputpanel/QskHunspellTextPredictor.cpp) +endif() + +set(TARGET_NAME qskinny) + +if(BUILD_QSKDLL) + qt_add_library(${TARGET_NAME} SHARED ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESSOURCES}) +else() + qt_add_library(${TARGET_NAME} STATIC ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESSOURCES}) +endif() + +if(BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PUBLIC + QSK_DLL + PRIVATE + QSK_MAKEDLL) +endif() + +target_include_directories(${TARGET_NAME} + PUBLIC + $ + $ + $ + $ + $ + $ + $) + +target_include_directories(${TARGET_NAME} + INTERFACE + $) + +target_link_libraries(${TARGET_NAME} + PUBLIC + Qt::Core + Qt::CorePrivate + Qt::Quick + Qt::QuickPrivate) + +if (QT_VERSION_MAJOR VERSION_GREATER "5") + target_link_libraries(${TARGET_NAME} + PUBLIC + Qt::OpenGL + Qt::OpenGLPrivate) +endif() + +if(ENABLE_HUNSPELL) + target_link_libraries(${TARGET_NAME} + PRIVATE + hunspell) +endif() + +if(ENABLE_PINYIN) + target_compile_definitions(${TARGET_NAME} PRIVATE PINYIN) + + target_link_libraries(${TARGET_NAME} + PRIVATE + pinyin + Fcitx5::Utils) + + target_include_directories(${TARGET_NAME} + PUBLIC + $) +endif() + +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOMOC ON + AUTORCC ON + FOLDER libs) + +# TODO hack for standalone qvg2svg +set_target_properties(${TARGET_NAME} + PROPERTIES + AUTOGEN_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/qskinny_autogen) + +list(TRANSFORM TARGET_HEADERS PREPEND "${CMAKE_CURRENT_LIST_DIR}/") +set_target_properties(${TARGET_NAME} + PROPERTIES + PUBLIC_HEADER "${TARGET_HEADERS}") \ No newline at end of file diff --git a/support/CMakeLists.txt b/support/CMakeLists.txt new file mode 100644 index 00000000..ac672a4e --- /dev/null +++ b/support/CMakeLists.txt @@ -0,0 +1,67 @@ +list(APPEND TARGET_HEADERS + SkinnyGlobal.h + SkinnyNamespace.h + SkinnyShapeFactory.h + SkinnyShapeProvider.h + SkinnyShortcut.h) + +list(APPEND TARGET_SOURCES + SkinnyNamespace.cpp + SkinnyShapeFactory.cpp + SkinnyShapeProvider.cpp + SkinnyShortcut.cpp) + +set(TARGET_NAME qsktestsupport) + +if (BUILD_QSKDLL) + qt_add_library(${TARGET_NAME} SHARED ${TARGET_SOURCES} ${TARGET_HEADERS}) +else() + qt_add_library(${TARGET_NAME} STATIC ${TARGET_SOURCES} ${TARGET_HEADERS}) +endif() + +if(ENABLE_FONT_CONFIG) + set(QSK_FONTDIR ${CMAKE_CURRENT_LIST_DIR}/fonts) + set(QSK_FONTCACHEDIR ${CMAKE_CURRENT_BINARY_DIR}/fontconfig) + set(QSK_FONTCONF_FILE ${QSK_FONTCACHEDIR}/fonts.conf) + + configure_file(fonts.conf.cmake.in ${QSK_FONTCONF_FILE} + @ONLY + NEWLINE_STYLE LF) + + target_compile_definitions(${TARGET_NAME} + PRIVATE + FONTCONFIG_FILE=${QSK_FONTCONF_FILE}) +endif() + +set_target_properties(${TARGET_NAME} PROPERTIES + AUTOMOC ON) + +target_link_libraries(${TARGET_NAME} + PUBLIC + qskinny) + +if (BUILD_QSKDLL) + target_compile_definitions(${TARGET_NAME} + PRIVATE + SKINNY_MAKEDLL) +endif() + +target_compile_definitions(${TARGET_NAME} + PRIVATE + PLUGIN_PATH=${CMAKE_INSTALL_PREFIX}/skins) + +target_include_directories(${TARGET_NAME} + PUBLIC + ${CMAKE_CURRENT_LIST_DIR}) + +if(ENABLE_ENSURE_SKINS) + target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/skins) + target_compile_definitions(${TARGET_NAME} PRIVATE ENSURE_SKINS) + + target_link_libraries(${TARGET_NAME} + PRIVATE + squiekskin + material3skin) +endif() + +install(TARGETS ${TARGET_NAME} DESTINATION ${QSK_INSTALL_LIBS}) \ No newline at end of file diff --git a/support/fonts.conf.cmake.in b/support/fonts.conf.cmake.in new file mode 100644 index 00000000..501a1fa0 --- /dev/null +++ b/support/fonts.conf.cmake.in @@ -0,0 +1,6 @@ + + + + @QSK_FONTDIR@ + @QSK_FONTCACHEDIR@/cache + diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 00000000..74da26cc --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,3 @@ +if(TARGET Qt::Svg) + add_subdirectory(svg2qvg) +endif() \ No newline at end of file diff --git a/tools/svg2qvg/CMakeLists.txt b/tools/svg2qvg/CMakeLists.txt new file mode 100644 index 00000000..30f3bc04 --- /dev/null +++ b/tools/svg2qvg/CMakeLists.txt @@ -0,0 +1,53 @@ +set(TARGET_NAME svg2qvg) +set(TARGET_SOURCES main.cpp) + +qt_add_executable(${TARGET_NAME} ${TARGET_SOURCES}) + +if(BUILD_SVG2QVG_STANDALONE) + + # NOTE: when building standalone some moc files are transitively required. + # These files are being created by the qskinny build, hence we add an explicit dependency. + # E.g. main.cpp -> #include -> #include "moc_QskGraphic.cpp" + add_dependencies(${TARGET_NAME} qskinny) + + # TODO hack for standalone qvg2svg + get_target_property(qskinny_AUTOGEN_DIR qskinny AUTOGEN_BUILD_DIR) + if (${qskinny_AUTOGEN_DIR} STREQUAL "") + message(FATAL_ERROR "Directory '${qskinny_AUTOGEN_DIR}' doesn't exist") + endif() + + # TODO fix multi configuration generators + if(CMAKE_GENERATOR MATCHES "Visual Studio.*") + add_definitions("/I${qskinny_AUTOGEN_DIR}/include_\$(Configuration)") + else() + target_include_directories(${TARGET_NAME} + PRIVATE + ${qskinny_AUTOGEN_DIR}/include) + endif() + + target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/graphic) + + target_compile_definitions(${TARGET_NAME} + PRIVATE + QSK_STANDALONE) + + target_link_libraries(${TARGET_NAME} + PRIVATE + Qt::Gui + Qt::GuiPrivate + Qt::Svg) +else() + target_link_libraries(${TARGET_NAME} + PRIVATE + qskinny + Qt::Svg) +endif() + +set_target_properties(${TARGET_NAME} + PROPERTIES + FOLDER tools) + +install(TARGETS ${TARGET_NAME})