mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 04:50:06 +00:00 
			
		
		
		
	
						commit
						a81d6f340d
					
				
					 35 changed files with 535 additions and 81 deletions
				
			
		
							
								
								
									
										1
									
								
								.clang-format-ignore
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.clang-format-ignore
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | CMakePresets.json | ||||||
							
								
								
									
										65
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -26,6 +26,8 @@ jobs: | ||||||
|             env_cc: '' |             env_cc: '' | ||||||
|             env_cxx: '' |             env_cxx: '' | ||||||
|             compiler: msvc |             compiler: msvc | ||||||
|  |             cppflags: '' | ||||||
|  |             ldflags: '' | ||||||
|             msvc_arch: x64 |             msvc_arch: x64 | ||||||
|             msvc_version: 2022 |             msvc_version: 2022 | ||||||
|             qt_version: 6.8.3 |             qt_version: 6.8.3 | ||||||
|  | @ -43,6 +45,8 @@ jobs: | ||||||
|             env_cc: gcc-11 |             env_cc: gcc-11 | ||||||
|             env_cxx: g++-11 |             env_cxx: g++-11 | ||||||
|             compiler: gcc |             compiler: gcc | ||||||
|  |             cppflags: '' | ||||||
|  |             ldflags: '' | ||||||
|             qt_version: 6.8.3 |             qt_version: 6.8.3 | ||||||
|             qt_arch_aqt: linux_gcc_64 |             qt_arch_aqt: linux_gcc_64 | ||||||
|             qt_arch_dir: gcc_64 |             qt_arch_dir: gcc_64 | ||||||
|  | @ -59,6 +63,8 @@ jobs: | ||||||
|             env_cc: clang-17 |             env_cc: clang-17 | ||||||
|             env_cxx: clang++-17 |             env_cxx: clang++-17 | ||||||
|             compiler: clang |             compiler: clang | ||||||
|  |             cppflags: '' | ||||||
|  |             ldflags: '' | ||||||
|             qt_version: 6.8.3 |             qt_version: 6.8.3 | ||||||
|             qt_arch_aqt: linux_gcc_64 |             qt_arch_aqt: linux_gcc_64 | ||||||
|             qt_arch_dir: gcc_64 |             qt_arch_dir: gcc_64 | ||||||
|  | @ -75,6 +81,8 @@ jobs: | ||||||
|             env_cc: gcc-11 |             env_cc: gcc-11 | ||||||
|             env_cxx: g++-11 |             env_cxx: g++-11 | ||||||
|             compiler: gcc |             compiler: gcc | ||||||
|  |             cppflags: '' | ||||||
|  |             ldflags: '' | ||||||
|             qt_version: 6.8.3 |             qt_version: 6.8.3 | ||||||
|             qt_arch_aqt: linux_gcc_arm64 |             qt_arch_aqt: linux_gcc_arm64 | ||||||
|             qt_arch_dir: gcc_arm64 |             qt_arch_dir: gcc_arm64 | ||||||
|  | @ -85,6 +93,36 @@ jobs: | ||||||
|             appimage_arch: aarch64 |             appimage_arch: aarch64 | ||||||
|             artifact_suffix: linux-arm64 |             artifact_suffix: linux-arm64 | ||||||
|             compiler_packages: g++-11 |             compiler_packages: g++-11 | ||||||
|  |           - name: macos_clang18_x64 | ||||||
|  |             os: macos-13 | ||||||
|  |             build_type: Release | ||||||
|  |             env_cc: clang | ||||||
|  |             env_cxx: clang++ | ||||||
|  |             compiler: clang | ||||||
|  |             qt_version: 6.8.3 | ||||||
|  |             qt_arch_aqt: clang_64 | ||||||
|  |             qt_arch_dir: macos | ||||||
|  |             qt_modules: qtimageformats qtmultimedia qtpositioning qtserialport | ||||||
|  |             qt_tools: '' | ||||||
|  |             conan_package_manager: '' | ||||||
|  |             conan_profile: scwx-macos_clang-18 | ||||||
|  |             appimage_arch: '' | ||||||
|  |             artifact_suffix: macos-x64 | ||||||
|  |           - name: macos_clang18_arm64 | ||||||
|  |             os: macos-15 | ||||||
|  |             build_type: Release | ||||||
|  |             env_cc: clang | ||||||
|  |             env_cxx: clang++ | ||||||
|  |             compiler: clang | ||||||
|  |             qt_version: 6.8.3 | ||||||
|  |             qt_arch_aqt: clang_64 | ||||||
|  |             qt_arch_dir: macos | ||||||
|  |             qt_modules: qtimageformats qtmultimedia qtpositioning qtserialport | ||||||
|  |             qt_tools: '' | ||||||
|  |             conan_package_manager: '' | ||||||
|  |             conan_profile: scwx-macos_clang-18_armv8 | ||||||
|  |             appimage_arch: '' | ||||||
|  |             artifact_suffix: macos-arm64 | ||||||
|     name: ${{ matrix.name }} |     name: ${{ matrix.name }} | ||||||
|     env: |     env: | ||||||
|       CC: ${{ matrix.env_cc }} |       CC: ${{ matrix.env_cc }} | ||||||
|  | @ -133,6 +171,17 @@ jobs: | ||||||
|                              flatpak-builder \ |                              flatpak-builder \ | ||||||
|                              ${{ matrix.compiler_packages }} |                              ${{ matrix.compiler_packages }} | ||||||
| 
 | 
 | ||||||
|  |     - name: Setup macOS Environment | ||||||
|  |       if: ${{ startsWith(matrix.os, 'macos') }} | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         brew install llvm@18 | ||||||
|  |         LLVM_PATH=$(brew --prefix llvm@18) | ||||||
|  |         echo "CC=${LLVM_PATH}/bin/clang" >> $GITHUB_ENV | ||||||
|  |         echo "CXX=${LLVM_PATH}/bin/clang++" >> $GITHUB_ENV | ||||||
|  |         echo "CPPFLAGS=-I${LLVM_PATH}/include" >> $GITHUB_ENV | ||||||
|  |         echo "LDFLAGS=-L${LLVM_PATH}/lib -L${LLVM_PATH}/lib/c++" >> $GITHUB_ENV | ||||||
|  | 
 | ||||||
|     - name: Setup Python Environment |     - name: Setup Python Environment | ||||||
|       shell: pwsh |       shell: pwsh | ||||||
|       run: | |       run: | | ||||||
|  | @ -325,12 +374,26 @@ jobs: | ||||||
|         name: supercell-wx-flatpak-${{ matrix.artifact_suffix }} |         name: supercell-wx-flatpak-${{ matrix.artifact_suffix }} | ||||||
|         path: ${{ github.workspace }}/supercell-wx.flatpak |         path: ${{ github.workspace }}/supercell-wx.flatpak | ||||||
| 
 | 
 | ||||||
|  |     - name: Build Disk Image (macOS) | ||||||
|  |       if: ${{ startsWith(matrix.os, 'macos') }} | ||||||
|  |       shell: pwsh | ||||||
|  |       run: | | ||||||
|  |         cd build | ||||||
|  |         cpack | ||||||
|  | 
 | ||||||
|  |     - name: Upload Disk Image (macOS) | ||||||
|  |       if: ${{ startsWith(matrix.os, 'macos') }} | ||||||
|  |       uses: actions/upload-artifact@v4 | ||||||
|  |       with: | ||||||
|  |         name: supercell-wx-${{ matrix.artifact_suffix }} | ||||||
|  |         path: ${{ github.workspace }}/build/supercell-wx-*.dmg* | ||||||
|  | 
 | ||||||
