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.
Files changed (364) hide show
  1. {ok_script-3.0.0b4 → ok_script-3.0.1}/PKG-INFO +1 -1
  2. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/MainWindow.py +10 -3
  3. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/common/config.py +19 -3
  4. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/en_US.qm +0 -0
  5. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/en_US.ts +20 -0
  6. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/es_ES.qm +0 -0
  7. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/es_ES.ts +20 -0
  8. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ja_JP.qm +0 -0
  9. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ja_JP.ts +20 -0
  10. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ko_KR.qm +0 -0
  11. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/ko_KR.ts +20 -0
  12. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_CN.qm +0 -0
  13. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_CN.ts +20 -0
  14. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_TW.qm +0 -0
  15. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/zh_TW.ts +20 -0
  16. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/__init__.py +3 -2
  17. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/feedback.py +24 -0
  18. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/qss.py +17 -12
  19. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/theme.py +76 -0
  20. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/window.py +80 -6
  21. ok_script-3.0.1/ok/ui/qt/resources.py +20611 -0
  22. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/settings_page.py +14 -1
  23. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/tasks_page.py +4 -1
  24. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/app.py +1 -0
  25. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/PKG-INFO +1 -1
  26. ok_script-3.0.0b4/ok/ui/qt/resources.py +0 -20501
  27. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/SKILL.md +0 -0
  28. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/agents/openai.yaml +0 -0
  29. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/develop/references/windows-input.md +0 -0
  30. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/generate-templates/SKILL.md +0 -0
  31. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/reload-tasks/SKILL.md +0 -0
  32. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/reload-tasks/agents/openai.yaml +0 -0
  33. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/SKILL.md +0 -0
  34. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/agents/openai.yaml +0 -0
  35. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-env/assets/ok-script-develop/SKILL.md +0 -0
  36. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-project/SKILL.md +0 -0
  37. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/setup-project/agents/openai.yaml +0 -0
  38. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/use_venv/SKILL.md +0 -0
  39. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/write-test/SKILL.md +0 -0
  40. {ok_script-3.0.0b4 → ok_script-3.0.1}/.agents/skills/write-test/agents/openai.yaml +0 -0
  41. {ok_script-3.0.0b4 → ok_script-3.0.1}/LICENSE.txt +0 -0
  42. {ok_script-3.0.0b4 → ok_script-3.0.1}/MANIFEST.in +0 -0
  43. {ok_script-3.0.0b4 → ok_script-3.0.1}/README.md +0 -0
  44. {ok_script-3.0.0b4 → ok_script-3.0.1}/diagnostics/qq_trace.py +0 -0
  45. {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/agent-setup.md +0 -0
  46. {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/feature-crops.md +0 -0
  47. {ok_script-3.0.0b4 → ok_script-3.0.1}/docs/mcp.md +0 -0
  48. {ok_script-3.0.0b4 → ok_script-3.0.1}/examples/mcp_observe.py +0 -0
  49. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/__init__.py +0 -0
  50. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/__main__.py +0 -0
  51. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/__init__.py +0 -0
  52. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/emulator_base.py +0 -0
  53. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/emulator_windows.py +0 -0
  54. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/platform_windows.py +0 -0
  55. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/alas/utils.py +0 -0
  56. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/assets/default-icon.png +0 -0
  57. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/__init__.py +0 -0
  58. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/__init__.py +0 -0
  59. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/deep.py +0 -0
  60. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/minitouch.py +0 -0
  61. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/nemu_ipc.py +0 -0
  62. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/nemu_utils.py +0 -0
  63. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/pool.py +0 -0
  64. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/timer.py +0 -0
  65. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/adb/util.py +0 -0
  66. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/__init__.py +0 -0
  67. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/d3d11.py +0 -0
  68. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/capture/windows/dump.py +0 -0
  69. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/cli.py +0 -0
  70. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/__init__.py +0 -0
  71. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/capture_labels.py +0 -0
  72. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/code_runner.py +0 -0
  73. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/config_schema.py +0 -0
  74. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/downloads.py +0 -0
  75. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/events.py +0 -0
  76. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/icons.py +0 -0
  77. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/mcp_runner.py +0 -0
  78. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/mcp_server.py +0 -0
  79. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/notifications.py +0 -0
  80. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/plugin_staging.py +0 -0
  81. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/plugins.py +0 -0
  82. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/screenshot.py +0 -0
  83. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_editing.py +0 -0
  84. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_packager.py +0 -0
  85. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/script_templates.py +0 -0
  86. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/skills.py +0 -0
  87. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/start_controller.py +0 -0
  88. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/task_manager.py +0 -0
  89. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/template_store.py +0 -0
  90. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/translation.py +0 -0
  91. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/core/ui_config.py +0 -0
  92. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/DeviceManager.py +0 -0
  93. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/__init__.py +0 -0
  94. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture.py +0 -0
  95. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/__init__.py +0 -0
  96. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/adb.py +0 -0
  97. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/base.py +0 -0
  98. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/bitblt.py +0 -0
  99. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/bitblt_utils.py +0 -0
  100. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/browser.py +0 -0
  101. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/desktop_duplication.py +0 -0
  102. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/hwnd_window.py +0 -0
  103. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/image.py +0 -0
  104. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/nemu_ipc.py +0 -0
  105. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/types.py +0 -0
  106. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/update.py +0 -0
  107. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/windows_graphics.py +0 -0
  108. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/capture_methods/windows_graphics_hdr.py +0 -0
  109. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction.py +0 -0
  110. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/__init__.py +0 -0
  111. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/adb.py +0 -0
  112. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/base.py +0 -0
  113. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/browser.py +0 -0
  114. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/do_nothing.py +0 -0
  115. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/foreground_post_message.py +0 -0
  116. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/genshin.py +0 -0
  117. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/keys.py +0 -0
  118. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/post_message.py +0 -0
  119. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/pydirect.py +0 -0
  120. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/pynput.py +0 -0
  121. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/interaction_methods/swipe.py +0 -0
  122. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/device/intercation.py +0 -0
  123. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/Box.py +0 -0
  124. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/Feature.py +0 -0
  125. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/FeatureSet.py +0 -0
  126. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/feature/__init__.py +0 -0
  127. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/gui/__init__.py +0 -0
  128. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/gui/util/pyappify_startup.py +0 -0
  129. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/__init__.py +0 -0
  130. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/manager.py +0 -0
  131. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/messenger_images.py +0 -0
  132. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/pipeline.py +0 -0
  133. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/ppocr.py +0 -0
  134. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/providers.py +0 -0
  135. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/system.py +0 -0
  136. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/notification/windows_messenger.py +0 -0
  137. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ocr/__init__.py +0 -0
  138. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ocr/download_paddle_model.py +0 -0
  139. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  140. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  141. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  142. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  143. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  144. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  145. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  146. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  147. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  148. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Media/__init__.py +0 -0
  149. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  150. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Security/__init__.py +0 -0
  151. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  152. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/Storage/__init__.py +0 -0
  153. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
  154. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/UI/__init__.py +0 -0
  155. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/Windows/__init__.py +0 -0
  156. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/__init__.py +0 -0
  157. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/delegate.py +0 -0
  158. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/export.py +0 -0
  159. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/idldsl.py +0 -0
  160. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/inspectable.py +0 -0
  161. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/roapi.py +0 -0
  162. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/types.py +0 -0
  163. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/rotypes/winstring.py +0 -0
  164. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/DiagnosisTask.py +0 -0
  165. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/TaskExecutor.py +0 -0
  166. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/__init__.py +0 -0
  167. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/exceptions.py +0 -0
  168. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/task/task.py +0 -0
  169. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/OKTestRunner.py +0 -0
  170. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/RunTests.py +0 -0
  171. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/TaskTestCase.py +0 -0
  172. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/test/__init__.py +0 -0
  173. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/third_party/__init__.py +0 -0
  174. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/third_party/paperclip.py +0 -0
  175. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/__init__.py +0 -0
  176. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/overlay/__init__.py +0 -0
  177. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/overlay/win32_gdi.py +0 -0
  178. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/Communicate.py +0 -0
  179. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/MessageWindow.py +0 -0
  180. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/StartController.py +0 -0
  181. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/__init__.py +0 -0
  182. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/AboutTab.py +0 -0
  183. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/UpdateCard.py +0 -0
  184. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/about/__init__.py +0 -0
  185. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/common/__init__.py +0 -0
  186. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/OverlayWidget.py +0 -0
  187. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/Screenshot.py +0 -0
  188. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/__init__.py +0 -0
  189. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/debug/diagnosis_page.py +0 -0
  190. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/events.py +0 -0
  191. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
  192. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/__init__.py +0 -0
  193. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/path.py +0 -0
  194. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/i18n/update.py +0 -0
  195. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/buttons.py +0 -0
  196. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/cards.py +0 -0
  197. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/dialogs.py +0 -0
  198. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/gallery.py +0 -0
  199. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/icons.py +0 -0
  200. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/inputs.py +0 -0
  201. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/labels.py +0 -0
  202. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/layout.py +0 -0
  203. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/navigation.py +0 -0
  204. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/options.py +0 -0
  205. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/popover.py +0 -0
  206. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/switch.py +0 -0
  207. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/kit/tabs.py +0 -0
  208. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
  209. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/overlay/__init__.py +0 -0
  210. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/PluginTab.py +0 -0
  211. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/__init__.py +0 -0
  212. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/plugins/imported_tabs.py +0 -0
  213. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/qt.qrc +0 -0
  214. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/GlobalConfigTab.py +0 -0
  215. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/__init__.py +0 -0
  216. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/settings/config_section.py +0 -0
  217. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/__init__.py +0 -0
  218. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/connection.py +0 -0
  219. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/diagnostics.py +0 -0
  220. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/lazy_page.py +0 -0
  221. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/log_page.py +0 -0
  222. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/nav_icons.py +0 -0
  223. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/shell/run_bar.py +0 -0
  224. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/start/__init__.py +0 -0
  225. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/EditTaskTab.py +0 -0
  226. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/MarkUpWindow.py +0 -0
  227. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ModifyListDialog.py +0 -0
  228. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
  229. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/RecordScript.py +0 -0
  230. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -0
  231. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
  232. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TaskManger.py +0 -0
  233. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
  234. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TemplateFactory.py +0 -0
  235. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/TemplateTab.py +0 -0
  236. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/__init__.py +0 -0
  237. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/config_editors.py +0 -0
  238. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/config_form.py +0 -0
  239. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/mouse_buttons.py +0 -0
  240. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/tasks/schedule_index_sync.py +0 -0
  241. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/Alert.py +0 -0
  242. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/InitWorker.py +0 -0
  243. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/__init__.py +0 -0
  244. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/download.py +0 -0
  245. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/pip_util.py +0 -0
  246. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/pyappify_startup.py +0 -0
  247. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/touch_scroll.py +0 -0
  248. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/util/windows_thumbnail.py +0 -0
  249. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/Card.py +0 -0
  250. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/CustomTab.py +0 -0
  251. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/FlowLayout.py +0 -0
  252. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ImageWidget.py +0 -0
  253. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ImportWarningDialog.py +0 -0
  254. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
  255. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
  256. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
  257. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
  258. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/Tab.py +0 -0
  259. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/TabWidget.py +0 -0
  260. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
  261. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
  262. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/ui/qt/widget/__init__.py +0 -0
  263. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/__init__.py +0 -0
  264. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/copy_ok_folder.py +0 -0
  265. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/update/inline_ok_requirements.py +0 -0
  266. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/Analytics.py +0 -0
  267. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/GlobalConfig.py +0 -0
  268. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/__init__.py +0 -0
  269. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/blur.py +0 -0
  270. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/clazz.py +0 -0
  271. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/collection.py +0 -0
  272. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/color.py +0 -0
  273. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/config.py +0 -0
  274. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/explorer.py +0 -0
  275. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/file.py +0 -0
  276. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/gpu_driver_settings.py +0 -0
  277. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/handler.py +0 -0
  278. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/i18n.py +0 -0
  279. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/logger.py +0 -0
  280. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/partial_sync_repo.py +0 -0
  281. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/print_hwnd.py +0 -0
  282. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/process.py +0 -0
  283. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/version.py +0 -0
  284. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/window.py +0 -0
  285. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok/util/windows_schedule.py +0 -0
  286. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/SOURCES.txt +0 -0
  287. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/dependency_links.txt +0 -0
  288. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/entry_points.txt +0 -0
  289. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/not-zip-safe +0 -0
  290. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/requires.txt +0 -0
  291. {ok_script-3.0.0b4 → ok_script-3.0.1}/ok_script.egg-info/top_level.txt +0 -0
  292. {ok_script-3.0.0b4 → ok_script-3.0.1}/pyproject.toml +0 -0
  293. {ok_script-3.0.0b4 → ok_script-3.0.1}/setup.cfg +0 -0
  294. {ok_script-3.0.0b4 → ok_script-3.0.1}/setup.py +0 -0
  295. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_app.py +0 -0
  296. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_base_interaction.py +0 -0
  297. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_blur.py +0 -0
  298. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_box.py +0 -0
  299. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_capture_update.py +0 -0
  300. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_cli.py +0 -0
  301. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_core_events.py +0 -0
  302. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_core_ui_services.py +0 -0
  303. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_device_manager.py +0 -0
  304. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_diagnosis_page.py +0 -0
  305. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_executor_jobs.py +0 -0
  306. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_explorer.py +0 -0
  307. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_global_config.py +0 -0
  308. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_gpu_driver_settings.py +0 -0
  309. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_handler.py +0 -0
  310. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_headless_imports.py +0 -0
  311. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_inline_ok_requirements.py +0 -0
  312. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_kit.py +0 -0
  313. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_lazy_page.py +0 -0
  314. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_log_page.py +0 -0
  315. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_logger.py +0 -0
  316. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_notifications.py +0 -0
  317. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_startup_tab.py +0 -0
  318. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_main_window_system_theme.py +0 -0
  319. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_markup_window.py +0 -0
  320. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_cleanup.py +0 -0
  321. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_runner.py +0 -0
  322. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_server.py +0 -0
  323. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mcp_setting.py +0 -0
  324. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_missing_frame.py +0 -0
  325. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_mouse_buttons.py +0 -0
  326. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_navigation_state.py +0 -0
  327. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_nemu_ipc_capture.py +0 -0
  328. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_notifications.py +0 -0
  329. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_ok_mutex.py +0 -0
  330. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_overlay_custom_draw.py +0 -0
  331. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_overlay_lifecycle.py +0 -0
  332. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_package_metadata.py +0 -0
  333. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugin_staging.py +0 -0
  334. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugin_tabs.py +0 -0
  335. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_plugins.py +0 -0
  336. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_process.py +0 -0
  337. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_process_mutex.py +0 -0
  338. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_pyappify_startup_update.py +0 -0
  339. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_qt_events.py +0 -0
  340. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_qt_page_layout.py +0 -0
  341. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_runtime_startup.py +0 -0
  342. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_schedule_startup.py +0 -0
  343. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_schedule_task_index_sync.py +0 -0
  344. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_screenshot_naming.py +0 -0
  345. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_screenshot_rendering.py +0 -0
  346. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_settings_page.py +0 -0
  347. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_shell.py +0 -0
  348. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_skills.py +0 -0
  349. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_start_controller.py +0 -0
  350. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_executor_next_frame.py +0 -0
  351. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_executor_queue.py +0 -0
  352. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_task_reloading.py +0 -0
  353. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_tasks_page.py +0 -0
  354. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_compression.py +0 -0
  355. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_generation.py +0 -0
  356. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_template_tab.py +0 -0
  357. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_touch_scroll.py +0 -0
  358. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_translation_fallback.py +0 -0
  359. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_ui_config.py +0 -0
  360. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_version.py +0 -0
  361. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_graphics_capture.py +0 -0
  362. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_graphics_hdr.py +0 -0
  363. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_schedule_target_parse.py +0 -0
  364. {ok_script-3.0.0b4 → ok_script-3.0.1}/tests/test_windows_schedule_xml.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ok-script
3
- Version: 3.0.0b4
3
+ Version: 3.0.1
4
4
  Summary: Vibe Coding Automation Framework
5
5
  Author-email: ok-oldking <firedcto@gmail.com>
6
6
  License: ok-script License
@@ -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.stack, 1)
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 theme."""
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 theme mode, both applied live.
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}, file, indent=4)
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"))
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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", "NavItem",
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: {window};
15
+ background: {window_bg};
16
16
  }}
17
17
  QWidget#kitSidebar {{
18
- background: {sidebar};
19
- border-right: 1px solid {separator};
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: {control}; border: 1px solid {border_strong};
112
+ color: {text_secondary}; background: transparent; border: 1px solid transparent;
113
113
  }}
114
- Pill[tone="accent"] {{ color: {text}; background: {accent_soft}; border-color: {accent_line}; }}
115
- Pill[tone="success"] {{ color: {success}; background: {success_soft}; border-color: {success_line}; }}
116
- Pill[tone="warning"] {{ color: {warning}; background: {warning_soft}; border-color: {warning_line}; }}
117
- Pill[tone="danger"] {{ color: {danger}; background: {danger_soft}; border-color: {danger_line}; }}
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: {sidebar};
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: {sidebar};
288
+ background: {sidebar_bg};
289
289
  border: 0;
290
- border-bottom: 1px solid {separator};
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: