ok-script 3.0.0b4__tar.gz → 3.0.1__tar.gz
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.
- {ok_script-3.0.0b4 → ok_script-3.0.1}/PKG-INFO +1 -1
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/MainWindow.py +10 -3
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/common/config.py +19 -3
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/en_US.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/en_US.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/es_ES.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/es_ES.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ja_JP.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ja_JP.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ko_KR.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ko_KR.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_CN.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_CN.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_TW.qm +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_TW.ts +20 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/__init__.py +3 -2
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/feedback.py +24 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/qss.py +17 -12
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/theme.py +76 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/window.py +80 -6
- ok_script-3.0.1/ok/ui/qt/resources.py +20611 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/settings_page.py +14 -1
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/tasks_page.py +4 -1
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/app.py +1 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/PKG-INFO +1 -1
- ok_script-3.0.0b4/ok/ui/qt/resources.py +0 -20501
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/agents/openai.yaml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/references/windows-input.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/generate-templates/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/reload-tasks/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/reload-tasks/agents/openai.yaml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/agents/openai.yaml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/assets/ok-script-develop/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-project/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-project/agents/openai.yaml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/use_venv/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/write-test/SKILL.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/write-test/agents/openai.yaml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/LICENSE.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/MANIFEST.in +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/README.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/diagnostics/qq_trace.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/agent-setup.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/feature-crops.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/mcp.md +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/examples/mcp_observe.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/__main__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/emulator_base.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/emulator_windows.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/platform_windows.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/utils.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/assets/default-icon.png +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/deep.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/minitouch.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/nemu_ipc.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/nemu_utils.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/pool.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/timer.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/util.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/d3d11.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/dump.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/cli.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/capture_labels.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/code_runner.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/config_schema.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/downloads.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/events.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/icons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/mcp_runner.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/mcp_server.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/notifications.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/plugin_staging.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/plugins.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/screenshot.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_editing.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_packager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_templates.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/skills.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/start_controller.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/task_manager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/template_store.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/translation.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/ui_config.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/DeviceManager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/adb.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/base.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/bitblt.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/bitblt_utils.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/browser.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/desktop_duplication.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/hwnd_window.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/image.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/nemu_ipc.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/types.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/update.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/windows_graphics.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/windows_graphics_hdr.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/adb.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/base.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/browser.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/do_nothing.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/foreground_post_message.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/genshin.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/keys.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/post_message.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/pydirect.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/pynput.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/swipe.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/intercation.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/Box.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/Feature.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/FeatureSet.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/gui/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/gui/util/pyappify_startup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/manager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/messenger_images.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/pipeline.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/ppocr.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/providers.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/system.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/windows_messenger.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ocr/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ocr/download_paddle_model.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Media/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Security/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Storage/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/UI/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/delegate.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/export.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/idldsl.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/inspectable.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/roapi.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/types.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/winstring.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/DiagnosisTask.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/TaskExecutor.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/exceptions.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/task.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/OKTestRunner.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/RunTests.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/TaskTestCase.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/third_party/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/third_party/paperclip.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/overlay/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/overlay/win32_gdi.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/Communicate.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/MessageWindow.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/StartController.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/AboutTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/UpdateCard.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/common/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/OverlayWidget.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/Screenshot.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/diagnosis_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/events.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/path.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/update.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/buttons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/cards.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/dialogs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/gallery.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/icons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/inputs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/labels.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/layout.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/navigation.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/options.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/popover.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/switch.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/tabs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/overlay/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/PluginTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/imported_tabs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/qt.qrc +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/GlobalConfigTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/config_section.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/connection.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/diagnostics.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/lazy_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/log_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/nav_icons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/run_bar.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/start/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/EditTaskTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/MarkUpWindow.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ModifyListDialog.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/RecordScript.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TaskManger.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TemplateFactory.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TemplateTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/config_editors.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/config_form.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/mouse_buttons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/schedule_index_sync.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/Alert.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/InitWorker.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/download.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/pip_util.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/pyappify_startup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/touch_scroll.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/windows_thumbnail.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/Card.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/CustomTab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/FlowLayout.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ImageWidget.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ImportWarningDialog.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/Tab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/TabWidget.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/copy_ok_folder.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/inline_ok_requirements.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/Analytics.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/GlobalConfig.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/__init__.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/blur.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/clazz.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/collection.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/color.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/config.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/explorer.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/file.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/gpu_driver_settings.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/handler.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/i18n.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/logger.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/partial_sync_repo.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/print_hwnd.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/process.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/version.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/window.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/windows_schedule.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/SOURCES.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/entry_points.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/not-zip-safe +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/requires.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/top_level.txt +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/pyproject.toml +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/setup.cfg +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/setup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_app.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_base_interaction.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_blur.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_box.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_capture_update.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_cli.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_core_events.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_core_ui_services.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_device_manager.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_diagnosis_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_executor_jobs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_explorer.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_global_config.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_gpu_driver_settings.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_handler.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_headless_imports.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_inline_ok_requirements.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_kit.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_lazy_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_log_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_logger.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_notifications.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_startup_tab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_system_theme.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_markup_window.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_cleanup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_runner.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_server.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_setting.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_missing_frame.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mouse_buttons.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_navigation_state.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_nemu_ipc_capture.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_notifications.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_ok_mutex.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_overlay_custom_draw.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_overlay_lifecycle.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_package_metadata.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugin_staging.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugin_tabs.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugins.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_process.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_process_mutex.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_pyappify_startup_update.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_qt_events.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_qt_page_layout.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_runtime_startup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_schedule_startup.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_schedule_task_index_sync.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_screenshot_naming.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_screenshot_rendering.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_settings_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_shell.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_skills.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_start_controller.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_executor_next_frame.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_executor_queue.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_reloading.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_tasks_page.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_compression.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_generation.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_tab.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_touch_scroll.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_translation_fallback.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_ui_config.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_version.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_graphics_capture.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_graphics_hdr.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_schedule_target_parse.py +0 -0
- {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_schedule_xml.py +0 -0
|
@@ -31,7 +31,7 @@ from ok.util.config import Config
|
|
|
31
31
|
|
|
32
32
|
from ok.ui.qt.Communicate import communicate
|
|
33
33
|
from ok.ui.qt.common.config import cfg as ui_config
|
|
34
|
-
from ok.ui.qt.kit import Dialog, KitWindow, NavigationView, Theme as KitTheme, set_toast_anchor, show_toast, \
|
|
34
|
+
from ok.ui.qt.kit import ContentLayer, Dialog, KitWindow, NavigationView, Theme as KitTheme, set_toast_anchor, show_toast, \
|
|
35
35
|
theme as kit_theme
|
|
36
36
|
from ok.ui.qt.kit.theme import set_style_property
|
|
37
37
|
from ok.ui.qt.shell.lazy_page import LazyPage
|
|
@@ -103,11 +103,17 @@ class MainWindow(KitWindow):
|
|
|
103
103
|
self.run_bar = RunBar(exit_event)
|
|
104
104
|
set_style_property(self.title_bar, "fused", True)
|
|
105
105
|
|
|
106
|
+
# Pages sit on a content layer; with Mica or Acrylic the material shows only
|
|
107
|
+
# in the frame around it (title bar, run bar, sidebar).
|
|
108
|
+
self.content_layer = ContentLayer()
|
|
109
|
+
layer_layout = QVBoxLayout(self.content_layer)
|
|
110
|
+
layer_layout.setContentsMargins(0, 0, 0, 0)
|
|
111
|
+
layer_layout.addWidget(self.stack)
|
|
106
112
|
pages = QHBoxLayout()
|
|
107
113
|
pages.setContentsMargins(0, 0, 0, 0)
|
|
108
114
|
pages.setSpacing(0)
|
|
109
115
|
pages.addWidget(self.navigation)
|
|
110
|
-
pages.addWidget(self.
|
|
116
|
+
pages.addWidget(self.content_layer, 1)
|
|
111
117
|
body = QVBoxLayout(self.body)
|
|
112
118
|
body.setContentsMargins(0, 0, 0, 0)
|
|
113
119
|
body.setSpacing(0)
|
|
@@ -347,8 +353,9 @@ class MainWindow(KitWindow):
|
|
|
347
353
|
return self.get_system_accent_color()
|
|
348
354
|
|
|
349
355
|
def _sync_kit_theme(self):
|
|
350
|
-
"""Apply the saved theme mode and the Windows accent color."""
|
|
356
|
+
"""Apply the saved theme mode, window backdrop and the Windows accent color."""
|
|
351
357
|
kit_theme.set_theme(KitTheme(ui_config.theme_mode))
|
|
358
|
+
kit_theme.set_backdrop(ui_config.backdrop)
|
|
352
359
|
if accent := self._system_accent():
|
|
353
360
|
kit_theme.set_accent(accent)
|
|
354
361
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# coding:utf-8
|
|
2
|
-
"""UI preferences stored in ``configs/ui_config.json``: language and
|
|
2
|
+
"""UI preferences stored in ``configs/ui_config.json``: language, theme and window backdrop."""
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
5
|
import os
|
|
@@ -12,6 +12,8 @@ from ok.util.logger import Logger
|
|
|
12
12
|
|
|
13
13
|
logger = Logger.get_logger(__name__)
|
|
14
14
|
|
|
15
|
+
BACKDROPS = ("mica", "acrylic", "none")
|
|
16
|
+
|
|
15
17
|
|
|
16
18
|
class Language(Enum):
|
|
17
19
|
""" Language enumeration """
|
|
@@ -39,7 +41,7 @@ def deserialize_language(value) -> Language:
|
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
class UiConfig(QObject):
|
|
42
|
-
"""The language and the
|
|
44
|
+
"""The language, the theme mode and the window backdrop, all applied live.
|
|
43
45
|
|
|
44
46
|
The file also accepts the older qfluentwidgets layout
|
|
45
47
|
(``MainWindow.Language`` and ``QFluentWidgets.ThemeMode``).
|
|
@@ -58,6 +60,11 @@ class UiConfig(QObject):
|
|
|
58
60
|
self.theme_mode = str(data.get("theme", legacy_theme or "auto")).lower()
|
|
59
61
|
if self.theme_mode not in ("light", "dark", "auto"):
|
|
60
62
|
self.theme_mode = "auto"
|
|
63
|
+
# Older files store only whether Mica is on ("mica", or qfluentwidgets' MicaEnabled).
|
|
64
|
+
legacy_mica = data.get("mica", (data.get("MainWindow") or {}).get("MicaEnabled", True))
|
|
65
|
+
self.backdrop = str(data.get("backdrop", "mica" if legacy_mica else "none")).lower()
|
|
66
|
+
if self.backdrop not in BACKDROPS:
|
|
67
|
+
self.backdrop = "mica"
|
|
61
68
|
|
|
62
69
|
def _read(self) -> dict:
|
|
63
70
|
try:
|
|
@@ -74,7 +81,8 @@ class UiConfig(QObject):
|
|
|
74
81
|
try:
|
|
75
82
|
os.makedirs(os.path.dirname(self.path), exist_ok=True)
|
|
76
83
|
with open(self.path, "w", encoding="utf-8") as file:
|
|
77
|
-
json.dump({"language": serialize_language(self.language), "theme": self.theme_mode
|
|
84
|
+
json.dump({"language": serialize_language(self.language), "theme": self.theme_mode,
|
|
85
|
+
"backdrop": self.backdrop}, file, indent=4)
|
|
78
86
|
except OSError as error:
|
|
79
87
|
logger.error(f"Failed to save {self.path}", error)
|
|
80
88
|
|
|
@@ -93,5 +101,13 @@ class UiConfig(QObject):
|
|
|
93
101
|
self.save()
|
|
94
102
|
self.theme_changed.emit()
|
|
95
103
|
|
|
104
|
+
def set_backdrop(self, backdrop: str) -> None:
|
|
105
|
+
backdrop = getattr(backdrop, "value", backdrop)
|
|
106
|
+
if backdrop == self.backdrop or backdrop not in BACKDROPS:
|
|
107
|
+
return
|
|
108
|
+
self.backdrop = backdrop
|
|
109
|
+
self.save()
|
|
110
|
+
self.theme_changed.emit()
|
|
111
|
+
|
|
96
112
|
|
|
97
113
|
cfg = UiConfig(get_relative_path('configs', "ui_config.json"))
|
|
Binary file
|
|
@@ -765,6 +765,26 @@
|
|
|
765
765
|
<source>Configuration takes effect after restart</source>
|
|
766
766
|
<translation>Configuration takes effect after restart</translation>
|
|
767
767
|
</message>
|
|
768
|
+
<message>
|
|
769
|
+
<source>Window Material</source>
|
|
770
|
+
<translation>Window Material</translation>
|
|
771
|
+
</message>
|
|
772
|
+
<message>
|
|
773
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
774
|
+
<translation>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</translation>
|
|
775
|
+
</message>
|
|
776
|
+
<message>
|
|
777
|
+
<source>Mica</source>
|
|
778
|
+
<translation>Mica</translation>
|
|
779
|
+
</message>
|
|
780
|
+
<message>
|
|
781
|
+
<source>Acrylic</source>
|
|
782
|
+
<translation>Acrylic</translation>
|
|
783
|
+
</message>
|
|
784
|
+
<message>
|
|
785
|
+
<source>None</source>
|
|
786
|
+
<translation>None</translation>
|
|
787
|
+
</message>
|
|
768
788
|
</context>
|
|
769
789
|
<context>
|
|
770
790
|
<name>StartButton</name>
|
|
Binary file
|
|
@@ -763,6 +763,26 @@
|
|
|
763
763
|
<source>Configuration takes effect after restart</source>
|
|
764
764
|
<translation>La configuración se aplicará después de reiniciar</translation>
|
|
765
765
|
</message>
|
|
766
|
+
<message>
|
|
767
|
+
<source>Window Material</source>
|
|
768
|
+
<translation>Material de la ventana</translation>
|
|
769
|
+
</message>
|
|
770
|
+
<message>
|
|
771
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
772
|
+
<translation>Mica tiñe la ventana con tu fondo de pantalla; Acrílico desenfoca lo que hay detrás</translation>
|
|
773
|
+
</message>
|
|
774
|
+
<message>
|
|
775
|
+
<source>Mica</source>
|
|
776
|
+
<translation>Mica</translation>
|
|
777
|
+
</message>
|
|
778
|
+
<message>
|
|
779
|
+
<source>Acrylic</source>
|
|
780
|
+
<translation>Acrílico</translation>
|
|
781
|
+
</message>
|
|
782
|
+
<message>
|
|
783
|
+
<source>None</source>
|
|
784
|
+
<translation>Ninguno</translation>
|
|
785
|
+
</message>
|
|
766
786
|
</context>
|
|
767
787
|
<context>
|
|
768
788
|
<name>StartButton</name>
|
|
Binary file
|
|
@@ -763,6 +763,26 @@
|
|
|
763
763
|
<source>Configuration takes effect after restart</source>
|
|
764
764
|
<translation>設定は再起動後に有効になります</translation>
|
|
765
765
|
</message>
|
|
766
|
+
<message>
|
|
767
|
+
<source>Window Material</source>
|
|
768
|
+
<translation>ウィンドウの素材</translation>
|
|
769
|
+
</message>
|
|
770
|
+
<message>
|
|
771
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
772
|
+
<translation>マイカは壁紙の色でウィンドウを色付けし、アクリルは背後を透かしてぼかします</translation>
|
|
773
|
+
</message>
|
|
774
|
+
<message>
|
|
775
|
+
<source>Mica</source>
|
|
776
|
+
<translation>マイカ</translation>
|
|
777
|
+
</message>
|
|
778
|
+
<message>
|
|
779
|
+
<source>Acrylic</source>
|
|
780
|
+
<translation>アクリル</translation>
|
|
781
|
+
</message>
|
|
782
|
+
<message>
|
|
783
|
+
<source>None</source>
|
|
784
|
+
<translation>なし</translation>
|
|
785
|
+
</message>
|
|
766
786
|
</context>
|
|
767
787
|
<context>
|
|
768
788
|
<name>StartButton</name>
|
|
Binary file
|
|
@@ -764,6 +764,26 @@
|
|
|
764
764
|
<source>Configuration takes effect after restart</source>
|
|
765
765
|
<translation>다시 시작하면 구성이 적용됩니다</translation>
|
|
766
766
|
</message>
|
|
767
|
+
<message>
|
|
768
|
+
<source>Window Material</source>
|
|
769
|
+
<translation>창 재질</translation>
|
|
770
|
+
</message>
|
|
771
|
+
<message>
|
|
772
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
773
|
+
<translation>Mica는 바탕 화면 배경으로 창에 색을 입히고, 아크릴은 창 뒤를 흐리게 보여 줍니다</translation>
|
|
774
|
+
</message>
|
|
775
|
+
<message>
|
|
776
|
+
<source>Mica</source>
|
|
777
|
+
<translation>Mica</translation>
|
|
778
|
+
</message>
|
|
779
|
+
<message>
|
|
780
|
+
<source>Acrylic</source>
|
|
781
|
+
<translation>아크릴</translation>
|
|
782
|
+
</message>
|
|
783
|
+
<message>
|
|
784
|
+
<source>None</source>
|
|
785
|
+
<translation>없음</translation>
|
|
786
|
+
</message>
|
|
767
787
|
</context>
|
|
768
788
|
<context>
|
|
769
789
|
<name>StartButton</name>
|
|
Binary file
|
|
@@ -765,6 +765,26 @@
|
|
|
765
765
|
<source>Configuration takes effect after restart</source>
|
|
766
766
|
<translation>配置在重启后生效</translation>
|
|
767
767
|
</message>
|
|
768
|
+
<message>
|
|
769
|
+
<source>Window Material</source>
|
|
770
|
+
<translation>窗口材质</translation>
|
|
771
|
+
</message>
|
|
772
|
+
<message>
|
|
773
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
774
|
+
<translation>云母以桌面壁纸为窗口着色,亚克力会模糊窗口后方的内容</translation>
|
|
775
|
+
</message>
|
|
776
|
+
<message>
|
|
777
|
+
<source>Mica</source>
|
|
778
|
+
<translation>云母</translation>
|
|
779
|
+
</message>
|
|
780
|
+
<message>
|
|
781
|
+
<source>Acrylic</source>
|
|
782
|
+
<translation>亚克力</translation>
|
|
783
|
+
</message>
|
|
784
|
+
<message>
|
|
785
|
+
<source>None</source>
|
|
786
|
+
<translation>无</translation>
|
|
787
|
+
</message>
|
|
768
788
|
</context>
|
|
769
789
|
<context>
|
|
770
790
|
<name>StartButton</name>
|
|
Binary file
|
|
@@ -763,6 +763,26 @@
|
|
|
763
763
|
<source>Configuration takes effect after restart</source>
|
|
764
764
|
<translation>設定將在重啟後生效</translation>
|
|
765
765
|
</message>
|
|
766
|
+
<message>
|
|
767
|
+
<source>Window Material</source>
|
|
768
|
+
<translation>視窗材質</translation>
|
|
769
|
+
</message>
|
|
770
|
+
<message>
|
|
771
|
+
<source>Mica tints the window with your wallpaper, Acrylic blurs what is behind it</source>
|
|
772
|
+
<translation>雲母以桌布為視窗著色,壓克力會模糊視窗後方的內容</translation>
|
|
773
|
+
</message>
|
|
774
|
+
<message>
|
|
775
|
+
<source>Mica</source>
|
|
776
|
+
<translation>雲母</translation>
|
|
777
|
+
</message>
|
|
778
|
+
<message>
|
|
779
|
+
<source>Acrylic</source>
|
|
780
|
+
<translation>壓克力</translation>
|
|
781
|
+
</message>
|
|
782
|
+
<message>
|
|
783
|
+
<source>None</source>
|
|
784
|
+
<translation>無</translation>
|
|
785
|
+
</message>
|
|
766
786
|
</context>
|
|
767
787
|
<context>
|
|
768
788
|
<name>StartButton</name>
|
|
@@ -19,10 +19,11 @@ from ok.ui.qt.kit.popover import Popover
|
|
|
19
19
|
from ok.ui.qt.kit.switch import Switch
|
|
20
20
|
from ok.ui.qt.kit.tabs import TabItem, TabStrip
|
|
21
21
|
from ok.ui.qt.kit.theme import Theme, theme
|
|
22
|
-
from ok.ui.qt.kit.window import KitWindow, TitleBar
|
|
22
|
+
from ok.ui.qt.kit.window import ContentLayer, KitWindow, TitleBar
|
|
23
23
|
|
|
24
24
|
__all__ = [
|
|
25
|
-
"Button", "Card", "ComboBox", "Dialog", "FlowLayout", "ICON_NAMES", "KitWindow", "Label",
|
|
25
|
+
"Button", "Card", "ComboBox", "ContentLayer", "Dialog", "FlowLayout", "ICON_NAMES", "KitWindow", "Label",
|
|
26
|
+
"NavItem",
|
|
26
27
|
"NavigationView", "NumberBox", "OptionCard", "OptionGroup", "Pill", "Popover", "ProgressRing", "SettingGroup",
|
|
27
28
|
"SettingRow", "StatusDot", "Switch", "TabItem", "TabStrip", "Theme", "TitleBar", "Toast", "confirm", "icon",
|
|
28
29
|
"load_icon", "set_toast_anchor", "set_toast_top_margin", "show_toast", "theme",
|
|
@@ -27,10 +27,34 @@ class Pill(QLabel):
|
|
|
27
27
|
super().__init__(text, parent)
|
|
28
28
|
self.setProperty("tone", _check_tone(tone))
|
|
29
29
|
self.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
|
|
30
|
+
theme.changed.connect(self.update)
|
|
30
31
|
|
|
31
32
|
def set_tone(self, tone: str) -> None:
|
|
32
33
|
set_style_property(self, "tone", _check_tone(tone))
|
|
33
34
|
|
|
35
|
+
def paintEvent(self, event) -> None:
|
|
36
|
+
tone = self.property("tone")
|
|
37
|
+
if tone == "neutral":
|
|
38
|
+
fill, outline = theme.color("control"), theme.color("border_strong")
|
|
39
|
+
else:
|
|
40
|
+
color = theme.color(_TONE_COLOR[tone])
|
|
41
|
+
fill, outline = QColor(color), QColor(color)
|
|
42
|
+
fill_alpha, line_alpha = {
|
|
43
|
+
"accent": (0.14, 0.6), "success": (0.1, 0.3),
|
|
44
|
+
"warning": (0.12, 0.35), "danger": (0.12, 0.45),
|
|
45
|
+
}[tone]
|
|
46
|
+
fill.setAlphaF(fill_alpha)
|
|
47
|
+
outline.setAlphaF(line_alpha)
|
|
48
|
+
# QSS draws translucent borders in segments, leaving seams at the
|
|
49
|
+
# rounded corners. A single antialiased stroke avoids those overlaps.
|
|
50
|
+
painter = QPainter(self)
|
|
51
|
+
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
|
52
|
+
painter.setBrush(fill)
|
|
53
|
+
painter.setPen(QPen(outline, 1))
|
|
54
|
+
painter.drawRoundedRect(QRectF(self.rect()).adjusted(0.5, 0.5, -0.5, -0.5), 5.5, 5.5)
|
|
55
|
+
painter.end()
|
|
56
|
+
super().paintEvent(event)
|
|
57
|
+
|
|
34
58
|
|
|
35
59
|
class StatusDot(QWidget):
|
|
36
60
|
"""A colored dot with a soft halo showing a connection or run state."""
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from PySide6.QtGui import QColor
|
|
4
4
|
|
|
5
5
|
from ok.ui.qt.kit.icons import icon_file
|
|
6
|
-
from ok.ui.qt.kit.theme import FONT_FAMILY, MONO_FONT_FAMILY, rgba
|
|
6
|
+
from ok.ui.qt.kit.theme import FONT_FAMILY, MONO_FONT_FAMILY, Backdrop, rgba
|
|
7
7
|
|
|
8
8
|
_TEMPLATE = """
|
|
9
9
|
QWidget {{
|
|
@@ -12,11 +12,11 @@ QWidget {{
|
|
|
12
12
|
font-size: 13px;
|
|
13
13
|
}}
|
|
14
14
|
QWidget#kitRoot, KitWindow {{
|
|
15
|
-
background: {
|
|
15
|
+
background: {window_bg};
|
|
16
16
|
}}
|
|
17
17
|
QWidget#kitSidebar {{
|
|
18
|
-
background: {
|
|
19
|
-
border-right: 1px solid {
|
|
18
|
+
background: {sidebar_bg};
|
|
19
|
+
border-right: 1px solid {frame_separator};
|
|
20
20
|
}}
|
|
21
21
|
|
|
22
22
|
QLabel {{ background: transparent; }}
|
|
@@ -109,12 +109,12 @@ TabItem QLabel#tabCount[selected="true"] {{ color: #FFFFFF; background: {accent_
|
|
|
109
109
|
|
|
110
110
|
Pill {{
|
|
111
111
|
font-size: 11.5px; font-weight: 500; border-radius: 6px; padding: 1px 8px;
|
|
112
|
-
color: {text_secondary}; background:
|
|
112
|
+
color: {text_secondary}; background: transparent; border: 1px solid transparent;
|
|
113
113
|
}}
|
|
114
|
-
Pill[tone="accent"] {{ color: {text};
|
|
115
|
-
Pill[tone="success"] {{ color: {success};
|
|
116
|
-
Pill[tone="warning"] {{ color: {warning};
|
|
117
|
-
Pill[tone="danger"] {{ color: {danger};
|
|
114
|
+
Pill[tone="accent"] {{ color: {text}; }}
|
|
115
|
+
Pill[tone="success"] {{ color: {success}; }}
|
|
116
|
+
Pill[tone="warning"] {{ color: {warning}; }}
|
|
117
|
+
Pill[tone="danger"] {{ color: {danger}; }}
|
|
118
118
|
|
|
119
119
|
QLineEdit, QAbstractSpinBox, QTextEdit, QPlainTextEdit {{
|
|
120
120
|
background: {control};
|
|
@@ -254,7 +254,7 @@ Toast {{
|
|
|
254
254
|
}}
|
|
255
255
|
|
|
256
256
|
QWidget#kitTitleBar {{
|
|
257
|
-
background: {
|
|
257
|
+
background: {sidebar_bg};
|
|
258
258
|
border-bottom: 1px solid {separator};
|
|
259
259
|
}}
|
|
260
260
|
QLabel#titleBadge {{
|
|
@@ -285,9 +285,9 @@ OptionCard:hover {{ border-color: {border_strong}; }}
|
|
|
285
285
|
OptionCard[selected="true"] {{ background: {accent_soft_weak}; border-color: {accent_line}; }}
|
|
286
286
|
QWidget#kitTitleBar[fused="true"] {{ border-bottom: 0; }}
|
|
287
287
|
RunBar {{
|
|
288
|
-
background: {
|
|
288
|
+
background: {sidebar_bg};
|
|
289
289
|
border: 0;
|
|
290
|
-
border-bottom: 1px solid {
|
|
290
|
+
border-bottom: 1px solid {frame_separator};
|
|
291
291
|
}}
|
|
292
292
|
ConnectionPill {{
|
|
293
293
|
background: transparent;
|
|
@@ -423,7 +423,12 @@ def build_stylesheet(manager) -> str:
|
|
|
423
423
|
accent = manager.accent()
|
|
424
424
|
dark = manager.is_dark()
|
|
425
425
|
success, warning, danger = (QColor(tokens[name]) for name in ("success", "warning", "danger"))
|
|
426
|
+
window_bg, sidebar_bg = (manager.background(name) for name in ("window", "sidebar"))
|
|
426
427
|
return _TEMPLATE.format(
|
|
428
|
+
window_bg=rgba(window_bg, window_bg.alphaF()),
|
|
429
|
+
sidebar_bg=rgba(sidebar_bg, sidebar_bg.alphaF()),
|
|
430
|
+
# With a backdrop the content layer's own edge separates it from the frame.
|
|
431
|
+
frame_separator=tokens["separator"] if manager.backdrop() == Backdrop.NONE else "transparent",
|
|
427
432
|
font=FONT_FAMILY,
|
|
428
433
|
mono=MONO_FONT_FAMILY,
|
|
429
434
|
accent=accent.name(),
|
|
@@ -8,6 +8,7 @@ theme changes. Installing on a root widget instead of the application keeps
|
|
|
8
8
|
the kit from restyling widgets that are not part of it.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import sys
|
|
11
12
|
import weakref
|
|
12
13
|
from enum import Enum
|
|
13
14
|
|
|
@@ -74,6 +75,47 @@ LIGHT_TOKENS = {
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
|
|
78
|
+
class Backdrop(Enum):
|
|
79
|
+
"""The DWM material drawn behind kit windows."""
|
|
80
|
+
|
|
81
|
+
NONE = "none"
|
|
82
|
+
MICA = "mica"
|
|
83
|
+
ACRYLIC = "acrylic"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# With a backdrop only the window frame (title bar, run bar, sidebar) shows the
|
|
87
|
+
# material, under one tint of the sidebar color at this opacity. Page content
|
|
88
|
+
# sits on an opaque layer (see ContentLayer), so cards, inputs and text keep
|
|
89
|
+
# their normal colors. Acrylic shows whatever is behind the window, so it gets
|
|
90
|
+
# a stronger tint than Mica to keep the frame readable.
|
|
91
|
+
BACKDROP_TINT = {
|
|
92
|
+
(Backdrop.MICA, False): 0.35, (Backdrop.MICA, True): 0.45,
|
|
93
|
+
(Backdrop.ACRYLIC, False): 0.8, (Backdrop.ACRYLIC, True): 0.65,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
MICA_MIN_BUILD = 22000 # Windows 11 21H2, through an undocumented attribute
|
|
97
|
+
SYSTEMBACKDROP_MIN_BUILD = 22523 # DWMWA_SYSTEMBACKDROP_TYPE (Mica and Acrylic)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _windows_build() -> int:
|
|
101
|
+
return sys.getwindowsversion().build if sys.platform == "win32" else 0
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def backdrop_supported(backdrop) -> bool:
|
|
105
|
+
"""Whether DWM on this system can draw ``backdrop``."""
|
|
106
|
+
|
|
107
|
+
backdrop = Backdrop(backdrop)
|
|
108
|
+
if backdrop == Backdrop.NONE:
|
|
109
|
+
return True
|
|
110
|
+
if backdrop == Backdrop.MICA:
|
|
111
|
+
return _windows_build() >= MICA_MIN_BUILD
|
|
112
|
+
return _windows_build() >= SYSTEMBACKDROP_MIN_BUILD
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def supported_backdrops() -> list:
|
|
116
|
+
return [backdrop for backdrop in Backdrop if backdrop_supported(backdrop)]
|
|
117
|
+
|
|
118
|
+
|
|
77
119
|
def _channel(value: float) -> float:
|
|
78
120
|
value /= 255
|
|
79
121
|
return value / 12.92 if value <= 0.03928 else ((value + 0.055) / 1.055) ** 2.4
|
|
@@ -118,11 +160,45 @@ class ThemeManager(QObject):
|
|
|
118
160
|
self._accent = QColor(DEFAULT_ACCENT)
|
|
119
161
|
self._roots = []
|
|
120
162
|
self._watching_system = False
|
|
163
|
+
self._backdrop = Backdrop.NONE
|
|
121
164
|
|
|
122
165
|
@property
|
|
123
166
|
def mode(self) -> Theme:
|
|
124
167
|
return self._mode
|
|
125
168
|
|
|
169
|
+
def backdrop(self) -> Backdrop:
|
|
170
|
+
"""The material kit windows draw on; NONE when unsupported."""
|
|
171
|
+
|
|
172
|
+
return self._backdrop
|
|
173
|
+
|
|
174
|
+
def set_backdrop(self, backdrop) -> None:
|
|
175
|
+
backdrop = Backdrop(backdrop)
|
|
176
|
+
if not backdrop_supported(backdrop):
|
|
177
|
+
backdrop = Backdrop.NONE
|
|
178
|
+
if backdrop == self._backdrop:
|
|
179
|
+
return
|
|
180
|
+
self._backdrop = backdrop
|
|
181
|
+
self._refresh()
|
|
182
|
+
|
|
183
|
+
def background(self, name: str) -> QColor:
|
|
184
|
+
"""The fill for a window-level background, adjusted for the backdrop.
|
|
185
|
+
|
|
186
|
+
``window``: the whole window (under the frame); ``sidebar``: the frame
|
|
187
|
+
parts (sidebar, title bar, run bar); ``layer``: the panel page content
|
|
188
|
+
sits on. Without a backdrop these are the plain tokens, and the layer is
|
|
189
|
+
transparent so the window color shows.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
if self._backdrop == Backdrop.NONE:
|
|
193
|
+
return QColor(0, 0, 0, 0) if name == "layer" else self.color(name)
|
|
194
|
+
if name == "layer":
|
|
195
|
+
return self.color("window")
|
|
196
|
+
if name == "sidebar":
|
|
197
|
+
return QColor(0, 0, 0, 0)
|
|
198
|
+
color = self.color("sidebar")
|
|
199
|
+
color.setAlphaF(BACKDROP_TINT[(self._backdrop, self.is_dark())])
|
|
200
|
+
return color
|
|
201
|
+
|
|
126
202
|
def set_theme(self, mode: Theme) -> None:
|
|
127
203
|
mode = Theme(mode)
|
|
128
204
|
if mode == self._mode:
|