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 407ef26..6f88e31 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -10,7 +10,7 @@ set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "Which macOS architectur
project(retro-imager LANGUAGES CXX C)
set(IMAGER_VERSION_MAJOR 0)
-set(IMAGER_VERSION_MINOR 3)
+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")
@@ -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)
@@ -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
diff --git a/src/config.h b/src/config.h
index db32119..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/refs/heads/dev/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/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/main.qml b/src/main.qml
index 87c99b0..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"
@@ -68,11 +68,12 @@ ApplicationWindow {
Image {
id: image
- source: "icons/logo_sxs_imager.png"
+ source: "icons/banner.png"
width: window.width * 1
height: window.height / 3
smooth: true
antialiasing: true
+ fillMode: image.PreserveAspectFit
}
}
@@ -137,8 +138,8 @@ ApplicationWindow {
bgrect.mouseOver = false
}
onClicked: {
- hwpopup.open()
- hwlist.forceActiveFocus()
+ hwpopup.open()
+ hwlist.forceActiveFocus()
}
}
Rectangle {
@@ -194,8 +195,8 @@ ApplicationWindow {
bgrect1.mouseOver = false
}
onClicked: {
- ospopup.open()
- osswipeview.currentItem.forceActiveFocus()
+ ospopup.open()
+ osswipeview.currentItem.forceActiveFocus()
}
}
@@ -253,10 +254,10 @@ ApplicationWindow {
bgrect2.mouseOver = false
}
onClicked: {
- imageWriter.startDriveListPolling()
- dstpopup.open()
- dstlist.forceActiveFocus()
- }
+ imageWriter.startDriveListPolling()
+ dstpopup.open()
+ dstlist.forceActiveFocus()
+ }
}
Rectangle {
@@ -478,6 +479,8 @@ ApplicationWindow {
}
}
+ // Popup for hardware device selection with nested structure
+ // Updated hwpopup definition
Popup {
id: hwpopup
x: 50
@@ -487,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 {
@@ -498,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
@@ -527,6 +546,7 @@ ApplicationWindow {
}
}
}
+
// line under title
Rectangle {
id: hwpopup_title_separator
@@ -536,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)
@@ -571,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")
+ }
}
}
@@ -742,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
@@ -757,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
@@ -816,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
+ }
}
}
}
@@ -1552,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);
}
}
@@ -1643,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?
@@ -1724,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)
{
@@ -1749,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 === "") {
@@ -1796,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 a2db64d..fedc395 100644
--- a/src/os_list.json
+++ b/src/os_list.json
@@ -3,7 +3,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -16,7 +16,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -29,7 +29,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -42,7 +42,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -55,7 +55,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -68,7 +68,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -81,7 +81,7 @@
{
"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/dev/src/icons/logo.png?raw=true",
+ "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,
@@ -92,14 +92,14 @@
]
},
{
- "name": "ROCKNIX 20240815 for Rockchip RK3326 devices",
- "description": "ROCKNIX 20240815 firmware optimized for Rockchip RK3326 devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-RK3326.aarch64-20240815.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1171847190,
+ "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": "0bdf629ef90c33ce236dd3cf4fd991d24ac61d4b2f8546d09e602308459b2425",
+ "extract_sha256": "8cc28cca1d4d88464cf156691a540111385c5b94f30aa067456cc80fcd12b747",
"devices": [
"rg351p",
"rg351m",
@@ -111,32 +111,45 @@
"ogs",
"xu10",
"v10",
- "rgb10",
- "xu_mini_m"
+ "rgb10"
]
},
{
- "name": "ROCKNIX 20240815 for Rockchip RK3399 devices",
- "description": "ROCKNIX 20240815 firmware optimized for Rockchip RK3399 devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-RK3399.aarch64-20240815.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1195501171,
+ "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": "8f77e5d80305d93f8e9e21ff7a9191d0f858caae72df18e9a028a9ea17f13416",
+ "extract_sha256": "53091696a540d693d99d515524816825a057823c0fe1f91a0b5e4837baeb24b9",
"devices": [
"rg552"
]
},
{
- "name": "ROCKNIX 20240815 for Rockchip RK3566 devices",
- "description": "ROCKNIX 20240815 firmware optimized for Rockchip RK3566 devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-RK3566.aarch64-20240815.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1282393570,
+ "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": "c0ae2048a325f54261fba3d052fbb3c26bf11f522241f89e8dc7057ef31e2ef5",
+ "extract_sha256": "4917f090e9364f47de5cf8663c0741eb79b8236c4b455a5ae4d3c8889744de27",
"devices": [
"rg353p",
"rg353m",
@@ -153,27 +166,27 @@
]
},
{
- "name": "ROCKNIX 20240815 for Powkiddy X55 devices",
- "description": "ROCKNIX 20240815 firmware optimized for Powkiddy X55 devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-RK3566-X55.aarch64-20240815.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1282079397,
+ "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": "1883848d6b8f6011c15f1aa54f44e5898eb7c89d4f6abcb229b13dd67c9928e8",
+ "extract_sha256": "35391e0a49de413a2672893a07ed6ca116f90746baef620eebf8d3ab7b2ad5f7",
"devices": [
"x55"
]
},
{
- "name": "ROCKNIX 20240815 for Hardkernel ODROID Go Ultra and Powkiddy RGB10 Max 3 Pro devices",
- "description": "ROCKNIX 20240815 firmware optimized for ODROID Go Ultra and RGB10 Max 3 Pro devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-S922X.aarch64-20240815-Odroid_GOU.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1257600535,
+ "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": "ddf4cb558846ab0c826b445bc55da908530fb2f7fbfc0ef070215fe7e0223c65",
+ "extract_sha256": "86cd0a48d541e3e68582107748e2f77656c153d11f6efd14563fb65a0f9c5076",
"devices": [
"ogu",
"rgb10_max_3_pro"
@@ -182,7 +195,7 @@
{
"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/dev/src/icons/rocknix.png?raw=true",
+ "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,
@@ -196,7 +209,7 @@
{
"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/dev/src/icons/rocknix.png?raw=true",
+ "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,
@@ -207,14 +220,14 @@
]
},
{
- "name": "ROCKNIX 20240815 for Rockchip RK3588 devices",
- "description": "ROCKNIX 20240815 firmware optimized for Rockchip RK3588 devices.",
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/rocknix.png?raw=true",
- "url": "https://github.com/ROCKNIX/distribution/releases/download/20240815/ROCKNIX-RK3588.aarch64-20240815.img.gz",
- "release_date": "2024-08-15",
- "image_download_size": 1313142011,
+ "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": "380180b7d8279b5fe0843e11935f27e11053749e084e578faa7ee7d4d4cce0b5",
+ "extract_sha256": "ec81027b7d9b757f09ccd78ce38c6993009e66ddd4b7e1a1206dc104ad739754",
"devices": [
"ace",
"orange_pi_5",
@@ -225,238 +238,313 @@
"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 RG40XXH",
- "tags": ["rg40xxh"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG40XX%20H.png?raw=true"
+ "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": "Anbernic RG40XXV",
- "tags": ["rg40xxv"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG40XX%20V.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": "Anbernic RG35XXH",
- "tags": ["rg35xxh"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX%20H.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": "Anbernic RG35XX Plus",
- "tags": ["rg35xx_plus"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX%20-%20PLUS.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": "Anbernic RG35XX SP",
- "tags": ["rg35xx_sp"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX%20SP.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": "Anbernic RG35XX 2024",
- "tags": ["rg35xx_2024"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX%20-%202024.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": "Anbernic RG28XX",
- "tags": ["rg28xx"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG28XX.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": "Anbernic RG351P",
- "tags": ["rg351p"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/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": "Anbernic RG351M",
- "tags": ["rg351m"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/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": "Anbernic RG351V",
- "tags": ["rg351v"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Game Console R33S",
- "tags": ["r33s"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Game Console R35S",
- "tags": ["r35s"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Game Console R36S",
- "tags": ["r36s"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID Go Advance",
- "tags": ["oga"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID Go Super",
- "tags": ["ogs"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "MagicX XU10",
- "tags": ["xu10"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy V10",
- "tags": ["v10"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy RGB10",
- "tags": ["rgb10"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG353P",
- "tags": ["rg353p"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG353M",
- "tags": ["rg353m"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG353V",
- "tags": ["rg353v"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG353VS",
- "tags": ["rg353vs"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG353PS",
- "tags": ["rg353ps"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG503",
- "tags": ["rg503"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG Arc-D",
- "tags": ["rg_arc_d"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG Arc-S",
- "tags": ["rg_arc_s"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy RK2023",
- "tags": ["rk2023"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy RGB10 Max 3",
- "tags": ["rgb10_max_3"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy RGB30",
- "tags": ["rgb30"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy RGB20SX",
- "tags": ["rgb20sx"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Anbernic RG552",
- "tags": ["rg552"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID Go Ultra",
- "tags": ["ogu"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/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/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID N2",
- "tags": ["on2"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID N2 Plus",
- "tags": ["on2_plus"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "ODROID N2L",
- "tags": ["on2l"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Gameforce Ace (default)",
- "tags": ["ace"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Orange Pi 5",
- "tags": ["orange_pi_5"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Orange Pi 5 Plus",
- "tags": ["orange_pi_5_plus"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Radxa Rock 5a",
- "tags": ["radxa_rock_5a"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Radxa Rock 5b",
- "tags": ["radxa_rock_5b"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Radxa Rock 5b Plus",
- "tags": ["radxa_rock_5b_plus"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Radxa Rock CM5",
- "tags": ["radxa_rock_cm5"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Indiedroid Nova (Must set dtb in extlinuix.conf)",
- "tags": ["nova"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "Powkiddy X55",
- "tags": ["x55"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG35XX.png?raw=true"
- },
- {
- "name": "MagicX XU Mini M",
- "tags": ["xu_mini_m"],
- "icon": "https://github.com/cmclark00/retro-imager/blob/dev/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/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