diff --git a/.github/workflows/integration_delivery.yml b/.github/workflows/integration_delivery.yml index 640d5b9a..9009001c 100644 --- a/.github/workflows/integration_delivery.yml +++ b/.github/workflows/integration_delivery.yml @@ -377,7 +377,6 @@ jobs: with: packages-dir: dist verbose: true - skip-existing: true release: if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') diff --git a/CHANGELOG.md b/CHANGELOG.md index d3a3b916..2889afc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - refactor(core): reorganize settings menu #69 - refactor(style): add icons to menu titles +- refactor(core): make pagination more obvious #69 +- refactor(core): render the next and previous menu items in place of footer/header + when there is such item #76 +- fix(notifications): scrollbar doesn't wrap around when scrolling up anymore ## Version 0.13.2 diff --git a/poetry.lock b/poetry.lock index 7c6ee016..02c48896 100644 --- a/poetry.lock +++ b/poetry.lock @@ -50,13 +50,13 @@ adafruit-circuitpython-typing = "*" [[package]] name = "adafruit-circuitpython-connectionmanager" -version = "1.2.0" +version = "2.0.0" description = "A urllib3.poolmanager/urllib3.connectionpool-like library for managing sockets and connections" optional = false python-versions = "*" files = [ - {file = "adafruit_circuitpython_connectionmanager-1.2.0-py3-none-any.whl", hash = "sha256:818c513d97cd1e64b12305f26a16b397e6e9a8564b59b9253314e0b8bad888d2"}, - {file = "adafruit_circuitpython_connectionmanager-1.2.0.tar.gz", hash = "sha256:0f399f0682ca56424bc14678851655abc2f1fd0783afef00bf99c8b4f051a7e8"}, + {file = "adafruit_circuitpython_connectionmanager-2.0.0-py3-none-any.whl", hash = "sha256:a7164831e02c02792c65123d2931dfeb6e998456aa0da48a0effaaddc8af7691"}, + {file = "adafruit_circuitpython_connectionmanager-2.0.0.tar.gz", hash = "sha256:32b0a2e38f703bf6e22d93e6929a301fe4e18fff6f68ad251521b8d250ef6436"}, ] [package.dependencies] @@ -2034,13 +2034,13 @@ files = [ [[package]] name = "ubo-gui" -version = "0.10.8" +version = "0.11.2" description = "GUI sdk for Ubo Pod" optional = true python-versions = "<4.0,>=3.11" files = [ - {file = "ubo_gui-0.10.8-py3-none-any.whl", hash = "sha256:b50205275de64deebc0d35dbfcb7605a04fde240978b4a5ddceb4edd61ab81b1"}, - {file = "ubo_gui-0.10.8.tar.gz", hash = "sha256:1b1c452ee1ce6bb75414f09291305b235a8799f78f399607dc24cff2c32e2036"}, + {file = "ubo_gui-0.11.2-py3-none-any.whl", hash = "sha256:3383fe2fed4e4f30fa2efa385eb8031190204173071c87c4ee1cfc5ae7a75ac4"}, + {file = "ubo_gui-0.11.2.tar.gz", hash = "sha256:54bc388e359cb3f91957a667ff70557f2bcb79bb4f3be4c3c0df25c91cbf52f4"}, ] [package.dependencies] @@ -2193,4 +2193,4 @@ dev = ["ubo-gui", "ubo-gui"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "fd3912a433df0eef7c6d5edbb9096a9bfbea223acf823db8ed686c550285a501" +content-hash = "147f3825b5838c2010886045c1d6b94d2788a8c892fedfef27b39016ce15b185" diff --git a/pyproject.toml b/pyproject.toml index 4f43684c..43e2272f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "ubo-app" -version = "0.13.2" +version = "0.13.3" description = "Ubo main app, running on device initialization. A platform for running other apps." authors = ["Sassan Haradji "] license = "Apache-2.0" @@ -18,10 +18,10 @@ priority = "primary" python = "^3.11" psutil = "^5.9.8" ubo-gui = [ - { version = "^0.10.8", markers = "extra=='default'", extras = [ + { version = "^0.11.2", markers = "extra=='default'", extras = [ "default", ] }, - { version = "^0.10.8", markers = "extra=='dev'", extras = [ + { version = "^0.11.2", markers = "extra=='dev'", extras = [ "dev", ] }, ] diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-000.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-000.jsonc index 49fa56ad..580a4895 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-000.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-000.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-001.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-001.jsonc index b9c16b95..0e706b38 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-001.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-001.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,7 +242,7 @@ }, "path": [ "Dashboard", - "Main" + "󰍜Main" ], "settings_items_priorities": { "WiFi": 2 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-002.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-002.jsonc index 1abe5ff6..627b9af7 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-002.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-002.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,8 +242,8 @@ }, "path": [ "Dashboard", - "Main", - "Settings" + "󰍜Main", + "Settings" ], "settings_items_priorities": { "WiFi": 2 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-003.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-003.jsonc index e52f1863..5a6eb3f6 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-003.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-003.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity" + "󰍜Main", + "Settings", + "󰛳Network" ], "settings_items_priorities": { "WiFi": 2 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-004.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-004.jsonc index 0ef5ee33..ec61c1e9 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-004.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-004.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity", + "󰍜Main", + "Settings", + "󰛳Network", "WiFi Settings" ], "settings_items_priorities": { diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-005.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-005.jsonc index ed48df7e..899b30c9 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-005.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-005.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity", + "󰍜Main", + "Settings", + "󰛳Network", "WiFi Settings", "Wi-Fi" ], diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-006.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-006.jsonc index e6e4be4a..de085296 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-006.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-006.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity", + "󰍜Main", + "Settings", + "󰛳Network", "WiFi Settings" ], "settings_items_priorities": { diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-007.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-007.jsonc index 85b0dd8d..395b4edf 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-007.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-007.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity", + "󰍜Main", + "Settings", + "󰛳Network", "WiFi Settings", "85776e9add84f39e71545a137a1d5006" ], diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-008.jsonc b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-008.jsonc index 02b8957b..86732ddf 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-008.jsonc +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/store-008.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,9 +58,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -71,6 +75,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -84,7 +89,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -97,7 +103,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -106,7 +113,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -117,13 +124,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -134,13 +142,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -151,18 +160,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -176,6 +186,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -184,17 +195,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -203,6 +215,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -220,7 +233,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, @@ -228,9 +242,9 @@ }, "path": [ "Dashboard", - "Main", - "Settings", - "Connectivity", + "󰍜Main", + "Settings", + "󰛳Network", "WiFi Settings", "85776e9add84f39e71545a137a1d5006" ], diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-000.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-000.hash index 524df104..cef00c61 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-000.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-000.hash @@ -1,2 +1,2 @@ // window-000 -a86093c770df6bd8caec7032edfaf3b90a13adc3c890c80adb4caf8cb4739152 +aa0e9f115e55a4509a38de29aac3ad0aa920e0d6750295fd9e29ff2bd3a8e159 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-001.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-001.hash index 3d43e3ab..e16fa149 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-001.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-001.hash @@ -1,2 +1,2 @@ // window-001 -50533f659e40b220943b617db686a01cd88ec690bb5b9582d5a4d08ca252a7d9 +60854a140e089ab6eb98aa13b2bf85b01530931700587b0617503fa8db0d261e diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-002.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-002.hash index c9d57b13..2a2076a6 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-002.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-002.hash @@ -1,2 +1,2 @@ // window-002 -0e93054205e42c551c706d9311ca578dc413eb8e3c1fa0a41d5acf15cba69fdf +46882e1bea54a859380063c8a5d0345cb5462fe30985578ae20876c126f14000 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-003.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-003.hash index 4d96c4c8..ca339a4b 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-003.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-003.hash @@ -1,2 +1,2 @@ // window-003 -e79efabd9138a2c428d7ffc00f25fc86f7ca72cdb419149d37efd7199fa157bb +d94da9af686e3311f6e4bdda5638097882a1fd030d462b7e26d0437eccc6d4f4 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-005.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-005.hash index 037f1d9b..72c5f2d2 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-005.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-005.hash @@ -1,2 +1,2 @@ // window-005 -bb31ce816b7ac09784dd3acc509c9e830e6b21f125dece9c6679eadcc5501f18 +2c1e57440337bb7403818c2d9c79fa262b1b550a830d8c6a1a6207be74f0ef24 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-007.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-007.hash index a079f6f9..10b5fd61 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-007.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-007.hash @@ -1,2 +1,2 @@ // window-007 -8393c183dce79e99979df40a76f2caae137ec9400ec79c6b92e19daf869acbe2 +114165b7cba5436fb6efc1331c0536e0521bdb3e9cca926415d439c6cf0e21e3 diff --git a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-008.hash b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-008.hash index 8dd70d85..d0464acf 100644 --- a/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-008.hash +++ b/tests/end_to_end/results/test_wireless_flow/wireless_flow/window-008.hash @@ -1,2 +1,2 @@ // window-008 -8393c183dce79e99979df40a76f2caae137ec9400ec79c6b92e19daf869acbe2 +114165b7cba5436fb6efc1331c0536e0521bdb3e9cca926415d439c6cf0e21e3 diff --git a/tests/fixtures/app.py b/tests/fixtures/app.py index 130f1c14..d1d86bb6 100644 --- a/tests/fixtures/app.py +++ b/tests/fixtures/app.py @@ -103,28 +103,6 @@ async def app_context(request: SubRequest) -> AsyncGenerator[AppContext, None]: setup() - from kivy.lang.builder import Builder - - Builder.load_string(""" -<-Slider>: - canvas: - Color: - rgb: 0.6, 0.1, 0.1 - Rectangle: - pos: (self.x, self.center_y - self.background_width/6) if self.orientation \ -== 'horizontal' else (self.center_x - self.background_width/6, self.y) - size: (self.width, self.background_width/3) if self.orientation == 'horizon\ -tal' else (self.background_width/3, self.height) - Color: - rgb: 0.8, 0.3, 0.3 - RoundedRectangle: - pos: (root.value_pos[0] - root.cursor_width*0.4, root.center_y - root.curso\ -r_height*0.4) if root.orientation == 'horizontal' else (root.center_x - root.cursor_wid\ -th*0.4, root.value_pos[1] - root.cursor_height*0.4) - size: root.cursor_size[0] * 0.8, root.cursor_size[1] * 0.8 - radius: root.cursor_size[0] * 0.4, root.cursor_size[1] * 0.4 - """) - import headless_kivy_pi.config headless_kivy_pi.config.setup_headless_kivy({'automatic_fps': True}) diff --git a/tests/integration/results/test_core/app_runs_and_exits/store-000.jsonc b/tests/integration/results/test_core/app_runs_and_exits/store-000.jsonc index 5504ca5c..d181bf71 100644 --- a/tests/integration/results/test_core/app_runs_and_exits/store-000.jsonc +++ b/tests/integration/results/test_core/app_runs_and_exits/store-000.jsonc @@ -15,6 +15,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -28,10 +29,11 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -45,6 +47,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -55,13 +58,14 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -72,13 +76,14 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -89,13 +94,14 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -106,18 +112,19 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -131,6 +138,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -139,17 +147,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -158,6 +167,7 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", @@ -175,7 +185,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, diff --git a/tests/integration/results/test_core/app_runs_and_exits/window-000.hash b/tests/integration/results/test_core/app_runs_and_exits/window-000.hash index bff73f73..40dd4015 100644 --- a/tests/integration/results/test_core/app_runs_and_exits/window-000.hash +++ b/tests/integration/results/test_core/app_runs_and_exits/window-000.hash @@ -1,2 +1,2 @@ // window-000 -16f712ad7d05caa2db6f642326636a1b2272218ad0569109608c7282166594b5 +ebfb22ab6cf3dad1c8840de2aaf6a3850f9d038e6d4eac759cbfe449c88daa47 diff --git a/tests/integration/results/test_services/all_services_register/store-000.jsonc b/tests/integration/results/test_services/all_services_register/store-000.jsonc index e1618aad..4b6cc126 100644 --- a/tests/integration/results/test_services/all_services_register/store-000.jsonc +++ b/tests/integration/results/test_services/all_services_register/store-000.jsonc @@ -111,6 +111,7 @@ "icon": "󰍜", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [ { @@ -124,6 +125,7 @@ "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [ { @@ -137,11 +139,12 @@ ], "icon": "󰡨", "is_short": false, - "label": "Docker" + "label": "Docker", + "opacity": null } ], "placeholder": "No apps", - "title": "Apps" + "title": "󰀻Apps" } }, { @@ -155,6 +158,7 @@ "icon": "", "is_short": false, "label": "Settings", + "opacity": null, "sub_menu": { "items": [ { @@ -165,9 +169,10 @@ 1, 1 ], - "icon": null, + "icon": "󰛳", "is_short": false, - "label": "Connectivity", + "label": "Network", + "opacity": null, "sub_menu": { "items": [ { @@ -181,6 +186,7 @@ "icon": "󰖩", "is_short": false, "label": "WiFi", + "opacity": null, "sub_menu": { "items": [ { @@ -194,7 +200,8 @@ ], "icon": "󱛃", "is_short": false, - "label": "Add" + "label": "Add", + "opacity": null }, { "action": "", @@ -207,7 +214,8 @@ ], "icon": "󱖫", "is_short": false, - "label": "Select" + "label": "Select", + "opacity": null } ], "placeholder": null, @@ -225,7 +233,8 @@ ], "icon": "[color=#008000]󰪥[/color]", "is_short": false, - "label": "SSH" + "label": "SSH", + "opacity": null }, { "background_color": "#68B7FF", @@ -238,6 +247,7 @@ "icon": "󰩟", "is_short": false, "label": "IP Addresses", + "opacity": null, "sub_menu": { "items": [ { @@ -251,6 +261,7 @@ "icon": "󰈀", "is_short": false, "label": "eth0", + "opacity": null, "sub_menu": { "items": [ { @@ -263,7 +274,8 @@ ], "icon": "󰩠", "is_short": false, - "label": "192.168.1.1" + "label": "192.168.1.1", + "opacity": null } ], "placeholder": "No IP addresses", @@ -277,7 +289,7 @@ } ], "placeholder": "No settings in this category", - "title": "Connectivity" + "title": "󰛳Network" } }, { @@ -288,9 +300,10 @@ 1, 1 ], - "icon": null, + "icon": "󰖤", "is_short": false, - "label": "Interface", + "label": "Accessibility", + "opacity": null, "sub_menu": { "items": [ { @@ -304,6 +317,7 @@ "icon": "󰔊", "is_short": false, "label": "Voice", + "opacity": null, "sub_menu": { "heading": "󰔊 Picovoice", "items": [ @@ -318,7 +332,8 @@ ], "icon": "󰐲", "is_short": false, - "label": "Set Access Key" + "label": "Set Access Key", + "opacity": null }, { "action": "", @@ -331,7 +346,8 @@ ], "icon": "󰌊", "is_short": false, - "label": "Clear Access Key" + "label": "Clear Access Key", + "opacity": null } ], "placeholder": null, @@ -341,7 +357,7 @@ } ], "placeholder": "No settings in this category", - "title": "Interface" + "title": "󰖤Accessibility" } }, { @@ -352,9 +368,10 @@ 1, 1 ], - "icon": null, + "icon": "󰟻", "is_short": false, - "label": "System", + "label": "Utilities", + "opacity": null, "sub_menu": { "items": [ { @@ -368,11 +385,12 @@ ], "icon": "[color=#008000]󰪥[/color]", "is_short": false, - "label": "LightDM" + "label": "LightDM", + "opacity": null } ], "placeholder": "No settings in this category", - "title": "System" + "title": "󰟻Utilities" } }, { @@ -383,9 +401,10 @@ 1, 1 ], - "icon": null, + "icon": "󰀻", "is_short": false, "label": "Apps", + "opacity": null, "sub_menu": { "items": [ { @@ -399,6 +418,7 @@ "icon": "󰡨", "is_short": false, "label": "Docker", + "opacity": null, "sub_menu": { "heading": "󰡨 Docker", "items": [ @@ -413,22 +433,23 @@ ], "icon": "󰐲", "is_short": false, - "label": "Set Access Key" + "label": "Set Access Key", + "opacity": null } ], "placeholder": null, "sub_heading": "Login a registry:", - "title": "Docker Settings" + "title": "󰡨Docker Settings" } } ], "placeholder": "No settings in this category", - "title": "Apps" + "title": "󰀻Apps" } } ], "placeholder": null, - "title": "Settings" + "title": "Settings" } }, { @@ -442,6 +463,7 @@ "icon": "", "is_short": false, "label": "About", + "opacity": null, "sub_menu": { "heading": "Ubo v0.0.0", "items": [ @@ -450,17 +472,18 @@ "color": "#000000", "icon": "󰄬", "is_short": false, - "label": "Already up to date!" + "label": "Already up to date!", + "opacity": null } ], "placeholder": null, "sub_heading": "A universal dashboard for your Raspberry Pi", - "title": "About" + "title": "About" } } ], "placeholder": null, - "title": "Main" + "title": "󰍜Main" } }, { @@ -469,10 +492,11 @@ "icon": "", "is_short": true, "label": "", + "opacity": null, "sub_menu": { "items": [], "placeholder": "No notifications", - "title": "Notifications (0)" + "title": "Notifications (0)" } }, { @@ -486,7 +510,8 @@ ], "icon": "󰐥", "is_short": true, - "label": "Turn off" + "label": "Turn off", + "opacity": null } ], "placeholder": null, diff --git a/tests/integration/results/test_services/all_services_register/window-000.hash b/tests/integration/results/test_services/all_services_register/window-000.hash index e89a4efc..55c21775 100644 --- a/tests/integration/results/test_services/all_services_register/window-000.hash +++ b/tests/integration/results/test_services/all_services_register/window-000.hash @@ -1,2 +1,2 @@ // window-000 -e7d60a1a33c4508e4a56b70fd5bcd1843a71c4e271c22af4f9b680a029ddeedf +e9885cb8ea68f54691794e9b73c1472c4abc8b19f34a2167fcd61f9afe92baa2 diff --git a/ubo_app/menu_app/home_page.kv b/ubo_app/menu_app/home_page.kv index 3ed3bfa0..7365cf42 100644 --- a/ubo_app/menu_app/home_page.kv +++ b/ubo_app/menu_app/home_page.kv @@ -1,24 +1,33 @@ -#:kivy 2.2.1 +#:kivy 2.3.0 : BoxLayout: id: layout orientation: 'horizontal' - NormalMenuPageWidget: - items: root.items + Widget: + id: container width: dp(UBO_GUI_SHORT_WIDTH) size_hint: None, 1 - BoxLayout + NormalMenuPageWidget: + size: container.width, dp(UBO_GUI_MENU_ITEM_HEIGHT * 5 + UBO_GUI_MENU_ITEM_GAP * 4) + items: root.items + count: root.count + offset: root.offset + padding_bottom: root.padding_bottom + padding_top: root.padding_top + + BoxLayout: id: central_column orientation: 'vertical' spacing: dp(12) - padding: dp(16) + padding: dp(10), root.padding_top + dp(6), dp(10), root.padding_bottom + dp(6) size_hint: 1, 1 - BoxLayout + BoxLayout: id: right_column + padding: 0, root.padding_top, 0, root.padding_bottom orientation: 'vertical' width: dp(UBO_GUI_SHORT_WIDTH) size_hint: None, 1 diff --git a/ubo_app/menu_app/home_page.py b/ubo_app/menu_app/home_page.py index cf6d2f0d..9c845c91 100644 --- a/ubo_app/menu_app/home_page.py +++ b/ubo_app/menu_app/home_page.py @@ -1,11 +1,14 @@ # ruff: noqa: D100, D101, D102, D103, D104, D107 from __future__ import annotations +import pathlib from functools import cached_property from typing import TYPE_CHECKING from kivy.clock import Clock +from kivy.lang.builder import Builder from ubo_gui.gauge import GaugeWidget +from ubo_gui.menu.constants import PAGE_SIZE from ubo_gui.page import PageWidget from ubo_gui.volume import VolumeWidget @@ -20,11 +23,18 @@ class HomePage(PageWidget): def __init__( self: HomePage, - items: Sequence[Item] | None = None, + items: Sequence[Item | None] = [], *args: object, **kwargs: object, ) -> None: - super().__init__(items, *args, **kwargs) + super().__init__( + [None, *items, None], + *args, + count=PAGE_SIZE + 2, + offset=1, + render_surroundings=True, + **kwargs, + ) self.ids.central_column.add_widget(self.cpu_gauge) self.ids.central_column.add_widget(self.ram_gauge) @@ -70,3 +80,8 @@ def set_value(_: int) -> None: Clock.schedule_interval(set_value, 1) return gauge + + +Builder.load_file( + pathlib.Path(__file__).parent.joinpath('home_page.kv').resolve().as_posix(), +) diff --git a/ubo_app/menu_app/menu_central.py b/ubo_app/menu_app/menu_central.py index a4d3ade0..20dd91c7 100644 --- a/ubo_app/menu_app/menu_central.py +++ b/ubo_app/menu_app/menu_central.py @@ -1,7 +1,6 @@ # ruff: noqa: D100, D101, D102, D103, D104, D107 from __future__ import annotations -import pathlib import re import weakref from functools import cached_property @@ -9,7 +8,6 @@ from debouncer import DebounceOptions, debounce from kivy.clock import Clock, mainthread -from kivy.lang.builder import Builder from ubo_gui.app import UboApp from ubo_gui.menu import MenuWidget from ubo_gui.notification import NotificationWidget @@ -35,8 +33,13 @@ class MenuWidgetWithHomePage(MenuWidget): def render_items(self: MenuWidgetWithHomePage, *_: object) -> None: - if self.depth == 1: - self.current_screen = HomePage(self.current_menu_items, name='Page 1 0') + if self.depth <= 1: + self.current_screen = HomePage( + self.current_menu_items, + name='Page 1 0', + padding_bottom=self.padding_bottom, + padding_top=self.padding_top, + ) else: super().render_items() @@ -64,12 +67,33 @@ async def _(menu: Menu | None) -> None: return mainthread(self.menu_widget.set_root_menu)(menu) + self.menu_widget.bind(page_index=self.handle_page_index_change) + self.menu_widget.bind(current_menu=self.handle_page_index_change) + + def build(self: UboApp) -> Widget | None: + root = super().build() + self.menu_widget.padding_top = root.ids.header_layout.height + self.menu_widget.padding_bottom = root.ids.footer_layout.height + return root + + def handle_page_index_change( + self: MenuAppCentral, + *_: object, + ) -> None: + self.root.ids.header_layout.opacity = ( + 1 if self.menu_widget.page_index == 0 else 0 + ) + self.root.ids.footer_layout.opacity = ( + 1 if self.menu_widget.page_index >= self.menu_widget.pages - 1 else 0 + ) + def handle_title_change(self: MenuAppCentral, _: MenuWidget, title: str) -> None: self.root.title = title @cached_property def central(self: MenuAppCentral) -> Widget | None: """Build the main menu and initiate it.""" + self.root.is_fullscreen = True self.root.title = self.menu_widget.title self.menu_widget.bind(title=self.handle_title_change) self.menu_widget.bind(current_screen=set_path) @@ -113,7 +137,6 @@ def display_notification( ) -> None: notification = event.notification application = NotificationWidget( - title='Notification', notification_title=notification.title, content=notification.content, icon=notification.icon, @@ -140,7 +163,10 @@ def display_notification( application.bind( on_info=lambda _: ( dispatch( - VoiceReadTextAction(text=notification.extra_information or ''), + VoiceReadTextAction( + text=(notification.extra_information or '').replace('\n', '') + or '', + ), ), self.menu_widget.open_application(info_application), ), @@ -153,8 +179,3 @@ def display_notification( lambda _: application.dispatch('on_dismiss'), notification.flash_time, ) - - -Builder.load_file( - pathlib.Path(__file__).parent.joinpath('home_page.kv').resolve().as_posix(), -) diff --git a/ubo_app/menu_app/notification_info.kv b/ubo_app/menu_app/notification_info.kv index 9d4b3fb8..b1937b3e 100644 --- a/ubo_app/menu_app/notification_info.kv +++ b/ubo_app/menu_app/notification_info.kv @@ -1,11 +1,11 @@ -#:kivy 2.2.1 +#:kivy 2.3.0 : BoxLayout: orientation: 'horizontal' - padding: dp(5) + padding: dp(5), dp(5), dp(5), root.padding_bottom - Widget: + StencilView: id: container size_hint: 1, 1 @@ -29,7 +29,6 @@ size_hint: None, 1 orientation: 'vertical' width: dp(UBO_GUI_SHORT_WIDTH) - padding: 0, dp(16), 0, dp(16) AnimatedSlider: id: slider diff --git a/ubo_app/services/000-sound/setup.py b/ubo_app/services/000-sound/setup.py index 058dc5e8..766179a1 100644 --- a/ubo_app/services/000-sound/setup.py +++ b/ubo_app/services/000-sound/setup.py @@ -16,8 +16,8 @@ def init_service() -> None: audio_manager = AudioManager() register_persistent_store( - 'sound_playback_volume', - lambda state: state.sound.playback_volume, + 'sound_state', + lambda state: state.sound, ) dispatch( diff --git a/ubo_app/services/030-wifi/pages/create_wireless_connection.kv b/ubo_app/services/030-wifi/pages/create_wireless_connection.kv index ec4c7f9b..bcecf8bf 100644 --- a/ubo_app/services/030-wifi/pages/create_wireless_connection.kv +++ b/ubo_app/services/030-wifi/pages/create_wireless_connection.kv @@ -1,34 +1,42 @@ - - BoxLayout: - orientation: 'vertical' - padding: dp(50) - spacing: dp(20) +#:kivy 2.3.0 + +: + AnchorLayout: + padding: 0, root.padding_top, 0, root.padding_bottom BoxLayout: - orientation: 'horizontal' - size_hint: 1, 1 - Label: - text: '󱛃' if root.creating else '󰄀' - size_hint: 1, None - font_size: dp(60) - height: self.texture_size[1] + anchor: 'center', 'top' + orientation: 'vertical' + padding: dp(50) + spacing: dp(10) + + BoxLayout: + orientation: 'horizontal' + size_hint: 1, 1 + Label: + text: '󱛃' if root.creating else '󰄀' + size_hint: 1, None + font_size: dp(60) + height: self.texture_size[1] + + Label: + text: '' if root.creating else '󰐲' + size_hint: 1, None + font_size: dp(60) + height: self.texture_size[1] Label: - text: '' if root.creating else '󰐲' - size_hint: 1, None - font_size: dp(60) + text: 'Creating Scanned WiFi Connection' if root.creating else 'Scan WiFi QR-Code With Front Camera' + text_size: self.width, None + font_size: dp(19) + halign: 'center' + valign: 'middle' height: self.texture_size[1] + size_hint: 1, 1 - Label: - text: 'Creating Scanned WiFi Connection' if root.creating else 'Scan WiFi QR-Code With Front Camera' - text_size: self.width, None - font_size: dp(19) - halign: 'center' - valign: 'middle' - height: self.texture_size[1] - size_hint: 1, 1 - - ItemWidget: - item: root.get_item(2) - is_set: not root.creating - size_hint: 1, None + BoxLayout: + anchor: 'left', 'bottom' + ItemWidget: + item: root.get_item(2) + is_set: not root.creating + size_hint: 1, None diff --git a/ubo_app/services/050-ssh/setup.py b/ubo_app/services/050-ssh/setup.py index 4a6e547c..5844ecb7 100644 --- a/ubo_app/services/050-ssh/setup.py +++ b/ubo_app/services/050-ssh/setup.py @@ -68,7 +68,7 @@ async def act() -> None: def __init__(self: ClearTemporaryUsersPrompt, **kwargs: object) -> None: """Initialize the prompt.""" super().__init__(**kwargs, items=None) - self.prompt = 'Clear temporary ssh users?' + self.prompt = 'Remove all temporary SSH accounts?' self.icon = '󱈋' self.first_option_label = '' self.first_option_background_color = 'black' @@ -110,9 +110,9 @@ async def act() -> None: dispatch( NotificationsAddAction( notification=Notification( - title=f'[size=20dp][b]HOST:[/b] {hostname}\n' - f'[b]USER:[/b] {username}\n[b]PASS:[/b] {password}[/size]', - content='', + title='Account Info', + content=f'[size=18dp][b]host:[/b] {hostname}\n' + f'[b]user:[/b] {username}\n[b]pass:[/b] {password}[/size]', importance=Importance.MEDIUM, icon='', display_type=NotificationDisplayType.STICKY, diff --git a/ubo_app/services/080-docker/docker_qrcode.kv b/ubo_app/services/080-docker/docker_qrcode.kv index 419e7693..ef75e21e 100644 --- a/ubo_app/services/080-docker/docker_qrcode.kv +++ b/ubo_app/services/080-docker/docker_qrcode.kv @@ -1,4 +1,4 @@ -#:kivy 2.2.1 +#:kivy 2.3.0 : BoxLayout: diff --git a/ubo_app/setup.py b/ubo_app/setup.py index 5451dacd..ae94e479 100644 --- a/ubo_app/setup.py +++ b/ubo_app/setup.py @@ -18,7 +18,12 @@ def setup() -> None: sys.modules['sdbus_async'] = Fake() sys.modules['sdbus_async.networkmanager'] = Fake() sys.modules['sdbus_async.networkmanager.enums'] = Fake() - subprocess.run = Fake() + original_run = subprocess.run + subprocess.run = ( + lambda command, *args, **kwargs: Fake() + if any(i in command[0] for i in ('reboot', 'poweroff')) + else original_run(command, *args, **kwargs) + ) asyncio.create_subprocess_exec = Fake( _Fake__return_value=Fake( _Fake__await_value=Fake( diff --git a/ubo_app/store/services/sound.py b/ubo_app/store/services/sound.py index affc7694..25f3eddb 100644 --- a/ubo_app/store/services/sound.py +++ b/ubo_app/store/services/sound.py @@ -1,7 +1,6 @@ # ruff: noqa: D100, D101, D102, D103, D104, D107, N999 from __future__ import annotations -import functools from dataclasses import field from enum import StrEnum from typing import TYPE_CHECKING @@ -69,34 +68,38 @@ class SoundPlayAudioEvent(SoundEvent): class SoundState(Immutable): playback_volume: float = field( - default_factory=functools.partial( - read_from_persistent_store, - key='sound_playback_volume', - object_type=float, - default=0.5, - ), + default_factory=lambda: read_from_persistent_store( + key='sound_state', + object_type=SoundState, + default=default_sound_state, + ).playback_volume, ) is_playback_mute: bool = field( - default_factory=functools.partial( - read_from_persistent_store, - key='sound_is_playback_mute', - object_type=bool, - default=False, - ), + default_factory=lambda: read_from_persistent_store( + key='sound_state', + object_type=SoundState, + default=default_sound_state, + ).is_playback_mute, ) capture_volume: float = field( - default_factory=functools.partial( - read_from_persistent_store, - key='sound_capture_volume', - object_type=float, - default=0.5, - ), + default_factory=lambda: read_from_persistent_store( + key='sound_state', + object_type=SoundState, + default=default_sound_state, + ).capture_volume, ) is_capture_mute: bool = field( - default_factory=functools.partial( - read_from_persistent_store, - key='sound_is_capture_mute', - object_type=bool, - default=False, - ), + default_factory=lambda: read_from_persistent_store( + key='sound_state', + object_type=SoundState, + default=default_sound_state, + ).is_capture_mute, ) + + +default_sound_state = SoundState( + playback_volume=0.5, + is_playback_mute=False, + capture_volume=0.5, + is_capture_mute=False, +) diff --git a/ubo_app/utils/persistent_store.py b/ubo_app/utils/persistent_store.py index 8074924f..67d01533 100644 --- a/ubo_app/utils/persistent_store.py +++ b/ubo_app/utils/persistent_store.py @@ -37,9 +37,9 @@ async def write(value: T) -> None: current_state = json.loads(Path(PERSISTENT_STORE_PATH).read_text()) except FileNotFoundError: current_state = {} - serialized_value = json.dumps(store.serialize_value(value), indent=2) + serialized_value = store.serialize_value(value) current_state[key] = serialized_value - Path(PERSISTENT_STORE_PATH).write_text(json.dumps(current_state)) + Path(PERSISTENT_STORE_PATH).write_text(json.dumps(current_state, indent=2)) subscribe_event(FinishEvent, write.unsubscribe) @@ -77,13 +77,14 @@ def read_from_persistent_store( from ubo_app.store import store try: - current_state = json.loads(Path(PERSISTENT_STORE_PATH).read_text()) + file_content = Path(PERSISTENT_STORE_PATH).read_text() + current_state = json.loads(file_content) except FileNotFoundError: return default or (None if object_type is None else object_type()) - serialized_value = current_state.get(key) - if serialized_value is None: + value = current_state.get(key) + if value is None: return default or (None if object_type is None else object_type()) return store.load_object( - json.loads(serialized_value), + value, object_type=cast(type[T], object_type), ) diff --git a/ubo_app/utils/qrcode.py b/ubo_app/utils/qrcode.py index f4eb84a9..6190ecc9 100644 --- a/ubo_app/utils/qrcode.py +++ b/ubo_app/utils/qrcode.py @@ -38,6 +38,7 @@ async def qrcode_input( pattern: str, *, prompt: str | None = None, + title: str | None = None, ) -> tuple[str, QrCodeGroupDict]: ... @@ -46,6 +47,7 @@ async def qrcode_input( pattern: str, *, prompt: str | None = None, + title: str | None = None, resolver: Callable[[str, QrCodeGroupDict], ReturnType], ) -> ReturnType: ... @@ -54,6 +56,7 @@ async def qrcode_input( pattern: str, *, prompt: str | None = None, + title: str | None = None, resolver: Callable[[str, QrCodeGroupDict], ReturnType] | None = None, ) -> tuple[str, QrCodeGroupDict] | ReturnType: """Use the camera to scan a QR code.""" @@ -65,7 +68,8 @@ async def qrcode_input( notification_future = Future() notification = Notification( id='qrcode', - title='QR Code', + icon='󰐲', + title='QR Code' if title is None else title, content=prompt, display_type=NotificationDisplayType.STICKY, is_read=True,