Compare commits

..

15 commits
v0.4 ... fix

Author SHA1 Message Date
cmclark00
182e9b91ae longshot 2025-03-19 21:26:32 -04:00
cmclark00
34089867a1 bump version to 0.5 and update Qt6 and MinGW64 root paths to use environment variables, work on nested menu integration. 2025-02-27 01:50:52 -05:00
cmclark00
45e5dc35ec undo fix 2025-02-25 21:14:41 -05:00
cmclark00
f84a7244dd fix CMakeLists.txt 2025-02-25 20:55:29 -05:00
cmclark00
3b6363aaba
Update os_list.json 2024-12-01 01:34:52 -05:00
cmclark00
028f5ef9f9
Update os_list.json 2024-11-28 22:06:26 -05:00
cmclark00
31c7760ccc
Update os_list.json 2024-11-28 21:26:03 -05:00
cmclark00
01a49182b2
Update os_list.json 2024-11-27 14:06:43 -05:00
cmclark00
2342facc6e
Update os_list.json 2024-11-26 22:03:22 -05:00
cmclark00
7fdbab9138
Update os_list.json 2024-11-26 21:50:17 -05:00
cmclark00
59536ddd9b fixing banner and migrating to onedev 2024-11-26 20:10:20 -05:00
cmclark00
e343b26b7b trying to fix all the broken jank 2024-11-26 19:53:06 -05:00
cmclark00
8b74f8a2b2 updating artwork 2024-10-15 23:31:53 -04:00
cmclark00
aaae987b5b telemetry updates 2024-10-15 21:58:29 -04:00
cmclark00
11d73edee3 Update config.h 2024-10-15 21:44:46 -04:00
99 changed files with 1539 additions and 410 deletions

16
minimal_test.json Normal file
View file

@ -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"
}
]
}

552
os_list.json Normal file
View file

@ -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"
}
]
}
]
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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

Binary file not shown.

View file

@ -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

Binary file not shown.

View file

@ -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

Binary file not shown.

View file

@ -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

Binary file not shown.

View file

@ -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

View file

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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

View file

@ -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

BIN
src/icons/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
src/icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Before After
Before After

View file

@ -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
}
}
@ -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,31 +556,70 @@ 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))
@ -571,6 +630,51 @@ ApplicationWindow {
}
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 {
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")
}
}
}
@ -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: {
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,55 +1671,119 @@ ApplicationWindow {
}
}
// Function to fetch OS list and populate the hardware categories
function fetchOSlist() {
try {
var oslist_json = imageWriter.getFilteredOSlist();
var o = JSON.parse(oslist_json)
var oslist_parsed = oslistFromJson(o)
if (oslist_parsed === false)
return
osmodel.clear()
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])
osmodel.append(oslist_parsed[i]);
}
if ("imager" in o) {
var imager = o["imager"]
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()
updatepopup.url = imager["url"];
updatepopup.openPopup();
}
}
if ("default_os" in imager) {
selectNamedOS(imager["default_os"], osmodel)
selectNamedOS(imager["default_os"], osmodel);
}
if (imageWriter.isEmbeddedMode()) {
if ("embedded_default_os" in imager) {
selectNamedOS(imager["embedded_default_os"], osmodel)
selectNamedOS(imager["embedded_default_os"], osmodel);
}
if ("embedded_default_destination" in imager) {
imageWriter.startDriveListPolling()
setDefaultDest.drive = imager["embedded_default_destination"]
setDefaultDest.start()
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);
}
}
Timer {
@ -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
try {
// Add defensive checks
if (!hwmodel) {
console.error("selectHWitem called with null model");
return;
}
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
inclusive = true;
break;
}
}
imageWriter.setHWFilterList(hwmodel.tags, inclusive)
// Handle tags with extra care
var tags = [];
/* Reload list */
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
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]
var candidate = oslist_parsed[0];
if ("description" in candidate &&
!("subitems" in candidate) &&
!candidate["description"].includes("(Recommended)")
)
{
candidate["description"] += " (Recommended)"
candidate["description"] += " (Recommended)";
}
}
osmodel.clear()
osmodel.clear();
for (var i in oslist_parsed) {
osmodel.append(oslist_parsed[i])
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
// 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()
hwbutton.text = hwmodel.name;
hwpopup.close();
} catch (e) {
console.error("Error in selectHWitem:", e);
onError("Error selecting hardware item: " + e.message);
}
}
/// Is the item a sub-list or sub-sub-list in the OS selection model?
@ -1725,6 +2110,29 @@ ApplicationWindow {
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)
{
var entry = subitems[i];

View file

@ -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": [{
"devices": [
{
"name": "Anbernic",
"subitems": [
{
"name": "Anbernic RG40XXH",
"tags": ["rg40xxh"],
"icon": "https://github.com/cmclark00/retro-imager/blob/dev/src/icons/RG40XX%20H.png?raw=true"
"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/dev/src/icons/RG40XX%20V.png?raw=true"
"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/dev/src/icons/RG35XX%20H.png?raw=true"
"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/dev/src/icons/RG35XX%20-%20PLUS.png?raw=true"
"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/dev/src/icons/RG35XX%20SP.png?raw=true"
"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/dev/src/icons/RG35XX%20-%202024.png?raw=true"
"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/dev/src/icons/RG28XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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"
"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"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/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": "Powkiddy RGB10 Max 3",
"tags": ["rgb10_max_3"],
"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/fix/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": "Game Console R36S",
"tags": ["r36s"],
"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/dev/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": "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 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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"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/dev/src/icons/RG35XX.png?raw=true"
"icon": "https://github.com/cmclark00/retro-imager/blob/fix/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": "MagicX",
"subitems": [
{
"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 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/dev/src/icons/RG35XX.png?raw=true"
"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"
}
]
}
]
}

View file

@ -32,7 +32,7 @@
<file>icons/cat_language_specific_operating_systems.png</file>
<file>icons/cat_3d_printing.png</file>
<file>icons/logo_stacked_imager.png</file>
<file>icons/logo_sxs_imager.png</file>
<file>icons/banner.png</file>
<file>qmlcomponents/ImButton.qml</file>
<file>qmlcomponents/ImButtonRed.qml</file>
<file>qmlcomponents/ImCheckBox.qml</file>

37
test_os_list.json Normal file
View file

@ -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"
}
]
}
]
}
}