ksaa 2025.11b1__py3-none-any.whl → 2025.11.post1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kaa/__init__.py +0 -0
- kaa/application/__init__.py +0 -0
- kaa/application/core/misc_core.py +4 -1
- kaa/application/services/__init__.py +0 -0
- kaa/application/services/config_service.py +112 -0
- kaa/application/services/feedback_service.py +121 -0
- kaa/application/services/produce_solution_service.py +83 -0
- kaa/application/services/task_service.py +145 -0
- kaa/application/services/update_service.py +208 -0
- kaa/application/ui/__init__.py +0 -0
- kaa/application/ui/common.py +123 -0
- kaa/application/ui/components/alert.py +251 -0
- kaa/application/ui/components/alert.pyi +257 -0
- kaa/application/ui/components/categorized_select.pyi +697 -0
- kaa/application/ui/facade.py +189 -0
- kaa/application/ui/gradio_view.py +135 -0
- kaa/application/ui/views/__init__.py +0 -0
- kaa/application/ui/views/feedback_view.py +65 -0
- kaa/application/ui/views/produce_view.py +251 -0
- kaa/application/ui/views/settings_view.py +581 -0
- kaa/application/ui/views/status_view.py +171 -0
- kaa/application/ui/views/task_view.py +102 -0
- kaa/application/ui/views/update_view.py +106 -0
- kaa/config/schema.py +8 -0
- kaa/db/constants.py +3 -2
- kaa/errors.py +60 -0
- kaa/main/gr.py +60 -3132
- kaa/main/kaa.py +11 -3
- kaa/metadata.py +80 -0
- kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/resources/game.db +0 -0
- kaa/resources/game_ver.txt +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
- kaa/sprites/052ab0f5-8d95-4b5d-8678-3838322d9e5e.png +0 -0
- kaa/sprites/18adb1a5-b95d-41ff-9cb9-16613fa4cf6a.png +0 -0
- kaa/sprites/2aac3a97-435e-4c02-925f-e2d1673b7982.png +0 -0
- kaa/sprites/2cc63c6d-5988-4f72-ae88-b03b8246ad97.png +0 -0
- kaa/sprites/3208d803-2c92-4775-80dc-0527df4b63d9.png +0 -0
- kaa/sprites/345435d0-5a5c-494b-95ab-1e086fb88f51.png +0 -0
- kaa/sprites/3ad30d90-8b57-4641-a9e2-33970e5cea1d.png +0 -0
- kaa/sprites/3e0da5df-a4de-42bd-83bd-13df3c393af4.png +0 -0
- kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
- kaa/sprites/44a50906-1835-4e29-ae97-496b4cdde9e9.png +0 -0
- kaa/sprites/488a1403-d300-4fa6-94c7-da71d09fd4bb.png +0 -0
- kaa/sprites/48c16d60-05d6-43bc-97c3-7f099bfc0881.png +0 -0
- kaa/sprites/4e3dbeb5-70bb-4642-9f73-01f9f98bc3aa.png +0 -0
- kaa/sprites/54987de4-3e1b-4640-b203-1e4c82d7e98d.png +0 -0
- kaa/sprites/5a0bfeac-fb22-4b0c-b775-4aa6220bae89.png +0 -0
- kaa/sprites/5aad0930-54a3-4b6d-bec8-250228963f69.png +0 -0
- kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
- kaa/sprites/5c9a1581-a14a-449b-a1b0-7a31a965facc.png +0 -0
- kaa/sprites/62411b55-7be8-46d9-aa4a-fb56dab6658c.png +0 -0
- kaa/sprites/6580ea89-553e-4445-a855-f834d580e6e6.png +0 -0
- kaa/sprites/686a2bf5-0498-4d53-8ba1-1110ff36f046.png +0 -0
- kaa/sprites/699ca639-3006-45c1-b5fd-8cf9631fd3ea.png +0 -0
- kaa/sprites/6e8325f9-7fdb-4729-ac13-ca67244d97bc.png +0 -0
- kaa/sprites/71051aa7-81f1-4144-9318-4405e10547ee.png +0 -0
- kaa/sprites/732ffc6c-6a17-41f8-9cd1-f218ebc0c23f.png +0 -0
- kaa/sprites/744ea25a-9b6e-4f8f-9a00-0ac714571b09.png +0 -0
- kaa/sprites/74b50642-0b18-45c3-8a5d-013ef1e0eb78.png +0 -0
- kaa/sprites/77e7262f-0d12-4bd9-9f22-e8f41a600bf8.png +0 -0
- kaa/sprites/78b928c6-0d24-4e87-a84f-0091d42f8e49.png +0 -0
- kaa/sprites/7c193df5-0a1d-444d-9f92-e9c0db79e53a.png +0 -0
- kaa/sprites/7e729638-f54a-48bb-8bbf-eeaa4d697502.png +0 -0
- kaa/sprites/802e717f-d70a-4f34-8b96-be586a8dfde9.png +0 -0
- kaa/sprites/831cac7e-49e9-45d1-bb65-b1db733cda90.png +0 -0
- kaa/sprites/8411b102-866d-4e41-ab12-507397b80ca5.png +0 -0
- kaa/sprites/84b3c8e2-6e37-443c-be9b-8a95aedc6f37.png +0 -0
- kaa/sprites/85308e03-ba72-499a-9d12-870269fa3cd0.png +0 -0
- kaa/sprites/8922feef-17db-4b10-93da-1bad30492ac2.png +0 -0
- kaa/sprites/8a6ed80c-79c6-4df6-ab65-64d67afb2d5b.png +0 -0
- kaa/sprites/8c0439d9-9eb7-43f3-8d1e-7e41c57c1bbd.png +0 -0
- kaa/sprites/8dd3de6d-07d5-4d93-9663-71a3a4c57a32.png +0 -0
- kaa/sprites/9009323d-1418-4aed-8a93-075b326d2e7a.png +0 -0
- kaa/sprites/904d22f7-51be-486f-8dd1-1871c0cf28e3.png +0 -0
- kaa/sprites/90943f62-0a03-4a75-804a-0c2fa7b27af4.png +0 -0
- kaa/sprites/9180e0e7-2cc4-46c7-95ff-fbe83806baf2.png +0 -0
- kaa/sprites/93f5c33e-ec81-4a70-a11f-b2e8cb1751ee.png +0 -0
- kaa/sprites/9558b2a5-3961-4ad0-9ce8-379d71920d78.png +0 -0
- kaa/sprites/968dff88-5a2f-42c7-b64b-406801e22c87.png +0 -0
- kaa/sprites/99d99d78-ee37-4e84-8768-b5a7f4f9bd51.png +0 -0
- kaa/sprites/9caa102c-70af-4a8c-b595-82df9f4c05d8.png +0 -0
- kaa/sprites/9e06b7d6-5d15-4844-bbfe-ad1af7da3113.png +0 -0
- kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/sprites/a04ed558-25e3-42d7-a662-250cad9fa5df.png +0 -0
- kaa/sprites/a0a62dbf-a027-4b63-86e4-2e863b2edb01.png +0 -0
- kaa/sprites/a4b898aa-405e-4235-8075-a34640a2b023.png +0 -0
- kaa/sprites/a5c3108f-c92d-4ce7-8c4e-93b79f55ceb3.png +0 -0
- kaa/sprites/a7e6222f-f8ca-47c2-af1e-f158a87f6a03.png +0 -0
- kaa/sprites/ab3d3301-8297-43a8-bf0b-85413c115a7d.png +0 -0
- kaa/sprites/ad589feb-6d19-47c7-a582-55ee130ee89d.png +0 -0
- kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
- kaa/sprites/aed87cd4-eb05-4c24-8adf-cd3fab20e9a3.png +0 -0
- kaa/sprites/afb9e4a9-29a5-4202-9f75-e7d2f1b64aa4.png +0 -0
- kaa/sprites/b1f547d4-c1ba-43fc-9398-4ccdc25b8b62.png +0 -0
- kaa/sprites/b61bd48f-1fe7-49fd-a588-09aac3b66f5a.png +0 -0
- kaa/sprites/b6219452-323a-44eb-9f44-97b2ad0ee49a.png +0 -0
- kaa/sprites/b7550a50-5943-45e7-9c1b-771117364844.png +0 -0
- kaa/sprites/b865eedf-7bea-46f6-bf14-7f8f4e9ab000.png +0 -0
- kaa/sprites/b8f0ed47-6115-4b88-848a-2fc4a1ab25d8.png +0 -0
- kaa/sprites/b9224799-d0c1-43d9-9f11-1d35903fc4d9.png +0 -0
- kaa/sprites/baa9c530-68cb-4111-85f6-060823ad32c4.png +0 -0
- kaa/sprites/bed54f67-d828-403c-9cb3-6a7c85695c2a.png +0 -0
- kaa/sprites/befadc5e-862a-4818-9223-5d58e4ac03cb.png +0 -0
- kaa/sprites/c0d1896c-71a1-47d6-9847-b87543a942e9.png +0 -0
- kaa/sprites/c2984c0f-3e17-45c3-9d7c-dc4f14440b13.png +0 -0
- kaa/sprites/c6b53acc-bc89-465e-9814-0138513327ac.png +0 -0
- kaa/sprites/c72a4609-6bf0-4568-8ebc-73c30d67c61e.png +0 -0
- kaa/sprites/c7829f82-bfce-4259-9ec6-f1cfb7bac925.png +0 -0
- kaa/sprites/c82ebc01-0127-417f-831a-9d17a84b2691.png +0 -0
- kaa/sprites/c8747b3b-745c-45ed-84b6-dde1b2558ce8.png +0 -0
- kaa/sprites/c98ef89e-4a1c-40f0-a82e-6851f7b6bbc9.png +0 -0
- kaa/sprites/cb04d87c-f5a9-405c-92ac-b3603e482221.png +0 -0
- kaa/sprites/cb43f670-6623-4af9-ac1d-746372e40511.png +0 -0
- kaa/sprites/ce357023-436b-4a39-882f-8410acd8f0d7.png +0 -0
- kaa/sprites/cea9f5ea-5923-4c6e-bd24-90d2e084112c.png +0 -0
- kaa/sprites/cf62e2df-3be1-4d03-9f34-1518280abd90.png +0 -0
- kaa/sprites/d0a483a9-400f-4b6e-87a0-9781b4454da0.png +0 -0
- kaa/sprites/d10d480c-e96e-475e-815c-0969f37fe3bc.png +0 -0
- kaa/sprites/d1839450-8d60-41a4-b035-8e1acd0f1c7a.png +0 -0
- kaa/sprites/d19859f3-f7cc-46ef-8bc6-86df7856fd53.png +0 -0
- kaa/sprites/d2d3d77d-a06f-4167-b02b-5ca688c0c0c3.png +0 -0
- kaa/sprites/d38c5015-e461-4e09-8b56-731472bdf59e.png +0 -0
- kaa/sprites/d473b5bd-4be3-4f0f-bb92-b909050f273a.png +0 -0
- kaa/sprites/d609a029-5407-43c2-a9a9-07bfd43fcbb8.png +0 -0
- kaa/sprites/d6491f82-9637-47eb-8f35-eb272b5ef8df.png +0 -0
- kaa/sprites/d8dd8b59-c05c-4350-a15d-be75c94d46cc.png +0 -0
- kaa/sprites/d98263bf-15fb-430e-ba39-2558fa99cac0.png +0 -0
- kaa/sprites/d9bc9bbb-9a1a-4cbe-b6ed-24112d7c5ac7.png +0 -0
- kaa/sprites/da922566-97ba-4477-bcad-35ea02a3ee48.png +0 -0
- kaa/sprites/dac8d8fd-006c-4f50-a4e0-d79dbf3f5915.png +0 -0
- kaa/sprites/db33ab8d-160d-48c7-b464-dfe194e762d4.png +0 -0
- kaa/sprites/dcfdfab4-8dfb-4069-bf88-8e8401ef86f3.png +0 -0
- kaa/sprites/de354b53-2fd0-4039-87e2-fcad2e070579.png +0 -0
- kaa/sprites/e28ea25e-0bcf-4d52-b501-9ef7a4863870.png +0 -0
- kaa/sprites/e2ac927f-257e-4537-995d-fbfbe4983b70.png +0 -0
- kaa/sprites/e642b9ef-c8a7-41d5-8d71-5cfbaf3017a1.png +0 -0
- kaa/sprites/e749feec-6bf2-4c24-bb12-948e696b8116.png +0 -0
- kaa/sprites/ed3aa6e6-4256-416b-9d04-d57ca340e39d.png +0 -0
- kaa/sprites/ed4c0554-84df-4c29-af18-7c38523cc59b.png +0 -0
- kaa/sprites/ef1bfd47-78e9-4cb7-a344-53d980fc3e5e.png +0 -0
- kaa/sprites/ef1ddc7d-75f9-4798-afa1-733e16794a81.png +0 -0
- kaa/sprites/efb01328-b6e1-438e-9471-bef3ea77a22c.png +0 -0
- kaa/sprites/f06b1a4f-eeb6-4dea-9543-5ec27640bdd9.png +0 -0
- kaa/sprites/f07bac27-9201-498f-9f26-a58291a70542.png +0 -0
- kaa/sprites/f0fd613b-d2f8-4b18-90d8-0b328373e715.png +0 -0
- kaa/sprites/f1fbe46a-759d-467d-b8ca-2158f530f7c5.png +0 -0
- kaa/sprites/f2314c76-3a2b-4644-831a-343a601145df.png +0 -0
- kaa/sprites/f329d4ba-e836-4be6-a05b-879b53667df3.png +0 -0
- kaa/sprites/f469d235-552f-4b07-9d03-9bcae425b6d8.png +0 -0
- kaa/sprites/f5177258-a3cf-4d4f-9c69-0b49556f754f.png +0 -0
- kaa/sprites/f5dcac82-7c54-4020-84c5-b1334b595612.png +0 -0
- kaa/sprites/f6656842-1460-41ab-95ed-561aefaf08e2.png +0 -0
- kaa/sprites/f70e9455-7cc8-449c-8282-89a9e69f7ac3.png +0 -0
- kaa/sprites/f7fd469f-791e-4bf7-ae3f-b5aaed92f999.png +0 -0
- kaa/sprites/f873280f-bc68-40d1-8d8d-3d86964264f0.png +0 -0
- kaa/sprites/f9da6eeb-ff9e-45b3-94b0-e7ba34938dec.png +0 -0
- kaa/sprites/fa24f5d5-d7e5-4421-8cbc-2ce3a0189654.png +0 -0
- kaa/sprites/fb61dbf3-fbc1-400a-adde-83ea08b5027d.png +0 -0
- kaa/sprites/fc8457b6-f8a3-4b01-9864-0cd624c312b6.png +0 -0
- kaa/sprites/fdbf6a89-b95a-481f-a269-be53e05b18de.png +0 -0
- kaa/sprites/fed11307-2186-4ede-875f-ffa0383f410c.png +0 -0
- kaa/sprites/ff0d3db2-c4e5-41e7-a85b-df4fd392924c.png +0 -0
- kaa/sprites/ff40ff91-4e8c-46cb-a254-66cd5ffd363e.png +0 -0
- kaa/sprites/ff614071-c318-4263-af3e-01ea0ab45b73.png +0 -0
- kaa/tasks/R.py +136 -128
- kaa/tasks/R2.py +24 -0
- kaa/tasks/common.py +5 -0
- kaa/tasks/daily/club_reward.py +1 -0
- kaa/tasks/daily/contest.py +2 -1
- kaa/tasks/daily/purchase.py +33 -1
- kaa/tasks/daily/upgrade_support_card.py +12 -2
- kaa/tasks/produce/cards.py +5 -4
- kaa/tasks/produce/common.py +202 -105
- kaa/tasks/produce/in_purodyuusu.py +35 -17
- kaa/tasks/produce/non_lesson_actions.py +10 -33
- kaa/tasks/produce/p_drink.py +5 -1
- kaa/tasks/produce/produce.py +2 -1
- kaa/tasks/start_game.py +2 -1
- kaa/util/reactive.py +182 -0
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/METADATA +27 -24
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/RECORD +352 -181
- /kaa/sprites/{35341839-4469-4ab6-aa40-33642fe43e82.png → 01e93c2c-28dc-41f8-8f9a-ec62ec12aa01.png} +0 -0
- /kaa/sprites/{68d9f340-a3d2-4708-8eb1-c1ed857decda.png → 02ac01e0-00b0-46d8-a6db-56248c843c6d.png} +0 -0
- /kaa/sprites/{39f6d657-3b3e-40aa-849b-7ad87a0be1d0.png → 033e73d1-9f45-4bca-bf96-6778410f2fc4.png} +0 -0
- /kaa/sprites/{799fe395-2264-4bc5-b515-813dadda8fe1.png → 04036690-5b0f-4ee0-a9d0-022ee822bf0e.png} +0 -0
- /kaa/sprites/{256ffeba-8e9e-4cc5-8a1c-9eaee427f1a5.png → 041bd3fc-d040-4773-8641-4e4509300d2f.png} +0 -0
- /kaa/sprites/{5ffd3f29-db4f-4f66-b9ed-be5a70b7ebf9.png → 04974917-b1e8-4ccc-807b-6f651026c955.png} +0 -0
- /kaa/sprites/{8be81341-a74d-42c8-8231-5d1854bc08e7.png → 04c4e4c2-9908-4be7-bcbe-4d926ca76737.png} +0 -0
- /kaa/sprites/{043e753e-db15-45ba-8513-53c3fc9c7f3c.png → 05b97cdf-f7df-4d91-9ec8-5e9594a46382.png} +0 -0
- /kaa/sprites/{5431dc38-c257-40b3-8f7b-8bceaa7fe587.png → 061b032f-860b-4c53-889b-aa126797f062.png} +0 -0
- /kaa/sprites/{cb6dffd9-6474-4d09-aee6-26352ea51d31.png → 07b43eb9-db32-4046-96d3-9f4314bfd80a.png} +0 -0
- /kaa/sprites/{3e087b8d-420d-48ff-b526-29c4a65d8cbe.png → 08b12ded-8230-4c7e-bb9f-27c85b0fdabb.png} +0 -0
- /kaa/sprites/{68e20ebf-02fd-46a1-88d7-b4472824e7bc.png → 09364c3a-f892-4911-abdc-2f5fea09289f.png} +0 -0
- /kaa/sprites/{c69dcdcf-42a7-420e-aa8e-bb8639ea80b6.png → 09d2a63d-d2f0-4b97-b3cb-22a61b1530f7.png} +0 -0
- /kaa/sprites/{d644faa3-ff16-417f-928c-4c62b040bfdb.png → 0cad6e46-276f-424e-a79e-d272ebaa7c8e.png} +0 -0
- /kaa/sprites/{db6707a2-2964-4919-9992-4d801fa43dae.png → 0e49fbde-6be6-42b3-b8d1-36e0cb9cc35d.png} +0 -0
- /kaa/sprites/{cd00a2d7-af48-48b1-b2e1-5360ceed249f.png → 0e51d671-928c-4972-8ac0-de446202070b.png} +0 -0
- /kaa/sprites/{736a9daf-05d6-46ba-810b-5a8f509152d1.png → 0e6f8981-f46c-4c7d-9d90-fe349f0a1d77.png} +0 -0
- /kaa/sprites/{92c3de1b-eed1-45b9-82e0-c9e97bb479e7.png → 0e9e3dbf-6e94-4a12-b558-3d8ab500c0a6.png} +0 -0
- /kaa/sprites/{913dbd4e-ebb1-4c9f-b145-9960cde59c17.png → 0eafb6c1-9d85-4fe0-8011-7235704ca9d3.png} +0 -0
- /kaa/sprites/{ec3cad5f-e0c9-4577-8499-79b50248344e.png → 1002a830-1ad5-47a7-b7dd-ed2989e6fc1b.png} +0 -0
- /kaa/sprites/{e5e49b44-dcc2-4e77-9180-0d2beaa3f9ad.png → 10943367-c1d8-41c7-a831-d5d05288875a.png} +0 -0
- /kaa/sprites/{c1d502eb-c77f-45cb-86b5-11b4a8a3aef5.png → 10f37db0-8c3e-4790-a5c3-cdb841f106a7.png} +0 -0
- /kaa/sprites/{802db04f-77c2-46a4-a6eb-f81d48ea03ce.png → 11f65378-b982-4936-9ac7-68560a74a042.png} +0 -0
- /kaa/sprites/{1befe09b-cb77-417a-b21e-7746804d4e03.png → 1660acf7-a420-4d92-a90c-55c5ff208da6.png} +0 -0
- /kaa/sprites/{16a0fd47-e85b-4848-8894-9d071ea993ac.png → 170d28bf-d262-4bf1-b35f-8f3d4b4fff6e.png} +0 -0
- /kaa/sprites/{5906d986-d0e5-452d-a7c4-ddeb7af8751d.png → 182d8c71-5ce5-4ee1-9f66-ef99aadae654.png} +0 -0
- /kaa/sprites/{cfe3563d-a24b-4197-a0cb-5628bd990c08.png → 18d26894-fd12-4644-8269-a09d11be9520.png} +0 -0
- /kaa/sprites/{8e5e968b-edad-4c03-abc8-3f2a7e8879ae.png → 1b0dd18b-eb41-4c9c-b031-bab91c93fd5d.png} +0 -0
- /kaa/sprites/{3fa5f81c-9223-44ba-bf07-71932350e845.png → 1e7a6e19-760c-4fbc-b0f1-f620f51056b9.png} +0 -0
- /kaa/sprites/{9e7eaa8e-3178-44da-a5ec-34b889f8facf.png → 1fbe13d6-3a4d-4935-b687-a76a76a1e32c.png} +0 -0
- /kaa/sprites/{1ad89ee4-1bb1-41d2-a92c-79caf6baa38a.png → 1fe31432-a050-48db-acc1-becde42deaf9.png} +0 -0
- /kaa/sprites/{94d54ba7-0ccf-4fd9-a5bf-488bac1364c8.png → 20146fe6-e62b-4c57-b229-901994903b70.png} +0 -0
- /kaa/sprites/{6c926e92-9af9-402d-8512-6417ca116928.png → 20c673e9-fcbe-469b-be35-7844a1d5a9cd.png} +0 -0
- /kaa/sprites/{572a921d-633f-4465-b177-7a0d9ad7e099.png → 21747ae5-d94d-45d1-bda8-939389dc4874.png} +0 -0
- /kaa/sprites/{aa1624ff-88b0-447b-8e2b-8a50fd9e4062.png → 21fbbe96-02bf-4835-aa04-068bc5cc6ca3.png} +0 -0
- /kaa/sprites/{3b4dc708-1d34-4a88-9fe3-d8de2ec1d5c8.png → 24be7d90-7944-4a0a-a60c-67c9737b322c.png} +0 -0
- /kaa/sprites/{b59c0e9b-1f20-4194-ab37-286f505fa656.png → 24d6a47c-2099-45e2-9a67-b37767f459fc.png} +0 -0
- /kaa/sprites/{023b8f4c-15ab-4845-b141-446c861ad475.png → 2568d3d3-b642-4ea4-b929-4dee0b09738a.png} +0 -0
- /kaa/sprites/{7d7df15f-707e-4e27-826f-21e42af1dae0.png → 263b1037-fb51-4eb1-8c71-5232b03235d2.png} +0 -0
- /kaa/sprites/{f0aef696-2106-46a4-8b7f-9f16b6c89d3f.png → 27dbd535-7f95-4698-8fea-2bed67dd6968.png} +0 -0
- /kaa/sprites/{81686816-c723-47d1-9824-a68d9ebe1bd4.png → 286801f7-3af5-4cd0-9c25-46c12c2cd8f8.png} +0 -0
- /kaa/sprites/{dc97fea3-898f-4135-9c40-ad41570ab4ae.png → 298182ae-747a-44e3-8511-a64d3532b8ac.png} +0 -0
- /kaa/sprites/{8e019262-ad23-4cbb-84da-86b34775a91e.png → 2d3470f8-a714-4175-a8fe-71eef80921b6.png} +0 -0
- /kaa/sprites/{01247ebe-8d63-4573-90f4-d8dc2b7ca14c.png → 2e3b2982-d14b-4b49-bb64-da8178311d75.png} +0 -0
- /kaa/sprites/{fcc72120-2a77-4c26-a27e-e1027c6088c0.png → 2e41df89-a8d7-4e7e-96cb-7f551414823b.png} +0 -0
- /kaa/sprites/{31f2de0a-567b-425a-9be6-536e4532d813.png → 31e02e56-f266-47b5-8b10-fe79fe06d614.png} +0 -0
- /kaa/sprites/{7daaca55-e3fd-4e12-bf31-872105ceb726.png → 3314dc6c-868f-4045-9f60-1f3a17fed324.png} +0 -0
- /kaa/sprites/{fdf0da06-f088-424f-9941-8c883fea3db3.png → 358f1561-c16f-45a0-842d-d62fc735dc80.png} +0 -0
- /kaa/sprites/{51b95c81-4ff9-434c-ade2-3518e63337cb.png → 3782897a-f1c2-4f05-a02d-4c760672f52a.png} +0 -0
- /kaa/sprites/{847eb5c0-0350-4b7c-9c9c-43c796709795.png → 385e60df-2063-4caf-b1ea-e6ac909bc49d.png} +0 -0
- /kaa/sprites/{8e4d8a0f-4a9d-4562-9234-63806b11d85f.png → 39450419-26b5-4fbd-a5d4-1bab369ced30.png} +0 -0
- /kaa/sprites/{424a0ef5-102d-4734-a731-2b3b3c7c9682.png → 397c0e24-f35a-48c9-a576-aa1fcfc517b5.png} +0 -0
- /kaa/sprites/{23b9cda9-8be8-438e-8e54-57d91a4bd875.png → 3adef8f4-629d-4cb7-b54a-dadabfea155e.png} +0 -0
- /kaa/sprites/{2234f709-1703-4589-905c-175f4db09b1b.png → 3b86b4ac-aa29-4309-82da-f47a174d88cc.png} +0 -0
- /kaa/sprites/{e933cd55-e47a-4327-89d7-b25995cb4a3f.png → 3c6bbcea-488d-4df8-ab40-21e263aa0b16.png} +0 -0
- /kaa/sprites/{49bde219-f9a3-41b5-84b8-e417160a0f40.png → 3db54e0b-672d-4dfd-8a9b-5db37a08be74.png} +0 -0
- /kaa/sprites/{2204967a-a0ee-4dd3-aecb-4d531e8e954c.png → 402d430d-b507-4aa6-b3e1-db66b38c71b4.png} +0 -0
- /kaa/sprites/{70768479-5d7a-4941-8774-ad556c47bee2.png → 414140a2-de67-4c7f-a7f6-c8b30a6c8d6a.png} +0 -0
- /kaa/sprites/{dd7bd6cd-90f1-4773-9b68-5df7f2f84da5.png → 4147514f-4f3f-4dd5-952b-0f2cf5f62181.png} +0 -0
- /kaa/sprites/{0562f69f-0300-4a2b-8252-63f3e7180e4c.png → 43e53b71-9d69-4f4f-b217-a1abeea8991e.png} +0 -0
- /kaa/sprites/{55c3af20-58dc-4407-a383-312a57417c39.png → 44fab632-3920-4cd8-9967-f7a8a1ee29a0.png} +0 -0
- /kaa/sprites/{645909d7-b960-46c7-b208-db44b6b7feec.png → 45f705f9-58fb-4729-ae55-ee10848678d6.png} +0 -0
- /kaa/sprites/{da48db0d-09d9-47c3-9e08-8b69ad547be6.png → 4678a5fa-5b1c-4fdc-b7c4-e0b820039546.png} +0 -0
- /kaa/sprites/{37215a56-f8e1-4f22-a148-9894136f6ab1.png → 4738974e-60b8-4583-8548-94211c164291.png} +0 -0
- /kaa/sprites/{338d7e71-98ce-4cd1-9954-bf7155150780.png → 474c1678-9c36-495b-aef2-cadbb47b237d.png} +0 -0
- /kaa/sprites/{01256311-237c-476f-96ce-4136dc4bfbd3.png → 47783412-9cc7-4ba0-904d-8cd300222889.png} +0 -0
- /kaa/sprites/{9f7150bc-c0b8-48d6-862c-456aaf518b2b.png → 47ed66a4-9e7e-4646-b554-469dc86322db.png} +0 -0
- /kaa/sprites/{5930140e-effe-4bcf-b0be-c20d3990d833.png → 4d0074ad-6db4-4060-b71a-05c0e36e57a6.png} +0 -0
- /kaa/sprites/{22dc4cfe-8c66-4461-8660-e2d11bbe6154.png → 4f2f8328-a698-40d3-a40f-1f1ae77dc843.png} +0 -0
- /kaa/sprites/{694879e8-ecca-45e2-8ea4-1b447fd43ace.png → 52d0ff68-7a55-4d53-bc20-a1fa05cfe876.png} +0 -0
- /kaa/sprites/{962aa0b9-1dd3-4260-a4fb-c069c26e5a84.png → 52d737a7-5b0b-4ce0-ae3f-5d4048060f12.png} +0 -0
- /kaa/sprites/{87f3c1ae-5117-4871-a7d6-3f5ff0c9f9fb.png → 54a9cae1-62e5-4546-a46a-a5157f51e8b4.png} +0 -0
- /kaa/sprites/{e7f2734f-9fdc-4521-8d7e-8b0fe270a223.png → 56d35e14-ada9-4bfa-a48f-e4601054e7eb.png} +0 -0
- /kaa/sprites/{3b4f90c9-6de7-4ac3-8e41-5f8757bf3f3e.png → 575784c1-7c4a-4484-9f38-aa3c280ce56e.png} +0 -0
- /kaa/sprites/{57c81080-7b53-4286-8fa5-848ad63e4774.png → 577417ee-6635-4cb4-9f28-d1e1b47ae2cd.png} +0 -0
- /kaa/sprites/{72634cb3-4c76-4ca2-8898-ebb837ec19e3.png → 58358122-984b-4c31-91d7-eaf5c8c9353d.png} +0 -0
- /kaa/sprites/{179c0fff-ebd2-4a16-8db2-297552cca218.png → 5a06a662-ffa9-49a9-a86d-136e5983abdd.png} +0 -0
- /kaa/sprites/{2b6d2eb0-bcf7-4bea-b037-6293d9c6d728.png → 5c8eebc5-6d5e-445e-a3d1-66dce2bb6338.png} +0 -0
- /kaa/sprites/{2a8626df-056c-46a2-aaf3-0060a5aef6a3.png → 5d2b03a2-acb6-4bd2-86e8-1b203d1aeaec.png} +0 -0
- /kaa/sprites/{0af1d573-1dc7-427e-997d-173308ea3649.png → 5f02656f-1314-44d0-ae31-a176c24d758c.png} +0 -0
- /kaa/sprites/{84cabff2-7a1b-4018-b74b-46f4db06304f.png → 608c12e2-95dd-4efa-93b2-e648e9583062.png} +0 -0
- /kaa/sprites/{8f7b55d8-0143-4d27-bef8-560d4d510500.png → 647bb09a-13f8-4d54-a8ac-5b534f1a8d87.png} +0 -0
- /kaa/sprites/{1cf03f98-63e9-467c-804d-c74dd97b69bd.png → 6483c406-26cc-44ee-ad12-2a30ec47aedb.png} +0 -0
- /kaa/sprites/{889a4153-b713-49cb-a4d5-e302bcdd002d.png → 67d6a201-dfb9-4c88-b42b-d968cf9a034c.png} +0 -0
- /kaa/sprites/{ea430652-e263-4a15-bb6f-8a8807be6c8f.png → 6a93b483-0848-45e4-a937-51850f296c3d.png} +0 -0
- /kaa/sprites/{e4dc3b35-195c-415f-9484-c2459bd8675a.png → 6b4e4351-b370-48cd-8e8f-ca663d44aa0c.png} +0 -0
- /kaa/sprites/{f6b042a8-a91e-4811-99f9-18bbb5197468.png → 6c961dee-87f3-42f1-acef-9fe7d6be4df1.png} +0 -0
- /kaa/sprites/{ab237c6d-c4d8-4716-8ef7-99b8e995c9a7.png → 6d22b7ee-6e0f-4f5d-96a4-d4cba26a4d04.png} +0 -0
- /kaa/sprites/{d7750f81-de10-4d6f-9cc7-35223bda9d70.png → 6d5a3e08-257c-4394-96a6-e0719a66e5ae.png} +0 -0
- /kaa/sprites/{847226a3-b7d2-4156-b732-9215a3e14f3a.png → 71d0d086-50f1-4f50-bb24-a0190827bd08.png} +0 -0
- /kaa/sprites/{2cec1d6a-9e8c-49b3-b885-0b0d7c4b95ee.png → 71f87e1c-77f1-45c7-bb9c-16f14498682b.png} +0 -0
- /kaa/sprites/{30e12bf1-8fa5-4de1-8d7b-28fa0fec0cb6.png → 737570a7-b8f9-4cd7-b5bd-f40cd51b49f8.png} +0 -0
- /kaa/sprites/{ae1e70bc-f735-4749-8c23-95735b91897a.png → 745ee069-0f22-4b99-9327-513f365eb922.png} +0 -0
- /kaa/sprites/{8bd22fe1-b544-4d2e-b74a-34f3cf0eb512.png → 7601152e-a216-4bf8-92a6-4e3e6ea01d3d.png} +0 -0
- /kaa/sprites/{bfdc9b53-2fe5-43f1-8588-7ab71217d31c.png → 7a23d548-4395-40cc-ac19-4497fa3d9fe2.png} +0 -0
- /kaa/sprites/{96704aa3-b5ad-4e34-bb88-fad766415362.png → 7a7871dd-fd07-4234-bd01-c3c9e41bad45.png} +0 -0
- /kaa/sprites/{43a367e1-91dd-495e-8c30-41903f75a99a.png → 7d3c3a12-8d0f-48a7-9fd4-66db5e58488f.png} +0 -0
- /kaa/sprites/{756f4ca7-acac-48e1-8bcd-1c5cd8937e3a.png → 7d9f8ea3-1fdf-4675-8ddf-38393e235746.png} +0 -0
- /kaa/sprites/{31e3ac2b-ecd4-4c37-88bc-985ef32e73a3.png → 83f258af-35b8-4918-a971-80ea938a854e.png} +0 -0
- /kaa/sprites/{91b30f5e-31b2-4756-a3f7-f0f82a335442.png → 848a6c94-97a5-44f7-b84b-2f3283dc446b.png} +0 -0
- /kaa/sprites/{8ed51be4-815c-4a3d-805e-030fdfa341e2.png → 86a56df9-47ff-4741-822d-5b7e024d1598.png} +0 -0
- /kaa/sprites/{f0462447-5226-4819-a39b-19ab90583f83.png → 8b04d1a8-6cd6-4d2e-91e7-bdc58c46d939.png} +0 -0
- /kaa/sprites/{4a081370-b0a1-4067-8470-e3007cc68a12.png → 8b60ce9f-09c0-48a0-93f0-d51e0aa16afb.png} +0 -0
- /kaa/sprites/{91a50322-52d9-4516-9e46-bc121f20667d.png → 8c59d3ca-baff-4260-aa0a-6cedac1c2771.png} +0 -0
- /kaa/sprites/{f635499a-943d-47da-952a-1feb58daa25b.png → 8d7b4761-2555-4398-bb74-b70de3b75e22.png} +0 -0
- /kaa/sprites/{13cb0309-b713-4725-b10b-26afe46eb9c0.png → 901a2e7a-37f3-4dda-a58b-5a7644ead6b9.png} +0 -0
- /kaa/sprites/{cd0e8663-2ea1-436a-b9fb-3caa0c3ed9e8.png → 9cc77f5e-e7d0-4de4-aeb8-587ab8cb212a.png} +0 -0
- /kaa/sprites/{9991b19c-7330-42c4-9d7d-db3cb00103b7.png → 9e45adeb-4637-4b8b-a687-f1d2cd8c6c18.png} +0 -0
- /kaa/sprites/{5734e48a-1e58-42de-be7b-b7db67db4a01.png → a006054e-61fb-4d2b-a98e-45ce3c663662.png} +0 -0
- /kaa/sprites/{d1ea0ea6-4a6a-4036-b140-922c95a648b5.png → a0f98517-e4cf-422c-b29f-395a55939772.png} +0 -0
- /kaa/sprites/{3aed50a2-d640-4178-9b8a-4dd7973eebf1.png → a94d76ef-db70-45a9-aeca-ba16344cc572.png} +0 -0
- /kaa/sprites/{978873bb-e4d0-451b-9126-6977144f5395.png → afe7f086-723e-4999-a7aa-3342a797d828.png} +0 -0
- /kaa/sprites/{dce410ee-fa56-41c4-b75e-e1bff79cd94f.png → b2036053-36fb-4aa7-8348-e31942731a93.png} +0 -0
- /kaa/sprites/{ad94041c-f30b-40b9-b11a-1a26e9962274.png → b6da02bf-3f43-4ed0-9b13-f15becb42ce9.png} +0 -0
- /kaa/sprites/{a5694c76-3c5d-462e-81d5-1e0e6cef0ec9.png → ba2fd21c-6228-4e2d-b2db-a6d085cb38a6.png} +0 -0
- /kaa/sprites/{cba0646d-dffe-4c5b-a44d-1f8d827624a6.png → bb224de8-828e-4bc5-a986-632c72fc9157.png} +0 -0
- /kaa/sprites/{5bf2a814-df85-4d0a-b4b5-8883ac2ee434.png → bcc6ee72-ad5a-4d5c-b6c7-1b3fdfc5fa81.png} +0 -0
- /kaa/sprites/{edcec31d-d5de-4f22-b666-3e3c656e06d8.png → bebf9f6d-7cca-44c5-9b9f-fa36e29e97b3.png} +0 -0
- /kaa/sprites/{9008fbb2-f23f-424f-9be7-5bae6a3697ab.png → c4d0b0c9-ffbe-4b6c-9bf3-b05919e1a07c.png} +0 -0
- /kaa/sprites/{f32a41a2-c482-41ba-b718-28f048f5148c.png → c893e762-f328-4ef6-b862-5da8eb049f9c.png} +0 -0
- /kaa/sprites/{2d0e9d49-365a-4bcb-a416-38b87defaa3c.png → c944d298-a46b-4799-aea3-eec22fc7d4ac.png} +0 -0
- /kaa/sprites/{5c310fe5-7e92-4167-9eba-6e8e14a2863a.png → d28a18db-0f66-45a6-b3cd-69173ecdd790.png} +0 -0
- /kaa/sprites/{464b1dd8-ca2e-41e9-a5b5-90545c584db7.png → d8d5019c-52e6-4767-a9aa-d8da6ffcbd00.png} +0 -0
- /kaa/sprites/{dd873ac0-ffba-4335-9cf2-2162c6835ed8.png → d9cb2f43-2786-48d8-90f8-8cf1929f6172.png} +0 -0
- /kaa/sprites/{e13fc34b-accc-4986-865d-f8d8410b45e9.png → dbc5db78-81f5-41e6-bdc4-dafaa9173320.png} +0 -0
- /kaa/sprites/{e9310e38-a418-4561-bf33-eb3e6dccf477.png → e2ac106f-edeb-4375-af8c-45f33e9bfae6.png} +0 -0
- /kaa/sprites/{d81b1325-e57a-4f22-93e1-6ad4baa28935.png → e8a33d3f-a4fb-4851-b47a-b5f3d85e882f.png} +0 -0
- /kaa/sprites/{2289d38f-dc98-4310-9f34-4cf5023f8545.png → f7facb3a-1b41-4409-b128-d4ad03245845.png} +0 -0
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/WHEEL +0 -0
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/licenses/LICENSE +0 -0
- {ksaa-2025.11b1.dist-info → ksaa-2025.11.post1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import datetime
|
|
3
|
+
from typing import List, Any, Callable, Optional
|
|
4
|
+
|
|
5
|
+
import gradio as gr
|
|
6
|
+
from kotonebot.client.host import Mumu12Host, Mumu12V5Host, LeidianHost
|
|
7
|
+
|
|
8
|
+
from kaa.application.ui.components.alert import Alert
|
|
9
|
+
from kaa.application.ui.facade import KaaFacade, ConfigValidationError
|
|
10
|
+
from kaa.application.ui.common import GradioComponents, GradioInput
|
|
11
|
+
from kaa.config.const import DailyMoneyShopItems, APShopItems
|
|
12
|
+
from kaa.util.reactive import Ref, getter, setter, of, ref
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
class SettingsView:
|
|
17
|
+
def __init__(self, facade: KaaFacade, components: GradioComponents, config_builders: List[Any]):
|
|
18
|
+
self.facade = facade
|
|
19
|
+
self.components = components
|
|
20
|
+
self.config_builders = config_builders
|
|
21
|
+
self.status_text = None
|
|
22
|
+
self.facade.save_configs()
|
|
23
|
+
|
|
24
|
+
def _handle_config_update(self, update_fn: Callable[[], None], success_msg: Optional[str] = '保存成功') -> str:
|
|
25
|
+
"""
|
|
26
|
+
统一处理配置更新、保存和错误捕获的 Helper 方法。
|
|
27
|
+
:param update_fn: 执行配置修改的函数(闭包)
|
|
28
|
+
:return: 状态提示文本
|
|
29
|
+
"""
|
|
30
|
+
try:
|
|
31
|
+
# 1. 执行具体的修改逻辑
|
|
32
|
+
update_fn()
|
|
33
|
+
|
|
34
|
+
# 2. 保存 (持久化)
|
|
35
|
+
self.facade.save_configs()
|
|
36
|
+
|
|
37
|
+
# 3. 反馈
|
|
38
|
+
if success_msg:
|
|
39
|
+
gr.Info(success_msg)
|
|
40
|
+
|
|
41
|
+
time_str = datetime.datetime.now().strftime("%H:%M:%S")
|
|
42
|
+
return f"*设置已保存: {time_str}*"
|
|
43
|
+
|
|
44
|
+
except ConfigValidationError as e:
|
|
45
|
+
# 恢复配置到修改前 (重载磁盘上的配置以覆盖内存中的无效修改)
|
|
46
|
+
# self.facade.config_service.reload()
|
|
47
|
+
gr.Warning(f"{str(e)}")
|
|
48
|
+
return "*保存失败*"
|
|
49
|
+
except Exception as e:
|
|
50
|
+
# 恢复配置
|
|
51
|
+
# self.facade.config_service.reload()
|
|
52
|
+
logger.exception("Failed to update settings")
|
|
53
|
+
gr.Warning(f"保存失败,已还原: {str(e)}")
|
|
54
|
+
return "*保存失败*"
|
|
55
|
+
|
|
56
|
+
def _bind(self, component: GradioInput, ref: Ref):
|
|
57
|
+
"""
|
|
58
|
+
将组件绑定到配置 Ref。自动选择最佳触发事件。
|
|
59
|
+
:param component: Gradio 组件
|
|
60
|
+
:param ref: 绑定引用对象
|
|
61
|
+
"""
|
|
62
|
+
def on_change(value):
|
|
63
|
+
old = ref.value
|
|
64
|
+
if value == old:
|
|
65
|
+
return
|
|
66
|
+
else:
|
|
67
|
+
def update():
|
|
68
|
+
ref.value = value
|
|
69
|
+
return self._handle_config_update(update)
|
|
70
|
+
|
|
71
|
+
# 文本框和数字框使用 blur (失焦) 触发,防止输入中途频繁保存
|
|
72
|
+
if isinstance(component, (gr.Textbox, gr.Number)):
|
|
73
|
+
component.blur(fn=on_change, inputs=component, outputs=self.status_text)
|
|
74
|
+
else:
|
|
75
|
+
# Checkbox, Dropdown, Radio 使用 change 触发
|
|
76
|
+
component.change(fn=on_change, inputs=component, outputs=self.status_text)
|
|
77
|
+
|
|
78
|
+
def create_ui(self):
|
|
79
|
+
"""Creates the content for the 'Settings' tab."""
|
|
80
|
+
gr.Markdown("## 设置")
|
|
81
|
+
self.status_text = gr.Markdown("*设置修改后将自动保存并即时生效。*", elem_classes=["text-gray-500", "text-sm"])
|
|
82
|
+
|
|
83
|
+
with gr.Tabs():
|
|
84
|
+
with gr.Tab("基本"):
|
|
85
|
+
self._create_emulator_settings()
|
|
86
|
+
self._create_start_game_settings()
|
|
87
|
+
self._create_end_game_settings()
|
|
88
|
+
|
|
89
|
+
with gr.Tab("日常"):
|
|
90
|
+
self._create_purchase_settings()
|
|
91
|
+
self._create_work_settings()
|
|
92
|
+
self._create_contest_settings()
|
|
93
|
+
self._create_reward_settings()
|
|
94
|
+
|
|
95
|
+
with gr.Tab("培育"):
|
|
96
|
+
self._create_produce_settings()
|
|
97
|
+
|
|
98
|
+
with gr.Tab("杂项"):
|
|
99
|
+
self._create_misc_settings()
|
|
100
|
+
self._create_idle_settings()
|
|
101
|
+
self._create_debug_settings()
|
|
102
|
+
|
|
103
|
+
def _create_emulator_settings(self):
|
|
104
|
+
"""Creates the UI for emulator/backend settings."""
|
|
105
|
+
# 模拟器设置比较特殊,因为多个组件相互依赖(如 Type 决定 Instance ID)
|
|
106
|
+
# 改为使用 _bind + 状态同步的方式
|
|
107
|
+
gr.Markdown("### 模拟器设置")
|
|
108
|
+
|
|
109
|
+
user_config = self.facade.config_service.get_current_user_config()
|
|
110
|
+
backend_config = user_config.backend
|
|
111
|
+
current_tab_id = backend_config.type
|
|
112
|
+
|
|
113
|
+
# 状态:当前选中的模拟器类型
|
|
114
|
+
backend_type_state = gr.State(value=current_tab_id)
|
|
115
|
+
self._bind(backend_type_state, ref(of(backend_config).type))
|
|
116
|
+
|
|
117
|
+
# 状态:用于在切换 Tab 时传递 instance_id
|
|
118
|
+
instance_id_state = gr.State()
|
|
119
|
+
self._bind(instance_id_state, ref(of(backend_config).instance_id))
|
|
120
|
+
|
|
121
|
+
# 状态:用于记录各个 Tab 的 Dropdown 选中值,解决 Tab 切换时无法获取 hidden 组件值的问题
|
|
122
|
+
mumu_init = backend_config.instance_id if backend_config.type == 'mumu12' else None
|
|
123
|
+
mumu_state = gr.State(value=mumu_init)
|
|
124
|
+
|
|
125
|
+
mumu5_init = backend_config.instance_id if backend_config.type == 'mumu12v5' else None
|
|
126
|
+
mumu5_state = gr.State(value=mumu5_init)
|
|
127
|
+
|
|
128
|
+
leidian_init = backend_config.instance_id if backend_config.type == 'leidian' else None
|
|
129
|
+
leidian_state = gr.State(value=leidian_init)
|
|
130
|
+
|
|
131
|
+
# 定义组件容器
|
|
132
|
+
comps = {}
|
|
133
|
+
|
|
134
|
+
with gr.Tabs(selected=current_tab_id):
|
|
135
|
+
# --- MuMu 12 ---
|
|
136
|
+
with gr.Tab("MuMu 12 v4.x", id="mumu12") as tab_mumu12:
|
|
137
|
+
gr.Markdown("已选中 MuMu 12 v4.x 模拟器")
|
|
138
|
+
comps['mumu_idx'] = gr.Dropdown(label="选择多开实例", choices=[], interactive=True)
|
|
139
|
+
self._bind(comps['mumu_idx'], ref(of(backend_config).instance_id))
|
|
140
|
+
comps['mumu_idx'].change(lambda x: x, inputs=comps['mumu_idx'], outputs=mumu_state)
|
|
141
|
+
|
|
142
|
+
comps['mumu_bg'] = gr.Checkbox(
|
|
143
|
+
label="MuMu12 模拟器后台保活模式", value=backend_config.mumu_background_mode, interactive=True
|
|
144
|
+
)
|
|
145
|
+
self._bind(comps['mumu_bg'], ref(of(backend_config).mumu_background_mode))
|
|
146
|
+
|
|
147
|
+
self._setup_mumu_refresh(tab_mumu12, comps['mumu_idx'], backend_config, 'mumu12', Mumu12Host)
|
|
148
|
+
|
|
149
|
+
tab_mumu12.select(
|
|
150
|
+
fn=lambda x: ("mumu12", x),
|
|
151
|
+
inputs=[mumu_state],
|
|
152
|
+
outputs=[backend_type_state, instance_id_state]
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# --- MuMu 12 v5 ---
|
|
156
|
+
with gr.Tab("MuMu 12 v5.x", id="mumu12v5") as tab_mumu12v5:
|
|
157
|
+
gr.Markdown("已选中 MuMu 12 v5.x 模拟器")
|
|
158
|
+
comps['mumu5_idx'] = gr.Dropdown(label="选择多开实例", choices=[], interactive=True)
|
|
159
|
+
self._bind(comps['mumu5_idx'], ref(of(backend_config).instance_id))
|
|
160
|
+
comps['mumu5_idx'].change(lambda x: x, inputs=comps['mumu5_idx'], outputs=mumu5_state)
|
|
161
|
+
|
|
162
|
+
comps['mumu5_bg'] = gr.Checkbox(
|
|
163
|
+
label="MuMu12v5 模拟器后台保活模式", value=backend_config.mumu_background_mode, interactive=True
|
|
164
|
+
)
|
|
165
|
+
self._bind(comps['mumu5_bg'], ref(of(backend_config).mumu_background_mode))
|
|
166
|
+
|
|
167
|
+
self._setup_mumu_refresh(tab_mumu12v5, comps['mumu5_idx'], backend_config, 'mumu12v5', Mumu12V5Host)
|
|
168
|
+
|
|
169
|
+
tab_mumu12v5.select(
|
|
170
|
+
fn=lambda x: ("mumu12v5", x),
|
|
171
|
+
inputs=[mumu5_state],
|
|
172
|
+
outputs=[backend_type_state, instance_id_state]
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# --- Leidian ---
|
|
176
|
+
with gr.Tab("雷电", id="leidian") as tab_leidian:
|
|
177
|
+
gr.Markdown("已选中雷电模拟器")
|
|
178
|
+
comps['leidian_idx'] = gr.Dropdown(label="选择多开实例", choices=[], interactive=True)
|
|
179
|
+
self._bind(comps['leidian_idx'], ref(of(backend_config).instance_id))
|
|
180
|
+
comps['leidian_idx'].change(lambda x: x, inputs=comps['leidian_idx'], outputs=leidian_state)
|
|
181
|
+
|
|
182
|
+
self._setup_mumu_refresh(tab_leidian, comps['leidian_idx'], backend_config, 'leidian', LeidianHost)
|
|
183
|
+
|
|
184
|
+
tab_leidian.select(
|
|
185
|
+
fn=lambda x: ("leidian", x),
|
|
186
|
+
inputs=[leidian_state],
|
|
187
|
+
outputs=[backend_type_state, instance_id_state]
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# --- Custom ---
|
|
191
|
+
with gr.Tab("自定义", id="custom") as tab_custom:
|
|
192
|
+
comps['adb_ip'] = gr.Textbox(value=backend_config.adb_ip, label="ADB IP 地址", interactive=True)
|
|
193
|
+
self._bind(comps['adb_ip'], ref(of(backend_config).adb_ip))
|
|
194
|
+
|
|
195
|
+
comps['adb_port'] = gr.Number(value=backend_config.adb_port, label="ADB 端口", minimum=1, maximum=65535, step=1, interactive=True)
|
|
196
|
+
self._bind(comps['adb_port'], ref(of(backend_config).adb_port))
|
|
197
|
+
|
|
198
|
+
tab_custom.select(
|
|
199
|
+
fn=lambda: ("custom", None),
|
|
200
|
+
outputs=[backend_type_state, instance_id_state]
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# --- DMM ---
|
|
204
|
+
with gr.Tab("DMM", id="dmm") as tab_dmm:
|
|
205
|
+
gr.Markdown("已选中 DMM")
|
|
206
|
+
|
|
207
|
+
tab_dmm.select(
|
|
208
|
+
fn=lambda: ("dmm", None),
|
|
209
|
+
outputs=[backend_type_state, instance_id_state]
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# 通用设置
|
|
213
|
+
comps['screenshot'] = gr.Dropdown(
|
|
214
|
+
choices=['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows', 'nemu_ipc'],
|
|
215
|
+
value=backend_config.screenshot_impl, label="截图方法", interactive=True
|
|
216
|
+
)
|
|
217
|
+
self._bind(comps['screenshot'], ref(of(backend_config).screenshot_impl))
|
|
218
|
+
|
|
219
|
+
@gr.render(inputs=[comps['screenshot'], backend_type_state])
|
|
220
|
+
def _tip(impl: str, backend_type: str):
|
|
221
|
+
if not impl or not backend_type:
|
|
222
|
+
return
|
|
223
|
+
|
|
224
|
+
is_mumu = 'mumu' in backend_type
|
|
225
|
+
# 1. 检查 DMM 兼容性
|
|
226
|
+
if backend_type == 'dmm':
|
|
227
|
+
if impl != 'windows' and impl != 'remote_windows':
|
|
228
|
+
Alert(
|
|
229
|
+
title="提示",
|
|
230
|
+
value="DMM 版本仅支持 `windows` 截图方式",
|
|
231
|
+
variant="warning",
|
|
232
|
+
show_close=False
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# 2. 检查模拟器兼容性
|
|
236
|
+
else:
|
|
237
|
+
if impl == 'nemu_ipc' and not is_mumu:
|
|
238
|
+
Alert(
|
|
239
|
+
title="提示",
|
|
240
|
+
value="`nemu_ipc` 仅适用于 MuMu 模拟器,其他模拟器请选择 `adb` 或 `uiautomator`",
|
|
241
|
+
variant="warning",
|
|
242
|
+
show_close=False
|
|
243
|
+
)
|
|
244
|
+
elif is_mumu and impl in ['adb', 'adb_raw', 'uiautomator2']:
|
|
245
|
+
Alert(
|
|
246
|
+
title="提示",
|
|
247
|
+
value="MuMu 模拟器推荐使用 `nemu_ipc` 截图方式,性能更佳且更稳定",
|
|
248
|
+
variant="info",
|
|
249
|
+
show_close=False
|
|
250
|
+
)
|
|
251
|
+
elif impl in ['windows', 'remote_windows']:
|
|
252
|
+
Alert(
|
|
253
|
+
title="提示",
|
|
254
|
+
value="模拟器不支持 `windows` 截图方式,建议使用 `adb` 或 `nemu_ipc`",
|
|
255
|
+
variant="warning",
|
|
256
|
+
show_close=False
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
comps['interval'] = gr.Number(
|
|
260
|
+
label="最小截图间隔(秒)", value=backend_config.target_screenshot_interval, minimum=0, step=0.1, interactive=True
|
|
261
|
+
)
|
|
262
|
+
self._bind(comps['interval'], ref(of(backend_config).target_screenshot_interval))
|
|
263
|
+
|
|
264
|
+
def _setup_mumu_refresh(self, tab, dropdown, config, type_key, host_cls):
|
|
265
|
+
# (辅助方法:为了简化主代码逻辑,将原本的刷新按钮逻辑抽取出来)
|
|
266
|
+
refresh_msg = gr.Markdown("<div style='color: red;'>点击下方「刷新」按钮载入信息</div>", visible=True)
|
|
267
|
+
refresh_btn = gr.Button("刷新")
|
|
268
|
+
|
|
269
|
+
def refresh():
|
|
270
|
+
try:
|
|
271
|
+
instances = host_cls.list()
|
|
272
|
+
is_current = config.type == type_key
|
|
273
|
+
current_id = config.instance_id if is_current else None
|
|
274
|
+
choices = [(i.name, i.id) for i in instances]
|
|
275
|
+
return gr.Dropdown(choices=choices, value=current_id, interactive=True), gr.Markdown(visible=False)
|
|
276
|
+
except Exception:
|
|
277
|
+
return gr.Dropdown(choices=[], interactive=True), gr.Markdown(visible=True)
|
|
278
|
+
|
|
279
|
+
refresh_btn.click(fn=refresh, outputs=[dropdown, refresh_msg])
|
|
280
|
+
|
|
281
|
+
# 自动加载
|
|
282
|
+
if config.type == type_key and config.instance_id:
|
|
283
|
+
try:
|
|
284
|
+
instances = host_cls.list()
|
|
285
|
+
dropdown.choices = [(i.name, i.id) for i in instances]
|
|
286
|
+
dropdown.value = config.instance_id
|
|
287
|
+
refresh_msg.visible = False
|
|
288
|
+
except:
|
|
289
|
+
pass
|
|
290
|
+
|
|
291
|
+
def _create_purchase_settings(self):
|
|
292
|
+
"""Creates the UI for shop purchase settings."""
|
|
293
|
+
with gr.Column():
|
|
294
|
+
gr.Markdown("### 商店购买设置")
|
|
295
|
+
opts = self.facade.config_service.get_options()
|
|
296
|
+
|
|
297
|
+
# --- 1. 启用主开关 ---
|
|
298
|
+
purchase_enabled = gr.Checkbox(label="启用商店购买", value=opts.purchase.enabled)
|
|
299
|
+
self._bind(purchase_enabled, ref(of(opts).purchase.enabled))
|
|
300
|
+
|
|
301
|
+
with gr.Group(visible=opts.purchase.enabled) as purchase_group:
|
|
302
|
+
# 绑定可见性
|
|
303
|
+
purchase_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=purchase_enabled, outputs=purchase_group)
|
|
304
|
+
|
|
305
|
+
# --- 2. 金币购买 ---
|
|
306
|
+
money_enabled = gr.Checkbox(label="启用金币购买", value=opts.purchase.money_enabled)
|
|
307
|
+
self._bind(money_enabled, ref(of(opts).purchase.money_enabled))
|
|
308
|
+
|
|
309
|
+
with gr.Group(visible=opts.purchase.money_enabled) as money_group:
|
|
310
|
+
money_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=money_enabled, outputs=money_group)
|
|
311
|
+
|
|
312
|
+
money_items = gr.Dropdown(
|
|
313
|
+
multiselect=True,
|
|
314
|
+
choices=[(DailyMoneyShopItems.to_ui_text(item), item.value) for item in DailyMoneyShopItems],
|
|
315
|
+
value=[item.value for item in opts.purchase.money_items],
|
|
316
|
+
label="金币商店购买物品"
|
|
317
|
+
)
|
|
318
|
+
self._bind(money_items, ref(of(opts).purchase.money_items))
|
|
319
|
+
|
|
320
|
+
money_refresh = gr.Checkbox(label="每日一次免费刷新金币商店", value=opts.purchase.money_refresh)
|
|
321
|
+
self._bind(money_refresh, ref(of(opts).purchase.money_refresh))
|
|
322
|
+
|
|
323
|
+
# --- 3. AP 购买 ---
|
|
324
|
+
ap_enabled = gr.Checkbox(label="启用AP购买", value=opts.purchase.ap_enabled)
|
|
325
|
+
self._bind(ap_enabled, ref(of(opts).purchase.ap_enabled))
|
|
326
|
+
|
|
327
|
+
ap_items_map = {
|
|
328
|
+
APShopItems.PRODUCE_PT_UP: "支援强化点数提升",
|
|
329
|
+
APShopItems.PRODUCE_NOTE_UP: "笔记数提升",
|
|
330
|
+
APShopItems.RECHALLENGE: "重新挑战券",
|
|
331
|
+
APShopItems.REGENERATE_MEMORY: "回忆再生成券"
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
with gr.Group(visible=opts.purchase.ap_enabled) as ap_group:
|
|
335
|
+
ap_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=ap_enabled, outputs=ap_group)
|
|
336
|
+
|
|
337
|
+
# 直接使用 (label, value) 的 choices,避免文本到枚举的二次转换
|
|
338
|
+
ap_choices = [(label, item.value) for item, label in ap_items_map.items()]
|
|
339
|
+
ap_values = [v for v in opts.purchase.ap_items]
|
|
340
|
+
ap_items = gr.Dropdown(
|
|
341
|
+
multiselect=True,
|
|
342
|
+
choices=ap_choices,
|
|
343
|
+
value=ap_values,
|
|
344
|
+
label="AP商店购买物品",
|
|
345
|
+
interactive=True
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
# 直接保存选中的值列表(Dropdown 返回的是 value 列表)
|
|
349
|
+
self._bind(ap_items, ref(of(opts).purchase.ap_items))
|
|
350
|
+
|
|
351
|
+
# --- 4. 每周免费礼包 ---
|
|
352
|
+
weekly_enabled = gr.Checkbox(label="启用每周免费礼包购买", value=opts.purchase.weekly_enabled)
|
|
353
|
+
self._bind(weekly_enabled, ref(of(opts).purchase.weekly_enabled))
|
|
354
|
+
|
|
355
|
+
def _create_work_settings(self):
|
|
356
|
+
"""Creates the UI for work/assignment settings."""
|
|
357
|
+
with gr.Column():
|
|
358
|
+
gr.Markdown("### 工作设置")
|
|
359
|
+
opts = self.facade.config_service.get_options()
|
|
360
|
+
|
|
361
|
+
assignment_enabled = gr.Checkbox(label="启用工作", value=opts.assignment.enabled)
|
|
362
|
+
self._bind(assignment_enabled, ref(of(opts).assignment.enabled))
|
|
363
|
+
|
|
364
|
+
with gr.Group(visible=opts.assignment.enabled) as work_group:
|
|
365
|
+
assignment_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=assignment_enabled, outputs=work_group)
|
|
366
|
+
|
|
367
|
+
with gr.Row():
|
|
368
|
+
with gr.Column():
|
|
369
|
+
mini_re = gr.Checkbox(label="启用重新分配 MiniLive", value=opts.assignment.mini_live_reassign_enabled)
|
|
370
|
+
self._bind(mini_re, ref(of(opts).assignment.mini_live_reassign_enabled))
|
|
371
|
+
|
|
372
|
+
mini_dur = gr.Dropdown(choices=[4, 6, 12], value=opts.assignment.mini_live_duration, label="MiniLive 工作时长", interactive=True)
|
|
373
|
+
self._bind(mini_dur, ref(of(opts).assignment.mini_live_duration))
|
|
374
|
+
|
|
375
|
+
with gr.Column():
|
|
376
|
+
online_re = gr.Checkbox(label="启用重新分配 OnlineLive", value=opts.assignment.online_live_reassign_enabled)
|
|
377
|
+
self._bind(online_re, ref(of(opts).assignment.online_live_reassign_enabled))
|
|
378
|
+
|
|
379
|
+
online_dur = gr.Dropdown(choices=[4, 6, 12], value=opts.assignment.online_live_duration, label="OnlineLive 工作时长", interactive=True)
|
|
380
|
+
self._bind(online_dur, ref(of(opts).assignment.online_live_duration))
|
|
381
|
+
|
|
382
|
+
def _create_contest_settings(self):
|
|
383
|
+
with gr.Column():
|
|
384
|
+
gr.Markdown("### 竞赛设置")
|
|
385
|
+
opts = self.facade.config_service.get_options()
|
|
386
|
+
|
|
387
|
+
contest_enabled = gr.Checkbox(label="启用竞赛", value=opts.contest.enabled)
|
|
388
|
+
self._bind(contest_enabled, ref(of(opts).contest.enabled))
|
|
389
|
+
|
|
390
|
+
with gr.Group(visible=opts.contest.enabled) as contest_group:
|
|
391
|
+
contest_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=contest_enabled, outputs=contest_group)
|
|
392
|
+
|
|
393
|
+
sel = gr.Dropdown(choices=[1, 2, 3], value=opts.contest.select_which_contestant, label="选择第几个挑战者", interactive=True)
|
|
394
|
+
self._bind(sel, ref(of(opts).contest.select_which_contestant))
|
|
395
|
+
|
|
396
|
+
when_no_set_choices = [
|
|
397
|
+
("通知我并跳过竞赛", "remind"), ("提醒我并等待手动编成", "wait"),
|
|
398
|
+
("使用自动编成并提醒我", "auto_set"), ("使用自动编成", "auto_set_silent")
|
|
399
|
+
]
|
|
400
|
+
when_no_set = gr.Dropdown(choices=when_no_set_choices, value=opts.contest.when_no_set, label="竞赛队伍未编成时", interactive=True)
|
|
401
|
+
self._bind(when_no_set, ref(of(opts).contest.when_no_set))
|
|
402
|
+
|
|
403
|
+
def _create_produce_settings(self):
|
|
404
|
+
with gr.Column():
|
|
405
|
+
gr.Markdown("### 培育设置")
|
|
406
|
+
opts = self.facade.config_service.get_options()
|
|
407
|
+
solutions = self.facade.list_produce_solutions()
|
|
408
|
+
|
|
409
|
+
produce_enabled = gr.Checkbox(label="启用培育", value=opts.produce.enabled)
|
|
410
|
+
self._bind(produce_enabled, ref(of(opts).produce.enabled))
|
|
411
|
+
|
|
412
|
+
if not solutions:
|
|
413
|
+
alert = Alert("你似乎还没有创建任何培育方案。你需要先到「方案」里创建一个!", "提示", action_text="去创建")
|
|
414
|
+
alert.click(fn=lambda: gr.Tabs(selected="produce"), inputs=[], outputs=[self.components.tabs])
|
|
415
|
+
|
|
416
|
+
with gr.Group(visible=opts.produce.enabled) as produce_group:
|
|
417
|
+
produce_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=produce_enabled, outputs=produce_group)
|
|
418
|
+
|
|
419
|
+
solution_choices = [(f"{sol.name} - {sol.description or '无描述'}", sol.id) for sol in solutions]
|
|
420
|
+
sol_drop = gr.Dropdown(choices=solution_choices, value=opts.produce.selected_solution_id, label="当前使用的培育方案", interactive=True)
|
|
421
|
+
self.components.settings_solution_dropdown = sol_drop
|
|
422
|
+
self._bind(sol_drop, ref(of(opts).produce.selected_solution_id))
|
|
423
|
+
|
|
424
|
+
cnt = gr.Number(minimum=1, value=opts.produce.produce_count, label="培育次数", interactive=True)
|
|
425
|
+
self._bind(cnt, ref(of(opts).produce.produce_count))
|
|
426
|
+
|
|
427
|
+
tm_cd = gr.Number(minimum=20, value=opts.produce.produce_timeout_cd, label="推荐卡检测用时上限", interactive=True)
|
|
428
|
+
self._bind(tm_cd, ref(of(opts).produce.produce_timeout_cd))
|
|
429
|
+
|
|
430
|
+
int_tm = gr.Number(minimum=20, value=opts.produce.interrupt_timeout, label="检测超时时间", interactive=True)
|
|
431
|
+
self._bind(int_tm, ref(of(opts).produce.interrupt_timeout))
|
|
432
|
+
|
|
433
|
+
fever = gr.Radio(label="培育前开启活动模式", choices=[("不操作", "ignore"), ("自动启用", "on"), ("自动禁用", "off")], value=opts.produce.enable_fever_month, interactive=True, info="某些活动期间,在选择培育模式/难度页面的切换活动开关")
|
|
434
|
+
self._bind(fever, ref(of(opts).produce.enable_fever_month))
|
|
435
|
+
|
|
436
|
+
def _create_start_game_settings(self):
|
|
437
|
+
with gr.Column():
|
|
438
|
+
gr.Markdown("### 启动游戏设置")
|
|
439
|
+
opts = self.facade.config_service.get_options()
|
|
440
|
+
backend_opts = self.facade.config_service.get_current_user_config().backend
|
|
441
|
+
|
|
442
|
+
start_game_enabled = gr.Checkbox(label="启用自动启动游戏", value=opts.start_game.enabled, interactive=True)
|
|
443
|
+
self._bind(start_game_enabled, ref(of(opts).start_game.enabled))
|
|
444
|
+
|
|
445
|
+
with gr.Group(visible=opts.start_game.enabled) as sg_group:
|
|
446
|
+
start_game_enabled.change(fn=lambda x: gr.Group(visible=x), inputs=start_game_enabled, outputs=sg_group)
|
|
447
|
+
|
|
448
|
+
# DMM Components
|
|
449
|
+
d1 = gr.Checkbox(label="自动禁用 Gakumas Localify 汉化", value=opts.start_game.disable_gakumas_localify, interactive=True)
|
|
450
|
+
self._bind(d1, ref(of(opts).start_game.disable_gakumas_localify))
|
|
451
|
+
|
|
452
|
+
d2 = gr.Textbox(label="DMM 版游戏路径 (可选)", value=opts.start_game.dmm_game_path, interactive=True, placeholder="如:F:\\Games\\gakumas\\gakumas.exe。留空自动识别。")
|
|
453
|
+
self._bind(d2, ref(of(opts).start_game.dmm_game_path))
|
|
454
|
+
|
|
455
|
+
d3 = gr.Checkbox(label="绕过 DMM 启动器", value=opts.start_game.dmm_bypass, interactive=True)
|
|
456
|
+
self._bind(d3, ref(of(opts).start_game.dmm_bypass))
|
|
457
|
+
|
|
458
|
+
# Emulator Check Components
|
|
459
|
+
check_emu = gr.Checkbox(label="自动启动模拟器", value=backend_opts.check_emulator, interactive=True)
|
|
460
|
+
self._bind(check_emu, ref(of(backend_opts).check_emulator))
|
|
461
|
+
|
|
462
|
+
kuyo = gr.Checkbox(label="通过Kuyo来启动游戏", value=opts.start_game.start_through_kuyo, interactive=True)
|
|
463
|
+
self._bind(kuyo, ref(of(opts).start_game.start_through_kuyo))
|
|
464
|
+
|
|
465
|
+
pkg = gr.Textbox(label="游戏包名", value=opts.start_game.game_package_name, interactive=True)
|
|
466
|
+
self._bind(pkg, ref(of(opts).start_game.game_package_name))
|
|
467
|
+
|
|
468
|
+
with gr.Group(visible=backend_opts.check_emulator) as check_emu_group:
|
|
469
|
+
check_emu.change(fn=lambda x: gr.Group(visible=x), inputs=check_emu, outputs=check_emu_group)
|
|
470
|
+
|
|
471
|
+
e1 = gr.Textbox(value=backend_opts.emulator_path, label="模拟器 exe 文件路径", interactive=True)
|
|
472
|
+
self._bind(e1, ref(of(backend_opts).emulator_path))
|
|
473
|
+
|
|
474
|
+
e2 = gr.Textbox(value=backend_opts.adb_emulator_name, label="ADB 模拟器名称", interactive=True)
|
|
475
|
+
self._bind(e2, ref(of(backend_opts).adb_emulator_name))
|
|
476
|
+
|
|
477
|
+
e3 = gr.Textbox(value=backend_opts.emulator_args, label="模拟器启动参数", interactive=True)
|
|
478
|
+
self._bind(e3, ref(of(backend_opts).emulator_args))
|
|
479
|
+
|
|
480
|
+
def _create_end_game_settings(self):
|
|
481
|
+
with gr.Column():
|
|
482
|
+
gr.Markdown("### 全部任务结束后")
|
|
483
|
+
gr.Markdown("*注:执行单个任务不会触发下面这些,只有状态页的启动按钮才会触发*")
|
|
484
|
+
opts = self.facade.config_service.get_options()
|
|
485
|
+
|
|
486
|
+
items = [
|
|
487
|
+
("退出 kaa", of(opts).end_game.exit_kaa),
|
|
488
|
+
("关闭游戏", of(opts).end_game.kill_game),
|
|
489
|
+
("关闭 DMMGamePlayer", of(opts).end_game.kill_dmm),
|
|
490
|
+
("关闭模拟器", of(opts).end_game.kill_emulator),
|
|
491
|
+
("关闭系统", of(opts).end_game.shutdown),
|
|
492
|
+
("休眠系统", of(opts).end_game.hibernate),
|
|
493
|
+
("恢复 Gakumas Localify 汉化状态", of(opts).end_game.restore_gakumas_localify)
|
|
494
|
+
]
|
|
495
|
+
for label, proxy in items:
|
|
496
|
+
comp = gr.Checkbox(label=label, value=getter(proxy)(), interactive=True)
|
|
497
|
+
self._bind(comp, ref(proxy))
|
|
498
|
+
|
|
499
|
+
def _create_misc_settings(self):
|
|
500
|
+
with gr.Column():
|
|
501
|
+
gr.Markdown("### 杂项设置")
|
|
502
|
+
opts = self.facade.config_service.get_options()
|
|
503
|
+
|
|
504
|
+
c1 = gr.Radio(label="检查更新时机", choices=[("从不", "never"), ("启动时", "startup")], value=opts.misc.check_update, interactive=True)
|
|
505
|
+
self._bind(c1, ref(of(opts).misc.check_update))
|
|
506
|
+
|
|
507
|
+
c2 = gr.Checkbox(label="自动安装更新", value=opts.misc.auto_install_update, interactive=True)
|
|
508
|
+
self._bind(c2, ref(of(opts).misc.auto_install_update))
|
|
509
|
+
|
|
510
|
+
c3 = gr.Checkbox(label="允许局域网访问 Web 界面", value=opts.misc.expose_to_lan, interactive=True)
|
|
511
|
+
self._bind(c3, ref(of(opts).misc.expose_to_lan))
|
|
512
|
+
|
|
513
|
+
c4 = gr.Radio(label="更新通道", choices=[("稳定版", "release"), ("测试版", "beta")], value=opts.misc.update_channel, interactive=True)
|
|
514
|
+
self._bind(c4, ref(of(opts).misc.update_channel))
|
|
515
|
+
|
|
516
|
+
c5 = gr.Radio(label="日志等级", choices=[("普通", "debug"), ("详细", "verbose")], value=opts.misc.log_level, interactive=True)
|
|
517
|
+
self._bind(c5, ref(of(opts).misc.log_level))
|
|
518
|
+
|
|
519
|
+
def _create_idle_settings(self):
|
|
520
|
+
with gr.Column():
|
|
521
|
+
gr.Markdown("### 闲置挂机设置")
|
|
522
|
+
opts = self.facade.config_service.get_options()
|
|
523
|
+
|
|
524
|
+
i1 = gr.Checkbox(label="启用闲置挂机", value=opts.idle.enabled, interactive=True)
|
|
525
|
+
self._bind(i1, ref(of(opts).idle.enabled))
|
|
526
|
+
|
|
527
|
+
i2 = gr.Number(label="闲置秒数", value=opts.idle.idle_seconds, minimum=1, step=1, interactive=True)
|
|
528
|
+
self._bind(i2, ref(of(opts).idle.idle_seconds))
|
|
529
|
+
|
|
530
|
+
i3 = gr.Checkbox(label="按键暂停时最小化窗口", value=opts.idle.minimize_on_pause, interactive=True)
|
|
531
|
+
self._bind(i3, ref(of(opts).idle.minimize_on_pause))
|
|
532
|
+
|
|
533
|
+
def _create_reward_settings(self):
|
|
534
|
+
with gr.Column():
|
|
535
|
+
gr.Markdown("### 奖励领取设置")
|
|
536
|
+
opts = self.facade.config_service.get_options()
|
|
537
|
+
|
|
538
|
+
r1 = gr.Checkbox(label="领取任务奖励", value=opts.mission_reward.enabled, interactive=True)
|
|
539
|
+
self._bind(r1, ref(of(opts).mission_reward.enabled))
|
|
540
|
+
|
|
541
|
+
club_en = gr.Checkbox(label="领取社团奖励", value=opts.club_reward.enabled, interactive=True)
|
|
542
|
+
self._bind(club_en, ref(of(opts).club_reward.enabled))
|
|
543
|
+
|
|
544
|
+
r3 = gr.Checkbox(label="收取礼物", value=opts.presents.enabled, interactive=True)
|
|
545
|
+
self._bind(r3, ref(of(opts).presents.enabled))
|
|
546
|
+
|
|
547
|
+
r4 = gr.Checkbox(label="收取活动费", value=opts.activity_funds.enabled, interactive=True)
|
|
548
|
+
self._bind(r4, ref(of(opts).activity_funds.enabled))
|
|
549
|
+
|
|
550
|
+
with gr.Group(visible=opts.club_reward.enabled) as club_group:
|
|
551
|
+
club_en.change(fn=lambda x: gr.Group(visible=x), inputs=club_en, outputs=club_group)
|
|
552
|
+
|
|
553
|
+
note = gr.Dropdown(
|
|
554
|
+
label="社团奖励笔记选择",
|
|
555
|
+
choices=[(DailyMoneyShopItems.to_ui_text(item), item.value) for item in DailyMoneyShopItems if "Note" in item.name],
|
|
556
|
+
value=opts.club_reward.selected_note.value,
|
|
557
|
+
interactive=True
|
|
558
|
+
)
|
|
559
|
+
self._bind(note, ref(of(opts).club_reward.selected_note))
|
|
560
|
+
|
|
561
|
+
def _create_debug_settings(self):
|
|
562
|
+
with gr.Column():
|
|
563
|
+
gr.Markdown("### 调试设置")
|
|
564
|
+
gr.Markdown('<div style="color: red;">仅供调试使用。正常运行时务必关闭下面所有的选项。</div>')
|
|
565
|
+
|
|
566
|
+
user_config = self.facade.config_service.get_current_user_config()
|
|
567
|
+
opts = self.facade.config_service.get_options()
|
|
568
|
+
|
|
569
|
+
keep_ss = gr.Checkbox(
|
|
570
|
+
label="保留截图数据",
|
|
571
|
+
value=user_config.keep_screenshots,
|
|
572
|
+
interactive=True
|
|
573
|
+
)
|
|
574
|
+
self._bind(keep_ss, ref(of(user_config).keep_screenshots))
|
|
575
|
+
|
|
576
|
+
trace_rec = gr.Checkbox(
|
|
577
|
+
label="跟踪推荐卡检测",
|
|
578
|
+
value=opts.trace.recommend_card_detection,
|
|
579
|
+
interactive=True
|
|
580
|
+
)
|
|
581
|
+
self._bind(trace_rec, ref(of(opts).trace.recommend_card_detection))
|