ok-script 2.0.22__tar.gz → 3.0.0__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-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/SKILL.md +3 -1
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-project/SKILL.md +1 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/PKG-INFO +43 -18
- {ok_script-2.0.22 → ok_script-3.0.0}/README.md +40 -12
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/__init__.py +40 -5
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/events.py +10 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/start_controller.py +25 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/ui_config.py +6 -4
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/windows_graphics.py +6 -3
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/windows_graphics_hdr.py +1 -1
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/Box.py +10 -25
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/Feature.py +0 -3
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/FeatureSet.py +93 -65
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/TaskExecutor.py +24 -29
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/task.py +52 -124
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/TaskTestCase.py +2 -2
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/MainWindow.py +269 -338
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/MessageWindow.py +17 -18
- ok_script-3.0.0/ok/ui/qt/about/AboutTab.py +272 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/about/UpdateCard.py +35 -60
- ok_script-3.0.0/ok/ui/qt/common/config.py +97 -0
- ok_script-3.0.0/ok/ui/qt/debug/diagnosis_page.py +500 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/en_US.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/en_US.ts +387 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/es_ES.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/es_ES.ts +387 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ja_JP.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ja_JP.ts +392 -1
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ko_KR.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/ko_KR.ts +388 -1
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_CN.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_CN.ts +387 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_TW.qm +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/zh_TW.ts +387 -0
- ok_script-3.0.0/ok/ui/qt/kit/__init__.py +29 -0
- ok_script-3.0.0/ok/ui/qt/kit/buttons.py +142 -0
- ok_script-3.0.0/ok/ui/qt/kit/cards.py +101 -0
- ok_script-3.0.0/ok/ui/qt/kit/dialogs.py +158 -0
- ok_script-3.0.0/ok/ui/qt/kit/feedback.py +268 -0
- ok_script-3.0.0/ok/ui/qt/kit/gallery.py +279 -0
- ok_script-3.0.0/ok/ui/qt/kit/icons.py +366 -0
- ok_script-3.0.0/ok/ui/qt/kit/inputs.py +95 -0
- ok_script-3.0.0/ok/ui/qt/kit/labels.py +27 -0
- ok_script-3.0.0/ok/ui/qt/kit/layout.py +73 -0
- ok_script-3.0.0/ok/ui/qt/kit/navigation.py +253 -0
- ok_script-3.0.0/ok/ui/qt/kit/options.py +114 -0
- ok_script-3.0.0/ok/ui/qt/kit/popover.py +105 -0
- ok_script-3.0.0/ok/ui/qt/kit/qss.py +453 -0
- ok_script-3.0.0/ok/ui/qt/kit/switch.py +96 -0
- ok_script-3.0.0/ok/ui/qt/kit/tabs.py +156 -0
- ok_script-3.0.0/ok/ui/qt/kit/theme.py +245 -0
- ok_script-3.0.0/ok/ui/qt/kit/window.py +356 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/PluginTab.py +173 -92
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/imported_tabs.py +31 -30
- ok_script-3.0.0/ok/ui/qt/qt.qrc +10 -0
- ok_script-3.0.0/ok/ui/qt/resources.py +20501 -0
- ok_script-3.0.0/ok/ui/qt/settings/GlobalConfigTab.py +42 -0
- ok_script-3.0.0/ok/ui/qt/settings/config_section.py +53 -0
- ok_script-3.0.0/ok/ui/qt/settings/settings_page.py +163 -0
- ok_script-3.0.0/ok/ui/qt/shell/__init__.py +1 -0
- ok_script-3.0.0/ok/ui/qt/shell/connection.py +299 -0
- ok_script-3.0.0/ok/ui/qt/shell/diagnostics.py +138 -0
- ok_script-3.0.0/ok/ui/qt/shell/lazy_page.py +32 -0
- ok_script-3.0.0/ok/ui/qt/shell/log_page.py +353 -0
- ok_script-3.0.0/ok/ui/qt/shell/nav_icons.py +57 -0
- ok_script-3.0.0/ok/ui/qt/shell/run_bar.py +361 -0
- ok_script-3.0.0/ok/ui/qt/tasks/EditTaskTab.py +1046 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/MarkUpWindow.py +211 -188
- ok_script-3.0.0/ok/ui/qt/tasks/ModifyListDialog.py +208 -0
- ok_script-3.0.0/ok/ui/qt/tasks/ScheduleTaskTab.py +851 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TemplateFactory.py +46 -41
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TemplateTab.py +152 -170
- ok_script-3.0.0/ok/ui/qt/tasks/config_editors.py +397 -0
- ok_script-2.0.22/ok/ui/qt/tasks/ConfigCard.py → ok_script-3.0.0/ok/ui/qt/tasks/config_form.py +65 -54
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndLineEdit.py → ok_script-3.0.0/ok/ui/qt/tasks/mouse_buttons.py +0 -41
- ok_script-3.0.0/ok/ui/qt/tasks/tasks_page.py +928 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/app.py +36 -43
- ok_script-3.0.0/ok/ui/qt/widget/Card.py +50 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/CustomTab.py +10 -6
- ok_script-3.0.0/ok/ui/qt/widget/ImportWarningDialog.py +46 -0
- ok_script-3.0.0/ok/ui/qt/widget/StartLoadingDialog.py +89 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/Tab.py +18 -20
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/PKG-INFO +43 -18
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/SOURCES.txt +40 -75
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/requires.txt +1 -4
- {ok_script-2.0.22 → ok_script-3.0.0}/pyproject.toml +3 -9
- ok_script-3.0.0/tests/test_diagnosis_page.py +133 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_global_config.py +18 -15
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_headless_imports.py +22 -0
- ok_script-3.0.0/tests/test_kit.py +481 -0
- ok_script-3.0.0/tests/test_lazy_page.py +47 -0
- ok_script-3.0.0/tests/test_log_page.py +153 -0
- ok_script-3.0.0/tests/test_main_window_notifications.py +76 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_main_window_startup_tab.py +18 -40
- ok_script-3.0.0/tests/test_main_window_system_theme.py +64 -0
- ok_script-3.0.0/tests/test_markup_window.py +94 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_setting.py +5 -5
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mouse_buttons.py +3 -3
- ok_script-3.0.0/tests/test_navigation_state.py +63 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugin_staging.py +2 -3
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugin_tabs.py +19 -20
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_pyappify_startup_update.py +28 -42
- ok_script-3.0.0/tests/test_qt_page_layout.py +50 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_schedule_startup.py +62 -3
- ok_script-3.0.0/tests/test_settings_page.py +108 -0
- ok_script-3.0.0/tests/test_shell.py +347 -0
- ok_script-3.0.0/tests/test_tasks_page.py +493 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_tab.py +5 -5
- ok_script-2.0.22/ok/ui/qt/TabTitles.py +0 -57
- ok_script-2.0.22/ok/ui/qt/about/AboutTab.py +0 -112
- ok_script-2.0.22/ok/ui/qt/about/HttpTextEdit.py +0 -23
- ok_script-2.0.22/ok/ui/qt/about/LinksBar.py +0 -82
- ok_script-2.0.22/ok/ui/qt/about/ProjectCard.py +0 -42
- ok_script-2.0.22/ok/ui/qt/about/VersionCard.py +0 -20
- ok_script-2.0.22/ok/ui/qt/common/OKIcon.py +0 -15
- ok_script-2.0.22/ok/ui/qt/common/accent_color.py +0 -28
- ok_script-2.0.22/ok/ui/qt/common/config.py +0 -66
- ok_script-2.0.22/ok/ui/qt/common/design_system.py +0 -69
- ok_script-2.0.22/ok/ui/qt/common/icons.py +0 -20
- ok_script-2.0.22/ok/ui/qt/common/style_sheet.py +0 -19
- ok_script-2.0.22/ok/ui/qt/debug/DebugTab.py +0 -295
- ok_script-2.0.22/ok/ui/qt/debug/JobControls.py +0 -128
- ok_script-2.0.22/ok/ui/qt/debug/RunCodeTab.py +0 -112
- ok_script-2.0.22/ok/ui/qt/qss/dark/card.qss +0 -16
- ok_script-2.0.22/ok/ui/qt/qss/dark/discord.svg +0 -10
- ok_script-2.0.22/ok/ui/qt/qss/dark/heart.svg +0 -7
- ok_script-2.0.22/ok/ui/qt/qss/dark/message_window.qss +0 -27
- ok_script-2.0.22/ok/ui/qt/qss/dark/setting_interface.qss +0 -18
- ok_script-2.0.22/ok/ui/qt/qss/dark/status_bar.qss +0 -23
- ok_script-2.0.22/ok/ui/qt/qss/dark/stop.svg +0 -9
- ok_script-2.0.22/ok/ui/qt/qss/dark/tab.qss +0 -91
- ok_script-2.0.22/ok/ui/qt/qss/light/card.qss +0 -15
- ok_script-2.0.22/ok/ui/qt/qss/light/discord.svg +0 -10
- ok_script-2.0.22/ok/ui/qt/qss/light/heart.svg +0 -7
- ok_script-2.0.22/ok/ui/qt/qss/light/message_window.qss +0 -23
- ok_script-2.0.22/ok/ui/qt/qss/light/setting_interface.qss +0 -15
- ok_script-2.0.22/ok/ui/qt/qss/light/status_bar.qss +0 -20
- ok_script-2.0.22/ok/ui/qt/qss/light/stop.svg +0 -9
- ok_script-2.0.22/ok/ui/qt/qss/light/tab.qss +0 -85
- ok_script-2.0.22/ok/ui/qt/qt.qrc +0 -25
- ok_script-2.0.22/ok/ui/qt/resources.py +0 -19088
- ok_script-2.0.22/ok/ui/qt/settings/GlobalConfigCard.py +0 -17
- ok_script-2.0.22/ok/ui/qt/settings/GlobalConfigTab.py +0 -47
- ok_script-2.0.22/ok/ui/qt/settings/SettingTab.py +0 -90
- ok_script-2.0.22/ok/ui/qt/start/LogWindow.py +0 -522
- ok_script-2.0.22/ok/ui/qt/start/SelectCaptureListView.py +0 -79
- ok_script-2.0.22/ok/ui/qt/start/SelectInteractionListView.py +0 -68
- ok_script-2.0.22/ok/ui/qt/start/StartCard.py +0 -146
- ok_script-2.0.22/ok/ui/qt/start/StartTab.py +0 -395
- ok_script-2.0.22/ok/ui/qt/tasks/ConfigItemFactory.py +0 -74
- ok_script-2.0.22/ok/ui/qt/tasks/ConfigLabelAndWidget.py +0 -15
- ok_script-2.0.22/ok/ui/qt/tasks/EditTaskTab.py +0 -1092
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndButtons.py +0 -44
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +0 -22
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndDropDown.py +0 -45
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndFileSelector.py +0 -89
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndGlobal.py +0 -21
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndList.py +0 -18
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndMcpServer.py +0 -39
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndMultiSelection.py +0 -133
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndSpinBox.py +0 -33
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndSwitchButton.py +0 -24
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndTextEdit.py +0 -42
- ok_script-2.0.22/ok/ui/qt/tasks/LabelAndWidget.py +0 -41
- ok_script-2.0.22/ok/ui/qt/tasks/ModifyListDialog.py +0 -249
- ok_script-2.0.22/ok/ui/qt/tasks/ModifyListItem.py +0 -55
- ok_script-2.0.22/ok/ui/qt/tasks/OneTimeTaskTab.py +0 -93
- ok_script-2.0.22/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -1310
- ok_script-2.0.22/ok/ui/qt/tasks/StartButton.py +0 -51
- ok_script-2.0.22/ok/ui/qt/tasks/TaskCard.py +0 -230
- ok_script-2.0.22/ok/ui/qt/tasks/TaskTab.py +0 -127
- ok_script-2.0.22/ok/ui/qt/tasks/TooltipTableWidget.py +0 -23
- ok_script-2.0.22/ok/ui/qt/tasks/TriggerTaskTab.py +0 -32
- ok_script-2.0.22/ok/ui/qt/widget/BaseLoading.py +0 -18
- ok_script-2.0.22/ok/ui/qt/widget/BaseWindow.py +0 -88
- ok_script-2.0.22/ok/ui/qt/widget/Card.py +0 -72
- ok_script-2.0.22/ok/ui/qt/widget/EmptyCard.py +0 -14
- ok_script-2.0.22/ok/ui/qt/widget/ExpandCardLayout.py +0 -29
- ok_script-2.0.22/ok/ui/qt/widget/FramelessDialog.py +0 -13
- ok_script-2.0.22/ok/ui/qt/widget/ImportWarningDialog.py +0 -40
- ok_script-2.0.22/ok/ui/qt/widget/OkCompactSpinBox.py +0 -10
- ok_script-2.0.22/ok/ui/qt/widget/StartLoadingDialog.py +0 -71
- ok_script-2.0.22/ok/ui/qt/widget/StatusBar.py +0 -131
- ok_script-2.0.22/ok/ui/qt/widget/WidgetWithVLabel.py +0 -17
- ok_script-2.0.22/ok/update/__init__.py +0 -0
- ok_script-2.0.22/tests/test_accent_color.py +0 -41
- ok_script-2.0.22/tests/test_config_card.py +0 -160
- ok_script-2.0.22/tests/test_debug_job_controls.py +0 -255
- ok_script-2.0.22/tests/test_expand_card_layout.py +0 -69
- ok_script-2.0.22/tests/test_main_window_notifications.py +0 -76
- ok_script-2.0.22/tests/test_main_window_system_theme.py +0 -124
- ok_script-2.0.22/tests/test_navigation_state.py +0 -45
- ok_script-2.0.22/tests/test_qt_legacy_imports.py +0 -12
- ok_script-2.0.22/tests/test_qt_page_layout.py +0 -45
- ok_script-2.0.22/tests/test_start_tab_overlay.py +0 -17
- ok_script-2.0.22/tests/test_task_ui.py +0 -207
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/agents/openai.yaml +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/develop/references/windows-input.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/generate-templates/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/reload-tasks/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/reload-tasks/agents/openai.yaml +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/agents/openai.yaml +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-env/assets/ok-script-develop/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/setup-project/agents/openai.yaml +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/use_venv/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/write-test/SKILL.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/.agents/skills/write-test/agents/openai.yaml +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/LICENSE.txt +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/MANIFEST.in +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/diagnostics/qq_trace.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/docs/agent-setup.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/docs/feature-crops.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/docs/mcp.md +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/examples/mcp_observe.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/__main__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/emulator_base.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/emulator_windows.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/platform_windows.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/alas/utils.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/assets/default-icon.png +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/deep.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/minitouch.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/nemu_ipc.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/nemu_utils.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/pool.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/timer.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/adb/util.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/d3d11.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/capture/windows/dump.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/cli.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/capture_labels.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/code_runner.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/config_schema.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/downloads.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/icons.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/mcp_runner.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/mcp_server.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/notifications.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/plugin_staging.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/plugins.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/screenshot.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_editing.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_packager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/script_templates.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/skills.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/task_manager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/template_store.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/core/translation.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/DeviceManager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/adb.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/base.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/bitblt.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/bitblt_utils.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/browser.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/desktop_duplication.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/hwnd_window.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/image.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/nemu_ipc.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/types.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/capture_methods/update.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/adb.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/base.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/browser.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/do_nothing.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/foreground_post_message.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/genshin.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/keys.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/post_message.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/pydirect.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/pynput.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/interaction_methods/swipe.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/device/intercation.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/feature/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/gui/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/gui/util/pyappify_startup.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/manager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/messenger_images.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/pipeline.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/ppocr.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/providers.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/system.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/notification/windows_messenger.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ocr/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ocr/download_paddle_model.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Media/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Security/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/Storage/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/UI/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/Windows/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/delegate.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/export.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/idldsl.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/inspectable.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/roapi.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/types.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/rotypes/winstring.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/DiagnosisTask.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/task/exceptions.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/OKTestRunner.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/RunTests.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/test/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/third_party/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/third_party/paperclip.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/overlay/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/overlay/win32_gdi.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/Communicate.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/StartController.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/about/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/common/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/OverlayWidget.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/Screenshot.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/debug/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/events.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/path.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/i18n/update.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/overlay/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/plugins/__init__.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/qss → ok_script-3.0.0/ok/ui/qt/settings}/__init__.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/settings → ok_script-3.0.0/ok/ui/qt/start}/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/RecordScript.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TaskManger.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/start → ok_script-3.0.0/ok/ui/qt/tasks}/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/tasks/schedule_index_sync.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/Alert.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/InitWorker.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/tasks → ok_script-3.0.0/ok/ui/qt/util}/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/download.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/pip_util.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/pyappify_startup.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/touch_scroll.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/util/windows_thumbnail.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/FlowLayout.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/ImageWidget.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/TabWidget.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/util → ok_script-3.0.0/ok/ui/qt/widget}/__init__.py +0 -0
- {ok_script-2.0.22/ok/ui/qt/widget → ok_script-3.0.0/ok/update}/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/update/copy_ok_folder.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/update/inline_ok_requirements.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/Analytics.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/GlobalConfig.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/__init__.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/blur.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/clazz.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/collection.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/color.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/config.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/explorer.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/file.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/gpu_driver_settings.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/handler.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/i18n.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/logger.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/partial_sync_repo.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/print_hwnd.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/process.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/version.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/window.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok/util/windows_schedule.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/entry_points.txt +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/not-zip-safe +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/ok_script.egg-info/top_level.txt +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/setup.cfg +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/setup.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_app.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_base_interaction.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_blur.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_box.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_capture_update.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_cli.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_core_events.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_core_ui_services.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_device_manager.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_executor_jobs.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_explorer.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_gpu_driver_settings.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_handler.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_inline_ok_requirements.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_logger.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_cleanup.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_runner.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_mcp_server.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_missing_frame.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_nemu_ipc_capture.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_notifications.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_ok_mutex.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_overlay_custom_draw.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_overlay_lifecycle.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_package_metadata.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_plugins.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_process.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_process_mutex.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_qt_events.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_runtime_startup.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_schedule_task_index_sync.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_screenshot_naming.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_screenshot_rendering.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_skills.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_start_controller.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_executor_next_frame.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_executor_queue.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_task_reloading.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_compression.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_template_generation.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_touch_scroll.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_translation_fallback.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_ui_config.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_version.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_graphics_capture.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_graphics_hdr.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_schedule_target_parse.py +0 -0
- {ok_script-2.0.22 → ok_script-3.0.0}/tests/test_windows_schedule_xml.py +0 -0
|
@@ -25,6 +25,8 @@ $projectPy = (Resolve-Path .\.venv\Scripts\python.exe).Path
|
|
|
25
25
|
|
|
26
26
|
Run this from the application's root. Install the chosen OpenCV variant separately if it is absent.
|
|
27
27
|
|
|
28
|
+
The `qt` extra installs `ok-pyside-minimal`, which provides the `PySide6` package with only QtCore, QtGui, QtWidgets and QtSvg. Do not also install `PySide6`, `PySide6-Essentials` or `PySide6-Addons` in the same environment: they write the same `PySide6` folder. If an older environment has them (for example from PySide6-Fluent-Widgets), uninstall them or recreate the environment before installing the `qt` extra.
|
|
29
|
+
|
|
28
30
|
Record the selected ok-script version or constraint, extras, and OpenCV variant in the application's existing dependency manifest or lockfile using its package manager. Keep setup reproducible without replacing unrelated dependencies.
|
|
29
31
|
|
|
30
32
|
If the application intentionally uses an existing editable library installation or `ok` source link, preserve that arrangement and install its required dependencies in the application's environment. A source link alone does not install dependencies. Modify the application's tasks and configuration; library source changes are outside this skill's scope.
|
|
@@ -33,7 +35,7 @@ Use the normal package index first. If downloads stall, a reachable alternate in
|
|
|
33
35
|
|
|
34
36
|
## Verify the environment
|
|
35
37
|
|
|
36
|
-
Run `& $projectPy -m pip check`. Smoke-test `import ok, cv2, mcp` and the selected optional stacks, and verify `ok.__file__` resolves to the intended checkout or installed package. For Qt, check `from PySide6 import QtCore` and `import
|
|
38
|
+
Run `& $projectPy -m pip check`. Smoke-test `import ok, cv2, mcp` and the selected optional stacks, and verify `ok.__file__` resolves to the intended checkout or installed package. For Qt, check `from PySide6 import QtCore, QtSvg` and `import ok.ui.qt.kit`.
|
|
37
39
|
|
|
38
40
|
If the application already has a launcher, run it with its environment to catch runtime imports that dependency metadata alone cannot verify. Compile changed application scripts and run its existing tests when relevant.
|
|
39
41
|
|
|
@@ -66,6 +66,7 @@ ROOT = Path(__file__).resolve().parent
|
|
|
66
66
|
config = {
|
|
67
67
|
'version': '0.1.0',
|
|
68
68
|
'gui_title': 'Automation Playground',
|
|
69
|
+
'game_name': 'Target', # shown as "Start Target" when Start will launch it; defaults to "Game"
|
|
69
70
|
'gui': {'type': 'qt'},
|
|
70
71
|
'debug': False,
|
|
71
72
|
'config_folder': str(ROOT / 'configs'),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ok-script
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Summary: Vibe Coding Automation Framework
|
|
5
5
|
Author-email: ok-oldking <firedcto@gmail.com>
|
|
6
6
|
License: ok-script License
|
|
7
7
|
================
|
|
@@ -106,10 +106,7 @@ Requires-Dist: Pillow>=10.0; extra == "default"
|
|
|
106
106
|
Requires-Dist: ok-d3dshot>=0.1.5; extra == "default"
|
|
107
107
|
Requires-Dist: OpenCC==1.2.0; extra == "default"
|
|
108
108
|
Provides-Extra: qt
|
|
109
|
-
Requires-Dist:
|
|
110
|
-
Requires-Dist: PySideSix-Frameless-Window>=0.3.12; extra == "qt"
|
|
111
|
-
Requires-Dist: darkdetect>=0.8.0; extra == "qt"
|
|
112
|
-
Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
|
|
109
|
+
Requires-Dist: ok-pyside-minimal>=6.12.0.post2; extra == "qt"
|
|
113
110
|
Provides-Extra: adb
|
|
114
111
|
Requires-Dist: adbutils>=2.2.1; extra == "adb"
|
|
115
112
|
Provides-Extra: ocr
|
|
@@ -129,11 +126,11 @@ Dynamic: license-file
|
|
|
129
126
|
|
|
130
127
|
**简体中文** | [English](README_en.md)
|
|
131
128
|
|
|
132
|
-
|
|
129
|
+
**Vibe Coding 自动化框架**
|
|
133
130
|
|
|
134
|
-
|
|
131
|
+
在 Codex、Claude Code 或任何支持 MCP 的编程代理里许个愿,得到一个可部署的自动化程序。
|
|
135
132
|
|
|
136
|
-
|
|
133
|
+
说出你想自动化的事。代理通过 MCP 观察 Windows 应用、游戏或安卓设备,编写 Python 任务,在真实目标上运行并修复失败。ok-script 把完成的任务连同桌面 GUI 打包成可分发的 Windows 安装包。打包后的程序在本地独立完成截图、识别和输入,无需代理保持连接。
|
|
137
134
|
|
|
138
135
|
ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提供模板匹配、OCR、目标支持时的后台输入、桌面界面和任务打包。
|
|
139
136
|
|
|
@@ -151,8 +148,24 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
|
|
|
151
148
|
|
|
152
149
|
> 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
|
|
153
150
|
|
|
151
|
+
修复已有任务:
|
|
152
|
+
|
|
153
|
+
> 连接这个项目的 ok-script MCP 服务,读取 reload-tasks 技能。用 list_tasks 找到出错任务的源码,修改该文件,按任务 ID 重载并等待重载成功。恢复并验证起始界面,重复运行已注册的实现,并给出运行日志和截图中的证据。
|
|
154
|
+
|
|
155
|
+
## MCP 开发流程
|
|
156
|
+
|
|
157
|
+
代理用自己的工具编辑文件、读取日志;MCP 让它直接操作正在运行的应用:
|
|
158
|
+
|
|
159
|
+
1. **学习**:`list_skills` 和 `get_skill` 返回当前安装版本自带的开发、模板、测试和重载流程;代理从已安装包中读取准确的 Python 签名。
|
|
160
|
+
2. **观察**:`screenshot` 保存已配置窗口或设备的当前画面。
|
|
161
|
+
3. **运行**:`run_task` 在真实目标上执行 Python 任务文件。每次尝试先恢复并验证起始状态,再由 `run()` 执行并断言自动化结果。
|
|
162
|
+
4. **检查**:每次尝试写入 `logs/mcp/<run_id>/run.log`、`status.json` 和任务截图。`get_run_status` 报告进度和错误,`stop_task` 用于取消。
|
|
163
|
+
5. **修复**:`list_tasks` 返回已注册任务的源码路径;修改后用 `reload_tasks` 在运行中的进程里替换。无法重置时用 `exit_process` 结束运行时。
|
|
164
|
+
6. **交付**:在项目配置中注册任务,通过 GUI 或 `python -m ok run_task` 运行,并用 [PyAppify](https://github.com/ok-oldking/pyappify) 打包成 Windows 安装包。
|
|
165
|
+
|
|
154
166
|
## 特性
|
|
155
167
|
|
|
168
|
+
- 面向编程代理的 MCP 服务:内置技能、实时截图、任务执行、热重载和逐次运行日志
|
|
156
169
|
- 纯 Python 实现,免费开源,可直接使用 pip 生态中的第三方库
|
|
157
170
|
- 同一套任务代码可支持 Windows 客户端、安卓模拟器和 ADB 设备
|
|
158
171
|
- 支持 OCR、OpenCV 模板匹配以及 YOLO 等视觉方案
|
|
@@ -173,7 +186,9 @@ python -m venv .venv
|
|
|
173
186
|
|
|
174
187
|
启动命令要求应用配置已经存在,请使用实际配置入口或项目已有的开发启动器。MCP 自 2.0.17 起随 ok-script 自动安装,无需额外扩展。OpenCV 需单独选择并安装一个兼容变体;Qt、ADB 和 OCR 按需安装。
|
|
175
188
|
|
|
176
|
-
让代理的 MCP
|
|
189
|
+
让代理的 MCP 客户端通过 Streamable HTTP 连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
|
|
190
|
+
|
|
191
|
+
已有桌面应用也可以在 **设置 > 基本设置 > 启用 MCP 服务器** 中开启,或使用 `python -m ok gui --config src.config:config --mcp` 启动。服务只监听本机回环地址,但已连接的代理可以用你的账户权限执行 Python。日常使用请保留单独的、关闭 MCP 的启动器。
|
|
177
192
|
|
|
178
193
|
[MCP 快速开始](docs/quick_start/README.md)介绍安装、连接以及脱离代理运行保存的任务。[MCP 说明(英文)](docs/mcp.md)包含执行和重载细节。
|
|
179
194
|
|
|
@@ -200,20 +215,30 @@ python -m venv .venv
|
|
|
200
215
|
|
|
201
216
|
## 使用 ok-script 的项目
|
|
202
217
|
|
|
203
|
-
- [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
|
|
204
218
|
- [鸣潮](https://github.com/ok-oldking/ok-wuthering-waves)
|
|
205
|
-
- [
|
|
219
|
+
- [异环](https://github.com/BnanZ0/ok-nte)
|
|
220
|
+
- [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
|
|
221
|
+
- [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
|
|
206
222
|
- [少女前线 2](https://github.com/ok-oldking/ok-gf2)
|
|
207
|
-
- [
|
|
223
|
+
- [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
|
|
224
|
+
- [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
|
|
208
225
|
- [星痕共鸣](https://github.com/Sanheiii/ok-star-resonance)
|
|
209
|
-
- [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
|
|
210
226
|
- [卡厄思梦境](https://github.com/baoxin1100/ok-kes)
|
|
227
|
+
- [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
|
|
211
228
|
- [阴阳师](https://github.com/YunLiuZ/ok-Onmyoji)
|
|
229
|
+
- [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
|
|
212
230
|
- [白荆回廊](https://github.com/ok-oldking/ok-baijing)(停止维护)
|
|
213
|
-
- [
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
231
|
+
- [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)(停止维护)
|
|
232
|
+
|
|
233
|
+
## 开发 ok-script
|
|
234
|
+
|
|
235
|
+
在本仓库中测试界面改动时,可以用 [main.py](main.py) 中的演示配置直接从源码启动 GUI:
|
|
236
|
+
|
|
237
|
+
```powershell
|
|
238
|
+
.\.venv\Scripts\python.exe main.py
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
它以记事本为目标窗口,无需游戏,并注册了一个演示一次性任务和一个触发任务,让任务、计划任务和模板页面都有内容。设置和日志保存在已被 git 忽略的 `configs/` 和 `logs/` 目录中。需要测试其他选项时,修改 `main.py` 中的 `config` 字典或演示任务即可。
|
|
217
242
|
|
|
218
243
|
## 社区与发布
|
|
219
244
|
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
**简体中文** | [English](README_en.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Vibe Coding 自动化框架**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
在 Codex、Claude Code 或任何支持 MCP 的编程代理里许个愿,得到一个可部署的自动化程序。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
说出你想自动化的事。代理通过 MCP 观察 Windows 应用、游戏或安卓设备,编写 Python 任务,在真实目标上运行并修复失败。ok-script 把完成的任务连同桌面 GUI 打包成可分发的 Windows 安装包。打包后的程序在本地独立完成截图、识别和输入,无需代理保持连接。
|
|
10
10
|
|
|
11
11
|
ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提供模板匹配、OCR、目标支持时的后台输入、桌面界面和任务打包。
|
|
12
12
|
|
|
@@ -24,8 +24,24 @@ ok-script 支持 Windows 应用和游戏、安卓模拟器及 ADB 设备,提
|
|
|
24
24
|
|
|
25
25
|
> 连接这个项目的 ok-script MCP 服务,读取开发技能。检查已安装的截图、匹配和输入 API,给出准确签名和源码位置。开发可复用 Python 任务:打开设置、启用“显示详情”、保存并验证结果。每次尝试前恢复并验证起始界面,测试重复运行,代码保存到项目中。使用 ok-script API 和 MCP,不使用 Computer Use 工具。最后给出不依赖代理或大模型调用的准确运行命令。
|
|
26
26
|
|
|
27
|
+
修复已有任务:
|
|
28
|
+
|
|
29
|
+
> 连接这个项目的 ok-script MCP 服务,读取 reload-tasks 技能。用 list_tasks 找到出错任务的源码,修改该文件,按任务 ID 重载并等待重载成功。恢复并验证起始界面,重复运行已注册的实现,并给出运行日志和截图中的证据。
|
|
30
|
+
|
|
31
|
+
## MCP 开发流程
|
|
32
|
+
|
|
33
|
+
代理用自己的工具编辑文件、读取日志;MCP 让它直接操作正在运行的应用:
|
|
34
|
+
|
|
35
|
+
1. **学习**:`list_skills` 和 `get_skill` 返回当前安装版本自带的开发、模板、测试和重载流程;代理从已安装包中读取准确的 Python 签名。
|
|
36
|
+
2. **观察**:`screenshot` 保存已配置窗口或设备的当前画面。
|
|
37
|
+
3. **运行**:`run_task` 在真实目标上执行 Python 任务文件。每次尝试先恢复并验证起始状态,再由 `run()` 执行并断言自动化结果。
|
|
38
|
+
4. **检查**:每次尝试写入 `logs/mcp/<run_id>/run.log`、`status.json` 和任务截图。`get_run_status` 报告进度和错误,`stop_task` 用于取消。
|
|
39
|
+
5. **修复**:`list_tasks` 返回已注册任务的源码路径;修改后用 `reload_tasks` 在运行中的进程里替换。无法重置时用 `exit_process` 结束运行时。
|
|
40
|
+
6. **交付**:在项目配置中注册任务,通过 GUI 或 `python -m ok run_task` 运行,并用 [PyAppify](https://github.com/ok-oldking/pyappify) 打包成 Windows 安装包。
|
|
41
|
+
|
|
27
42
|
## 特性
|
|
28
43
|
|
|
44
|
+
- 面向编程代理的 MCP 服务:内置技能、实时截图、任务执行、热重载和逐次运行日志
|
|
29
45
|
- 纯 Python 实现,免费开源,可直接使用 pip 生态中的第三方库
|
|
30
46
|
- 同一套任务代码可支持 Windows 客户端、安卓模拟器和 ADB 设备
|
|
31
47
|
- 支持 OCR、OpenCV 模板匹配以及 YOLO 等视觉方案
|
|
@@ -46,7 +62,9 @@ python -m venv .venv
|
|
|
46
62
|
|
|
47
63
|
启动命令要求应用配置已经存在,请使用实际配置入口或项目已有的开发启动器。MCP 自 2.0.17 起随 ok-script 自动安装,无需额外扩展。OpenCV 需单独选择并安装一个兼容变体;Qt、ADB 和 OCR 按需安装。
|
|
48
64
|
|
|
49
|
-
让代理的 MCP
|
|
65
|
+
让代理的 MCP 客户端通过 Streamable HTTP 连接有效 `logs/mcp/connections/<pid>-<port>.json` 记录中的 URL,并使用该记录的 `Authorization: Bearer <token>` 请求头。不要公开凭据。让代理调用 `list_skills`,通过 `get_skill` 读取相关技能,再用 `screenshot` 验证目标。
|
|
66
|
+
|
|
67
|
+
已有桌面应用也可以在 **设置 > 基本设置 > 启用 MCP 服务器** 中开启,或使用 `python -m ok gui --config src.config:config --mcp` 启动。服务只监听本机回环地址,但已连接的代理可以用你的账户权限执行 Python。日常使用请保留单独的、关闭 MCP 的启动器。
|
|
50
68
|
|
|
51
69
|
[MCP 快速开始](docs/quick_start/README.md)介绍安装、连接以及脱离代理运行保存的任务。[MCP 说明(英文)](docs/mcp.md)包含执行和重载细节。
|
|
52
70
|
|
|
@@ -73,20 +91,30 @@ python -m venv .venv
|
|
|
73
91
|
|
|
74
92
|
## 使用 ok-script 的项目
|
|
75
93
|
|
|
76
|
-
- [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
|
|
77
94
|
- [鸣潮](https://github.com/ok-oldking/ok-wuthering-waves)
|
|
78
|
-
- [
|
|
95
|
+
- [异环](https://github.com/BnanZ0/ok-nte)
|
|
96
|
+
- [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
|
|
97
|
+
- [明日方舟:终末地](https://github.com/AliceJump/ok-end-field)
|
|
79
98
|
- [少女前线 2](https://github.com/ok-oldking/ok-gf2)
|
|
80
|
-
- [
|
|
99
|
+
- [ok-script 应用模板](https://github.com/ok-oldking/ok-script-app)
|
|
100
|
+
- [棕色尘埃 2](https://github.com/GodRaymond233/ok-bd2)
|
|
81
101
|
- [星痕共鸣](https://github.com/Sanheiii/ok-star-resonance)
|
|
82
|
-
- [二重螺旋](https://github.com/BnanZ0/ok-duet-night-abyss)
|
|
83
102
|
- [卡厄思梦境](https://github.com/baoxin1100/ok-kes)
|
|
103
|
+
- [蓝色星原:旅谣](https://github.com/longer-sausage/OK-AzurPromilia)
|
|
84
104
|
- [阴阳师](https://github.com/YunLiuZ/ok-Onmyoji)
|
|
105
|
+
- [原神](https://github.com/ok-oldking/ok-genshin-impact)(停止维护,后台过剧情仍可用)
|
|
85
106
|
- [白荆回廊](https://github.com/ok-oldking/ok-baijing)(停止维护)
|
|
86
|
-
- [
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
107
|
+
- [崩坏:星穹铁道](https://github.com/Shasnow/ok-starrailassistant)(停止维护)
|
|
108
|
+
|
|
109
|
+
## 开发 ok-script
|
|
110
|
+
|
|
111
|
+
在本仓库中测试界面改动时,可以用 [main.py](main.py) 中的演示配置直接从源码启动 GUI:
|
|
112
|
+
|
|
113
|
+
```powershell
|
|
114
|
+
.\.venv\Scripts\python.exe main.py
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
它以记事本为目标窗口,无需游戏,并注册了一个演示一次性任务和一个触发任务,让任务、计划任务和模板页面都有内容。设置和日志保存在已被 git 忽略的 `configs/` 和 `logs/` 目录中。需要测试其他选项时,修改 `main.py` 中的 `config` 字典或演示任务即可。
|
|
90
118
|
|
|
91
119
|
## 社区与发布
|
|
92
120
|
|
|
@@ -310,6 +310,8 @@ class App(_OverlayConfigMixin):
|
|
|
310
310
|
self.global_config = task_executor.global_config if task_executor else None
|
|
311
311
|
from ok.ui.qt.util.app import init_app_config
|
|
312
312
|
self.app, self.locale = init_app_config()
|
|
313
|
+
from ok.ui.qt.common.config import cfg as ui_config
|
|
314
|
+
ui_config.language_changed.connect(self._on_language_changed)
|
|
313
315
|
install_qt_event_dispatcher()
|
|
314
316
|
self.app.aboutToQuit.connect(self._close_device_manager)
|
|
315
317
|
if task_executor is not None:
|
|
@@ -461,6 +463,44 @@ class App(_OverlayConfigMixin):
|
|
|
461
463
|
self.do_show_main()
|
|
462
464
|
|
|
463
465
|
def do_show_main(self):
|
|
466
|
+
self._create_main_window()
|
|
467
|
+
self.main_window.show()
|
|
468
|
+
self.main_window.bring_to_front()
|
|
469
|
+
|
|
470
|
+
logger.debug(f'show_main_window end')
|
|
471
|
+
|
|
472
|
+
def _on_language_changed(self):
|
|
473
|
+
# The signal comes from a widget in the window being replaced; rebuild once it returns.
|
|
474
|
+
from PySide6.QtCore import QTimer
|
|
475
|
+
QTimer.singleShot(0, self._apply_language)
|
|
476
|
+
|
|
477
|
+
def _apply_language(self):
|
|
478
|
+
from ok.ui.qt.util.app import install_translator
|
|
479
|
+
self.locale = install_translator(self.app)
|
|
480
|
+
self.po_translation = None
|
|
481
|
+
if og.executor is not None:
|
|
482
|
+
og.executor.locale = self.locale
|
|
483
|
+
og.executor.load_tr()
|
|
484
|
+
logger.info(f'language changed to {self.locale.name()}')
|
|
485
|
+
|
|
486
|
+
old_window = self.main_window
|
|
487
|
+
if old_window is None:
|
|
488
|
+
return
|
|
489
|
+
# Every page translates its text on construction, so build a fresh window.
|
|
490
|
+
visible = old_window.isVisible()
|
|
491
|
+
old_window.update_ok_config()
|
|
492
|
+
old_window.dispose()
|
|
493
|
+
self._create_main_window()
|
|
494
|
+
# Startup work in the first showEvent has already run for this process.
|
|
495
|
+
self.main_window.shown = True
|
|
496
|
+
self.main_window.switch_to(self.main_window.setting_tab)
|
|
497
|
+
if visible:
|
|
498
|
+
self.main_window.show()
|
|
499
|
+
self.main_window.bring_to_front()
|
|
500
|
+
old_window.hide()
|
|
501
|
+
old_window.deleteLater()
|
|
502
|
+
|
|
503
|
+
def _create_main_window(self):
|
|
464
504
|
from ok.ui.qt.MainWindow import MainWindow
|
|
465
505
|
|
|
466
506
|
self.main_window = MainWindow(self, self.config, self.ok_config, self.icon, self.title, self.version,
|
|
@@ -482,11 +522,6 @@ class App(_OverlayConfigMixin):
|
|
|
482
522
|
if hasattr(og.my_app, 'on_show_main_window'):
|
|
483
523
|
og.my_app.on_show_main_window(self.main_window)
|
|
484
524
|
|
|
485
|
-
self.main_window.show()
|
|
486
|
-
self.main_window.bring_to_front()
|
|
487
|
-
|
|
488
|
-
logger.debug(f'show_main_window end')
|
|
489
|
-
|
|
490
525
|
def exec(self):
|
|
491
526
|
logger.info('app.exec()')
|
|
492
527
|
import signal
|
|
@@ -45,6 +45,10 @@ class EventSignal:
|
|
|
45
45
|
elif callback in self._subscribers:
|
|
46
46
|
self._subscribers.remove(callback)
|
|
47
47
|
|
|
48
|
+
def disconnect_where(self, predicate: Callable[[Callable[..., Any]], bool]) -> None:
|
|
49
|
+
with self._lock:
|
|
50
|
+
self._subscribers = [callback for callback in self._subscribers if not predicate(callback)]
|
|
51
|
+
|
|
48
52
|
def emit(self, *args: Any, **kwargs: Any) -> None:
|
|
49
53
|
with self._lock:
|
|
50
54
|
subscribers = tuple(self._subscribers)
|
|
@@ -94,6 +98,12 @@ class EventBus:
|
|
|
94
98
|
self.any.emit(EventMessage(name, args, kwargs))
|
|
95
99
|
return forward
|
|
96
100
|
|
|
101
|
+
def disconnect_where(self, predicate: Callable[[Callable[..., Any]], bool]) -> None:
|
|
102
|
+
"""Remove every subscriber of every event for which ``predicate`` is true."""
|
|
103
|
+
self.any.disconnect_where(predicate)
|
|
104
|
+
for name in self._event_names:
|
|
105
|
+
getattr(self, name).disconnect_where(predicate)
|
|
106
|
+
|
|
97
107
|
def emit_draw_box(self, key=None, boxes=None, color=None, frame=None, debug=True):
|
|
98
108
|
self.draw_box.emit(key, boxes, color, frame, debug)
|
|
99
109
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import threading
|
|
1
2
|
import time
|
|
2
3
|
|
|
3
4
|
from ok import Handler, og
|
|
@@ -27,6 +28,25 @@ class StartController:
|
|
|
27
28
|
self.start_method = windows_config.get('start_method', WINDOWS_START_METHOD_START)
|
|
28
29
|
self.starting = False
|
|
29
30
|
|
|
31
|
+
@property
|
|
32
|
+
def _cancel_requested(self):
|
|
33
|
+
event = self.__dict__.get('_cancel_event')
|
|
34
|
+
if event is None:
|
|
35
|
+
event = self.__dict__['_cancel_event'] = threading.Event()
|
|
36
|
+
return event
|
|
37
|
+
|
|
38
|
+
def cancel_start(self):
|
|
39
|
+
"""Stop waiting for the game to launch; the game process is left running."""
|
|
40
|
+
logger.info('cancel_start requested')
|
|
41
|
+
self._cancel_requested.set()
|
|
42
|
+
|
|
43
|
+
def _cancelled(self):
|
|
44
|
+
if self._cancel_requested.is_set():
|
|
45
|
+
logger.info('start cancelled while waiting for the game')
|
|
46
|
+
communicate.starting_emulator.emit(True, None, 0)
|
|
47
|
+
return True
|
|
48
|
+
return False
|
|
49
|
+
|
|
30
50
|
def tr(self, message):
|
|
31
51
|
app = getattr(og, "app", None)
|
|
32
52
|
return app.tr(message) if app is not None else message
|
|
@@ -50,6 +70,7 @@ class StartController:
|
|
|
50
70
|
|
|
51
71
|
def do_start(self, task=None, exit_after=False):
|
|
52
72
|
self.starting = True
|
|
73
|
+
self._cancel_requested.clear()
|
|
53
74
|
try:
|
|
54
75
|
return self._do_start(task, exit_after)
|
|
55
76
|
finally:
|
|
@@ -137,6 +158,8 @@ class StartController:
|
|
|
137
158
|
wait_until = time.time() + self.start_timeout
|
|
138
159
|
first_check = True
|
|
139
160
|
while not self.exit_event.is_set():
|
|
161
|
+
if self._cancelled():
|
|
162
|
+
return False
|
|
140
163
|
if refresh_first or not first_check:
|
|
141
164
|
og.device_manager.do_refresh(True)
|
|
142
165
|
first_check = False
|
|
@@ -159,6 +182,8 @@ class StartController:
|
|
|
159
182
|
min_width, min_height = self.STARTED_WINDOW_MIN_SIZE
|
|
160
183
|
|
|
161
184
|
while not self.exit_event.is_set():
|
|
185
|
+
if self._cancelled():
|
|
186
|
+
return False
|
|
162
187
|
hwnd_window = getattr(og.device_manager, 'hwnd_window', None)
|
|
163
188
|
if hwnd_window is not None:
|
|
164
189
|
hwnd_window.do_update_window_size()
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
# Fits a 1600x900 screen with a taskbar (about 1600x852 available). The minimum
|
|
5
|
+
# equals the default so the layout always looks the same.
|
|
4
6
|
DEFAULT_WINDOW_SIZE = {
|
|
5
|
-
"width":
|
|
6
|
-
"height":
|
|
7
|
-
"min_width":
|
|
8
|
-
"min_height":
|
|
7
|
+
"width": 1560,
|
|
8
|
+
"height": 820,
|
|
9
|
+
"min_width": 1560,
|
|
10
|
+
"min_height": 820,
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
GUI_TYPES = {"qt"}
|
|
@@ -2,6 +2,7 @@ import ctypes
|
|
|
2
2
|
import threading
|
|
3
3
|
import time
|
|
4
4
|
|
|
5
|
+
import cv2
|
|
5
6
|
import numpy as np
|
|
6
7
|
import win32gui
|
|
7
8
|
|
|
@@ -33,9 +34,11 @@ class WindowsGraphicsCaptureMethod(BaseWindowsCaptureMethod):
|
|
|
33
34
|
return DirectXPixelFormat.B8G8R8A8UIntNormalized
|
|
34
35
|
|
|
35
36
|
def read_mapped_frame(self, mapinfo):
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
mapped = np.ctypeslib.as_array(ctypes.cast(mapinfo.pData, PBYTE),
|
|
38
|
+
(self.last_size.Height, mapinfo.RowPitch // 4, 4))[:, :self.last_size.Width]
|
|
39
|
+
# One pass copies out of the mapped buffer and drops alpha, giving a
|
|
40
|
+
# contiguous BGR frame instead of a strided view of a BGRA copy.
|
|
41
|
+
return cv2.cvtColor(mapped, cv2.COLOR_BGRA2BGR)
|
|
39
42
|
|
|
40
43
|
def __init__(self, hwnd_window):
|
|
41
44
|
super().__init__(hwnd_window)
|
|
@@ -46,7 +46,7 @@ class WindowsGraphicsCaptureHDRMethod(WindowsGraphicsCaptureMethod):
|
|
|
46
46
|
def read_mapped_frame(self, mapinfo):
|
|
47
47
|
height, width = self.last_size.Height, self.last_size.Width
|
|
48
48
|
# RowPitch includes driver padding. The buffer is only valid until
|
|
49
|
-
# Unmap, so return an owned BGRA array
|
|
49
|
+
# Unmap, so return an owned BGRA array.
|
|
50
50
|
buffer = np.ctypeslib.as_array(ctypes.cast(mapinfo.pData, PBYTE),
|
|
51
51
|
(height * mapinfo.RowPitch,))
|
|
52
52
|
rgba_bits = np.ndarray((height, width, 4), dtype=np.uint16,
|
|
@@ -268,16 +268,12 @@ class Box:
|
|
|
268
268
|
:param condition: Optional condition function. 可选条件函数。
|
|
269
269
|
:return: Closest Box or None. 最近的框或 None。
|
|
270
270
|
"""
|
|
271
|
-
|
|
272
|
-
orig_y = self.y
|
|
273
|
-
orig_w = self.width
|
|
274
|
-
orig_h = self.height
|
|
275
|
-
|
|
276
|
-
boxes.sort(key=lambda box: self._distance_criteria(box, direction, orig_x, orig_y, orig_w, orig_h, condition))
|
|
271
|
+
best, best_distance = None, float('inf')
|
|
277
272
|
for box in boxes:
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
273
|
+
distance = self._distance_criteria(box, direction, self.x, self.y, self.width, self.height, condition)
|
|
274
|
+
if distance < best_distance:
|
|
275
|
+
best, best_distance = box, distance
|
|
276
|
+
return best
|
|
281
277
|
|
|
282
278
|
|
|
283
279
|
def box_intersect(box1, box2):
|
|
@@ -335,7 +331,7 @@ def find_box_by_name(boxes, names):
|
|
|
335
331
|
for box in boxes:
|
|
336
332
|
for i, name in enumerate(names):
|
|
337
333
|
if (isinstance(name, str) and name == box.name) or (
|
|
338
|
-
isinstance(name, re.Pattern) and re.search(name, box.name)):
|
|
334
|
+
isinstance(name, re.Pattern) and isinstance(box.name, str) and re.search(name, box.name)):
|
|
339
335
|
if i < priority:
|
|
340
336
|
priority = i
|
|
341
337
|
result = box
|
|
@@ -435,18 +431,7 @@ def find_boxes_by_name(boxes, names):
|
|
|
435
431
|
if isinstance(names, (str, re.Pattern)):
|
|
436
432
|
names = [names]
|
|
437
433
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
for name in names:
|
|
443
|
-
if matched:
|
|
444
|
-
break
|
|
445
|
-
if (isinstance(name, str) and name == box.name) or (isinstance(box.name, str) and
|
|
446
|
-
isinstance(name, re.Pattern) and re.search(name,
|
|
447
|
-
box.name)):
|
|
448
|
-
matched = True
|
|
449
|
-
if matched:
|
|
450
|
-
result.append(box)
|
|
451
|
-
|
|
452
|
-
return result
|
|
434
|
+
return [box for box in boxes if any(
|
|
435
|
+
(isinstance(name, str) and name == box.name) or
|
|
436
|
+
(isinstance(name, re.Pattern) and isinstance(box.name, str) and re.search(name, box.name))
|
|
437
|
+
for name in names)]
|