|     - name: Test Supercell Wx |     - name: Test Supercell Wx | ||||||
|       working-directory: ${{ github.workspace }}/build |       working-directory: ${{ github.workspace }}/build | ||||||
|       env: |       env: | ||||||
|         MAPBOX_API_KEY:   ${{ secrets.MAPBOX_API_KEY }} |         MAPBOX_API_KEY:   ${{ secrets.MAPBOX_API_KEY }} | ||||||
|         MAPTILER_API_KEY: ${{ secrets.MAPTILER_API_KEY }} |         MAPTILER_API_KEY: ${{ secrets.MAPTILER_API_KEY }} | ||||||
|       run: ctest -C ${{ matrix.build_type }} --exclude-regex test_mln.* |       run: ctest -C ${{ matrix.build_type }} --exclude-regex "test_mln.*|UpdateManager.*" | ||||||
| 
 | 
 | ||||||
|     - name: Upload Test Logs |     - name: Upload Test Logs | ||||||
|       if: ${{ !cancelled() }} |       if: ${{ !cancelled() }} | ||||||
|  |  | ||||||
|  | @ -3,6 +3,8 @@ set(PROJECT_NAME supercell-wx) | ||||||
| 
 | 
 | ||||||
| include(tools/scwx_config.cmake) | include(tools/scwx_config.cmake) | ||||||
| 
 | 
 | ||||||
|  | set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0) | ||||||
|  | 
 | ||||||
| scwx_python_setup() | scwx_python_setup() | ||||||
| 
 | 
 | ||||||
