diff --git a/.github/workflows/build-arm64-mac.yml b/.github/workflows/build-arm64-mac.yml new file mode 100644 index 0000000..f87c91a --- /dev/null +++ b/.github/workflows/build-arm64-mac.yml @@ -0,0 +1,47 @@ +name: Build Retro-Imager for ARM64 Macs + +on: + push: + branches: + - dev + pull_request: + branches: + - dev + +jobs: + build: + name: Build on macOS ARM64 + runs-on: macos-13 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Dependencies + run: | + brew update + brew install cmake qt@6 + + - name: Verify Qt Installation Path + run: | + echo "Qt is installed at: $(brew --prefix qt@6)" + ls -la $(brew --prefix qt@6) + + - name: Configure and Build Retro-Imager + run: | + mkdir -p build + cd build + cmake -DCMAKE_PREFIX_PATH=$(brew --prefix qt@6) ../src + make + + - name: Archive Build Artifacts + if: success() + run: | + mkdir -p build_artifacts + tar -czvf build_artifacts/retro-imager-arm64-mac.tar.gz build/ + + - name: Upload Build Artifacts + uses: actions/upload-artifact@v3 + with: + name: retro-imager-arm64-mac + path: build_artifacts/retro-imager-arm64-mac.tar.gz diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml deleted file mode 100644 index d0e0302..0000000 --- a/.github/workflows/windows-build.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Windows x64 Build - -on: - push: - branches: - - boogaloo - pull_request: - branches: - - boogaloo - -jobs: - build: - runs-on: windows-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Set up Qt - uses: jurplel/install-qt-action@v3 - with: - version: '6.7.3' - host: 'windows' - target: 'desktop' - arch: 'win64_msvc2019_64' - - - name: Install CMake - run: | - choco install cmake --installargs '"ADD_CMAKE_TO_PATH=System"' --yes - - - name: Install Visual Studio Build Tools - run: | - choco install visualstudio2019buildtools --version=16.11.9 --yes - choco install visualstudio2019-workload-vctools --yes - - - name: Configure CMake - shell: cmd - run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat" - cmake -S src -B build -G "NMake Makefiles" -DCMAKE_PREFIX_PATH:PATH="%Qt5_DIR%" - - - name: Build the project - shell: cmd - run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat" - cmake --build build --config Release diff --git a/README.md b/README.md index b8ba31e..70654da 100644 --- a/README.md +++ b/README.md @@ -1,154 +1,65 @@ -# Raspberry Pi Imager +# Retro-Imager -Raspberry Pi Imaging Utility +**Retro-Imager** is a fork of the official Raspberry Pi Imager, specially tailored for retro gaming handhelds and the custom firmwares that power them. This project simplifies the process of flashing custom firmware images to your retro handheld devices, allowing you to quickly get set up and start gaming. -- To install on Raspberry Pi OS, use `sudo apt update && sudo apt install rpi-imager`. -- Download the latest version for Windows, macOS and Ubuntu from the [Raspberry Pi downloads page](https://www.raspberrypi.com/software/). +## Supported Devices & Custom Firmwares -## How to use Raspberry Pi Imager +At present, **Retro-Imager** supports: +**muOS** and **Rocknix**. +More devices and firmwares will be added in future releases! -Please see our [official documentation](https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager). +## Features + +- **Easy-to-use interface**: Retro-Imager retains the familiar look and feel of Raspberry Pi Imager, making it accessible to anyone. +- **Handheld Focus**: Tailored specifically for retro handheld gaming devices, eliminating unnecessary options for general-purpose single-board computers. +- **Custom Firmware Support**: Flash custom OS images like muOS and Rocknix quickly and easily. +- **Firmware Recommendations**: The top-most firmware option for each device is our recommended choice, ensuring optimal performance and compatibility. + +## Getting Started + +### Prerequisites + +- A computer running Linux (x86_64) or Windows (x86_64) +- A microSD card reader +- A microSD card (at least 8GB, though larger is recommended) + +### Installation + +1. Download the most recent release from the [GitHub releases page](https://github.com/cmclark00/retro-imager/releases). +2. Extract the files (if necessary) and run the application on your system: + - For Linux: Make the file executable and run it. + ```bash + chmod +x retro-imager.AppImage + ./retro-imager.AppImage + ``` + - For Windows: Double-click the `.exe` file. + +### Using Retro-Imager + +1. Launch Retro-Imager. +2. Select your device from the list (e.g., RG35XX Plus, RG28XX, RGB30). +3. Choose the custom firmware you would like to install. The top-most option is the recommended firmware for your selected device. +4. Insert your microSD card into your computer. +5. Select the correct device from the list and click "Write". +6. Safely remove the microSD card and insert it into your retro gaming handheld. ## Contributing -### Linux +We welcome contributions! Whether you're improving code, fixing bugs, or expanding firmware support, your help is appreciated. -#### Get dependencies +To contribute: -- Install the build dependencies (Debian used as an example): - -```sh -sudo apt install --no-install-recommends build-essential cmake git libgnutls28-dev -``` - -- Get the Qt online installer from: https://www.qt.io/download-open-source -- During installation, choose Qt 6.7, CMake and Qt Creator. - -#### Get the source - -```sh -git clone --depth 1 https://github.com/raspberrypi/rpi-imager -``` - -#### Build the AppImage - -Modify appimagecraft.yml: - -- First, you _must_ set Qt6_ROOT (as a extra_variables item under build/cmake) to the root of your Qt6 installation. eg: `/opt/Qt/6.7.2/gcc_arm64/` -- Second, you _must_ set QMAKE (as a raw_environment variable of the linuxdeploy plugin) to the full path of qmake inside that Qt6 installation. eg: `/opt/Qt/6.7.2./gcc_arm64/bin/qmake` - -Now, use AppImageCraft to build your AppImage: - -```sh -cd rpi-imager -export LD_LIBRARY_PATH=${your_Qt6_install_path}/lib -./${your_platform_appimagecraft}.AppImage -``` - -Now mark the AppImage as executable, and run it: - -```sh -chmod +x ./Raspberry_Pi_Imager-*.AppImage -./Raspberry_Pi_Imager-*.AppImage -``` - -### Windows - -#### Get dependencies - -- Get the Qt online installer from: https://www.qt.io/download-open-source -During installation, choose Qt 6.7 with Mingw64 64-bit toolchain, CMake and Qt Creator. - -- For building the installer, get Nullsoft scriptable install system: https://nsis.sourceforge.io/Download - -- It is assumed you already have a valid code signing certificate, and the Windows 10 Kit (SDK) installed. - -#### Building - -Building Raspberry Pi Imager on Windows is best done with the Qt Creator GUI. - -- Download source .zip from github and extract it to a folder on disk -- Open src/CMakeLists.txt in Qt Creator. -- Use Qt Creator to set the MINGW64_ROOT CMake variable to your MingGW64 installation path, eg `C:\Qt\Tools\mingw64` -- For builds you distribute to others, make sure you choose "Release" in the toolchain settings and not the Debug configuration. -- Menu "Build" -> "Build all" -- Result will be in build_rpi-imager_someversion -- Go to the BUILD folder, right click on the .nsi script "Compile NSIS script", to create installer. - -### macOS - -#### Get dependencies - -- Get the Qt online installer from: https://www.qt.io/download-open-source -During installation, choose Qt 6.7, CMake and Qt Creator. -- It is assumed you have an Apple developer subscription, and already have a "Developer ID" code signing certificate for distribution outside the Mac Store. - -#### Building - -- Download source .zip from github and extract it to a folder on disk -- Start Qt Creator and open src/CMakeLists.txt -- Use Qt Creator to set the Qt6_ROOT CMake variable to your Qt6 installation path, eg `/opt/Qt6/6.7.2/gcc_arm64` -- Menu "Build" -> "Build all" -- Result will be in build_rpi-imager_someversion -- For distribution to others: - - Use the IMAGER_SIGNED_APP flag to enable Application signing - - Use the IMAGER_SIGNING_IDENTITY string to specify the Developer ID certificate Common Name - - Use the IMAGER_NOTARIZE_APP flag to enable notarization as part of the build - - Use the IMAGER_NOTARIZE_KEYCHAIN_PROFILE string to specify the name of the keychain item containing your Apple ID credentials for notarizing. - -### Linux embedded (netboot) build - -The embedded build runs under a minimalistic Linux distribution compiled by buildroot. -To build: - -- You must be running a Linux system, and have the buildroot dependencies installed as listed in the buildroot manual: https://buildroot.org/downloads/manual/manual.html#requirement -- Run: - -```sh -cd rpi-imager/embedded -./build.sh -``` - -The result will be in the "output" directory. -The files can be copied to a FAT32 formatted SD card, and inserted in a Pi for testing. -If you would like to build a (signed) netboot image there are tools for that at: https://github.com/raspberrypi/usbboot/tree/master/tools - -## Other notes - -### Custom repository - -If the application is started with "--repo [your own URL]" it will use a custom image repository. -So can simply create another 'start menu shortcut' to the application with that parameter to use the application with your own images. - -### Telemetry - -In order to understand usage of the application (e.g. uptake of Raspberry Pi Imager versions and which images and operating systems are most popular) when using the default image repository, the URL, operating system name and category (if present) of a selected image are sent along with the running version of Raspberry Pi Imager, your operating system, CPU architecture, locale and Raspberry Pi revision (if applicable) to https://rpi-imager-stats.raspberrypi.com by downloadstatstelemetry.cpp. - -This web service is hosted by [Heroku](https://www.heroku.com) and only stores an incrementing counter using a [Redis Sorted Set](https://redis.io/topics/data-types#sorted-sets) for each URL, operating system name and category per day in the `eu-west-1` region and does not associate any personal data with those counts. This allows us to query the number of downloads over time and nothing else. - -The last 1,500 requests to the service are logged for one week before expiring as this is the [minimum log retention period for Heroku](https://devcenter.heroku.com/articles/logging#log-history-limits). - -On Windows, you can opt out of telemetry by disabling it in the Registry: - -```pwsh -reg add "HKCU\Software\Raspberry Pi\Imager" /v telemetry /t REG_DWORD /d 0 -``` - -On Linux, run `rpi-imager --disable-telemetry` or add the following to `~/.config/Raspberry Pi/Imager.conf`: - -```ini -[General] -telemetry=false -``` - -On macOS, disable it by editing the property list for the application: - -```sh -defaults write org.raspberrypi.Imager.plist telemetry -bool NO -``` +1. Fork the repository. +2. Create a new branch: + ```bash + git checkout -b feature/YourFeature +3. Commit your changes: + ```bash + git commit -m "Add some feature" +4. Push to the branch: + ```bash + git push origin feature/YourFeature +5. Open a Pull Request. ### License - -The main code of the Imaging Utility is made available under the terms of the Apache license. -See license.txt and files in "src/dependencies" folder for more information about the various open source licenses that apply to the third-party dependencies used such as Qt, libarchive, drivelist, mountutils and libcurl. -For the embedded (netboot) build see also "embedded/legal-info" for more information about the extra system software included in that. +This project is licensed under the MIT License. See the LICENSE file for details. diff --git a/appimagecraft.yml b/appimagecraft.yml index 82bd195..83cbde4 100644 --- a/appimagecraft.yml +++ b/appimagecraft.yml @@ -1,8 +1,8 @@ version: 1 project: - name: org.raspberrypi.rpi-imager - version: 1.9.2 + name: org.coreymclark.retro-imager + version: 0.3.0 build: cmake: diff --git a/minimal_test.json b/minimal_test.json new file mode 100644 index 0000000..75c3838 --- /dev/null +++ b/minimal_test.json @@ -0,0 +1,16 @@ +{ + "os_list": [ + { + "name": "Test OS 1", + "description": "A test OS for verifying functionality", + "icon": "icons/erase.png", + "url": "internal://format" + }, + { + "name": "Test OS 2", + "description": "Another test OS", + "icon": "icons/erase.png", + "url": "internal://format" + } + ] +} \ No newline at end of file diff --git a/os_list.json b/os_list.json new file mode 100644 index 0000000..fedc395 --- /dev/null +++ b/os_list.json @@ -0,0 +1,552 @@ +{ + "os_list": [ + { + "name": "muOS 2410.1 Banana for RG35XX Plus", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX Plus.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-PLUS-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2151537628, + "extract_size": 4504682496, + "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", + "devices": [ + "rg35xx_plus" + ] + }, + { + "name": "muOS 2410.1 Banana for RG28XX", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG28XX.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG28XX-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2158432397, + "extract_size": 4504682496, + "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", + "devices": [ + "rg28xx" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XXH", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXH.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-H-2410.1-BANANA-a10951c4.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2118435484, + "extract_size": 4504682496, + "extract_sha256": "a84a1386de3b046aea05c75a4ccc8da0fbc2ee42f89b7b78a720cf657f45d3d2", + "devices": [ + "rg35xxh" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XXSP", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXSP.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-SP-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2176694960, + "extract_size": 4504682496, + "extract_sha256": "9a529d2f089bba6616615026c6ec16e282d622adbc6ae97172b7ab73d32092c4", + "devices": [ + "rg35xx_sp" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XX24", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX24.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-2024-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2151137645, + "extract_size": 4504682496, + "extract_sha256": "fc0da5aa0dcda244be8dec28115210200fe259c374bb7b25d6d26f4db812d351", + "devices": [ + "rg35xx_2024" + ] + }, + { + "name": "muOS 2410.1 Banana for RG40XXH", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXH.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-H-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2132388103, + "extract_size": 4504682496, + "extract_sha256": "fe51f4f3a7f9e51c34eb78ef704a9a6af0233d6fdf87ccd070444034003afe5c", + "devices": [ + "rg40xxh" + ] + }, + { + "name": "muOS 2410.1 Banana for RG40XXV", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXV.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-V-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2132476961, + "extract_size": 4504682496, + "extract_sha256": "aa2cd35010e1414c62b0460d8f193d7a3c56ebcf3f59a220aebe995ab93bb051", + "devices": [ + "rg40xxv" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3326 devices, A image.", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3326 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3326.aarch64-20241120-a.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1348717111, + "extract_size": 2197815296, + "extract_sha256": "8cc28cca1d4d88464cf156691a540111385c5b94f30aa067456cc80fcd12b747", + "devices": [ + "rg351p", + "rg351m", + "rg351v", + "r33s", + "r35s", + "r36s", + "oga", + "ogs", + "xu10", + "v10", + "rgb10" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3326 devices, B image.", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3326 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3326.aarch64-20241120-b.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1348619756, + "extract_size": 2197815296, + "extract_sha256": "e43ed5ea9c8c93408a180e57409e9a07d7594ecb1ffe46f21024655f46ea9050", + "devices": [ + "xu_mini_m", + "rgb10x" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3399 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3399 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3399.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1288581465, + "extract_size": 2198863872, + "extract_sha256": "53091696a540d693d99d515524816825a057823c0fe1f91a0b5e4837baeb24b9", + "devices": [ + "rg552" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3566 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3566 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3566.aarch64-20241120-Generic.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1391749865, + "extract_size": 2198863872, + "extract_sha256": "4917f090e9364f47de5cf8663c0741eb79b8236c4b455a5ae4d3c8889744de27", + "devices": [ + "rg353p", + "rg353m", + "rg353v", + "rg353vs", + "rg353ps", + "rg503", + "rg_arc_d", + "rg_arc_s", + "rk2023", + "rgb10_max_3", + "rgb30", + "rgb20sx" + ] + }, + { + "name": "ROCKNIX 20241120 for Powkiddy X55 devices", + "description": "ROCKNIX 20241120 firmware optimized for Powkiddy X55 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3566.aarch64-20241120-Powkiddy_x55.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1391396234, + "extract_size": 2198863872, + "extract_sha256": "35391e0a49de413a2672893a07ed6ca116f90746baef620eebf8d3ab7b2ad5f7", + "devices": [ + "x55" + ] + }, + { + "name": "ROCKNIX 20241120 for Hardkernel ODROID Go Ultra and Powkiddy RGB10 Max 3 Pro devices", + "description": "ROCKNIX 20241120 firmware optimized for ODROID Go Ultra and RGB10 Max 3 Pro devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-S922X.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1416924259, + "extract_size": 2185232384, + "extract_sha256": "86cd0a48d541e3e68582107748e2f77656c153d11f6efd14563fb65a0f9c5076", + "devices": [ + "ogu", + "rgb10_max_3_pro" + ] + }, + { + "name": "ROCKNIX 20240815 for Hardkernel ODROID N2/N2+ devices", + "description": "ROCKNIX 20240815 firmware optimized for Hardkernel ODROID N2/N2+ devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-S922X.aarch64-20240815-Odroid_N2.img.gz", + "release_date": "2024-08-15", + "image_download_size": 1249723275, + "extract_size": 2185232384, + "extract_sha256": "7e5b56f4a0c0a9d9c64e7b1ba4472dd7e2dac9c28a23585098e16349f30c7fc9", + "devices": [ + "on2", + "on2_plus" + ] + }, + { + "name": "ROCKNIX 20240815 for Hardkernel ODROID N2L devices", + "description": "ROCKNIX 20240815 firmware optimized for Hardkernel ODROID N2L devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-S922X.aarch64-20240815-Odroid_N2L.img.gz", + "release_date": "2024-08-15", + "image_download_size": 1249707786, + "extract_size": 2185232384, + "extract_sha256": "5af36c78b57dcb35c910bb72c2ed28208fe94c94d5b7fda83d73ef33a2419910", + "devices": [ + "on2l" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3588 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3588 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3588.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1451047021, + "extract_size": 2198863872, + "extract_sha256": "ec81027b7d9b757f09ccd78ce38c6993009e66ddd4b7e1a1206dc104ad739754", + "devices": [ + "ace", + "orange_pi_5", + "orange_pi_5_plus", + "radxa_rock_5a", + "radxa_rock_5b", + "radxa_rock_5b_plus", + "radxa_rock_cm5", + "nova" + ] + }, + { + "name": "ROCKNIX 20241120 for Retroid Pocket Mini and Retroid Pocket 5 devices", + "description": "ROCKNIX 20241120 firmware optimized for Snapdragon 865 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-SD865.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1404994449, + "extract_size": 2198863872, + "extract_sha256": "82f9336c27c9b733322e7e9f685bc1e98aa4eedb0c17f9ae297edb983ada6f39", + "devices": [ + "rpmini", + "rp5" + ] + } + ], + "imager": { + "devices": [ + { + "name": "Anbernic", + "subitems": [ + { + "name": "Anbernic RG40XXH", + "tags": ["rg40xxh"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG40XX%20H.png?raw=true" + }, + { + "name": "Anbernic RG40XXV", + "tags": ["rg40xxv"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG40XX%20V.png?raw=true" + }, + { + "name": "Anbernic RG35XXH", + "tags": ["rg35xxh"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20H.png?raw=true" + }, + { + "name": "Anbernic RG35XX Plus", + "tags": ["rg35xx_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20-%20PLUS.png?raw=true" + }, + { + "name": "Anbernic RG35XX SP", + "tags": ["rg35xx_sp"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20SP.png?raw=true" + }, + { + "name": "Anbernic RG35XX 2024", + "tags": ["rg35xx_2024"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20-%202024.png?raw=true" + }, + { + "name": "Anbernic RG28XX", + "tags": ["rg28xx"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG28XX.png?raw=true" + }, + { + "name": "Anbernic RG351P", + "tags": ["rg351p"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG351M", + "tags": ["rg351m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG351V", + "tags": ["rg351v"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353P", + "tags": ["rg353p"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353M", + "tags": ["rg353m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353V", + "tags": ["rg353v"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353VS", + "tags": ["rg353vs"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353PS", + "tags": ["rg353ps"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG503", + "tags": ["rg503"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG Arc-D", + "tags": ["rg_arc_d"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG Arc-S", + "tags": ["rg_arc_s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Game Console", + "subitems": [ + { + "name": "Game Console R33S", + "tags": ["r33s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Game Console R35S", + "tags": ["r35s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Game Console R36S", + "tags": ["r36s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "ODROID", + "subitems": [ + { + "name": "ODROID Go Advance", + "tags": ["oga"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID Go Super", + "tags": ["ogs"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2", + "tags": ["on2"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2 Plus", + "tags": ["on2_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2L", + "tags": ["on2l"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "MagicX", + "subitems": [ + { + "name": "MagicX XU10", + "tags": ["xu10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "MagicX XU Mini M", + "tags": ["xu_mini_m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Powkiddy", + "subitems": [ + { + "name": "Powkiddy V10", + "tags": ["v10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10", + "tags": ["rgb10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RK2023", + "tags": ["rk2023"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10 Max 3", + "tags": ["rgb10_max_3"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB30", + "tags": ["rgb30"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB20SX", + "tags": ["rgb20sx"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG552", + "tags": ["rg552"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID Go Ultra", + "tags": ["ogu"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10 Max 3 Pro", + "tags": ["rgb10_max_3_pro"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy X55", + "tags": ["x55"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Gameforce", + "subitems": [ + { + "name": "Gameforce Ace (default)", + "tags": ["ace"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Orange Pi", + "subitems": [ + { + "name": "Orange Pi 5", + "tags": ["orange_pi_5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Orange Pi 5 Plus", + "tags": ["orange_pi_5_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Radxa", + "subitems": [ + { + "name": "Radxa Rock 5a", + "tags": ["radxa_rock_5a"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock 5b", + "tags": ["radxa_rock_5b"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock 5b Plus", + "tags": ["radxa_rock_5b_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock CM5", + "tags": ["radxa_rock_cm5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Indiedroid", + "subitems": [ + { + "name": "Indiedroid Nova (Must set dtb in extlinuix.conf)", + "tags": ["nova"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Retroid", + "subitems": [ + { + "name": "Retroid Pocket Mini", + "tags": ["rpmini"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Retroid Pocket 5", + "tags": ["rp5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + } + ] + } +} + diff --git a/qt_plugins/assetimporters/libassimp.dylib b/qt_plugins/assetimporters/libassimp.dylib new file mode 100755 index 0000000..fcc24b2 Binary files /dev/null and b/qt_plugins/assetimporters/libassimp.dylib differ diff --git a/qt_plugins/canbus/libqtpassthrucanbus.dylib b/qt_plugins/canbus/libqtpassthrucanbus.dylib new file mode 100755 index 0000000..f81d632 Binary files /dev/null and b/qt_plugins/canbus/libqtpassthrucanbus.dylib differ diff --git a/qt_plugins/canbus/libqtpeakcanbus.dylib b/qt_plugins/canbus/libqtpeakcanbus.dylib new file mode 100755 index 0000000..b481c0a Binary files /dev/null and b/qt_plugins/canbus/libqtpeakcanbus.dylib differ diff --git a/qt_plugins/canbus/libqttinycanbus.dylib b/qt_plugins/canbus/libqttinycanbus.dylib new file mode 100755 index 0000000..e25a98b Binary files /dev/null and b/qt_plugins/canbus/libqttinycanbus.dylib differ diff --git a/qt_plugins/canbus/libqtvirtualcanbus.dylib b/qt_plugins/canbus/libqtvirtualcanbus.dylib new file mode 100755 index 0000000..1d0afa2 Binary files /dev/null and b/qt_plugins/canbus/libqtvirtualcanbus.dylib differ diff --git a/qt_plugins/designer/libqquickwidget.dylib b/qt_plugins/designer/libqquickwidget.dylib new file mode 100755 index 0000000..fa42225 Binary files /dev/null and b/qt_plugins/designer/libqquickwidget.dylib differ diff --git a/qt_plugins/designer/libqwebengineview.dylib b/qt_plugins/designer/libqwebengineview.dylib new file mode 100755 index 0000000..c0e98f8 Binary files /dev/null and b/qt_plugins/designer/libqwebengineview.dylib differ diff --git a/qt_plugins/generic/libqtuiotouchplugin.dylib b/qt_plugins/generic/libqtuiotouchplugin.dylib new file mode 100755 index 0000000..5d77bc6 Binary files /dev/null and b/qt_plugins/generic/libqtuiotouchplugin.dylib differ diff --git a/qt_plugins/geometryloaders/libdefaultgeometryloader.dylib b/qt_plugins/geometryloaders/libdefaultgeometryloader.dylib new file mode 100755 index 0000000..915e18b Binary files /dev/null and b/qt_plugins/geometryloaders/libdefaultgeometryloader.dylib differ diff --git a/qt_plugins/geometryloaders/libgltfgeometryloader.dylib b/qt_plugins/geometryloaders/libgltfgeometryloader.dylib new file mode 100755 index 0000000..c26e1e3 Binary files /dev/null and b/qt_plugins/geometryloaders/libgltfgeometryloader.dylib differ diff --git a/qt_plugins/geoservices/libqtgeoservices_itemsoverlay.dylib b/qt_plugins/geoservices/libqtgeoservices_itemsoverlay.dylib new file mode 100755 index 0000000..47ec78f Binary files /dev/null and b/qt_plugins/geoservices/libqtgeoservices_itemsoverlay.dylib differ diff --git a/qt_plugins/geoservices/libqtgeoservices_osm.dylib b/qt_plugins/geoservices/libqtgeoservices_osm.dylib new file mode 100755 index 0000000..ead5dd9 Binary files /dev/null and b/qt_plugins/geoservices/libqtgeoservices_osm.dylib differ diff --git a/qt_plugins/help/libhelpplugin.dylib b/qt_plugins/help/libhelpplugin.dylib new file mode 100755 index 0000000..e615f84 Binary files /dev/null and b/qt_plugins/help/libhelpplugin.dylib differ diff --git a/qt_plugins/iconengines/libqsvgicon.dylib b/qt_plugins/iconengines/libqsvgicon.dylib new file mode 100755 index 0000000..2334c1f Binary files /dev/null and b/qt_plugins/iconengines/libqsvgicon.dylib differ diff --git a/qt_plugins/imageformats/libqgif.dylib b/qt_plugins/imageformats/libqgif.dylib new file mode 100755 index 0000000..80c37d6 Binary files /dev/null and b/qt_plugins/imageformats/libqgif.dylib differ diff --git a/qt_plugins/imageformats/libqicns.dylib b/qt_plugins/imageformats/libqicns.dylib new file mode 100755 index 0000000..2a906b9 Binary files /dev/null and b/qt_plugins/imageformats/libqicns.dylib differ diff --git a/qt_plugins/imageformats/libqico.dylib b/qt_plugins/imageformats/libqico.dylib new file mode 100755 index 0000000..f8c1a2c Binary files /dev/null and b/qt_plugins/imageformats/libqico.dylib differ diff --git a/qt_plugins/imageformats/libqjp2.dylib b/qt_plugins/imageformats/libqjp2.dylib new file mode 100755 index 0000000..589265b Binary files /dev/null and b/qt_plugins/imageformats/libqjp2.dylib differ diff --git a/qt_plugins/imageformats/libqjpeg.dylib b/qt_plugins/imageformats/libqjpeg.dylib new file mode 100755 index 0000000..9b4c006 Binary files /dev/null and b/qt_plugins/imageformats/libqjpeg.dylib differ diff --git a/qt_plugins/imageformats/libqmacheif.dylib b/qt_plugins/imageformats/libqmacheif.dylib new file mode 100755 index 0000000..a5ca073 Binary files /dev/null and b/qt_plugins/imageformats/libqmacheif.dylib differ diff --git a/qt_plugins/imageformats/libqmng.dylib b/qt_plugins/imageformats/libqmng.dylib new file mode 100755 index 0000000..b03723d Binary files /dev/null and b/qt_plugins/imageformats/libqmng.dylib differ diff --git a/qt_plugins/imageformats/libqpdf.dylib b/qt_plugins/imageformats/libqpdf.dylib new file mode 100755 index 0000000..10a7c59 Binary files /dev/null and b/qt_plugins/imageformats/libqpdf.dylib differ diff --git a/qt_plugins/imageformats/libqsvg.dylib b/qt_plugins/imageformats/libqsvg.dylib new file mode 100755 index 0000000..a9cc580 Binary files /dev/null and b/qt_plugins/imageformats/libqsvg.dylib differ diff --git a/qt_plugins/imageformats/libqtga.dylib b/qt_plugins/imageformats/libqtga.dylib new file mode 100755 index 0000000..67f39da Binary files /dev/null and b/qt_plugins/imageformats/libqtga.dylib differ diff --git a/qt_plugins/imageformats/libqtiff.dylib b/qt_plugins/imageformats/libqtiff.dylib new file mode 100755 index 0000000..bf7ea97 Binary files /dev/null and b/qt_plugins/imageformats/libqtiff.dylib differ diff --git a/qt_plugins/imageformats/libqwbmp.dylib b/qt_plugins/imageformats/libqwbmp.dylib new file mode 100755 index 0000000..f057406 Binary files /dev/null and b/qt_plugins/imageformats/libqwbmp.dylib differ diff --git a/qt_plugins/imageformats/libqwebp.dylib b/qt_plugins/imageformats/libqwebp.dylib new file mode 100755 index 0000000..557482f Binary files /dev/null and b/qt_plugins/imageformats/libqwebp.dylib differ diff --git a/qt_plugins/multimedia/libdarwinmediaplugin.dylib b/qt_plugins/multimedia/libdarwinmediaplugin.dylib new file mode 100755 index 0000000..a2c0e2c Binary files /dev/null and b/qt_plugins/multimedia/libdarwinmediaplugin.dylib differ diff --git a/qt_plugins/networkinformation/libqglib.dylib b/qt_plugins/networkinformation/libqglib.dylib new file mode 100755 index 0000000..0855317 Binary files /dev/null and b/qt_plugins/networkinformation/libqglib.dylib differ diff --git a/qt_plugins/networkinformation/libqscnetworkreachability.dylib b/qt_plugins/networkinformation/libqscnetworkreachability.dylib new file mode 100755 index 0000000..72b348b Binary files /dev/null and b/qt_plugins/networkinformation/libqscnetworkreachability.dylib differ diff --git a/qt_plugins/opcua/libopen62541_backend.dylib b/qt_plugins/opcua/libopen62541_backend.dylib new file mode 100755 index 0000000..5578936 Binary files /dev/null and b/qt_plugins/opcua/libopen62541_backend.dylib differ diff --git a/qt_plugins/permissions/libqdarwinbluetoothpermission.a b/qt_plugins/permissions/libqdarwinbluetoothpermission.a new file mode 100644 index 0000000..b8122f3 Binary files /dev/null and b/qt_plugins/permissions/libqdarwinbluetoothpermission.a differ diff --git a/qt_plugins/permissions/libqdarwinbluetoothpermission.prl b/qt_plugins/permissions/libqdarwinbluetoothpermission.prl new file mode 100644 index 0000000..9f6d1ba --- /dev/null +++ b/qt_plugins/permissions/libqdarwinbluetoothpermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwinbluetoothpermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework CoreBluetooth +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework CoreBluetooth diff --git a/qt_plugins/permissions/libqdarwincalendarpermission.a b/qt_plugins/permissions/libqdarwincalendarpermission.a new file mode 100644 index 0000000..21e7ec4 Binary files /dev/null and b/qt_plugins/permissions/libqdarwincalendarpermission.a differ diff --git a/qt_plugins/permissions/libqdarwincalendarpermission.prl b/qt_plugins/permissions/libqdarwincalendarpermission.prl new file mode 100644 index 0000000..fb7e5e9 --- /dev/null +++ b/qt_plugins/permissions/libqdarwincalendarpermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwincalendarpermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework EventKit +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework EventKit diff --git a/qt_plugins/permissions/libqdarwincamerapermission.a b/qt_plugins/permissions/libqdarwincamerapermission.a new file mode 100644 index 0000000..f319588 Binary files /dev/null and b/qt_plugins/permissions/libqdarwincamerapermission.a differ diff --git a/qt_plugins/permissions/libqdarwincamerapermission.prl b/qt_plugins/permissions/libqdarwincamerapermission.prl new file mode 100644 index 0000000..1085b53 --- /dev/null +++ b/qt_plugins/permissions/libqdarwincamerapermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwincamerapermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework AVFoundation +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework AVFoundation diff --git a/qt_plugins/permissions/libqdarwincontactspermission.a b/qt_plugins/permissions/libqdarwincontactspermission.a new file mode 100644 index 0000000..548b88c Binary files /dev/null and b/qt_plugins/permissions/libqdarwincontactspermission.a differ diff --git a/qt_plugins/permissions/libqdarwincontactspermission.prl b/qt_plugins/permissions/libqdarwincontactspermission.prl new file mode 100644 index 0000000..a2d9c0e --- /dev/null +++ b/qt_plugins/permissions/libqdarwincontactspermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwincontactspermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework Contacts +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework Contacts diff --git a/qt_plugins/permissions/libqdarwinlocationpermission.a b/qt_plugins/permissions/libqdarwinlocationpermission.a new file mode 100644 index 0000000..6642bed Binary files /dev/null and b/qt_plugins/permissions/libqdarwinlocationpermission.a differ diff --git a/qt_plugins/permissions/libqdarwinlocationpermission.prl b/qt_plugins/permissions/libqdarwinlocationpermission.prl new file mode 100644 index 0000000..fe1aa38 --- /dev/null +++ b/qt_plugins/permissions/libqdarwinlocationpermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwinlocationpermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework CoreLocation +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework CoreLocation diff --git a/qt_plugins/permissions/libqdarwinmicrophonepermission.a b/qt_plugins/permissions/libqdarwinmicrophonepermission.a new file mode 100644 index 0000000..77ed4ff Binary files /dev/null and b/qt_plugins/permissions/libqdarwinmicrophonepermission.a differ diff --git a/qt_plugins/permissions/libqdarwinmicrophonepermission.prl b/qt_plugins/permissions/libqdarwinmicrophonepermission.prl new file mode 100644 index 0000000..ca6f7b7 --- /dev/null +++ b/qt_plugins/permissions/libqdarwinmicrophonepermission.prl @@ -0,0 +1,5 @@ +QMAKE_PRL_TARGET = libqdarwinmicrophonepermission.a +QMAKE_PRL_CONFIG = static +QMAKE_PRL_VERSION = 6.8.2 +QMAKE_PRL_LIBS = -F$$[QT_INSTALL_LIBS] -framework QtCore -framework IOKit -framework DiskArbitration -framework UniformTypeIdentifiers -framework Foundation -framework AVFoundation +QMAKE_PRL_LIBS_FOR_CMAKE = -F$$[QT_INSTALL_LIBS];-framework;QtCore;-framework IOKit;-framework DiskArbitration;-framework UniformTypeIdentifiers;-framework Foundation;-framework AVFoundation diff --git a/qt_plugins/permissions/objects-Release/QDarwinBluetoothPermissionPlugin_init/QDarwinBluetoothPermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinBluetoothPermissionPlugin_init/QDarwinBluetoothPermissionPlugin_init.cpp.o new file mode 100644 index 0000000..1f5594e Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinBluetoothPermissionPlugin_init/QDarwinBluetoothPermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/permissions/objects-Release/QDarwinCalendarPermissionPlugin_init/QDarwinCalendarPermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinCalendarPermissionPlugin_init/QDarwinCalendarPermissionPlugin_init.cpp.o new file mode 100644 index 0000000..8476489 Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinCalendarPermissionPlugin_init/QDarwinCalendarPermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/permissions/objects-Release/QDarwinCameraPermissionPlugin_init/QDarwinCameraPermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinCameraPermissionPlugin_init/QDarwinCameraPermissionPlugin_init.cpp.o new file mode 100644 index 0000000..f974b34 Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinCameraPermissionPlugin_init/QDarwinCameraPermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/permissions/objects-Release/QDarwinContactsPermissionPlugin_init/QDarwinContactsPermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinContactsPermissionPlugin_init/QDarwinContactsPermissionPlugin_init.cpp.o new file mode 100644 index 0000000..2410986 Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinContactsPermissionPlugin_init/QDarwinContactsPermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/permissions/objects-Release/QDarwinLocationPermissionPlugin_init/QDarwinLocationPermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinLocationPermissionPlugin_init/QDarwinLocationPermissionPlugin_init.cpp.o new file mode 100644 index 0000000..d836b6f Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinLocationPermissionPlugin_init/QDarwinLocationPermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/permissions/objects-Release/QDarwinMicrophonePermissionPlugin_init/QDarwinMicrophonePermissionPlugin_init.cpp.o b/qt_plugins/permissions/objects-Release/QDarwinMicrophonePermissionPlugin_init/QDarwinMicrophonePermissionPlugin_init.cpp.o new file mode 100644 index 0000000..94ff547 Binary files /dev/null and b/qt_plugins/permissions/objects-Release/QDarwinMicrophonePermissionPlugin_init/QDarwinMicrophonePermissionPlugin_init.cpp.o differ diff --git a/qt_plugins/platforminputcontexts/libqtvirtualkeyboardplugin.dylib b/qt_plugins/platforminputcontexts/libqtvirtualkeyboardplugin.dylib new file mode 100755 index 0000000..2c06f84 Binary files /dev/null and b/qt_plugins/platforminputcontexts/libqtvirtualkeyboardplugin.dylib differ diff --git a/qt_plugins/platforms/libqcocoa.dylib b/qt_plugins/platforms/libqcocoa.dylib new file mode 100755 index 0000000..889280a Binary files /dev/null and b/qt_plugins/platforms/libqcocoa.dylib differ diff --git a/qt_plugins/platforms/libqminimal.dylib b/qt_plugins/platforms/libqminimal.dylib new file mode 100755 index 0000000..e81a765 Binary files /dev/null and b/qt_plugins/platforms/libqminimal.dylib differ diff --git a/qt_plugins/platforms/libqoffscreen.dylib b/qt_plugins/platforms/libqoffscreen.dylib new file mode 100755 index 0000000..48d0a65 Binary files /dev/null and b/qt_plugins/platforms/libqoffscreen.dylib differ diff --git a/qt_plugins/position/libqtposition_cl.dylib b/qt_plugins/position/libqtposition_cl.dylib new file mode 100755 index 0000000..7b2609f Binary files /dev/null and b/qt_plugins/position/libqtposition_cl.dylib differ diff --git a/qt_plugins/position/libqtposition_nmea.dylib b/qt_plugins/position/libqtposition_nmea.dylib new file mode 100755 index 0000000..16f391c Binary files /dev/null and b/qt_plugins/position/libqtposition_nmea.dylib differ diff --git a/qt_plugins/position/libqtposition_positionpoll.dylib b/qt_plugins/position/libqtposition_positionpoll.dylib new file mode 100755 index 0000000..57694c8 Binary files /dev/null and b/qt_plugins/position/libqtposition_positionpoll.dylib differ diff --git a/qt_plugins/qmllint/libquicklintplugin.dylib b/qt_plugins/qmllint/libquicklintplugin.dylib new file mode 100755 index 0000000..7030a05 Binary files /dev/null and b/qt_plugins/qmllint/libquicklintplugin.dylib differ diff --git a/qt_plugins/qmlls/libqmllsquickplugin.dylib b/qt_plugins/qmlls/libqmllsquickplugin.dylib new file mode 100755 index 0000000..ba20b05 Binary files /dev/null and b/qt_plugins/qmlls/libqmllsquickplugin.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_debugger.dylib b/qt_plugins/qmltooling/libqmldbg_debugger.dylib new file mode 100755 index 0000000..2fa184c Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_debugger.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_inspector.dylib b/qt_plugins/qmltooling/libqmldbg_inspector.dylib new file mode 100755 index 0000000..a9503ce Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_inspector.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_local.dylib b/qt_plugins/qmltooling/libqmldbg_local.dylib new file mode 100755 index 0000000..994227c Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_local.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_messages.dylib b/qt_plugins/qmltooling/libqmldbg_messages.dylib new file mode 100755 index 0000000..e359090 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_messages.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_native.dylib b/qt_plugins/qmltooling/libqmldbg_native.dylib new file mode 100755 index 0000000..8cc2349 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_native.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_nativedebugger.dylib b/qt_plugins/qmltooling/libqmldbg_nativedebugger.dylib new file mode 100755 index 0000000..f0f6df7 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_nativedebugger.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_preview.dylib b/qt_plugins/qmltooling/libqmldbg_preview.dylib new file mode 100755 index 0000000..0b3eab2 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_preview.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_profiler.dylib b/qt_plugins/qmltooling/libqmldbg_profiler.dylib new file mode 100755 index 0000000..7d12387 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_profiler.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_quick3dprofiler.dylib b/qt_plugins/qmltooling/libqmldbg_quick3dprofiler.dylib new file mode 100755 index 0000000..64a0904 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_quick3dprofiler.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_quickprofiler.dylib b/qt_plugins/qmltooling/libqmldbg_quickprofiler.dylib new file mode 100755 index 0000000..dddba4d Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_quickprofiler.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_server.dylib b/qt_plugins/qmltooling/libqmldbg_server.dylib new file mode 100755 index 0000000..57bc0ac Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_server.dylib differ diff --git a/qt_plugins/qmltooling/libqmldbg_tcp.dylib b/qt_plugins/qmltooling/libqmldbg_tcp.dylib new file mode 100755 index 0000000..4c0dda8 Binary files /dev/null and b/qt_plugins/qmltooling/libqmldbg_tcp.dylib differ diff --git a/qt_plugins/renderers/libopenglrenderer.dylib b/qt_plugins/renderers/libopenglrenderer.dylib new file mode 100755 index 0000000..69f7f8a Binary files /dev/null and b/qt_plugins/renderers/libopenglrenderer.dylib differ diff --git a/qt_plugins/renderers/librhirenderer.dylib b/qt_plugins/renderers/librhirenderer.dylib new file mode 100755 index 0000000..4d80219 Binary files /dev/null and b/qt_plugins/renderers/librhirenderer.dylib differ diff --git a/qt_plugins/renderplugins/libscene2d.dylib b/qt_plugins/renderplugins/libscene2d.dylib new file mode 100755 index 0000000..297aadf Binary files /dev/null and b/qt_plugins/renderplugins/libscene2d.dylib differ diff --git a/qt_plugins/sceneparsers/libassimpsceneimport.dylib b/qt_plugins/sceneparsers/libassimpsceneimport.dylib new file mode 100755 index 0000000..c30c9c5 Binary files /dev/null and b/qt_plugins/sceneparsers/libassimpsceneimport.dylib differ diff --git a/qt_plugins/sceneparsers/libgltfsceneexport.dylib b/qt_plugins/sceneparsers/libgltfsceneexport.dylib new file mode 100755 index 0000000..701b4bc Binary files /dev/null and b/qt_plugins/sceneparsers/libgltfsceneexport.dylib differ diff --git a/qt_plugins/sceneparsers/libgltfsceneimport.dylib b/qt_plugins/sceneparsers/libgltfsceneimport.dylib new file mode 100755 index 0000000..54836de Binary files /dev/null and b/qt_plugins/sceneparsers/libgltfsceneimport.dylib differ diff --git a/qt_plugins/scxmldatamodel/libqscxmlecmascriptdatamodel.dylib b/qt_plugins/scxmldatamodel/libqscxmlecmascriptdatamodel.dylib new file mode 100755 index 0000000..43c9b8f Binary files /dev/null and b/qt_plugins/scxmldatamodel/libqscxmlecmascriptdatamodel.dylib differ diff --git a/qt_plugins/sensors/libqtsensors_generic.dylib b/qt_plugins/sensors/libqtsensors_generic.dylib new file mode 100755 index 0000000..00b9bc5 Binary files /dev/null and b/qt_plugins/sensors/libqtsensors_generic.dylib differ diff --git a/qt_plugins/sqldrivers/libqsqlite.dylib b/qt_plugins/sqldrivers/libqsqlite.dylib new file mode 100755 index 0000000..57c2d28 Binary files /dev/null and b/qt_plugins/sqldrivers/libqsqlite.dylib differ diff --git a/qt_plugins/styles/libqmacstyle.dylib b/qt_plugins/styles/libqmacstyle.dylib new file mode 100755 index 0000000..1f56999 Binary files /dev/null and b/qt_plugins/styles/libqmacstyle.dylib differ diff --git a/qt_plugins/texttospeech/libqtexttospeech_mock.dylib b/qt_plugins/texttospeech/libqtexttospeech_mock.dylib new file mode 100755 index 0000000..8cae0ba Binary files /dev/null and b/qt_plugins/texttospeech/libqtexttospeech_mock.dylib differ diff --git a/qt_plugins/texttospeech/libqtexttospeech_speech_macos.dylib b/qt_plugins/texttospeech/libqtexttospeech_speech_macos.dylib new file mode 100755 index 0000000..3de7c3d Binary files /dev/null and b/qt_plugins/texttospeech/libqtexttospeech_speech_macos.dylib differ diff --git a/qt_plugins/texttospeech/libqtexttospeech_speechdarwin.dylib b/qt_plugins/texttospeech/libqtexttospeech_speechdarwin.dylib new file mode 100755 index 0000000..8f0e6d8 Binary files /dev/null and b/qt_plugins/texttospeech/libqtexttospeech_speechdarwin.dylib differ diff --git a/qt_plugins/tls/libqcertonlybackend.dylib b/qt_plugins/tls/libqcertonlybackend.dylib new file mode 100755 index 0000000..5d5ec6a Binary files /dev/null and b/qt_plugins/tls/libqcertonlybackend.dylib differ diff --git a/qt_plugins/tls/libqopensslbackend.dylib b/qt_plugins/tls/libqopensslbackend.dylib new file mode 100755 index 0000000..b5281dc Binary files /dev/null and b/qt_plugins/tls/libqopensslbackend.dylib differ diff --git a/qt_plugins/tls/libqsecuretransportbackend.dylib b/qt_plugins/tls/libqsecuretransportbackend.dylib new file mode 100755 index 0000000..152a3f6 Binary files /dev/null and b/qt_plugins/tls/libqsecuretransportbackend.dylib differ diff --git a/qt_plugins/webview/libqtwebview_darwin.dylib b/qt_plugins/webview/libqtwebview_darwin.dylib new file mode 100755 index 0000000..9d09aae Binary files /dev/null and b/qt_plugins/webview/libqtwebview_darwin.dylib differ diff --git a/qt_plugins/webview/libqtwebview_webengine.dylib b/qt_plugins/webview/libqtwebview_webengine.dylib new file mode 100755 index 0000000..8872889 Binary files /dev/null and b/qt_plugins/webview/libqtwebview_webengine.dylib differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8784f05..6f88e31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,10 +8,10 @@ OPTION (DRIVELIST_FILTER_SYSTEM_DRIVES "Filter System drives from displayed driv set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "Which macOS architectures to build for") -project(rpi-imager LANGUAGES CXX C) -set(IMAGER_VERSION_MAJOR 1) -set(IMAGER_VERSION_MINOR 9) -set(IMAGER_VERSION_PATCH 2) +project(retro-imager LANGUAGES CXX C) +set(IMAGER_VERSION_MAJOR 0) +set(IMAGER_VERSION_MINOR 5) +set(IMAGER_VERSION_PATCH 0) set(IMAGER_VERSION_STR "${IMAGER_VERSION_MAJOR}.${IMAGER_VERSION_MINOR}.${IMAGER_VERSION_PATCH}") set(IMAGER_VERSION_CSV "${IMAGER_VERSION_MAJOR},${IMAGER_VERSION_MINOR},${IMAGER_VERSION_PATCH},0") add_definitions(-DIMAGER_VERSION_STR="${IMAGER_VERSION_STR}") @@ -21,10 +21,10 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) #add_link_options("-fsanitize=address") # You _must_ set your Qt6 root for the build to progress. -set(Qt6_ROOT "/opt/Qt/6.7.2/gcc_arm64" CACHE PATH "Your Qt6 root path") +set(Qt6_ROOT "$ENV{QT6_ROOT}" CACHE PATH "Your Qt6 root path") if (WIN32) - set(MINGW64_ROOT "" CACHE PATH "Your MinGW64 root path, likely provided by QtCreator") + set(MINGW64_ROOT "$ENV{MINGW64_ROOT}" CACHE PATH "Your MinGW64 root path, likely provided by QtCreator") endif() if (APPLE) @@ -384,12 +384,12 @@ if (WIN32) POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe" "${CMAKE_BINARY_DIR}/dependencies/fat32format/fat32format.exe" - "${CMAKE_SOURCE_DIR}/../license.txt" "${CMAKE_SOURCE_DIR}/windows/rpi-imager-cli.cmd" + "${CMAKE_SOURCE_DIR}/../license.txt" "${CMAKE_SOURCE_DIR}/windows/retro-imager-cli.cmd" "${CMAKE_BINARY_DIR}/deploy") configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/windows/rpi-imager.nsi.in" - "${CMAKE_CURRENT_BINARY_DIR}/rpi-imager.nsi" + "${CMAKE_CURRENT_SOURCE_DIR}/windows/retro-imager.nsi.in" + "${CMAKE_CURRENT_BINARY_DIR}/retro-imager.nsi" @ONLY) add_custom_command(TARGET ${PROJECT_NAME} @@ -402,7 +402,7 @@ if (WIN32) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND "${WINDEPLOYQT}" --no-translations --qmldir "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/deploy/rpi-imager.exe") + COMMAND "${WINDEPLOYQT}" --no-translations --qmldir "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/deploy/retro-imager.exe") # Remove excess files add_custom_command(TARGET ${PROJECT_NAME} @@ -433,32 +433,30 @@ elseif(APPLE) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND "${MACDEPLOYQT_EXECUTABLE}" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app" -qmldir="${CMAKE_CURRENT_SOURCE_DIR}") - add_custom_command(TARGET ${PROJECT_NAME} - POST_BUILD - COMMAND mv "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.app") + # Don't rename the app bundle, use the project name consistently # Sign the .app. add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND codesign -f --deep --digest-algorithm=sha1,sha256 -o runtime --timestamp -s "${IMAGER_SIGNING_IDENTITY}" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.app") + COMMAND codesign -f --deep --digest-algorithm=sha1,sha256 -o runtime --timestamp -s "${IMAGER_SIGNING_IDENTITY}" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app") # Create the .dmg for distribution add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND hdiutil create -volname "Raspberry Pi Imager" -srcfolder "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.app" -ov -format UDBZ "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.dmg") + COMMAND hdiutil create -volname "${PROJECT_NAME}" -srcfolder "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app" -ov -format UDBZ "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dmg") # Sign the .dmg for distribution, but do not initialise notarisation add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND codesign -f --digest-algorithm=sha1,sha256 -o runtime --timestamp -s "${IMAGER_SIGNING_IDENTITY}" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.dmg") + COMMAND codesign -f --digest-algorithm=sha1,sha256 -o runtime --timestamp -s "${IMAGER_SIGNING_IDENTITY}" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dmg") if(IMAGER_NOTARIZE_APP) if(IMAGER_NOTARIZE_KEYCHAIN_PROFILE) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND xcrun notarytool submit "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.dmg" --wait --keychain-profile "${IMAGER_NOTARIZE_KEYCHAIN_PROFILE}") + COMMAND xcrun notarytool submit "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dmg" --wait --keychain-profile "${IMAGER_NOTARIZE_KEYCHAIN_PROFILE}") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND xcrun stapler staple "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.dmg") + COMMAND xcrun stapler staple "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dmg") else() message(FATAL_ERROR "Notarization requested, but no keychain profile is supplied") endif(IMAGER_NOTARIZE_KEYCHAIN_PROFILE) @@ -471,12 +469,12 @@ elseif(APPLE) # Unsigned application add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND "${MACDEPLOYQT_EXECUTABLE}" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.app" -qmldir="${CMAKE_CURRENT_SOURCE_DIR}" -always-overwrite -no-strip -dmg) + COMMAND "${MACDEPLOYQT_EXECUTABLE}" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app" -qmldir="${CMAKE_CURRENT_SOURCE_DIR}" -always-overwrite -no-strip -dmg) endif(IMAGER_SIGNED_APP) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND "mv" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager.dmg" "${CMAKE_BINARY_DIR}/Raspberry\ Pi\ Imager-${IMAGER_VERSION_STR}.dmg") + COMMAND "mv" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dmg" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}-${IMAGER_VERSION_STR}.dmg") else() # UNIX, Linux systems @@ -494,7 +492,7 @@ else() install(TARGETS ${PROJECT_NAME} DESTINATION bin) install(FILES "${CMAKE_CURRENT_LIST_DIR}/../debian/rpi-imager.png" DESTINATION share/icons/hicolor/128x128/apps) - install(FILES "linux/org.raspberrypi.rpi-imager.desktop" DESTINATION share/applications) + install(FILES "linux/org.coreymclark.retro-imager.desktop" DESTINATION share/applications) install(FILES "${CMAKE_CURRENT_LIST_DIR}/../debian/rpi-imager.metainfo.xml" DESTINATION share/metainfo) endif() diff --git a/src/config.h b/src/config.h index d148216..3527123 100644 --- a/src/config.h +++ b/src/config.h @@ -8,13 +8,13 @@ /* Repository URL */ -#define OSLIST_URL "https://raw.githubusercontent.com/cmclark00/retro-imager/boogaloo/src/os_list.json" +#define OSLIST_URL "https://raw.githubusercontent.com/cmclark00/retro-imager/refs/heads/fix/src/os_list.json" /* Time synchronization URL (only used on eglfs QPA platform, URL must be HTTP) */ #define TIME_URL "http://downloads.raspberrypi.org/os_list_imagingutility_v4.json?time_synchronization" /* Phone home the name of images downloaded for image popularity ranking */ -#define TELEMETRY_URL "https://rpi-imager-stats.raspberrypi.com/downloads" +#define TELEMETRY_URL "http://technerdguys.com/telemetry-endpoint" /* Hash algorithm for verifying (uncompressed image) checksum */ #define OSLIST_HASH_ALGORITHM QCryptographicHash::Sha256 diff --git a/src/icons/banner.png b/src/icons/banner.png new file mode 100644 index 0000000..000982c Binary files /dev/null and b/src/icons/banner.png differ diff --git a/src/icons/icon.png b/src/icons/icon.png new file mode 100644 index 0000000..9ca2554 Binary files /dev/null and b/src/icons/icon.png differ diff --git a/src/icons/logo.png b/src/icons/logo.png new file mode 100644 index 0000000..07540a1 Binary files /dev/null and b/src/icons/logo.png differ diff --git a/src/icons/rocknix.png b/src/icons/rocknix.png new file mode 100644 index 0000000..0dceb47 Binary files /dev/null and b/src/icons/rocknix.png differ diff --git a/src/icons/rpi-imager.ico b/src/icons/rpi-imager.ico index ecb494b..bf62901 100644 Binary files a/src/icons/rpi-imager.ico and b/src/icons/rpi-imager.ico differ diff --git a/src/linux/org.raspberrypi.rpi-imager.desktop b/src/linux/org.coreymclark.retro-imager.desktop similarity index 72% rename from src/linux/org.raspberrypi.rpi-imager.desktop rename to src/linux/org.coreymclark.retro-imager.desktop index 5236899..1d6236e 100644 --- a/src/linux/org.raspberrypi.rpi-imager.desktop +++ b/src/linux/org.coreymclark.retro-imager.desktop @@ -1,11 +1,11 @@ [Desktop Entry] Type=Application Version=1.0 -Name=Raspberry Pi Imager +Name=Retro Imager Name[zh_CN]=树莓派启动盘制作工具 -Comment=Raspberry Pi Imager +Comment=Retro Imager Comment[zh_CN]=树莓派启动盘制作工具 Icon=rpi-imager -Exec=rpi-imager %F +Exec=retro-imager %F Categories=Utility StartupNotify=false diff --git a/src/main.qml b/src/main.qml index 162445c..7b202f8 100644 --- a/src/main.qml +++ b/src/main.qml @@ -11,7 +11,7 @@ import QtQuick.Controls.Material 2.2 import "qmlcomponents" ApplicationWindow { - // Define the colors + // Define the colors property color beigeColor: "#c4bebb" property color maroonColor: "#800000" property color yellowColor: "#fcad01" @@ -26,7 +26,7 @@ ApplicationWindow { minimumWidth: imageWriter.isEmbeddedMode() ? -1 : 680 minimumHeight: imageWriter.isEmbeddedMode() ? -1 : 450 - title: qsTr("Retro Imager v0.1") + title: qsTr("Retro Imager v%1").arg(imageWriter.constantVersion()) FontLoader {id: roboto; source: "fonts/Roboto-Regular.ttf"} FontLoader {id: robotoLight; source: "fonts/Roboto-Light.ttf"} FontLoader {id: robotoBold; source: "fonts/Roboto-Bold.ttf"} @@ -60,28 +60,20 @@ ApplicationWindow { id: bg spacing: 0 + Rectangle { id: logoContainer + color: accentColor implicitHeight: window.height/4 Image { id: image - source: "icons/logo_sxs_imager.png" - - // Specify the maximum size of the image - width: window.width + source: "icons/banner.png" + width: window.width * 1 height: window.height / 3 - smooth: true antialiasing: true - - anchors { - left: logoContainer.left - top: logoContainer.top - bottom: logoContainer.bottom - topMargin: window.height - bottomMargin: window.height - } + fillMode: image.PreserveAspectFit } } @@ -146,8 +138,8 @@ ApplicationWindow { bgrect.mouseOver = false } onClicked: { - hwpopup.open() - hwlist.forceActiveFocus() + hwpopup.open() + hwlist.forceActiveFocus() } } Rectangle { @@ -203,8 +195,8 @@ ApplicationWindow { bgrect1.mouseOver = false } onClicked: { - ospopup.open() - osswipeview.currentItem.forceActiveFocus() + ospopup.open() + osswipeview.currentItem.forceActiveFocus() } } @@ -262,10 +254,10 @@ ApplicationWindow { bgrect2.mouseOver = false } onClicked: { - imageWriter.startDriveListPolling() - dstpopup.open() - dstlist.forceActiveFocus() - } + imageWriter.startDriveListPolling() + dstpopup.open() + dstlist.forceActiveFocus() + } } Rectangle { @@ -487,6 +479,8 @@ ApplicationWindow { } } + // Popup for hardware device selection with nested structure + // Updated hwpopup definition Popup { id: hwpopup x: 50 @@ -496,6 +490,21 @@ ApplicationWindow { padding: 0 closePolicy: Popup.CloseOnEscape property string hwselected: "" + property string categorySelected: "" + + // Make sure to create both lists when the popup opens + onOpened: { + // Initialize the SwipeView if needed + if (hwswipeview.count < 2) { + // Make sure we already have the second view for device list + var secondView = subHwlist.createObject(hwswipeview) + hwswipeview.addItem(secondView) + } + + // Make sure we're showing the first view (categories) + hwswipeview.currentIndex = 0 + hwTitleText.text = qsTr("Retro Gaming Handheld Device") + } // background of title Rectangle { @@ -507,7 +516,8 @@ ApplicationWindow { width: parent.width Text { - text: qsTr("Raspberry Pi Device") + id: hwTitleText + text: qsTr("Retro Gaming Handheld Device") horizontalAlignment: Text.AlignHCenter anchors.fill: parent anchors.topMargin: 10 @@ -536,6 +546,7 @@ ApplicationWindow { } } } + // line under title Rectangle { id: hwpopup_title_separator @@ -545,30 +556,109 @@ ApplicationWindow { height: 1 } - ListView { - id: hwlist - clip: true - model: ListModel { - id: deviceModel - ListElement { - name: qsTr("[ All ]") - tags: "[]" - icon: "" - description: "" - matching_type: "exclusive" - } - } - currentIndex: -1 - delegate: hwdelegate + SwipeView { anchors.top: hwpopup_title_separator.bottom anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom + id: hwswipeview + interactive: false + clip: true + // Add debug printing for SwipeView changes + onCurrentIndexChanged: { + console.log("SwipeView current index changed to: " + currentIndex) + } + + ListView { + id: hwlist + clip: true + model: ListModel { + id: categoryModel + // Main categories will be loaded from JSON + } + currentIndex: -1 + delegate: hwdelegate + boundsBehavior: Flickable.StopAtBounds + ScrollBar.vertical: ScrollBar { + anchors.right: parent.right + width: 10 + policy: hwlist.contentHeight > hwlist.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + } + Keys.onSpacePressed: { + if (currentIndex != -1) + selectHWcategory(model.get(currentIndex)) + } + Accessible.onPressAction: { + if (currentIndex != -1) + selectHWcategory(model.get(currentIndex)) + } + Keys.onEnterPressed: Keys.onSpacePressed(event) + Keys.onReturnPressed: Keys.onSpacePressed(event) + Keys.onRightPressed: { + // Navigate into subcategories + if (currentIndex != -1 && typeof model.get(currentIndex).subitems !== "undefined") + selectHWcategory(model.get(currentIndex), true) + } + } + + // Add the initial device list view directly to ensure it exists + ListView { + id: initialDeviceList + clip: true + model: ListModel { + ListElement { + name: "Back" + tags: "[]" + icon: "icons/ic_chevron_left_40px.svg" + description: "Go back to main menu" + } + } + currentIndex: -1 + delegate: hwdelegate + boundsBehavior: Flickable.StopAtBounds + ScrollBar.vertical: ScrollBar { + width: 10 + policy: parent.contentHeight > parent.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + } + Keys.onSpacePressed: { + if (currentIndex != -1) + selectHWitem(model.get(currentIndex)) + } + Accessible.onPressAction: { + if (currentIndex != -1) + selectHWitem(model.get(currentIndex)) + } + Keys.onEnterPressed: Keys.onSpacePressed(event) + Keys.onReturnPressed: Keys.onSpacePressed(event) + Keys.onLeftPressed: { + hwswipeview.decrementCurrentIndex() + hwpopup.categorySelected = "" + hwTitleText.text = qsTr("Retro Gaming Handheld Device") + } + } + } + } + + // Component for the device subcategory list + Component { + id: subHwlist + + ListView { + clip: true + model: ListModel { + ListElement { + name: "Back" + tags: "[]" + icon: "icons/ic_chevron_left_40px.svg" + description: "Go back to main menu" + } + } + currentIndex: -1 + delegate: hwdelegate boundsBehavior: Flickable.StopAtBounds ScrollBar.vertical: ScrollBar { - anchors.right: parent.right width: 10 - policy: hwlist.contentHeight > hwlist.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + policy: parent.contentHeight > parent.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded } Keys.onSpacePressed: { if (currentIndex != -1) @@ -580,6 +670,11 @@ ApplicationWindow { } Keys.onEnterPressed: Keys.onSpacePressed(event) Keys.onReturnPressed: Keys.onSpacePressed(event) + Keys.onLeftPressed: { + hwswipeview.decrementCurrentIndex() + hwpopup.categorySelected = "" + hwTitleText.text = qsTr("Retro Gaming Handheld Device") + } } } @@ -751,13 +846,14 @@ ApplicationWindow { } } + // Hardware delegate component for displaying devices and categories Component { id: hwdelegate Item { width: window.width-100 height: contentLayout.implicitHeight + 24 - Accessible.name: name+".\n"+description + Accessible.name: name+".\n"+(typeof description === "undefined" ? "" : description) MouseArea { id: hwMouseArea @@ -766,27 +862,31 @@ ApplicationWindow { hoverEnabled: true onEntered: { - bgrect.mouseOver = true + bgrect3.mouseOver = true } onExited: { - bgrect.mouseOver = false + bgrect3.mouseOver = false } onClicked: { - selectHWitem(model) + if (typeof subitems !== "undefined" && subitems) { + selectHWcategory(model) + } else { + selectHWitem(model) + } } } Rectangle { - id: bgrect + id: bgrect3 anchors.fill: parent color: accentColor visible: mouseOver && parent.ListView.view.currentIndex !== index property bool mouseOver: false } Rectangle { - id: borderrect + id: borderrect2 implicitHeight: 1 implicitWidth: parent.width color: accentColor @@ -825,11 +925,21 @@ ApplicationWindow { Text { Layout.fillWidth: true + text: typeof description === "undefined" ? "" : description font.family: roboto.name wrapMode: Text.WordWrap color: accentColor } } + + // Show right chevron for categories with subitems + Image { + source: "icons/ic_chevron_right_40px.svg" + visible: typeof subitems !== "undefined" && subitems + Layout.preferredHeight: 40 + Layout.preferredWidth: 40 + fillMode: Image.PreserveAspectFit + } } } } @@ -1561,54 +1671,118 @@ ApplicationWindow { } } + // Function to fetch OS list and populate the hardware categories function fetchOSlist() { - var oslist_json = imageWriter.getFilteredOSlist(); - var o = JSON.parse(oslist_json) - var oslist_parsed = oslistFromJson(o) - if (oslist_parsed === false) - return - osmodel.clear() - for (var i in oslist_parsed) { - osmodel.append(oslist_parsed[i]) - } + try { + var oslist_json = imageWriter.getFilteredOSlist(); + var o = JSON.parse(oslist_json); + var oslist_parsed = oslistFromJson(o); + + if (oslist_parsed === false) { + return; + } + + osmodel.clear(); + for (var i in oslist_parsed) { + osmodel.append(oslist_parsed[i]); + } - if ("imager" in o) { - var imager = o["imager"] + if ("imager" in o) { + var imager = o["imager"]; - if ("devices" in imager) - { - deviceModel.clear() - var devices = imager["devices"] - for (var j in devices) - { - devices[j]["tags"] = JSON.stringify(devices[j]["tags"]) - deviceModel.append(devices[j]) - if ("default" in devices[j] && devices[j]["default"]) - { - hwlist.currentIndex = deviceModel.count-1 + if ("devices" in imager) { + // Clear the category model + categoryModel.clear(); + + // Add an "All" option at the top + categoryModel.append({ + name: qsTr("[ All ]"), + tags: "[]", + icon: "", + description: qsTr("Show firmware for all devices"), + matching_type: "inclusive" + }); + + // Process device categories more safely + var devices = imager["devices"]; + if (devices && Array.isArray(devices)) { + for (var j = 0; j < devices.length; j++) { + // Create a plain JavaScript object (not a complex QML type) + var device = { + name: devices[j].name || "", + description: devices[j].description || "", + icon: devices[j].icon || "", + matching_type: devices[j].matching_type || "" + }; + + // Handle subitems properly + if (devices[j].subitems && Array.isArray(devices[j].subitems)) { + // Create a new array for subitems + var subitems = []; + + for (var k = 0; k < devices[j].subitems.length; k++) { + var subitem = devices[j].subitems[k]; + + // Create a plain object with only the properties we need + var newSubitem = { + name: subitem.name || "", + description: subitem.description || "", + icon: subitem.icon || "", + matching_type: subitem.matching_type || "" + }; + + // Ensure tags is a properly formatted string + if (subitem.tags) { + if (typeof subitem.tags === "string") { + newSubitem.tags = subitem.tags; + } else if (Array.isArray(subitem.tags)) { + newSubitem.tags = JSON.stringify(subitem.tags); + } else { + newSubitem.tags = "[]"; + } + } else { + newSubitem.tags = "[]"; + } + + subitems.push(newSubitem); + } + + // Add the subitems array + device.subitems = subitems; + } + + // Add the device category to the model + categoryModel.append(device); + } + } + } + + // Rest of your function remains unchanged + if (imageWriter.getBoolSetting("check_version") && "latest_version" in imager && "url" in imager) { + if (!imageWriter.isEmbeddedMode() && imageWriter.isVersionNewer(imager["latest_version"])) { + updatepopup.url = imager["url"]; + updatepopup.openPopup(); + } + } + + if ("default_os" in imager) { + selectNamedOS(imager["default_os"], osmodel); + } + + if (imageWriter.isEmbeddedMode()) { + if ("embedded_default_os" in imager) { + selectNamedOS(imager["embedded_default_os"], osmodel); + } + if ("embedded_default_destination" in imager) { + imageWriter.startDriveListPolling(); + setDefaultDest.drive = imager["embedded_default_destination"]; + setDefaultDest.start(); } } } - - if (imageWriter.getBoolSetting("check_version") && "latest_version" in imager && "url" in imager) { - if (!imageWriter.isEmbeddedMode() && imageWriter.isVersionNewer(imager["latest_version"])) { - updatepopup.url = imager["url"] - updatepopup.openPopup() - } - } - if ("default_os" in imager) { - selectNamedOS(imager["default_os"], osmodel) - } - if (imageWriter.isEmbeddedMode()) { - if ("embedded_default_os" in imager) { - selectNamedOS(imager["embedded_default_os"], osmodel) - } - if ("embedded_default_destination" in imager) { - imageWriter.startDriveListPolling() - setDefaultDest.drive = imager["embedded_default_destination"] - setDefaultDest.start() - } - } + } catch (e) { + console.error("Error in fetchOSlist:", e); + onError("Error loading device list: " + e.message); } } @@ -1652,63 +1826,265 @@ ApplicationWindow { return m } + // Function to handle new category/subcategory hardware list + function newHwSublist() { + try { + // Make sure we have enough items in SwipeView + if (hwswipeview.count <= hwswipeview.currentIndex + 1) { + var newlist = subHwlist.createObject(hwswipeview); + if (!newlist) { + console.error("Failed to create subHwlist component"); + return null; + } + hwswipeview.addItem(newlist); + } + + var nextView = hwswipeview.itemAt(hwswipeview.currentIndex + 1); + if (!nextView) { + console.error("Failed to get next view in SwipeView"); + return null; + } + + var m = nextView.model; + if (!m) { + console.error("Next view does not have a model"); + return null; + } + + // Clear existing items except for the first one (Back button) + if (m.count > 1) { + m.remove(1, m.count - 1); + } + + return m; + } catch (e) { + console.error("Error in newHwSublist:", e); + return null; + } + } + + // Function to select a hardware category (parent item with subitems) + function selectHWcategory(hwmodel, navigateOnly) { + try { + // Add defensive checks + if (!hwmodel) { + console.error("selectHWcategory called with null model"); + return; + } + + if (hwmodel.name === qsTr("Back")) { + hwswipeview.decrementCurrentIndex(); + hwpopup.categorySelected = ""; + hwTitleText.text = qsTr("Retro Gaming Handheld Device"); + return; + } + + // Update the title to show current category + hwTitleText.text = hwmodel.name; + hwpopup.categorySelected = hwmodel.name; + + // Make sure we have a SwipeView with at least two items + if (hwswipeview.count < 2) { + // Create a new sublist view if needed + var newlist = subHwlist.createObject(hwswipeview); + if (!newlist) { + console.error("Failed to create new subHwlist"); + return; + } + hwswipeview.addItem(newlist); + } + + // Get the model of the next view + var nextView = hwswipeview.itemAt(hwswipeview.currentIndex + 1); + if (!nextView) { + console.error("Failed to get next view in SwipeView"); + return; + } + + var m = nextView.model; + if (!m) { + console.error("Next view does not have a model"); + return; + } + + // Clear all items except the first one (Back button) + if (m.count > 1) { + m.remove(1, m.count - 1); + } + + // Parse subitems if they exist - use a safer approach + if (typeof hwmodel.subitems !== "undefined" && hwmodel.subitems) { + var subitems = hwmodel.subitems; + + console.log("Processing subitems for: " + hwmodel.name); + console.log("Subitems type: " + typeof subitems); + + // Check if we need to convert an object to an array + if (!Array.isArray(subitems) && typeof subitems === "object") { + console.log("Converting object to array"); + var subitemsArray = []; + for (var key in subitems) { + if (subitems.hasOwnProperty(key)) { + var subitem = subitems[key]; + // Make sure each item has a name property + if (typeof subitem === "object") { + if (!subitem.name && key) { + subitem.name = key; + } + subitemsArray.push(subitem); + } + } + } + subitems = subitemsArray; + } + + // Make sure subitems is an array before iterating + if (Array.isArray(subitems)) { + console.log("Subitems count: " + subitems.length); + + for (var i = 0; i < subitems.length; i++) { + console.log("Processing subitem: " + i + " - " + (subitems[i].name || "unnamed")); + + // Create a simple object with just the properties we need + var item = { + name: subitems[i].name || "", + description: subitems[i].description || "", + icon: subitems[i].icon || "", + matching_type: subitems[i].matching_type || "" + }; + + // Handle tags appropriately + if (typeof subitems[i].tags === "string") { + item.tags = subitems[i].tags; + } else if (Array.isArray(subitems[i].tags)) { + item.tags = JSON.stringify(subitems[i].tags); + } else { + item.tags = "[]"; + } + + m.append(item); + } + + // Now explicitly increment the SwipeView index to show the device list + console.log("Setting next view current index to 0"); + nextView.currentIndex = 0; + + console.log("Incrementing SwipeView from index: " + hwswipeview.currentIndex); + hwswipeview.incrementCurrentIndex(); + console.log("New SwipeView index: " + hwswipeview.currentIndex); + } else { + console.error("Subitems is not an array or object: " + typeof subitems); + onError("Error: Invalid subitems format"); + } + } else { + console.log("No subitems found for: " + hwmodel.name); + + // If it's not a navigation-only action and has no subitems, select the item + if (!navigateOnly) { + selectHWitem(hwmodel); + } + } + } catch (e) { + console.error("Error in selectHWcategory:", e); + onError("Error navigating hardware categories: " + e.message); + } + } + function selectHWitem(hwmodel) { - /* Default is exclusive matching */ - var inclusive = false - - if (hwmodel.matching_type) { - switch (hwmodel.matching_type) { - case "exclusive": - break; - case "inclusive": - inclusive = true - break; + try { + // Add defensive checks + if (!hwmodel) { + console.error("selectHWitem called with null model"); + return; } - } - imageWriter.setHWFilterList(hwmodel.tags, inclusive) - - /* Reload list */ - var oslist_json = imageWriter.getFilteredOSlist(); - var o = JSON.parse(oslist_json) - var oslist_parsed = oslistFromJson(o) - if (oslist_parsed === false) - return - - /* As we're filtering the OS list, we need to ensure we present a 'Recommended' OS. - * To do this, we exploit a convention of how we build the OS list. By convention, - * the preferred OS for a device is listed at the top level of the list, and is at the - * lowest index. So.. - */ - if (oslist_parsed.length != 0) { - var candidate = oslist_parsed[0] - - if ("description" in candidate && - !("subitems" in candidate) && - !candidate["description"].includes("(Recommended)") - ) - { - candidate["description"] += " (Recommended)" + if (hwmodel.name === qsTr("Back")) { + hwswipeview.decrementCurrentIndex(); + hwTitleText.text = qsTr("Retro Gaming Handheld Device"); + hwpopup.categorySelected = ""; + return; } + + // Default is exclusive matching + var inclusive = false; + + if (hwmodel.matching_type) { + switch (hwmodel.matching_type) { + case "exclusive": + break; + case "inclusive": + inclusive = true; + break; + } + } + + // Handle tags with extra care + var tags = []; + + try { + if (typeof hwmodel.tags === "string") { + if (hwmodel.tags === "[]" || hwmodel.tags === "") { + // Empty tags array + tags = []; + } else { + // Parse JSON string + tags = JSON.parse(hwmodel.tags); + } + } else if (Array.isArray(hwmodel.tags)) { + // Direct array + tags = hwmodel.tags; + } else if (hwmodel.tags) { + // Some other value, convert to string and try to parse + tags = JSON.parse(String(hwmodel.tags)); + } + } catch (e) { + console.error("Error parsing tags:", e); + tags = []; + } + + // Call the filtering function with the parsed tags + console.log("Setting HW filter with tags:", JSON.stringify(tags)); + imageWriter.setHWFilterList(tags, inclusive); + + // Reload list + var oslist_json = imageWriter.getFilteredOSlist(); + var o = JSON.parse(oslist_json); + var oslist_parsed = oslistFromJson(o); + + if (oslist_parsed === false) { + return; + } + + if (oslist_parsed.length != 0) { + var candidate = oslist_parsed[0]; + + if ("description" in candidate && + !("subitems" in candidate) && + !candidate["description"].includes("(Recommended)") + ) + { + candidate["description"] += " (Recommended)"; + } + } + + osmodel.clear(); + for (var i in oslist_parsed) { + osmodel.append(oslist_parsed[i]); + } + + // When the HW device is changed, reset the OS selection + oslist.currentIndex = -1; + osswipeview.currentIndex = 0; + imageWriter.setSrc(""); + osbutton.text = qsTr("CHOOSE CFW"); + writebutton.enabled = false; + + hwbutton.text = hwmodel.name; + hwpopup.close(); + } catch (e) { + console.error("Error in selectHWitem:", e); + onError("Error selecting hardware item: " + e.message); } - - osmodel.clear() - for (var i in oslist_parsed) { - osmodel.append(oslist_parsed[i]) - } - - // When the HW device is changed, reset the OS selection otherwise - // you get a weird effect with the selection moving around in the list - // when the user next opens the OS list, and the user could still have - // an OS selected which isn't compatible with this HW device - oslist.currentIndex = -1 - osswipeview.currentIndex = 0 - imageWriter.setSrc("") - osbutton.text = qsTr("CHOOSE CFW") - writebutton.enabled = false - - hwbutton.text = hwmodel.name - hwpopup.close() } /// Is the item a sub-list or sub-sub-list in the OS selection model? @@ -1733,6 +2109,29 @@ ApplicationWindow { if (typeof(d.subitems_json) == "string" && d.subitems_json !== "") { var m = newSublist() var subitems = JSON.parse(d.subitems_json) + + // Handle the case when subitems is an object instead of an array + if (!Array.isArray(subitems) && typeof subitems === "object") { + console.log("Converting object to array from subitems_json"); + + // Create an array from the object properties + var subitemsArray = []; + for (var key in subitems) { + if (subitems.hasOwnProperty(key)) { + var subitem = subitems[key]; + // Make sure each item has a name property + if (typeof subitem === "object") { + if (!subitem.name && key) { + subitem.name = key; + } + subitemsArray.push(subitem); + } + } + } + + console.log("Converted to array with " + subitemsArray.length + " items"); + subitems = subitemsArray; + } for (var i in subitems) { @@ -1758,7 +2157,7 @@ ApplicationWindow { { console.log("Failure: Backend should have pre-flattened the JSON!"); - osswipeview.itemAt(osswipeview.currentIndex+1).currentIndex = (selectFirstSubitem === true) ? 0 : -1 + osswipeview.itemAt(osswipeview.currentIndex+1).currentIndex = (selectFirstSubitem ===true) ? 0 : -1 osswipeview.incrementCurrentIndex() } } else if (d.url === "") { @@ -1805,4 +2204,4 @@ ApplicationWindow { writebutton.enabled = true } } -} +} \ No newline at end of file diff --git a/src/os_list.json b/src/os_list.json index 2773259..fedc395 100644 --- a/src/os_list.json +++ b/src/os_list.json @@ -1,135 +1,552 @@ { - "os_list": [ - { - "name": "muOS 2410.1 Banana for RG35XX Plus", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX Plus.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-PLUS-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2151537628, - "extract_size": 4504682496, - "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", - "devices": [ - "rg35xx_plus" - ] - }, - { - "name": "muOS 2410.1 Banana for RG28XX", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG28XX.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG28XX-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2158432397, - "extract_size": 4504682496, - "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", - "devices": [ - "rg28xx" - ] - }, - { - "name": "muOS 2410.1 Banana for RG35XXH", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXH.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-H-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2132124667, - "extract_size": 4504682496, - "extract_sha256": "d0d54809fcc128e43a42a2e13bfcb3427be97e05d0776263612ccce08677ea08", - "devices": [ - "rg35xxh" - ] - }, - { - "name": "muOS 2410.1 Banana for RG35XXSP", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXSP.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-SP-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2176694960, - "extract_size": 4504682496, - "extract_sha256": "9a529d2f089bba6616615026c6ec16e282d622adbc6ae97172b7ab73d32092c4", - "devices": [ - "rg35xx_sp" - ] - }, - { - "name": "muOS 2410.1 Banana for RG35XX24", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX24.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-2024-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2151137645, - "extract_size": 4504682496, - "extract_sha256": "fc0da5aa0dcda244be8dec28115210200fe259c374bb7b25d6d26f4db812d351", - "devices": [ - "rg35xx_2024" - ] - }, - { - "name": "muOS 2410.1 Banana for RG40XXH", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXH.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-H-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2132388103, - "extract_size": 4504682496, - "extract_sha256": "fe51f4f3a7f9e51c34eb78ef704a9a6af0233d6fdf87ccd070444034003afe5c", - "devices": [ - "rg40xxh" - ] - }, - { - "name": "muOS 2410.1 Banana for RG40XXV", - "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXV.", - "icon": "https://muos.dev/lib/tpl/muos/images/logo.png", - "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-V-2410.1-BANANA-d1bae326.img.gz", - "release_date": "2024-10-12", - "image_download_size": 2132476961, - "extract_size": 4504682496, - "extract_sha256": "aa2cd35010e1414c62b0460d8f193d7a3c56ebcf3f59a220aebe995ab93bb051", - "devices": [ - "rg40xxv" - ] - } - ], - "imager": { - "devices": [ - { - "name": "Anbernic RG40XXH", - "tags": ["rg40xxh"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG40XX%20H.png?raw=true" - }, - { - "name": "Anbernic RG40XXV", - "tags": ["rg40xxv"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG40XX%20V.png?raw=true" - }, - { - "name": "Anbernic RG35XXH", - "tags": ["rg35xxh"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG35XX%20H.png?raw=true" - }, - { - "name": "Anbernic RG35XX Plus", - "tags": ["rg35xx_plus"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG35XX%20-%20PLUS.png?raw=true" - }, - { - "name": "Anbernic RG35XX SP", - "tags": ["rg35xx_sp"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG35XX%20SP.png?raw=true" - }, - { - "name": "Anbernic RG35XX 2024", - "tags": ["rg35xx_2024"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG35XX%20-%202024.png?raw=true" - }, - { - "name": "Anbernic RG28XX", - "tags": ["rg28xx"], - "icon": "https://github.com/cmclark00/retro-imager/blob/boogaloo/src/icons/RG28XX.png?raw=true" - } - - ] - } + "os_list": [ + { + "name": "muOS 2410.1 Banana for RG35XX Plus", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX Plus.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-PLUS-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2151537628, + "extract_size": 4504682496, + "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", + "devices": [ + "rg35xx_plus" + ] + }, + { + "name": "muOS 2410.1 Banana for RG28XX", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG28XX.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG28XX-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2158432397, + "extract_size": 4504682496, + "extract_sha256": "62c492047923e3e8709e0b015760b7f1e0db2ccab40e741fe067b49d96957624", + "devices": [ + "rg28xx" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XXH", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXH.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-H-2410.1-BANANA-a10951c4.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2118435484, + "extract_size": 4504682496, + "extract_sha256": "a84a1386de3b046aea05c75a4ccc8da0fbc2ee42f89b7b78a720cf657f45d3d2", + "devices": [ + "rg35xxh" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XXSP", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XXSP.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-SP-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2176694960, + "extract_size": 4504682496, + "extract_sha256": "9a529d2f089bba6616615026c6ec16e282d622adbc6ae97172b7ab73d32092c4", + "devices": [ + "rg35xx_sp" + ] + }, + { + "name": "muOS 2410.1 Banana for RG35XX24", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG35XX24.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG35XX-2024-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2151137645, + "extract_size": 4504682496, + "extract_sha256": "fc0da5aa0dcda244be8dec28115210200fe259c374bb7b25d6d26f4db812d351", + "devices": [ + "rg35xx_2024" + ] + }, + { + "name": "muOS 2410.1 Banana for RG40XXH", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXH.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-H-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2132388103, + "extract_size": 4504682496, + "extract_sha256": "fe51f4f3a7f9e51c34eb78ef704a9a6af0233d6fdf87ccd070444034003afe5c", + "devices": [ + "rg40xxh" + ] + }, + { + "name": "muOS 2410.1 Banana for RG40XXV", + "description": "muOS 2410.1 Banana firmware optimized for Anbernic RG40XXV.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/logo.png?raw=true", + "url": "https://dl.muos.dev/RELEASE/2410.1/muOS-RG40XX-V-2410.1-BANANA-d1bae326.img.gz", + "release_date": "2024-10-12", + "image_download_size": 2132476961, + "extract_size": 4504682496, + "extract_sha256": "aa2cd35010e1414c62b0460d8f193d7a3c56ebcf3f59a220aebe995ab93bb051", + "devices": [ + "rg40xxv" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3326 devices, A image.", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3326 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3326.aarch64-20241120-a.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1348717111, + "extract_size": 2197815296, + "extract_sha256": "8cc28cca1d4d88464cf156691a540111385c5b94f30aa067456cc80fcd12b747", + "devices": [ + "rg351p", + "rg351m", + "rg351v", + "r33s", + "r35s", + "r36s", + "oga", + "ogs", + "xu10", + "v10", + "rgb10" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3326 devices, B image.", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3326 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3326.aarch64-20241120-b.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1348619756, + "extract_size": 2197815296, + "extract_sha256": "e43ed5ea9c8c93408a180e57409e9a07d7594ecb1ffe46f21024655f46ea9050", + "devices": [ + "xu_mini_m", + "rgb10x" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3399 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3399 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3399.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1288581465, + "extract_size": 2198863872, + "extract_sha256": "53091696a540d693d99d515524816825a057823c0fe1f91a0b5e4837baeb24b9", + "devices": [ + "rg552" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3566 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3566 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3566.aarch64-20241120-Generic.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1391749865, + "extract_size": 2198863872, + "extract_sha256": "4917f090e9364f47de5cf8663c0741eb79b8236c4b455a5ae4d3c8889744de27", + "devices": [ + "rg353p", + "rg353m", + "rg353v", + "rg353vs", + "rg353ps", + "rg503", + "rg_arc_d", + "rg_arc_s", + "rk2023", + "rgb10_max_3", + "rgb30", + "rgb20sx" + ] + }, + { + "name": "ROCKNIX 20241120 for Powkiddy X55 devices", + "description": "ROCKNIX 20241120 firmware optimized for Powkiddy X55 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3566.aarch64-20241120-Powkiddy_x55.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1391396234, + "extract_size": 2198863872, + "extract_sha256": "35391e0a49de413a2672893a07ed6ca116f90746baef620eebf8d3ab7b2ad5f7", + "devices": [ + "x55" + ] + }, + { + "name": "ROCKNIX 20241120 for Hardkernel ODROID Go Ultra and Powkiddy RGB10 Max 3 Pro devices", + "description": "ROCKNIX 20241120 firmware optimized for ODROID Go Ultra and RGB10 Max 3 Pro devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-S922X.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1416924259, + "extract_size": 2185232384, + "extract_sha256": "86cd0a48d541e3e68582107748e2f77656c153d11f6efd14563fb65a0f9c5076", + "devices": [ + "ogu", + "rgb10_max_3_pro" + ] + }, + { + "name": "ROCKNIX 20240815 for Hardkernel ODROID N2/N2+ devices", + "description": "ROCKNIX 20240815 firmware optimized for Hardkernel ODROID N2/N2+ devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-S922X.aarch64-20240815-Odroid_N2.img.gz", + "release_date": "2024-08-15", + "image_download_size": 1249723275, + "extract_size": 2185232384, + "extract_sha256": "7e5b56f4a0c0a9d9c64e7b1ba4472dd7e2dac9c28a23585098e16349f30c7fc9", + "devices": [ + "on2", + "on2_plus" + ] + }, + { + "name": "ROCKNIX 20240815 for Hardkernel ODROID N2L devices", + "description": "ROCKNIX 20240815 firmware optimized for Hardkernel ODROID N2L devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-S922X.aarch64-20240815-Odroid_N2L.img.gz", + "release_date": "2024-08-15", + "image_download_size": 1249707786, + "extract_size": 2185232384, + "extract_sha256": "5af36c78b57dcb35c910bb72c2ed28208fe94c94d5b7fda83d73ef33a2419910", + "devices": [ + "on2l" + ] + }, + { + "name": "ROCKNIX 20241120 for Rockchip RK3588 devices", + "description": "ROCKNIX 20241120 firmware optimized for Rockchip RK3588 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-RK3588.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1451047021, + "extract_size": 2198863872, + "extract_sha256": "ec81027b7d9b757f09ccd78ce38c6993009e66ddd4b7e1a1206dc104ad739754", + "devices": [ + "ace", + "orange_pi_5", + "orange_pi_5_plus", + "radxa_rock_5a", + "radxa_rock_5b", + "radxa_rock_5b_plus", + "radxa_rock_cm5", + "nova" + ] + }, + { + "name": "ROCKNIX 20241120 for Retroid Pocket Mini and Retroid Pocket 5 devices", + "description": "ROCKNIX 20241120 firmware optimized for Snapdragon 865 devices.", + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/rocknix.png?raw=true", + "url": "https://github.com/ROCKNIX/distribution/releases/download/20241120/ROCKNIX-SD865.aarch64-20241120.img.gz", + "release_date": "2024-11-20", + "image_download_size": 1404994449, + "extract_size": 2198863872, + "extract_sha256": "82f9336c27c9b733322e7e9f685bc1e98aa4eedb0c17f9ae297edb983ada6f39", + "devices": [ + "rpmini", + "rp5" + ] + } + ], + "imager": { + "devices": [ + { + "name": "Anbernic", + "subitems": [ + { + "name": "Anbernic RG40XXH", + "tags": ["rg40xxh"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG40XX%20H.png?raw=true" + }, + { + "name": "Anbernic RG40XXV", + "tags": ["rg40xxv"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG40XX%20V.png?raw=true" + }, + { + "name": "Anbernic RG35XXH", + "tags": ["rg35xxh"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20H.png?raw=true" + }, + { + "name": "Anbernic RG35XX Plus", + "tags": ["rg35xx_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20-%20PLUS.png?raw=true" + }, + { + "name": "Anbernic RG35XX SP", + "tags": ["rg35xx_sp"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20SP.png?raw=true" + }, + { + "name": "Anbernic RG35XX 2024", + "tags": ["rg35xx_2024"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX%20-%202024.png?raw=true" + }, + { + "name": "Anbernic RG28XX", + "tags": ["rg28xx"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG28XX.png?raw=true" + }, + { + "name": "Anbernic RG351P", + "tags": ["rg351p"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG351M", + "tags": ["rg351m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG351V", + "tags": ["rg351v"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353P", + "tags": ["rg353p"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353M", + "tags": ["rg353m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353V", + "tags": ["rg353v"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353VS", + "tags": ["rg353vs"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG353PS", + "tags": ["rg353ps"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG503", + "tags": ["rg503"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG Arc-D", + "tags": ["rg_arc_d"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG Arc-S", + "tags": ["rg_arc_s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Game Console", + "subitems": [ + { + "name": "Game Console R33S", + "tags": ["r33s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Game Console R35S", + "tags": ["r35s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Game Console R36S", + "tags": ["r36s"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "ODROID", + "subitems": [ + { + "name": "ODROID Go Advance", + "tags": ["oga"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID Go Super", + "tags": ["ogs"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2", + "tags": ["on2"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2 Plus", + "tags": ["on2_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID N2L", + "tags": ["on2l"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "MagicX", + "subitems": [ + { + "name": "MagicX XU10", + "tags": ["xu10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "MagicX XU Mini M", + "tags": ["xu_mini_m"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Powkiddy", + "subitems": [ + { + "name": "Powkiddy V10", + "tags": ["v10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10", + "tags": ["rgb10"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RK2023", + "tags": ["rk2023"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10 Max 3", + "tags": ["rgb10_max_3"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB30", + "tags": ["rgb30"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB20SX", + "tags": ["rgb20sx"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Anbernic RG552", + "tags": ["rg552"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "ODROID Go Ultra", + "tags": ["ogu"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy RGB10 Max 3 Pro", + "tags": ["rgb10_max_3_pro"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Powkiddy X55", + "tags": ["x55"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Gameforce", + "subitems": [ + { + "name": "Gameforce Ace (default)", + "tags": ["ace"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Orange Pi", + "subitems": [ + { + "name": "Orange Pi 5", + "tags": ["orange_pi_5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Orange Pi 5 Plus", + "tags": ["orange_pi_5_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Radxa", + "subitems": [ + { + "name": "Radxa Rock 5a", + "tags": ["radxa_rock_5a"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock 5b", + "tags": ["radxa_rock_5b"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock 5b Plus", + "tags": ["radxa_rock_5b_plus"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Radxa Rock CM5", + "tags": ["radxa_rock_cm5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Indiedroid", + "subitems": [ + { + "name": "Indiedroid Nova (Must set dtb in extlinuix.conf)", + "tags": ["nova"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + }, + { + "name": "Retroid", + "subitems": [ + { + "name": "Retroid Pocket Mini", + "tags": ["rpmini"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + }, + { + "name": "Retroid Pocket 5", + "tags": ["rp5"], + "icon": "https://github.com/cmclark00/retro-imager/blob/fix/src/icons/RG35XX.png?raw=true" + } + ] + } + ] + } } + diff --git a/src/qml.qrc b/src/qml.qrc index 8dcca05..d86215f 100644 --- a/src/qml.qrc +++ b/src/qml.qrc @@ -32,7 +32,7 @@ icons/cat_language_specific_operating_systems.png icons/cat_3d_printing.png icons/logo_stacked_imager.png - icons/logo_sxs_imager.png + icons/banner.png qmlcomponents/ImButton.qml qmlcomponents/ImButtonRed.qml qmlcomponents/ImCheckBox.qml diff --git a/src/windows/rpi-imager-cli.cmd b/src/windows/retro-imager-cli.cmd similarity index 53% rename from src/windows/rpi-imager-cli.cmd rename to src/windows/retro-imager-cli.cmd index 99c15f7..8158775 100644 --- a/src/windows/rpi-imager-cli.cmd +++ b/src/windows/retro-imager-cli.cmd @@ -1,9 +1,9 @@ @echo off rem -rem For scripting: call rpi-imager.exe and wait until it finished before continuing +rem For scripting: call retro-imager.exe and wait until it finished before continuing rem This is necessary because it is compiled as GUI application, and Windows rem normalling does not wait until those exit rem -start /WAIT rpi-imager.exe --cli %* +start /WAIT retro-imager.exe --cli %* diff --git a/src/windows/rpi-imager.nsi.in b/src/windows/retro-imager.nsi.in similarity index 96% rename from src/windows/rpi-imager.nsi.in rename to src/windows/retro-imager.nsi.in index 348efd0..bc1e1ce 100644 --- a/src/windows/rpi-imager.nsi.in +++ b/src/windows/retro-imager.nsi.in @@ -4,20 +4,20 @@ # by Vlasis K. Barkas aka Red Wine red_wine@freemail.gr Sep 2006 ############################################################################################ -!define APP_NAME "Raspberry Pi Imager" -!define COMP_NAME "Raspberry Pi Ltd" +!define APP_NAME "Retro Imager" +!define COMP_NAME "coreymclark" !define VERSION "@IMAGER_VERSION_STR@" -!define INSTALLER_NAME "imager-${VERSION}.exe" +!define INSTALLER_NAME "retro-imager-${VERSION}.exe" !define COPYRIGHT "Raspberry Pi Ltd" -!define DESCRIPTION "Raspberry Pi Imager" -!define MAIN_APP_EXE "rpi-imager.exe" +!define DESCRIPTION "Retro Imager" +!define MAIN_APP_EXE "retro-imager.exe" !define INSTALL_TYPE "SetShellVarContext current" !define REG_ROOT "HKCU" !define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" !define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" # Window to close if running -!define EXE_TO_TERMINATE "rpi-imager.exe" +!define EXE_TO_TERMINATE "retro-imager.exe" ###################################################################### @@ -38,7 +38,7 @@ OutFile "${INSTALLER_NAME}" BrandingText "${APP_NAME}" XPStyle on InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" -InstallDir "$PROGRAMFILES\Raspberry Pi Imager" +InstallDir "$PROGRAMFILES\Retro Imager" ###################################################################### @@ -89,7 +89,7 @@ InstallDir "$PROGRAMFILES\Raspberry Pi Imager" !ifdef REG_START_MENU !define MUI_STARTMENUPAGE_NODISABLE -!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Raspberry Pi" +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Retro Imager" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}" !define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}" @@ -256,8 +256,8 @@ File "deploy\libgcc_s_seh-1.dll" File "deploy\libstdc++-6.dll" File "deploy\libwinpthread-1.dll" File "deploy\license.txt" -File "deploy\rpi-imager-cli.cmd" -File "deploy\rpi-imager.exe" +File "deploy\retro-imager-cli.cmd" +File "deploy\retro-imager.exe" SetOutPath "$INSTDIR\generic" File "deploy\generic\qtuiotouchplugin.dll" SetOutPath "$INSTDIR\iconengines" @@ -766,13 +766,13 @@ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}" !endif -WriteRegStr SHCTX "Software\Classes\.zip\OpenWithProgIds" "RPI_IMAGINGUTILITY" "" -WriteRegStr SHCTX "Software\Classes\.gz\OpenWithProgIds" "RPI_IMAGINGUTILITY" "" -WriteRegStr SHCTX "Software\Classes\.xz\OpenWithProgIds" "RPI_IMAGINGUTILITY" "" -WriteRegStr SHCTX "Software\Classes\.img\OpenWithProgIds" "RPI_IMAGINGUTILITY" "" -WriteRegStr SHCTX "Software\Classes\.zstd\OpenWithProgIds" "RPI_IMAGINGUTILITY" "" -WriteRegStr SHCTX "Software\Classes\RPI_IMAGINGUTILITY\shell\open" "FriendlyAppName" "Raspberry Pi Imager" -WriteRegStr SHCTX "Software\Classes\RPI_IMAGINGUTILITY\shell\open\command" "" '"$INSTDIR\rpi-imager.exe" "%1"' +WriteRegStr SHCTX "Software\Classes\.zip\OpenWithProgIds" "RETRO_IMAGINGUTILITY" "" +WriteRegStr SHCTX "Software\Classes\.gz\OpenWithProgIds" "RETRO_IMAGINGUTILITY" "" +WriteRegStr SHCTX "Software\Classes\.xz\OpenWithProgIds" "RETRO_IMAGINGUTILITY" "" +WriteRegStr SHCTX "Software\Classes\.img\OpenWithProgIds" "RETRO_IMAGINGUTILITY" "" +WriteRegStr SHCTX "Software\Classes\.zstd\OpenWithProgIds" "RETRO_IMAGINGUTILITY" "" +WriteRegStr SHCTX "Software\Classes\RETRO_IMAGINGUTILITY\shell\open" "FriendlyAppName" "Retro Imager" +WriteRegStr SHCTX "Software\Classes\RETRO_IMAGINGUTILITY\shell\open\command" "" '"$INSTDIR\retro-imager.exe" "%1"' SectionEnd @@ -805,8 +805,8 @@ Delete "$INSTDIR\Qt5Widgets.dll" Delete "$INSTDIR\Qt5WinExtras.dll" # Old name Delete "$INSTDIR\imagingutility.exe" -Delete "$INSTDIR\rpi-imager.exe" -Delete "$INSTDIR\rpi-imager-cli.cmd" +Delete "$INSTDIR\retro-imager.exe" +Delete "$INSTDIR\retro-imager-cli.cmd" Delete "$INSTDIR\styles\qwindowsvistastyle.dll" Delete "$INSTDIR\QtQuick.2\plugins.qmltypes" Delete "$INSTDIR\QtQuick.2\qmldir" @@ -1195,8 +1195,8 @@ Delete "$INSTDIR\Qt6Svg.dll" Delete "$INSTDIR\Qt6VirtualKeyboard.dll" Delete "$INSTDIR\Qt6Widgets.dll" Delete "$INSTDIR\libgcc_s_seh-1.dll" -Delete "$INSTDIR\rpi-imager-cli.cmd" -Delete "$INSTDIR\rpi-imager.exe" +Delete "$INSTDIR\retro-imager-cli.cmd" +Delete "$INSTDIR\retro-imager.exe" Delete "$INSTDIR\generic\qtuiotouchplugin.dll" Delete "$INSTDIR\iconengines\qsvgicon.dll" Delete "$INSTDIR\imageformats\qgif.dll" @@ -1699,30 +1699,30 @@ RmDir "$SMPROGRAMS\$SM_Folder" !endif !ifndef REG_START_MENU -Delete "$SMPROGRAMS\Raspberry Pi\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\Retro Imager${APP_NAME}.lnk" !ifdef WEB_SITE -Delete "$SMPROGRAMS\Raspberry Pi\${APP_NAME} Website.lnk" +Delete "$SMPROGRAMS\Retro Imager\${APP_NAME} Website.lnk" !endif -RmDir "$SMPROGRAMS\Raspberry Pi" +RmDir "$SMPROGRAMS\Retro Imager" !endif DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" # File associations -DeleteRegValue SHCTX "Software\Classes\.zip\OpenWithProgIds" "RPI_IMAGINGUTILITY" -DeleteRegValue SHCTX "Software\Classes\.gz\OpenWithProgIds" "RPI_IMAGINGUTILITY" -DeleteRegValue SHCTX "Software\Classes\.xz\OpenWithProgIds" "RPI_IMAGINGUTILITY" -DeleteRegValue SHCTX "Software\Classes\.img\OpenWithProgIds" "RPI_IMAGINGUTILITY" -DeleteRegValue SHCTX "Software\Classes\.zstd\OpenWithProgIds" "RPI_IMAGINGUTILITY" -DeleteRegKey SHCTX "Software\Classes\RPI_IMAGINGUTILITY" +DeleteRegValue SHCTX "Software\Classes\.zip\OpenWithProgIds" "RETRO_IMAGINGUTILITY" +DeleteRegValue SHCTX "Software\Classes\.gz\OpenWithProgIds" "RETRO_IMAGINGUTILITY" +DeleteRegValue SHCTX "Software\Classes\.xz\OpenWithProgIds" "RETRO_IMAGINGUTILITY" +DeleteRegValue SHCTX "Software\Classes\.img\OpenWithProgIds" "RETRO_IMAGINGUTILITY" +DeleteRegValue SHCTX "Software\Classes\.zstd\OpenWithProgIds" "RETRO_IMAGINGUTILITY" +DeleteRegKey SHCTX "Software\Classes\RETRO_IMAGINGUTILITY" DeleteRegKey ${REG_ROOT} "" -RMDir /r "$APPDATA\Raspberry Pi\Imager" -RMDir "$APPDATA\Raspberry Pi" -RMDir /r "$LOCALAPPDATA\Raspberry Pi\Imager" -RMDir "$LOCALAPPDATA\Raspberry Pi" +RMDir /r "$APPDATA\Retro Imager\Imager" +RMDir "$APPDATA\Retro Imager" +RMDir /r "$LOCALAPPDATA\Retro Imager\Imager" +RMDir "$LOCALAPPDATA\Retro Imager" SectionEnd diff --git a/test_os_list.json b/test_os_list.json new file mode 100644 index 0000000..de84dde --- /dev/null +++ b/test_os_list.json @@ -0,0 +1,37 @@ +{ + "os_list": [ + { + "name": "Test OS 1", + "description": "A test OS for verifying functionality", + "icon": "icons/erase.png", + "url": "internal://format", + "devices": ["rg40xxh"] + }, + { + "name": "Test OS 2", + "description": "Another test OS", + "icon": "icons/erase.png", + "url": "internal://format", + "devices": ["rg35xx_plus"] + } + ], + "imager": { + "devices": [ + { + "name": "Test Device Category", + "subitems": [ + { + "name": "Test Device 1", + "tags": ["rg40xxh"], + "icon": "icons/erase.png" + }, + { + "name": "Test Device 2", + "tags": ["rg35xx_plus"], + "icon": "icons/erase.png" + } + ] + } + ] + } +} \ No newline at end of file