| project(${PROJECT_NAME} | project(${PROJECT_NAME} | ||||||
|  |  | ||||||
|  | @ -210,6 +210,88 @@ | ||||||
|         "CC": "gcc-11", |         "CC": "gcc-11", | ||||||
|         "CXX": "g++-11" |         "CXX": "g++-11" | ||||||
|       } |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-base", | ||||||
|  |       "inherits": "base", | ||||||
|  |       "hidden": true, | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CMAKE_PREFIX_PATH": "$env{HOME}/Qt/6.8.3/macos" | ||||||
|  |       }, | ||||||
|  |       "condition": { | ||||||
|  |         "type": "equals", | ||||||
|  |         "lhs": "${hostSystemName}", | ||||||
|  |         "rhs": "Darwin" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-base", | ||||||
|  |       "inherits": "macos-base", | ||||||
|  |       "hidden": true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-x64-base", | ||||||
|  |       "inherits": "macos-clang18-base", | ||||||
|  |       "hidden": true, | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CONAN_HOST_PROFILE": "scwx-macos_clang-18", | ||||||
|  |         "CONAN_BUILD_PROFILE": "scwx-macos_clang-18" | ||||||
|  |       }, | ||||||
|  |       "environment": { | ||||||
|  |         "CC": "/usr/local/opt/llvm@18/bin/clang", | ||||||
|  |         "CXX": "/usr/local/opt/llvm@18/bin/clang++", | ||||||
|  |         "PATH": "/usr/local/opt/llvm@18/bin:$penv{PATH}", | ||||||
|  |         "CPPFLAGS": "-I/usr/local/opt/llvm@18/include", | ||||||
|  |         "LDFLAGS": "-L/usr/local/opt/llvm@18/lib -L/usr/local/opt/llvm@18/lib/c++" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-arm64-base", | ||||||
|  |       "inherits": "macos-clang18-base", | ||||||
|  |       "hidden": true, | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CONAN_HOST_PROFILE": "scwx-macos_clang-18_armv8", | ||||||
|  |         "CONAN_BUILD_PROFILE": "scwx-macos_clang-18_armv8" | ||||||
|  |       }, | ||||||
|  |       "environment": { | ||||||
|  |         "CC": "/opt/homebrew/opt/llvm@18/bin/clang", | ||||||
|  |         "CXX": "/opt/homebrew/opt/llvm@18/bin/clang++", | ||||||
|  |         "PATH": "/opt/homebrew/opt/llvm@18/bin:$penv{PATH}", | ||||||
|  |         "CPPFLAGS": "-I/opt/homebrew/opt/llvm@18/include", | ||||||
|  |         "LDFLAGS": "-L/opt/homebrew/opt/llvm@18/lib -L/opt/homebrew/opt/llvm@18/lib/c++" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-x64-debug", | ||||||
|  |       "inherits": "macos-clang18-x64-base", | ||||||
|  |       "displayName": "macOS Clang 18 x64 Debug", | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CMAKE_BUILD_TYPE": "Debug" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-x64-release", | ||||||
|  |       "inherits": "macos-clang18-x64-base", | ||||||
|  |       "displayName": "macOS Clang 18 x64 Release", | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CMAKE_BUILD_TYPE": "Release" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-arm64-debug", | ||||||
|  |       "inherits": "macos-clang18-arm64-base", | ||||||
|  |       "displayName": "macOS Clang 18 Arm64 Debug", | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CMAKE_BUILD_TYPE": "Debug" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-arm64-release", | ||||||
|  |       "inherits": "macos-clang18-arm64-base", | ||||||
|  |       "displayName": "macOS Clang 18 Arm64 Release", | ||||||
|  |       "cacheVariables": { | ||||||
|  |         "CMAKE_BUILD_TYPE": "Release" | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "buildPresets": [ |   "buildPresets": [ | ||||||
|  | @ -236,6 +318,30 @@ | ||||||
|       "configurePreset": "linux-gcc-release", |       "configurePreset": "linux-gcc-release", | ||||||
|       "displayName": "Linux GCC Release", |       "displayName": "Linux GCC Release", | ||||||
|       "configuration": "Release" |       "configuration": "Release" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-x64-debug", | ||||||
|  |       "configurePreset": "macos-clang18-x64-debug", | ||||||
|  |       "displayName": "macOS Clang 18 x64 Debug", | ||||||
|  |       "configuration": "Debug" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-x64-release", | ||||||
|  |       "configurePreset": "macos-clang18-x64-release", | ||||||
|  |       "displayName": "macOS Clang 18 x64 Release", | ||||||
|  |       "configuration": "Release" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-arm64-debug", | ||||||
|  |       "configurePreset": "macos-clang18-arm64-debug", | ||||||
|  |       "displayName": "macOS Clang 18 Arm64 Debug", | ||||||
|  |       "configuration": "Debug" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "macos-clang18-arm64-release", | ||||||
|  |       "configurePreset": "macos-clang18-arm64-release", | ||||||
|  |       "displayName": "macOS Clang 18 Arm64 Release", | ||||||
|  |       "configuration": "Release" | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "testPresets": [ |   "testPresets": [ | ||||||
|  |  | ||||||
|  | @ -28,12 +28,13 @@ Supercell Wx supports the following 64-bit operating systems: | ||||||
|   - Ubuntu 22.04+ |   - Ubuntu 22.04+ | ||||||
|   - NixOS 25.05+ |   - NixOS 25.05+ | ||||||
|   - Most distributions supporting the GCC Standard C++ Library 11+ |   - Most distributions supporting the GCC Standard C++ Library 11+ | ||||||
|  | - macOS 12 (Monterey) or later | ||||||
| 
 | 
 | ||||||
| ## Linux Dependencies | ## Linux Dependencies | ||||||
| 
 | 
 | ||||||
| Supercell Wx requires the following Linux dependencies: | Supercell Wx requires the following Linux dependencies: | ||||||
| 
 | 
 | ||||||
| - Linux/X11 (Wayland works too) with support for GCC 11 and OpenGL 3.3 | - Linux/X11 (Wayland works too) with support for GCC 11, OpenGL 3.3 and OpenGL ES 3.0 | ||||||
| - X11/XCB libraries including xcb-cursor | - X11/XCB libraries including xcb-cursor | ||||||
| 
 | 
 | ||||||
| ## FAQ | ## FAQ | ||||||
|  |  | ||||||
|  | @ -35,10 +35,16 @@ class SupercellWxConan(ConanFile): | ||||||
|             self.options["openssl"].shared    = True |             self.options["openssl"].shared    = True | ||||||
|             self.options["libcurl"].ca_bundle = "none" |             self.options["libcurl"].ca_bundle = "none" | ||||||
|             self.options["libcurl"].ca_path   = "none" |             self.options["libcurl"].ca_path   = "none" | ||||||
|  |         elif self.settings.os == "Macos": | ||||||
|  |             self.options["openssl"].shared    = True | ||||||
|  |             self.options["libcurl"].ca_bundle = "none" | ||||||
|  |             self.options["libcurl"].ca_path   = "none" | ||||||
| 
 | 
 | ||||||
|     def requirements(self): |     def requirements(self): | ||||||
|         if self.settings.os == "Linux": |         if self.settings.os == "Linux": | ||||||
|             self.requires("onetbb/2022.0.0") |             self.requires("onetbb/2022.0.0") | ||||||
|  |         elif self.settings.os == "Macos": | ||||||
|  |             self.requires("onetbb/2022.0.0") | ||||||
| 
 | 
 | ||||||
|     def generate(self): |     def generate(self): | ||||||
|         build_folder = os.path.join(self.build_folder, |         build_folder = os.path.join(self.build_folder, | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								external/maplibre-native
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								external/maplibre-native
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +1 @@ | ||||||
| Subproject commit 554e6e9ac46b6eaf5970a219c88e3df11f1cee30 | Subproject commit 3654f5fa9f06534d7fd2d95b810049a82e5953ef | ||||||
							
								
								
									
										6
									
								
								external/maplibre-native-qt.cmake
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								external/maplibre-native-qt.cmake
									
										
									
									
										vendored
									
									
								
							|  | @ -35,6 +35,12 @@ else() | ||||||
|     target_compile_options(MLNQtCore PRIVATE "$<$<CONFIG:Release>:-g>") |     target_compile_options(MLNQtCore PRIVATE "$<$<CONFIG:Release>:-g>") | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | if (APPLE) | ||||||
|  |     # Enable GL check error debug | ||||||
|  |     target_compile_definitions(mbgl-core PRIVATE MLN_GL_CHECK_ERRORS=1) | ||||||
|  |     target_compile_definitions(MLNQtCore PRIVATE MLN_GL_CHECK_ERRORS=1) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| set(MLN_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/maplibre-native/include | set(MLN_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/maplibre-native/include | ||||||
|                      ${CMAKE_CURRENT_SOURCE_DIR}/maplibre-native-qt/src/core/include |                      ${CMAKE_CURRENT_SOURCE_DIR}/maplibre-native-qt/src/core/include | ||||||
|                      ${CMAKE_CURRENT_BINARY_DIR}/maplibre-native-qt/src/core/include PARENT_SCOPE) |                      ${CMAKE_CURRENT_BINARY_DIR}/maplibre-native-qt/src/core/include PARENT_SCOPE) | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								scwx-qt/res/icons/scwx.icns
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								scwx-qt/res/icons/scwx.icns
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										42
									
								
								scwx-qt/res/scwx-qt.plist.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								scwx-qt/res/scwx-qt.plist.in
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||||
|  | <plist version="1.0"> | ||||||
|  | <dict> | ||||||
|  | 	<key>CFBundleInfoDictionaryVersion</key> | ||||||
|  | 	<string>6.0</string> | ||||||
|  | 	<key>CFBundlePackageType</key> | ||||||
|  | 	<string>APPL</string> | ||||||
|  | 
 | ||||||
|  | 	<key>CFBundleName</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> | ||||||
|  | 	<key>CFBundleIdentifier</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> | ||||||
|  | 	<key>CFBundleExecutable</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> | ||||||
|  | 
 | ||||||
|  | 	<key>CFBundleVersion</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> | ||||||
|  | 	<key>CFBundleShortVersionString</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> | ||||||
|  | 
 | ||||||
|  | 	<key>LSMinimumSystemVersion</key> | ||||||
|  | 	<string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string> | ||||||
|  | 
 | ||||||
|  | 	<key>NSHumanReadableCopyright</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_COPYRIGHT}</string> | ||||||
|  | 
 | ||||||
|  | 	<key>CFBundleIconFile</key> | ||||||
|  | 	<string>${MACOSX_BUNDLE_ICON_FILE}</string> | ||||||
|  | 
 | ||||||
|  | 	<key>CFBundleDevelopmentRegion</key> | ||||||
|  | 	<string>en</string> | ||||||
|  | 	<key>CFBundleAllowMixedLocalizations</key> | ||||||
|  | 	<true/> | ||||||
|  | 
 | ||||||
|  | 	<key>NSPrincipalClass</key> | ||||||
|  | 	<string>NSApplication</string> | ||||||
|  | 
 | ||||||
|  | 	<key>NSSupportsAutomaticGraphicsSwitching</key> | ||||||
|  | 	<true/> | ||||||
|  | </dict> | ||||||
|  | </plist> | ||||||
|  | @ -626,6 +626,26 @@ if (WIN32) | ||||||
|     if (SCWX_DISABLE_CONSOLE) |     if (SCWX_DISABLE_CONSOLE) | ||||||
|         set_target_properties(supercell-wx PROPERTIES WIN32_EXECUTABLE $<IF:$<CONFIG:Release>,TRUE,FALSE>) |         set_target_properties(supercell-wx PROPERTIES WIN32_EXECUTABLE $<IF:$<CONFIG:Release>,TRUE,FALSE>) | ||||||
|     endif() |     endif() | ||||||
|  | elseif (APPLE) | ||||||
|  |     set(SCWX_ICON "${scwx-qt_SOURCE_DIR}/res/icons/scwx.icns") | ||||||
|  | 
 | ||||||
|  |     set_source_files_properties(${SCWX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") | ||||||
|  | 
 | ||||||
|  |     qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES} ${SCWX_ICON}) | ||||||
|  | 
 | ||||||
|  |     string(TIMESTAMP CURRENT_YEAR "%Y") | ||||||
|  | 
 | ||||||
|  |     set_target_properties(supercell-wx PROPERTIES | ||||||
|  |                           MACOSX_BUNDLE                      TRUE | ||||||
|  |                           MACOSX_BUNDLE_INFO_PLIST           "${scwx-qt_SOURCE_DIR}/res/scwx-qt.plist.in" | ||||||
|  |                           MACOSX_BUNDLE_GUI_IDENTIFIER       "net.supercellwx.app" | ||||||
|  |                           MACOSX_BUNDLE_BUNDLE_NAME          "Supercell Wx" | ||||||
|  |                           MACOSX_BUNDLE_BUNDLE_VERSION       "${SCWX_VERSION}" | ||||||
|  |                           MACOSX_BUNDLE_SHORT_VERSION_STRING "${SCWX_VERSION}" | ||||||
|  |                           MACOSX_BUNDLE_COPYRIGHT            "Copyright ${CURRENT_YEAR} Dan Paulat" | ||||||
|  |                           MACOSX_BUNDLE_ICON_FILE            "scwx.icns" | ||||||
|  |                           MACOSX_BUNDLE_INFO_STRING          "Free and open source advanced weather radar" | ||||||
|  |                           RESOURCE                           ${SCWX_ICON}) | ||||||
| else() | else() | ||||||
|     qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES}) |     qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES}) | ||||||
| endif() | endif() | ||||||
|  | @ -635,7 +655,7 @@ if (WIN32) | ||||||
|     target_compile_definitions(supercell-wx PUBLIC WIN32_LEAN_AND_MEAN) |     target_compile_definitions(supercell-wx PUBLIC WIN32_LEAN_AND_MEAN) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| if (NOT MSVC) | if (LINUX) | ||||||
|     # Qt emit keyword is incompatible with TBB |     # Qt emit keyword is incompatible with TBB | ||||||
|     target_compile_definitions(scwx-qt      PRIVATE QT_NO_EMIT) |     target_compile_definitions(scwx-qt      PRIVATE QT_NO_EMIT) | ||||||
|     target_compile_definitions(supercell-wx PRIVATE QT_NO_EMIT) |     target_compile_definitions(supercell-wx PRIVATE QT_NO_EMIT) | ||||||
|  | @ -694,7 +714,9 @@ if (MSVC) | ||||||
| else() | else() | ||||||
|     target_compile_options(scwx-qt PRIVATE "$<$<CONFIG:Release>:-g>") |     target_compile_options(scwx-qt PRIVATE "$<$<CONFIG:Release>:-g>") | ||||||
|     target_compile_options(supercell-wx PRIVATE "$<$<CONFIG:Release>:-g>") |     target_compile_options(supercell-wx PRIVATE "$<$<CONFIG:Release>:-g>") | ||||||
|  | endif() | ||||||
| 
 | 
 | ||||||
|  | if (LINUX) | ||||||
|     # Add wayland client packages |     # Add wayland client packages | ||||||
|     find_package(QT NAMES Qt6 |     find_package(QT NAMES Qt6 | ||||||
|                  COMPONENTS WaylandClient |                  COMPONENTS WaylandClient | ||||||
|  | @ -733,9 +755,11 @@ target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::Widgets | ||||||
| target_link_libraries(supercell-wx PRIVATE scwx-qt | target_link_libraries(supercell-wx PRIVATE scwx-qt | ||||||
|                                            wxdata) |                                            wxdata) | ||||||
| 
 | 
 | ||||||
| # Set DT_RUNPATH for Linux targets | if (LINUX) | ||||||
| set_target_properties(MLNQtCore    PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") # QMapLibre::Core |     # Set DT_RUNPATH for Linux targets | ||||||
| set_target_properties(supercell-wx PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") |     set_target_properties(MLNQtCore    PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") # QMapLibre::Core | ||||||
|  |     set_target_properties(supercell-wx PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") | ||||||
|  | endif() | ||||||
| 
 | 
 | ||||||
| install(TARGETS supercell-wx | install(TARGETS supercell-wx | ||||||
|                 MLNQtCore # QMapLibre::Core |                 MLNQtCore # QMapLibre::Core | ||||||
|  | @ -745,7 +769,15 @@ install(TARGETS supercell-wx | ||||||
|                                "^(/usr)?/lib/.*\\.so(\\..*)?" |                                "^(/usr)?/lib/.*\\.so(\\..*)?" | ||||||
|         RUNTIME |         RUNTIME | ||||||
|           COMPONENT supercell-wx |           COMPONENT supercell-wx | ||||||
|  |         BUNDLE | ||||||
|  |           DESTINATION . | ||||||
|  |           COMPONENT supercell-wx | ||||||
|  |           OPTIONAL | ||||||
|         LIBRARY |         LIBRARY | ||||||
|  |           COMPONENT supercell-wx | ||||||
|  |           OPTIONAL | ||||||
|  |         FRAMEWORK | ||||||
|  |           DESTINATION Frameworks | ||||||
|           COMPONENT supercell-wx |           COMPONENT supercell-wx | ||||||
|           OPTIONAL) |           OPTIONAL) | ||||||
| 
 | 
 | ||||||
|  | @ -767,14 +799,64 @@ install(SCRIPT ${deploy_script_qmaplibre_core} | ||||||
| install(SCRIPT ${deploy_script_scwx} | install(SCRIPT ${deploy_script_scwx} | ||||||
|         COMPONENT supercell-wx) |         COMPONENT supercell-wx) | ||||||
| 
 | 
 | ||||||
|  | if (APPLE) | ||||||
|  |     # Install additional script to fix up the bundle | ||||||
|  |     install(CODE [[ | ||||||
|  |             include (BundleUtilities) | ||||||
|  | 
 | ||||||
|  |             # Define the bundle path | ||||||
|  |             set(BUNDLE_PATH "${CMAKE_INSTALL_PREFIX}/supercell-wx.app") | ||||||
|  | 
 | ||||||
|  |             file(GLOB_RECURSE PLUGIN_DYLIBS "${BUNDLE_PATH}/Contents/PlugIns/**/*.dylib") | ||||||
|  | 
 | ||||||
|  |             # Add the correct rpath for plugins to find bundled frameworks | ||||||
|  |             foreach(PLUGIN_DYLIB ${PLUGIN_DYLIBS}) | ||||||
|  |                 execute_process( | ||||||
|  |                     COMMAND install_name_tool -add_rpath "@loader_path/../../Frameworks" | ||||||
|  |                     ${PLUGIN_DYLIB} | ||||||
|  |                     ) | ||||||
|  |             endforeach() | ||||||
|  | 
 | ||||||
|  |             # Fix up the bundle with all dependencies | ||||||
|  |             fixup_bundle( | ||||||
|  |                 "${BUNDLE_PATH}" | ||||||
|  |                 "" | ||||||
|  |                 "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_PREFIX}/Frameworks" | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  |             # Re-sign the bundle | ||||||
|  |             execute_process( | ||||||
|  |                 COMMAND codesign --force --deep --sign - "${BUNDLE_PATH}" | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  |             # Verify the bundle | ||||||
|  |             verify_app("${BUNDLE_PATH}") | ||||||
|  | 
 | ||||||
|  |             # Rename to "Supercell Wx.app" | ||||||
|  |             file(REMOVE_RECURSE | ||||||
|  |                  "${CMAKE_INSTALL_PREFIX}/Supercell Wx.app") | ||||||
|  |             file(RENAME | ||||||
|  |                  "${BUNDLE_PATH}" | ||||||
|  |                  "${CMAKE_INSTALL_PREFIX}/Supercell Wx.app") | ||||||
|  | 
 | ||||||
|  |             # Remove extra directories | ||||||
|  |             file(REMOVE_RECURSE | ||||||
|  |                  "${CMAKE_INSTALL_PREFIX}/Frameworks") | ||||||
|  |             file(REMOVE_RECURSE | ||||||
|  |                  "${CMAKE_INSTALL_PREFIX}/lib") | ||||||
|  |             ]] | ||||||
|  |             COMPONENT supercell-wx) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | set(CPACK_PACKAGE_NAME          "Supercell Wx") | ||||||
|  | set(CPACK_PACKAGE_VENDOR        "Dan Paulat") | ||||||
|  | set(CPACK_PACKAGE_CHECKSUM      SHA256) | ||||||
|  | set(CPACK_RESOURCE_FILE_LICENSE "${SCWX_DIR}/LICENSE.txt") | ||||||
|  | 
 | ||||||
| if (MSVC) | if (MSVC) | ||||||
|     set(CPACK_PACKAGE_NAME                "Supercell Wx") |  | ||||||
|     set(CPACK_PACKAGE_VENDOR              "Dan Paulat") |  | ||||||
|     set(CPACK_PACKAGE_FILE_NAME           "supercell-wx-v${SCWX_VERSION}-windows-x64") |     set(CPACK_PACKAGE_FILE_NAME           "supercell-wx-v${SCWX_VERSION}-windows-x64") | ||||||
|     set(CPACK_PACKAGE_INSTALL_DIRECTORY   "Supercell Wx") |     set(CPACK_PACKAGE_INSTALL_DIRECTORY   "Supercell Wx") | ||||||
|     set(CPACK_PACKAGE_ICON                "${CMAKE_CURRENT_SOURCE_DIR}/res/icons/scwx-256.ico") |     set(CPACK_PACKAGE_ICON                "${CMAKE_CURRENT_SOURCE_DIR}/res/icons/scwx-256.ico") | ||||||
|     set(CPACK_PACKAGE_CHECKSUM            SHA256) |  | ||||||
|     set(CPACK_RESOURCE_FILE_LICENSE       "${SCWX_DIR}/LICENSE.txt") |  | ||||||
|     set(CPACK_GENERATOR                   WIX) |     set(CPACK_GENERATOR                   WIX) | ||||||
|     set(CPACK_PACKAGE_EXECUTABLES         "supercell-wx;Supercell Wx") |     set(CPACK_PACKAGE_EXECUTABLES         "supercell-wx;Supercell Wx") | ||||||
|     set(CPACK_WIX_UPGRADE_GUID            36AD0F51-4D4F-4B5D-AB61-94C6B4E4FE1C) |     set(CPACK_WIX_UPGRADE_GUID            36AD0F51-4D4F-4B5D-AB61-94C6B4E4FE1C) | ||||||
|  | @ -786,5 +868,15 @@ if (MSVC) | ||||||
|     set(CPACK_INSTALL_CMAKE_PROJECTS |     set(CPACK_INSTALL_CMAKE_PROJECTS | ||||||
|         "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_PROJECT_NAME};supercell-wx;/") |         "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_PROJECT_NAME};supercell-wx;/") | ||||||
| 
 | 
 | ||||||
|  |     include(CPack) | ||||||
|  | elseif(APPLE) | ||||||
|  |     set(CPACK_PACKAGE_FILE_NAME   "supercell-wx-v${SCWX_VERSION}-macos") | ||||||
|  |     set(CPACK_PACKAGE_ICON        "${SCWX_ICON}") | ||||||
|  |     set(CPACK_PACKAGE_VERSION     "${SCWX_VERSION}") | ||||||
|  | 
 | ||||||
|  |     set(CPACK_GENERATOR DragNDrop) | ||||||
|  | 
 | ||||||
|  |     set(CPACK_COMPONENTS_ALL supercell-wx) | ||||||
|  | 
 | ||||||
|     include(CPack) |     include(CPack) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  | @ -740,7 +740,7 @@ bool Icons::RunMousePicking( | ||||||
| 
 | 
 | ||||||
|    // For each pickable icon
 |    // For each pickable icon
 | ||||||
|    auto it = std::find_if( //
 |    auto it = std::find_if( //
 | ||||||
|       std::execution::par_unseq, |       std::execution::par, | ||||||
|       p->currentHoverIcons_.crbegin(), |       p->currentHoverIcons_.crbegin(), | ||||||
|       p->currentHoverIcons_.crend(), |       p->currentHoverIcons_.crend(), | ||||||
|       [&mouseLocalCoords](const auto& icon) |       [&mouseLocalCoords](const auto& icon) | ||||||
|  |  | ||||||
|  | @ -4,10 +4,15 @@ | ||||||
| 
 | 
 | ||||||
| #include <mutex> | #include <mutex> | ||||||
| 
 | 
 | ||||||
| #include <GL/glu.h> |  | ||||||
| #include <boost/container/stable_vector.hpp> | #include <boost/container/stable_vector.hpp> | ||||||
| 
 | 
 | ||||||
| #if defined(_WIN32) | #if !defined(__APPLE__) | ||||||
|  | #   include <GL/glu.h> | ||||||
|  | #else | ||||||
|  | #   include <OpenGL/glu.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(_WIN32) || defined(__APPLE__) | ||||||
| typedef void (*_GLUfuncptr)(void); | typedef void (*_GLUfuncptr)(void); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ namespace gl | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| static const std::string logPrefix_ = "scwx::qt::gl::gl_context"; | static const std::string logPrefix_ = "scwx::qt::gl::gl_context"; | ||||||
|  | static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||||
| 
 | 
 | ||||||
| class GlContext::Impl | class GlContext::Impl | ||||||
| { | { | ||||||
|  | @ -84,6 +85,13 @@ void GlContext::Impl::InitializeGL() | ||||||
|    gl_->initializeOpenGLFunctions(); |    gl_->initializeOpenGLFunctions(); | ||||||
|    gl30_->initializeOpenGLFunctions(); |    gl30_->initializeOpenGLFunctions(); | ||||||
| 
 | 
 | ||||||
|  |    logger_->info("OpenGL Version: {}", | ||||||
|  |                  reinterpret_cast<const char*>(gl_->glGetString(GL_VERSION))); | ||||||
|  |    logger_->info("OpenGL Vendor: {}", | ||||||
|  |                  reinterpret_cast<const char*>(gl_->glGetString(GL_VENDOR))); | ||||||
|  |    logger_->info("OpenGL Renderer: {}", | ||||||
|  |                  reinterpret_cast<const char*>(gl_->glGetString(GL_RENDERER))); | ||||||
|  | 
 | ||||||
|    gl_->glGenTextures(1, &textureAtlas_); |    gl_->glGenTextures(1, &textureAtlas_); | ||||||
| 
 | 
 | ||||||
|    glInitialized_ = true; |    glInitialized_ = true; | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ | ||||||
| #include <QApplication> | #include <QApplication> | ||||||
| #include <QStandardPaths> | #include <QStandardPaths> | ||||||
| #include <QStyleHints> | #include <QStyleHints> | ||||||
|  | #include <QSurfaceFormat> | ||||||
| #include <QTranslator> | #include <QTranslator> | ||||||
| #include <QPalette> | #include <QPalette> | ||||||
| #include <QStyle> | #include <QStyle> | ||||||
|  | @ -62,6 +63,16 @@ int main(int argc, char* argv[]) | ||||||
| 
 | 
 | ||||||
|    QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); |    QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); | ||||||
| 
 | 
 | ||||||
|  | #if defined(__APPLE__) | ||||||
|  |    // For macOS, we must choose between OpenGL 4.1 Core and OpenGL 2.1
 | ||||||
|  |    // Compatibility. OpenGL 2.1 does not meet requirements for shaders used by
 | ||||||
|  |    // Supercell Wx.
 | ||||||
|  |    QSurfaceFormat surfaceFormat = QSurfaceFormat::defaultFormat(); | ||||||
|  |    surfaceFormat.setVersion(4, 1); | ||||||
|  |    surfaceFormat.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile); | ||||||
|  |    QSurfaceFormat::setDefaultFormat(surfaceFormat); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|    QApplication a(argc, argv); |    QApplication a(argc, argv); | ||||||
| 
 | 
 | ||||||
|    QCoreApplication::setApplicationName("Supercell Wx"); |    QCoreApplication::setApplicationName("Supercell Wx"); | ||||||
|  |  | ||||||
|  | @ -175,7 +175,7 @@ public: | ||||||
|       level2ChunksProviderManager_->Disable(); |       level2ChunksProviderManager_->Disable(); | ||||||
| 
 | 
 | ||||||
|       std::shared_lock lock(level3ProviderManagerMutex_); |       std::shared_lock lock(level3ProviderManagerMutex_); | ||||||
|       std::for_each(std::execution::par_unseq, |       std::for_each(std::execution::par, | ||||||
|                     level3ProviderManagerMap_.begin(), |                     level3ProviderManagerMap_.begin(), | ||||||
|                     level3ProviderManagerMap_.end(), |                     level3ProviderManagerMap_.end(), | ||||||
|                     [](auto& p) |                     [](auto& p) | ||||||
|  | @ -693,7 +693,7 @@ void RadarProductManager::EnableRefresh(common::RadarProductGroup group, | ||||||
|                auto availableProducts = |                auto availableProducts = | ||||||
|                   providerManager->provider_->GetAvailableProducts(); |                   providerManager->provider_->GetAvailableProducts(); | ||||||
| 
 | 
 | ||||||
|                if (std::find(std::execution::par_unseq, |                if (std::find(std::execution::par, | ||||||
|                              availableProducts.cbegin(), |                              availableProducts.cbegin(), | ||||||
|                              availableProducts.cend(), |                              availableProducts.cend(), | ||||||
|                              product) != availableProducts.cend()) |                              product) != availableProducts.cend()) | ||||||
|  | @ -920,13 +920,13 @@ RadarProductManager::GetActiveVolumeTimes( | ||||||
| 
 | 
 | ||||||
|    // For each provider (in parallel)
 |    // For each provider (in parallel)
 | ||||||
|    std::for_each( |    std::for_each( | ||||||
|       std::execution::par_unseq, |       std::execution::par, | ||||||
|       providers.begin(), |       providers.begin(), | ||||||
|       providers.end(), |       providers.end(), | ||||||
|       [&](const std::shared_ptr<provider::NexradDataProvider>& provider) |       [&](const std::shared_ptr<provider::NexradDataProvider>& provider) | ||||||
|       { |       { | ||||||
|          // For yesterday, today and tomorrow (in parallel)
 |          // For yesterday, today and tomorrow (in parallel)
 | ||||||
|          std::for_each(std::execution::par_unseq, |          std::for_each(std::execution::par, | ||||||
|                        dates.begin(), |                        dates.begin(), | ||||||
|                        dates.end(), |                        dates.end(), | ||||||
|                        [&](const auto& date) |                        [&](const auto& date) | ||||||
|  | @ -1246,7 +1246,7 @@ void RadarProductManagerImpl::PopulateProductTimes( | ||||||
|    std::mutex                                      volumeTimesMutex {}; |    std::mutex                                      volumeTimesMutex {}; | ||||||
| 
 | 
 | ||||||
|    // For yesterday, today and tomorrow (in parallel)
 |    // For yesterday, today and tomorrow (in parallel)
 | ||||||
|    std::for_each(std::execution::par_unseq, |    std::for_each(std::execution::par, | ||||||
|                  dates.begin(), |                  dates.begin(), | ||||||
|                  dates.end(), |                  dates.end(), | ||||||
|                  [&](const auto& date) |                  [&](const auto& date) | ||||||
|  |  | ||||||
|  | @ -62,7 +62,7 @@ LoadImageResources(const std::vector<std::string>& urlStrings) | ||||||
|    std::mutex                                              m {}; |    std::mutex                                              m {}; | ||||||
|    std::vector<std::shared_ptr<boost::gil::rgba8_image_t>> images {}; |    std::vector<std::shared_ptr<boost::gil::rgba8_image_t>> images {}; | ||||||
| 
 | 
 | ||||||
|    std::for_each(std::execution::par_unseq, |    std::for_each(std::execution::par, | ||||||
|                  urlStrings.begin(), |                  urlStrings.begin(), | ||||||
|                  urlStrings.end(), |                  urlStrings.end(), | ||||||
|                  [&](auto& urlString) |                  [&](auto& urlString) | ||||||
|  |  | ||||||
|  | @ -17,7 +17,6 @@ | ||||||
| #include <boost/asio/steady_timer.hpp> | #include <boost/asio/steady_timer.hpp> | ||||||
| #include <boost/asio/thread_pool.hpp> | #include <boost/asio/thread_pool.hpp> | ||||||
| #include <boost/container/stable_vector.hpp> | #include <boost/container/stable_vector.hpp> | ||||||
| #include <boost/range/irange.hpp> |  | ||||||
| #include <range/v3/range/conversion.hpp> | #include <range/v3/range/conversion.hpp> | ||||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||||
| #include <range/v3/view/single.hpp> | #include <range/v3/view/single.hpp> | ||||||
|  | @ -488,7 +487,7 @@ void TextEventManager::Impl::LoadArchives( | ||||||
| 
 | 
 | ||||||
|    std::vector<scwx::types::iem::AfosEntry> loadListEntries {}; |    std::vector<scwx::types::iem::AfosEntry> loadListEntries {}; | ||||||
| 
 | 
 | ||||||
|    for (auto date : boost::irange(startDate, endDate)) |    for (auto date = startDate; date < endDate; date += std::chrono::days {1}) | ||||||
|    { |    { | ||||||
|       auto mapIt = unloadedProductMap_.find(date); |       auto mapIt = unloadedProductMap_.find(date); | ||||||
|       if (mapIt == unloadedProductMap_.cend()) |       if (mapIt == unloadedProductMap_.cend()) | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| #include <mutex> | #include <mutex> | ||||||
| #include <ranges> | #include <ranges> | ||||||
| #include <set> | #include <set> | ||||||
|  | #include <shared_mutex> | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
| #include <unordered_set> | #include <unordered_set> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -124,6 +124,9 @@ void AudioCodecPage::Impl::SetInstructionsLabelText() | ||||||
|                     self_, |                     self_, | ||||||
|                     [](const QString& link) |                     [](const QString& link) | ||||||
|                     { QDesktopServices::openUrl(QUrl {link}); }); |                     { QDesktopServices::openUrl(QUrl {link}); }); | ||||||
|  | #elif defined(__APPLE__) | ||||||
|  |    instructionsLabel_->setText(tr( | ||||||
|  |       "Please see the instructions for your Mac for installing media codecs.")); | ||||||
| #else | #else | ||||||
|    instructionsLabel_->setText( |    instructionsLabel_->setText( | ||||||
|       tr("Please see the instructions for your Linux distribution for " |       tr("Please see the instructions for your Linux distribution for " | ||||||
|  |  | ||||||
|  | @ -13,8 +13,6 @@ namespace util | ||||||
| namespace color | namespace color | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| static const std::string logPrefix_ = "scwx::qt::util::color"; |  | ||||||
| 
 |  | ||||||
| std::string ToArgbString(const boost::gil::rgba8_pixel_t& color) | std::string ToArgbString(const boost::gil::rgba8_pixel_t& color) | ||||||
| { | { | ||||||
|    return fmt::format( |    return fmt::format( | ||||||
|  |  | ||||||
|  | @ -12,8 +12,6 @@ namespace qt | ||||||
| namespace util | namespace util | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| static const std::string logPrefix_ = "scwx::qt::util::file"; |  | ||||||
| 
 |  | ||||||
| std::unique_ptr<std::istream> OpenFile(const std::string&      filename, | std::unique_ptr<std::istream> OpenFile(const std::string&      filename, | ||||||
|                                        std::ios_base::openmode mode) |                                        std::ios_base::openmode mode) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -390,11 +390,10 @@ TextureAtlas::Impl::LoadImage(const std::string& imagePath, double scale) | ||||||
| 
 | 
 | ||||||
|    QUrl url = QUrl::fromUserInput(qImagePath); |    QUrl url = QUrl::fromUserInput(qImagePath); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|    if (url.isLocalFile()) |    if (url.isLocalFile()) | ||||||
|    { |    { | ||||||
|       QString suffix = QFileInfo(qImagePath).suffix().toLower(); |       const QString suffix          = QFileInfo(qImagePath).suffix().toLower(); | ||||||
|       QString qLocalImagePath = url.toString(QUrl::PreferLocalFile); |       const QString qLocalImagePath = url.toString(QUrl::PreferLocalFile); | ||||||
| 
 | 
 | ||||||
|       if (suffix == "svg") |       if (suffix == "svg") | ||||||
|       { |       { | ||||||
|  | @ -448,13 +447,13 @@ TextureAtlas::Impl::LoadImage(const std::string& imagePath, double scale) | ||||||
|          // If no alpha channel, replace black with transparent
 |          // If no alpha channel, replace black with transparent
 | ||||||
|          if (numChannels == 3) |          if (numChannels == 3) | ||||||
|          { |          { | ||||||
|             std::for_each( |             std::for_each(std::execution::par, | ||||||
|                std::execution::par_unseq, |  | ||||||
|                           view.begin(), |                           view.begin(), | ||||||
|                           view.end(), |                           view.end(), | ||||||
|                           [](boost::gil::rgba8_pixel_t& pixel) |                           [](boost::gil::rgba8_pixel_t& pixel) | ||||||
|                           { |                           { | ||||||
|                   static const boost::gil::rgba8_pixel_t kBlack {0, 0, 0, 255}; |                              static const boost::gil::rgba8_pixel_t kBlack { | ||||||
|  |                                 0, 0, 0, 255}; | ||||||
|                              if (pixel == kBlack) |                              if (pixel == kBlack) | ||||||
|                              { |                              { | ||||||
|                                 pixel[3] = 0; |                                 pixel[3] = 0; | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								tools/conan/profiles/scwx-macos_clang-18
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								tools/conan/profiles/scwx-macos_clang-18
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | [settings] | ||||||
|  | arch=x86_64 | ||||||
|  | build_type=Release | ||||||
|  | compiler=clang | ||||||
|  | compiler.cppstd=20 | ||||||
|  | compiler.libcxx=libc++ | ||||||
|  | compiler.version=18 | ||||||
|  | os=Macos | ||||||
|  | os.version=12.0 | ||||||
							
								
								
									
										9
									
								
								tools/conan/profiles/scwx-macos_clang-18_armv8
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								tools/conan/profiles/scwx-macos_clang-18_armv8
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | [settings] | ||||||
|  | arch=armv8 | ||||||
|  | build_type=Release | ||||||
|  | compiler=clang | ||||||
|  | compiler.cppstd=20 | ||||||
|  | compiler.libcxx=libc++ | ||||||
|  | compiler.version=18 | ||||||
|  | os=Macos | ||||||
|  | os.version=12.0 | ||||||
|  | @ -1,8 +1,19 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| script_dir="$(dirname "$(readlink -f "$0")")" | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
| 
 | 
 | ||||||
| # Assign user-specified Python Virtual Environment | # Assign user-specified Python Virtual Environment | ||||||
| [ "${1:-}" = "none" ] && unset venv_path || export venv_path="$(readlink -f "${1:-${script_dir}/../.venv}")" | if [ "${1:-}" = "none" ]; then | ||||||
|  |     unset venv_path | ||||||
|  | else | ||||||
|  |     venv_arg="${1:-${script_dir}/../.venv}" | ||||||
|  |     # Portable way to get absolute path without requiring the directory to exist | ||||||
|  |     case "${venv_arg}" in | ||||||
|  |         /*) venv_path="${venv_arg}" ;; | ||||||
|  |         *) venv_path="$(cd "$(dirname "${venv_arg}")" && pwd)/$(basename "${venv_arg}")" ;; | ||||||
|  |     esac | ||||||
|  |     export venv_path | ||||||
|  | fi | ||||||
| 
 | 
 | ||||||
| # Load custom build settings | # Load custom build settings | ||||||
| if [ -f "${script_dir}/lib/user-setup.sh" ]; then | if [ -f "${script_dir}/lib/user-setup.sh" ]; then | ||||||
|  | @ -11,12 +22,12 @@ fi | ||||||
| 
 | 
 | ||||||
| # Activate Python Virtual Environment | # Activate Python Virtual Environment | ||||||
| if [ -n "${venv_path:-}" ]; then | if [ -n "${venv_path:-}" ]; then | ||||||
|     python -m venv "${venv_path}" |     python3 -m venv "${venv_path}" | ||||||
|     source "${venv_path}/bin/activate" |     source "${venv_path}/bin/activate" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Detect if a Python Virtual Environment was specified above, or elsewhere | # Detect if a Python Virtual Environment was specified above, or elsewhere | ||||||
| IN_VENV=$(python -c 'import sys; print(sys.prefix != getattr(sys, "base_prefix", sys.prefix))') | IN_VENV=$(python3 -c 'import sys; print(sys.prefix != getattr(sys, "base_prefix", sys.prefix))') | ||||||
| 
 | 
 | ||||||
| if [ "${IN_VENV}" = "True" ]; then | if [ "${IN_VENV}" = "True" ]; then | ||||||
|     # In a virtual environment, don't use --user |     # In a virtual environment, don't use --user | ||||||
|  | @ -27,14 +38,22 @@ else | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Install Python packages | # Install Python packages | ||||||
| python -m pip install ${PIP_FLAGS} --upgrade pip | python3 -m pip install ${PIP_FLAGS} --upgrade pip | ||||||
| pip install ${PIP_FLAGS} -r "${script_dir}/../requirements.txt" | python3 -m pip install ${PIP_FLAGS} -r "${script_dir}/../requirements.txt" | ||||||
| 
 | 
 | ||||||
| # Configure default Conan profile | # Configure default Conan profile | ||||||
| conan profile detect -e | conan profile detect -e | ||||||
| 
 | 
 | ||||||
| # Conan profiles | # Conan profiles | ||||||
| conan_profiles=( | if [[ "$(uname)" == "Darwin" ]]; then | ||||||
|  |     # macOS profiles | ||||||
|  |     conan_profiles=( | ||||||
|  |         "scwx-macos_clang-18" | ||||||
|  |         "scwx-macos_clang-18_armv8" | ||||||
|  |     ) | ||||||
|  | else | ||||||
|  |     # Linux profiles | ||||||
|  |     conan_profiles=( | ||||||
|         "scwx-linux_clang-17" |         "scwx-linux_clang-17" | ||||||
|         "scwx-linux_clang-17_armv8" |         "scwx-linux_clang-17_armv8" | ||||||
|         "scwx-linux_clang-18" |         "scwx-linux_clang-18" | ||||||
|  | @ -48,6 +67,7 @@ conan_profiles=( | ||||||
|         "scwx-linux_gcc-14" |         "scwx-linux_gcc-14" | ||||||
|         "scwx-linux_gcc-14_armv8" |         "scwx-linux_gcc-14_armv8" | ||||||
|     ) |     ) | ||||||
|  | fi | ||||||
| 
 | 
 | ||||||
| # Install Conan profiles | # Install Conan profiles | ||||||
| for profile_name in "${conan_profiles[@]}"; do | for profile_name in "${conan_profiles[@]}"; do | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| script_dir="$(dirname "$(readlink -f "$0")")" | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
| 
 | 
 | ||||||
| cmake_args=( | cmake_args=( | ||||||
|     -B "${build_dir}" |     -B "${build_dir}" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| script_dir="$(dirname "$(readlink -f "$0")")" | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
| 
 | 
 | ||||||
| # Import common paths | # Import common paths | ||||||
| source "${script_dir}/common-paths.sh" | source "${script_dir}/common-paths.sh" | ||||||
|  | @ -9,14 +10,14 @@ if [ -f "${script_dir}/user-setup.sh" ]; then | ||||||
|     source "${script_dir}/user-setup.sh" |     source "${script_dir}/user-setup.sh" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Activate Python Virtual Environment | # Activate python3 Virtual Environment | ||||||
| if [ -n "${venv_path:-}" ]; then | if [ -n "${venv_path:-}" ]; then | ||||||
|     python -m venv "${venv_path}" |     python3 -m venv "${venv_path}" | ||||||
|     source "${venv_path}/bin/activate" |     source "${venv_path}/bin/activate" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Detect if a Python Virtual Environment was specified above, or elsewhere | # Detect if a python3 Virtual Environment was specified above, or elsewhere | ||||||
| IN_VENV=$(python -c 'import sys; print(sys.prefix != getattr(sys, "base_prefix", sys.prefix))') | IN_VENV=$(python3 -c 'import sys; print(sys.prefix != getattr(sys, "base_prefix", sys.prefix))') | ||||||
| 
 | 
 | ||||||
| if [ "${IN_VENV}" = "True" ]; then | if [ "${IN_VENV}" = "True" ]; then | ||||||
|     # In a virtual environment, don't use --user |     # In a virtual environment, don't use --user | ||||||
|  | @ -26,9 +27,9 @@ else | ||||||
|     PIP_FLAGS="--upgrade --user" |     PIP_FLAGS="--upgrade --user" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Install Python packages | # Install python3 packages | ||||||
| python -m pip install ${PIP_FLAGS} pip | python3 -m pip install ${PIP_FLAGS} pip | ||||||
| pip install ${PIP_FLAGS} -r "${script_dir}/../../requirements.txt" | python3 -m pip install ${PIP_FLAGS} -r "${script_dir}/../../requirements.txt" | ||||||
| 
 | 
 | ||||||
| if [[ -n "${build_type}" ]]; then | if [[ -n "${build_type}" ]]; then | ||||||
|     # Install Conan profile and packages |     # Install Conan profile and packages | ||||||
|  | @ -49,7 +50,7 @@ fi | ||||||
| # Run CMake Configure | # Run CMake Configure | ||||||
| "${script_dir}/run-cmake-configure.sh" | "${script_dir}/run-cmake-configure.sh" | ||||||
| 
 | 
 | ||||||
| # Deactivate Python Virtual Environment | # Deactivate python3 Virtual Environment | ||||||
| if [ -n "${venv_path:-}" ]; then | if [ -n "${venv_path:-}" ]; then | ||||||
|     deactivate |     deactivate | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| script_dir="$(dirname "$(readlink -f "$0")")" | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
| 
 | 
 | ||||||
| # Configure default Conan profile | # Configure default Conan profile | ||||||
| conan profile detect -e | conan profile detect -e | ||||||
|  |  | ||||||
|  | @ -31,6 +31,9 @@ macro(scwx_python_setup) | ||||||
|             set(Python3_EXECUTABLE "$ENV{VIRTUAL_ENV}/bin/python") |             set(Python3_EXECUTABLE "$ENV{VIRTUAL_ENV}/bin/python") | ||||||
|         endif() |         endif() | ||||||
| 
 | 
 | ||||||
|  |         # Add virtual environment to program search paths | ||||||
|  |         set(CMAKE_PROGRAM_PATH "$ENV{VIRTUAL_ENV}/bin" ${CMAKE_PROGRAM_PATH}) | ||||||
|  | 
 | ||||||
|         message(STATUS "Using virtual environment: $ENV{VIRTUAL_ENV}") |         message(STATUS "Using virtual environment: $ENV{VIRTUAL_ENV}") | ||||||
|     else() |     else() | ||||||
|         message(STATUS "Python virtual environment undefined") |         message(STATUS "Python virtual environment undefined") | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								tools/setup-macos-debug.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										30
									
								
								tools/setup-macos-debug.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
|  | 
 | ||||||
|  | export build_dir="$(python3 -c 'import os,sys;print(os.path.realpath(sys.argv[1]))' "${1:-${script_dir}/../build-debug}")" | ||||||
|  | export build_type=Debug | ||||||
|  | export conan_profile=${2:-scwx-macos_clang-18_armv8} | ||||||
|  | export generator=Ninja | ||||||
|  | export qt_base="/Users/${USER}/Qt" | ||||||
|  | export qt_arch=macos | ||||||
|  | export address_sanitizer=${4:-disabled} | ||||||
|  | 
 | ||||||
|  | # Set explicit compiler paths | ||||||
|  | export CC=$(brew --prefix llvm@18)/bin/clang | ||||||
|  | export CXX=$(brew --prefix llvm@18)/bin/clang++ | ||||||
|  | export PATH="$(brew --prefix llvm@18)/bin:$PATH" | ||||||
|  | 
 | ||||||
|  | export LDFLAGS="-L$(brew --prefix llvm@18)/lib -L$(brew --prefix llvm@18)/lib/c++" | ||||||
|  | export CPPFLAGS="-I$(brew --prefix llvm@18)/include" | ||||||
|  | 
 | ||||||
|  | # Assign user-specified Python Virtual Environment | ||||||
|  | if [ "${3:-}" = "none" ]; then | ||||||
|  |     unset venv_path | ||||||
|  | else | ||||||
|  |     # macOS does not have 'readlink -f', use python for realpath | ||||||
|  |     export venv_path="$(python3 -c 'import os,sys;print(os.path.realpath(sys.argv[1]))' "${3:-${script_dir}/../.venv}")" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Perform common setup | ||||||
|  | "${script_dir}/lib/setup-common.sh" | ||||||
							
								
								
									
										30
									
								
								tools/setup-macos-release.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										30
									
								
								tools/setup-macos-release.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | script_source="${BASH_SOURCE[0]:-$0}" | ||||||
|  | script_dir="$(cd "$(dirname "${script_source}")" && pwd)" | ||||||
|  | 
 | ||||||
|  | export build_dir="$(python3 -c 'import os,sys;print(os.path.realpath(sys.argv[1]))' "${1:-${script_dir}/../build-release}")" | ||||||
|  | export build_type=Release | ||||||
|  | export conan_profile=${2:-scwx-macos_clang-18_armv8} | ||||||
|  | export generator=Ninja | ||||||
|  | export qt_base="/Users/${USER}/Qt" | ||||||
|  | export qt_arch=macos | ||||||
|  | export address_sanitizer=${4:-disabled} | ||||||
|  | 
 | ||||||
|  | # Set explicit compiler paths | ||||||
|  | export CC=$(brew --prefix llvm@18)/bin/clang | ||||||
|  | export CXX=$(brew --prefix llvm@18)/bin/clang++ | ||||||
|  | export PATH="$(brew --prefix llvm@18)/bin:$PATH" | ||||||
|  | 
 | ||||||
|  | export LDFLAGS="-L$(brew --prefix llvm@18)/lib -L$(brew --prefix llvm@18)/lib/c++" | ||||||
|  | export CPPFLAGS="-I$(brew --prefix llvm@18)/include" | ||||||
|  | 
 | ||||||
|  | # Assign user-specified Python Virtual Environment | ||||||
|  | if [ "${3:-}" = "none" ]; then | ||||||
|  |     unset venv_path | ||||||
|  | else | ||||||
|  |     # macOS does not have 'readlink -f', use python for realpath | ||||||
|  |     export venv_path="$(python3 -c 'import os,sys;print(os.path.realpath(sys.argv[1]))' "${3:-${script_dir}/../.venv}")" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Perform common setup | ||||||
|  | "${script_dir}/lib/setup-common.sh" | ||||||
|  | @ -7,8 +7,6 @@ namespace network | ||||||
| namespace cpr | namespace cpr | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| static const std::string logPrefix_ = "scwx::network::cpr"; |  | ||||||
| 
 |  | ||||||
| static ::cpr::Header header_ {}; | static ::cpr::Header header_ {}; | ||||||
| 
 | 
 | ||||||
| ::cpr::Header GetHeader() | ::cpr::Header GetHeader() | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
| #include <istream> | #include <istream> | ||||||
|  | #include <numeric> | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
|  |  | ||||||
|  | @ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.24) | ||||||
| 
 | 
 | ||||||
| project(scwx-data) | project(scwx-data) | ||||||
| 
 | 
 | ||||||
|  | include(CheckCXXSymbolExists) | ||||||
|  | 
 | ||||||
| find_package(Boost) | find_package(Boost) | ||||||
| find_package(cpr) | find_package(cpr) | ||||||
| find_package(LibXml2) | find_package(LibXml2) | ||||||
|  | @ -10,7 +12,9 @@ find_package(range-v3) | ||||||
| find_package(re2) | find_package(re2) | ||||||
| find_package(spdlog) | find_package(spdlog) | ||||||
| 
 | 
 | ||||||
| if (NOT MSVC) | check_cxx_symbol_exists(_LIBCPP_VERSION version LIBCPP) | ||||||
|  | 
 | ||||||
|  | if (LINUX) | ||||||
|     find_package(TBB) |     find_package(TBB) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | @ -327,10 +331,16 @@ if (NOT CHRONO_HAS_TIMEZONES_AND_CALENDERS) | ||||||
|     target_link_libraries(wxdata PUBLIC date::date-tz) |     target_link_libraries(wxdata PUBLIC date::date-tz) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| if (NOT MSVC) | if (LINUX) | ||||||
|     target_link_libraries(wxdata PUBLIC TBB::tbb) |     target_link_libraries(wxdata PUBLIC TBB::tbb) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | if (LIBCPP) | ||||||
|  |     # Enable support for parallel algorithms | ||||||
|  |     target_compile_options(wxdata PUBLIC -fexperimental-library) | ||||||
|  |     target_link_libraries(wxdata INTERFACE c++experimental) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| set_target_properties(wxdata PROPERTIES CXX_STANDARD 20 | set_target_properties(wxdata PROPERTIES CXX_STANDARD 20 | ||||||
|                                         CXX_STANDARD_REQUIRED ON |                                         CXX_STANDARD_REQUIRED ON | ||||||
|                                         CXX_EXTENSIONS OFF) |                                         CXX_EXTENSIONS OFF) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat