frontengine 1.0.49__tar.gz → 1.0.50__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.
- {frontengine-1.0.49 → frontengine-1.0.50}/PKG-INFO +1 -20
- {frontengine-1.0.49 → frontengine-1.0.50}/README.md +0 -19
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/main_ui.py +0 -8
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/user_setting/user_setting_file.py +0 -6
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/english.py +0 -24
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/traditional_chinese.py +0 -24
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/PKG-INFO +1 -20
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/SOURCES.txt +0 -12
- {frontengine-1.0.49 → frontengine-1.0.50}/pyproject.toml +1 -1
- frontengine-1.0.49/frontengine/show/gaming/crosshair_widget.py +0 -161
- frontengine-1.0.49/frontengine/show/teleprompter/teleprompter_widget.py +0 -171
- frontengine-1.0.49/frontengine/ui/page/stream/stream_setting_ui.py +0 -351
- frontengine-1.0.49/frontengine/utils/obs/obs_client.py +0 -148
- frontengine-1.0.49/frontengine/utils/obs/obs_protocol.py +0 -140
- frontengine-1.0.49/frontengine/utils/obs/websocket_frames.py +0 -147
- frontengine-1.0.49/frontengine/utils/soundboard/soundboard.py +0 -172
- frontengine-1.0.49/frontengine/utils/virtual_camera/__init__.py +0 -0
- frontengine-1.0.49/frontengine/utils/weather/__init__.py +0 -0
- frontengine-1.0.49/frontengine/utils/window_pin/__init__.py +0 -0
- frontengine-1.0.49/frontengine/utils/workshop/__init__.py +0 -0
- frontengine-1.0.49/frontengine/worker/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/LICENSE +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/__main__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/base_widget.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/camera/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/camera/camera_widget.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/canvas/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/canvas/whiteboard_widget.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/capture/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/capture/region_capture.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/focus_shield/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/gaming → frontengine-1.0.50/frontengine/show/gif}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/gif/paint_gif.py +0 -0
- {frontengine-1.0.49/frontengine/show/gif → frontengine-1.0.50/frontengine/show/image}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/image/paint_image.py +0 -0
- {frontengine-1.0.49/frontengine/show/image → frontengine-1.0.50/frontengine/show/load}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/load/load_someone_make_ui.py +0 -0
- {frontengine-1.0.49/frontengine/show/load → frontengine-1.0.50/frontengine/show/measure}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/measure/measure_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/measure → frontengine-1.0.50/frontengine/show/monitor}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/monitor/monitor_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/monitor → frontengine-1.0.50/frontengine/show/notes}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/notes/sticky_note_widget.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/overlay_factory.py +0 -0
- {frontengine-1.0.49/frontengine/show/notes → frontengine-1.0.50/frontengine/show/particle}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/particle/particle_ui.py +0 -0
- {frontengine-1.0.49/frontengine/show/particle → frontengine-1.0.50/frontengine/show/pet}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/pet/desktop_pet.py +0 -0
- {frontengine-1.0.49/frontengine/show/pet → frontengine-1.0.50/frontengine/show/presentation}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/presentation/annotation_overlay.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/presentation/cursor_effects.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/presentation/keystroke_display.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/presentation/magnifier.py +0 -0
- {frontengine-1.0.49/frontengine/show/presentation → frontengine-1.0.50/frontengine/show/scene}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/scene/extend_graphic_scene.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/scene/extend_graphic_view.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/scene/scene.py +0 -0
- {frontengine-1.0.49/frontengine/show/scene → frontengine-1.0.50/frontengine/show/screen_care}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/screen_care/color_vision_widget.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/screen_care/screen_filter.py +0 -0
- {frontengine-1.0.49/frontengine/show/screen_care → frontengine-1.0.50/frontengine/show/sound_player}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/sound_player/sound_effect.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/sound_player/sound_player.py +0 -0
- {frontengine-1.0.49/frontengine/show/sound_player → frontengine-1.0.50/frontengine/show/spectrum}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/spectrum/spectrum_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/spectrum → frontengine-1.0.50/frontengine/show/text}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/text/draw_text.py +0 -0
- {frontengine-1.0.49/frontengine/show/teleprompter → frontengine-1.0.50/frontengine/show/toast}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/toast/toast_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/text → frontengine-1.0.50/frontengine/show/video}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/video/video_player.py +0 -0
- {frontengine-1.0.49/frontengine/show/toast → frontengine-1.0.50/frontengine/show/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
- {frontengine-1.0.49/frontengine/show/video → frontengine-1.0.50/frontengine/show/web}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/web/webview.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/show/window_helpers.py +0 -0
- {frontengine-1.0.49/frontengine/show/wallpaper → frontengine-1.0.50/frontengine/system_tray}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/system_tray/extend_system_tray.py +0 -0
- {frontengine-1.0.49/frontengine/show/web → frontengine-1.0.50/frontengine/ui}/__init__.py +0 -0
- {frontengine-1.0.49/frontengine/system_tray → frontengine-1.0.50/frontengine/ui/color}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/color/global_color.py +0 -0
- {frontengine-1.0.49/frontengine/ui → frontengine-1.0.50/frontengine/ui/dialog}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/reminder_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/save_file_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/signage_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
- {frontengine-1.0.49/frontengine/ui/color → frontengine-1.0.50/frontengine/ui/menu}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/menu/help_menu.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/menu/how_to_menu.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/menu/language_menu.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/menu/preset_menu.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/menu/settings_menu.py +0 -0
- {frontengine-1.0.49/frontengine/ui/dialog → frontengine-1.0.50/frontengine/ui/page}/__init__.py +0 -0
- {frontengine-1.0.49/frontengine/ui/menu → frontengine-1.0.50/frontengine/ui/page/control_center}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page → frontengine-1.0.50/frontengine/ui/page/focus}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/control_center → frontengine-1.0.50/frontengine/ui/page/gif}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/focus → frontengine-1.0.50/frontengine/ui/page/image}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/image/image_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/gif → frontengine-1.0.50/frontengine/ui/page/particle}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/image → frontengine-1.0.50/frontengine/ui/page/pet}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/particle → frontengine-1.0.50/frontengine/ui/page/presentation}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/pet → frontengine-1.0.50/frontengine/ui/page/scene_setting}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/presentation → frontengine-1.0.50/frontengine/ui/page/scene_setting/scene_page}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/scene_setting → frontengine-1.0.50/frontengine/ui/page/screen_care}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/scene_setting/scene_page → frontengine-1.0.50/frontengine/ui/page/sound_player}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/screen_care → frontengine-1.0.50/frontengine/ui/page/text}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/text/text_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/sound_player → frontengine-1.0.50/frontengine/ui/page/tools}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/utils.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/stream → frontengine-1.0.50/frontengine/ui/page/video}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/video/video_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/text → frontengine-1.0.50/frontengine/ui/page/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/tools → frontengine-1.0.50/frontengine/ui/page/web}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/web/web_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/video → frontengine-1.0.50/frontengine/ui/page/widgets}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/wallpaper → frontengine-1.0.50/frontengine/user_setting}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/user_setting/preset_repository.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/user_setting/scene_setting.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/web → frontengine-1.0.50/frontengine/utils}/__init__.py +0 -0
- {frontengine-1.0.49/frontengine/ui/page/widgets → frontengine-1.0.50/frontengine/utils/app_profile}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/app_profile/app_profile_service.py +0 -0
- {frontengine-1.0.49/frontengine/user_setting → frontengine-1.0.50/frontengine/utils/audio_meter}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/screen_audio.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
- {frontengine-1.0.49/frontengine/utils → frontengine-1.0.50/frontengine/utils/autostart}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/autostart/autostart_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/app_profile → frontengine-1.0.50/frontengine/utils/break_reminder}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/break_reminder/break_reminder.py +0 -0
- {frontengine-1.0.49/frontengine/utils/audio_meter → frontengine-1.0.50/frontengine/utils/browser}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/browser/browser.py +0 -0
- {frontengine-1.0.49/frontengine/utils/autostart → frontengine-1.0.50/frontengine/utils/clipboard}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/clipboard/clipboard_history.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
- {frontengine-1.0.49/frontengine/utils/break_reminder → frontengine-1.0.50/frontengine/utils/color_vision}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/color_vision/color_vision.py +0 -0
- {frontengine-1.0.49/frontengine/utils/browser → frontengine-1.0.50/frontengine/utils/critical_exit}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/critical_exit/critical_exit.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/critical_exit/win32_vk.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/exception/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/exception/exception_tags.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/exception/exceptions.py +0 -0
- {frontengine-1.0.49/frontengine/utils/clipboard → frontengine-1.0.50/frontengine/utils/file}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/file/open/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/file/open/open_file.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/file/save/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/file/save/save_file.py +0 -0
- {frontengine-1.0.49/frontengine/utils/color_vision → frontengine-1.0.50/frontengine/utils/focus_shield}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/focus_shield/focus_shield.py +0 -0
- {frontengine-1.0.49/frontengine/utils/critical_exit → frontengine-1.0.50/frontengine/utils/focus_timer}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/focus_timer/focus_timer.py +0 -0
- {frontengine-1.0.49/frontengine/utils/file → frontengine-1.0.50/frontengine/utils/hotkey}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/hotkey/hotkey_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/focus_shield → frontengine-1.0.50/frontengine/utils/input_watch}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/input_watch/input_watch_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/focus_timer → frontengine-1.0.50/frontengine/utils/json}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/json/json_file.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/json/json_repository.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/json_format/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/json_format/json_process.py +0 -0
- {frontengine-1.0.49/frontengine/utils/hotkey → frontengine-1.0.50/frontengine/utils/logging}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/logging/loggin_instance.py +0 -0
- {frontengine-1.0.49/frontengine/utils/input_watch → frontengine-1.0.50/frontengine/utils/measure}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/measure/measure.py +0 -0
- {frontengine-1.0.49/frontengine/utils/json → frontengine-1.0.50/frontengine/utils/midi}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/midi/midi_input.py +0 -0
- {frontengine-1.0.49/frontengine/utils/logging → frontengine-1.0.50/frontengine/utils/multi_language}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/france.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/germany.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/italy.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/language_wrapper.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/russian.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
- {frontengine-1.0.49/frontengine/utils/measure → frontengine-1.0.50/frontengine/utils/now_playing}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/now_playing/now_playing.py +0 -0
- {frontengine-1.0.49/frontengine/utils/midi → frontengine-1.0.50/frontengine/utils/pet_chat}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/multi_language → frontengine-1.0.50/frontengine/utils/platform_info}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/platform_info/platform_info.py +0 -0
- {frontengine-1.0.49/frontengine/utils/now_playing → frontengine-1.0.50/frontengine/utils/playlist}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/playlist/playlist.py +0 -0
- {frontengine-1.0.49/frontengine/utils/obs → frontengine-1.0.50/frontengine/utils/plugins}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/plugins/plugin_loader.py +0 -0
- {frontengine-1.0.49/frontengine/utils/pet_chat → frontengine-1.0.50/frontengine/utils/power_mode}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/power_mode/power_mode.py +0 -0
- {frontengine-1.0.49/frontengine/utils/platform_info → frontengine-1.0.50/frontengine/utils/preset_schedule}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/playlist → frontengine-1.0.50/frontengine/utils/recording}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/recording/frame_recorder.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/recording/gif_writer.py +0 -0
- {frontengine-1.0.49/frontengine/utils/plugins → frontengine-1.0.50/frontengine/utils/redirect_manager}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
- {frontengine-1.0.49/frontengine/utils/power_mode → frontengine-1.0.50/frontengine/utils/reminder}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/reminder/reminder_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/preset_schedule → frontengine-1.0.50/frontengine/utils/remote}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/remote/remote_server.py +0 -0
- {frontengine-1.0.49/frontengine/utils/recording → frontengine-1.0.50/frontengine/utils/screen_privacy}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/screen_privacy/share_watch.py +0 -0
- {frontengine-1.0.49/frontengine/utils/redirect_manager → frontengine-1.0.50/frontengine/utils/screen_text}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/screen_text/screen_text_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/reminder → frontengine-1.0.50/frontengine/utils/signage}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/signage/signage_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/remote → frontengine-1.0.50/frontengine/utils/smart_pause}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/smart_pause/pause_rules.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/screen_privacy → frontengine-1.0.50/frontengine/utils/system_stats}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/system_stats/system_stats.py +0 -0
- {frontengine-1.0.49/frontengine/utils/screen_text → frontengine-1.0.50/frontengine/utils/text_source}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/text_source/text_source.py +0 -0
- {frontengine-1.0.49/frontengine/utils/signage → frontengine-1.0.50/frontengine/utils/theme_schedule}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
- {frontengine-1.0.49/frontengine/utils/smart_pause → frontengine-1.0.50/frontengine/utils/usage_tracking}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/usage_tracking/usage_service.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
- {frontengine-1.0.49/frontengine/utils/soundboard → frontengine-1.0.50/frontengine/utils/virtual_camera}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
- {frontengine-1.0.49/frontengine/utils/system_stats → frontengine-1.0.50/frontengine/utils/weather}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/weather/weather_service.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/web_url.py +0 -0
- {frontengine-1.0.49/frontengine/utils/text_source → frontengine-1.0.50/frontengine/utils/window_pin}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/window_pin/window_layout.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/window_pin/window_pin.py +0 -0
- {frontengine-1.0.49/frontengine/utils/theme_schedule → frontengine-1.0.50/frontengine/utils/workshop}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/workshop/workshop_content.py +0 -0
- {frontengine-1.0.49/frontengine/utils/usage_tracking → frontengine-1.0.50/frontengine/worker}/__init__.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine/worker/qthread_worker.py +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/dependency_links.txt +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/entry_points.txt +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/requires.txt +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/frontengine.egg-info/top_level.txt +0 -0
- {frontengine-1.0.49 → frontengine-1.0.50}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frontengine
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.50
|
|
4
4
|
Summary: FrontEngine is use-define frontview or only use like screen saver
|
|
5
5
|
Author-email: JE-Chen <jechenmailman@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
@@ -185,25 +185,6 @@ that caps every overlay's refresh rate and drops its render resolution.
|
|
|
185
185
|
|
|
186
186
|
---
|
|
187
187
|
|
|
188
|
-
## Stream and gaming
|
|
189
|
-
|
|
190
|
-
Four things on the **Stream** tab, for playing and for going live:
|
|
191
|
-
|
|
192
|
-
- **Crosshair** — a cross, dot, circle or T shape in the middle of the screen,
|
|
193
|
-
in your colour and size. It is **only drawn on top**: nothing is injected,
|
|
194
|
-
no memory is read, no game file is touched. An exclusive-fullscreen game will
|
|
195
|
-
cover it, which is how the OS stacks windows.
|
|
196
|
-
- **Teleprompter** — scroll a script at an adjustable speed and size, with a
|
|
197
|
-
mirror option for prompter glass. It stops at the last line rather than
|
|
198
|
-
snapping back mid-read.
|
|
199
|
-
- **Soundboard** — up to twelve slots, each with a sound and an optional
|
|
200
|
-
hotkey. A file that has gone missing is dropped rather than kept as a dead
|
|
201
|
-
button.
|
|
202
|
-
- **OBS** — switch scenes and toggle recording or streaming through OBS's own
|
|
203
|
-
WebSocket (built in since OBS 28). The password stays in your local settings.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
188
|
## Signage, whiteboard and lip-sync
|
|
208
189
|
|
|
209
190
|
- **Signage mode** (Settings) — rotate through a list of presets on a timer and
|
|
@@ -161,25 +161,6 @@ that caps every overlay's refresh rate and drops its render resolution.
|
|
|
161
161
|
|
|
162
162
|
---
|
|
163
163
|
|
|
164
|
-
## Stream and gaming
|
|
165
|
-
|
|
166
|
-
Four things on the **Stream** tab, for playing and for going live:
|
|
167
|
-
|
|
168
|
-
- **Crosshair** — a cross, dot, circle or T shape in the middle of the screen,
|
|
169
|
-
in your colour and size. It is **only drawn on top**: nothing is injected,
|
|
170
|
-
no memory is read, no game file is touched. An exclusive-fullscreen game will
|
|
171
|
-
cover it, which is how the OS stacks windows.
|
|
172
|
-
- **Teleprompter** — scroll a script at an adjustable speed and size, with a
|
|
173
|
-
mirror option for prompter glass. It stops at the last line rather than
|
|
174
|
-
snapping back mid-read.
|
|
175
|
-
- **Soundboard** — up to twelve slots, each with a sound and an optional
|
|
176
|
-
hotkey. A file that has gone missing is dropped rather than kept as a dead
|
|
177
|
-
button.
|
|
178
|
-
- **OBS** — switch scenes and toggle recording or streaming through OBS's own
|
|
179
|
-
WebSocket (built in since OBS 28). The password stays in your local settings.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
164
|
## Signage, whiteboard and lip-sync
|
|
184
165
|
|
|
185
166
|
- **Signage mode** (Settings) — rotate through a list of presets on a timer and
|
|
@@ -29,7 +29,6 @@ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
|
|
|
29
29
|
from frontengine.ui.page.presentation.presentation_setting_ui import PresentationSettingUI
|
|
30
30
|
from frontengine.ui.page.screen_care.screen_care_setting_ui import ScreenCareSettingUI
|
|
31
31
|
from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
|
|
32
|
-
from frontengine.ui.page.stream.stream_setting_ui import StreamSettingUI
|
|
33
32
|
from frontengine.ui.page.text.text_setting_ui import TextSettingUI
|
|
34
33
|
from frontengine.ui.page.tools.tools_setting_ui import ToolsSettingUI
|
|
35
34
|
from frontengine.ui.page.video.video_setting_ui import VideoSettingUI
|
|
@@ -150,7 +149,6 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
150
149
|
self.focus_setting_ui = FocusSettingUI()
|
|
151
150
|
self.widgets_setting_ui = WidgetsSettingUI()
|
|
152
151
|
self.tools_setting_ui = ToolsSettingUI()
|
|
153
|
-
self.stream_setting_ui = StreamSettingUI()
|
|
154
152
|
|
|
155
153
|
# 控制中心
|
|
156
154
|
# Control Center
|
|
@@ -362,9 +360,6 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
362
360
|
for attribute in ("measure_widget_list", "capture_widget_list", "camera_widget_list"):
|
|
363
361
|
self.control_center_ui.register_overlay_source(
|
|
364
362
|
lambda attribute=attribute: getattr(self.tools_setting_ui, attribute, []))
|
|
365
|
-
for attribute in ("crosshair_widget_list", "teleprompter_widget_list"):
|
|
366
|
-
self.control_center_ui.register_overlay_source(
|
|
367
|
-
lambda attribute=attribute: getattr(self.stream_setting_ui, attribute, []))
|
|
368
363
|
|
|
369
364
|
def _add_tabs(self) -> None:
|
|
370
365
|
"""加入所有內建與擴充的 Tab / Add all built-in and extended tabs"""
|
|
@@ -384,7 +379,6 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
384
379
|
(self.focus_setting_ui, "tab_focus_text"),
|
|
385
380
|
(self.widgets_setting_ui, "tab_widgets_text"),
|
|
386
381
|
(self.tools_setting_ui, "tab_tools_text"),
|
|
387
|
-
(self.stream_setting_ui, "tab_stream_text"),
|
|
388
382
|
(self.control_center_ui, "tab_control_center_text"),
|
|
389
383
|
]
|
|
390
384
|
|
|
@@ -681,8 +675,6 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
681
675
|
self.tools_setting_ui.release_pinned_windows()
|
|
682
676
|
self.tools_setting_ui.stop_camera()
|
|
683
677
|
self.tools_setting_ui.stop_virtual_camera()
|
|
684
|
-
if getattr(self, "stream_setting_ui", None) is not None:
|
|
685
|
-
self.stream_setting_ui.soundboard.stop_all()
|
|
686
678
|
|
|
687
679
|
def _clear_overlays(self) -> None:
|
|
688
680
|
"""清空各分頁記著的覆蓋層清單。"""
|
|
@@ -81,12 +81,6 @@ user_setting_dict: Dict[str, Any] = {
|
|
|
81
81
|
# 是否同意把擷取畫面送到 Anthropic 讀取文字(預設不同意)
|
|
82
82
|
# Consent to send captures to Anthropic for reading text (off by default).
|
|
83
83
|
"screen_text_consent": False,
|
|
84
|
-
# 音效板:[{label, path, hotkey, volume}]
|
|
85
|
-
# Soundboard slots: [{label, path, hotkey, volume}]
|
|
86
|
-
"soundboard": [],
|
|
87
|
-
# OBS WebSocket 連線設定(密碼只留在本機設定檔)
|
|
88
|
-
# OBS WebSocket connection; the password stays in the local settings file.
|
|
89
|
-
"obs": {"host": "127.0.0.1", "port": 4455, "password": "", "scene": ""},
|
|
90
84
|
# 覆蓋層畫質檔位:high / balanced / saver
|
|
91
85
|
# Overlay quality tier: high / balanced / saver.
|
|
92
86
|
"quality_tier": "high",
|
|
@@ -518,30 +518,6 @@ english_word_dict = {
|
|
|
518
518
|
"screen_text_consent_body": "Reading text needs the captured area sent to Anthropic's API. It leaves this machine, and anything visible in the selection goes with it. Your own ANTHROPIC_API_KEY is used. Send captures?",
|
|
519
519
|
"screen_text_no_key": 'Set {env} in your environment to use this.',
|
|
520
520
|
"screen_text_ready": 'Captures are sent to Anthropic only while the box above is ticked.',
|
|
521
|
-
"tab_stream_text": 'Stream',
|
|
522
|
-
"stream_crosshair_label": 'Crosshair',
|
|
523
|
-
"stream_crosshair_cross": 'Cross',
|
|
524
|
-
"stream_crosshair_dot": 'Dot',
|
|
525
|
-
"stream_crosshair_circle": 'Circle',
|
|
526
|
-
"stream_crosshair_t": 'T shape',
|
|
527
|
-
"stream_crosshair_start": 'Show crosshair',
|
|
528
|
-
"stream_crosshair_stop": 'Hide crosshair',
|
|
529
|
-
"stream_teleprompter_label": 'Teleprompter',
|
|
530
|
-
"stream_teleprompter_script": 'Paste your script here',
|
|
531
|
-
"stream_teleprompter_mirror": 'Mirror',
|
|
532
|
-
"stream_teleprompter_start": 'Start prompter',
|
|
533
|
-
"stream_teleprompter_stop": 'Stop prompter',
|
|
534
|
-
"stream_sound_label": 'Soundboard',
|
|
535
|
-
"stream_sound_add": 'Add sound',
|
|
536
|
-
"stream_sound_remove": 'Remove',
|
|
537
|
-
"stream_sound_play": 'Play',
|
|
538
|
-
"stream_obs_label": 'OBS',
|
|
539
|
-
"stream_obs_password": 'WebSocket password', # NOSONAR - a field label, not a credential
|
|
540
|
-
"stream_obs_scene": 'Scene name',
|
|
541
|
-
"stream_obs_switch": 'Switch scene',
|
|
542
|
-
"stream_obs_record": 'Toggle recording',
|
|
543
|
-
"stream_obs_stream": 'Toggle streaming',
|
|
544
|
-
"stream_hint": 'The crosshair is only drawn on top - no game is modified. OBS control uses its own WebSocket; the password is kept in your local settings.',
|
|
545
521
|
"control_center_hide_from_capture": 'Hide from capture',
|
|
546
522
|
"control_center_show_in_capture": 'Show in capture',
|
|
547
523
|
"settings_menu_screen_privacy": 'Screen-sharing privacy...',
|
{frontengine-1.0.49 → frontengine-1.0.50}/frontengine/utils/multi_language/traditional_chinese.py
RENAMED
|
@@ -517,30 +517,6 @@ traditional_chinese_word_dict = {
|
|
|
517
517
|
"screen_text_consent_body": '讀取文字需要把框選到的畫面送到 Anthropic 的 API。這份畫面會離開這台電腦,框選範圍內看得到的東西都會一起送出,使用的是你自己的 ANTHROPIC_API_KEY。要送出嗎?',
|
|
518
518
|
"screen_text_no_key": '請先在環境變數設定 {env} 才能使用。',
|
|
519
519
|
"screen_text_ready": '只有在上面那個選項打勾時,擷取畫面才會送到 Anthropic。',
|
|
520
|
-
"tab_stream_text": '直播',
|
|
521
|
-
"stream_crosshair_label": '準星',
|
|
522
|
-
"stream_crosshair_cross": '十字',
|
|
523
|
-
"stream_crosshair_dot": '點',
|
|
524
|
-
"stream_crosshair_circle": '圓環',
|
|
525
|
-
"stream_crosshair_t": 'T 字',
|
|
526
|
-
"stream_crosshair_start": '顯示準星',
|
|
527
|
-
"stream_crosshair_stop": '關閉準星',
|
|
528
|
-
"stream_teleprompter_label": '提詞機',
|
|
529
|
-
"stream_teleprompter_script": '把講稿貼在這裡',
|
|
530
|
-
"stream_teleprompter_mirror": '左右鏡像',
|
|
531
|
-
"stream_teleprompter_start": '開始提詞',
|
|
532
|
-
"stream_teleprompter_stop": '停止提詞',
|
|
533
|
-
"stream_sound_label": '音效板',
|
|
534
|
-
"stream_sound_add": '新增音效',
|
|
535
|
-
"stream_sound_remove": '移除',
|
|
536
|
-
"stream_sound_play": '播放',
|
|
537
|
-
"stream_obs_label": 'OBS',
|
|
538
|
-
"stream_obs_password": 'WebSocket 密碼', # NOSONAR - a field label, not a credential
|
|
539
|
-
"stream_obs_scene": '場景名稱',
|
|
540
|
-
"stream_obs_switch": '切換場景',
|
|
541
|
-
"stream_obs_record": '切換錄影',
|
|
542
|
-
"stream_obs_stream": '切換直播',
|
|
543
|
-
"stream_hint": '準星只是疊在畫面上的一層,不會更動任何遊戲。OBS 控制走它自己的 WebSocket,密碼只留在本機設定檔裡。',
|
|
544
520
|
"control_center_hide_from_capture": '分享時隱藏',
|
|
545
521
|
"control_center_show_in_capture": '分享時顯示',
|
|
546
522
|
"settings_menu_screen_privacy": '螢幕分享隱私…',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frontengine
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.50
|
|
4
4
|
Summary: FrontEngine is use-define frontview or only use like screen saver
|
|
5
5
|
Author-email: JE-Chen <jechenmailman@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
@@ -185,25 +185,6 @@ that caps every overlay's refresh rate and drops its render resolution.
|
|
|
185
185
|
|
|
186
186
|
---
|
|
187
187
|
|
|
188
|
-
## Stream and gaming
|
|
189
|
-
|
|
190
|
-
Four things on the **Stream** tab, for playing and for going live:
|
|
191
|
-
|
|
192
|
-
- **Crosshair** — a cross, dot, circle or T shape in the middle of the screen,
|
|
193
|
-
in your colour and size. It is **only drawn on top**: nothing is injected,
|
|
194
|
-
no memory is read, no game file is touched. An exclusive-fullscreen game will
|
|
195
|
-
cover it, which is how the OS stacks windows.
|
|
196
|
-
- **Teleprompter** — scroll a script at an adjustable speed and size, with a
|
|
197
|
-
mirror option for prompter glass. It stops at the last line rather than
|
|
198
|
-
snapping back mid-read.
|
|
199
|
-
- **Soundboard** — up to twelve slots, each with a sound and an optional
|
|
200
|
-
hotkey. A file that has gone missing is dropped rather than kept as a dead
|
|
201
|
-
button.
|
|
202
|
-
- **OBS** — switch scenes and toggle recording or streaming through OBS's own
|
|
203
|
-
WebSocket (built in since OBS 28). The password stays in your local settings.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
188
|
## Signage, whiteboard and lip-sync
|
|
208
189
|
|
|
209
190
|
- **Signage mode** (Settings) — rotate through a list of presets on a timer and
|
|
@@ -21,8 +21,6 @@ frontengine/show/capture/__init__.py
|
|
|
21
21
|
frontengine/show/capture/region_capture.py
|
|
22
22
|
frontengine/show/focus_shield/__init__.py
|
|
23
23
|
frontengine/show/focus_shield/focus_shield_widget.py
|
|
24
|
-
frontengine/show/gaming/__init__.py
|
|
25
|
-
frontengine/show/gaming/crosshair_widget.py
|
|
26
24
|
frontengine/show/gif/__init__.py
|
|
27
25
|
frontengine/show/gif/paint_gif.py
|
|
28
26
|
frontengine/show/image/__init__.py
|
|
@@ -56,8 +54,6 @@ frontengine/show/sound_player/sound_effect.py
|
|
|
56
54
|
frontengine/show/sound_player/sound_player.py
|
|
57
55
|
frontengine/show/spectrum/__init__.py
|
|
58
56
|
frontengine/show/spectrum/spectrum_widget.py
|
|
59
|
-
frontengine/show/teleprompter/__init__.py
|
|
60
|
-
frontengine/show/teleprompter/teleprompter_widget.py
|
|
61
57
|
frontengine/show/text/__init__.py
|
|
62
58
|
frontengine/show/text/draw_text.py
|
|
63
59
|
frontengine/show/toast/__init__.py
|
|
@@ -126,8 +122,6 @@ frontengine/ui/page/screen_care/__init__.py
|
|
|
126
122
|
frontengine/ui/page/screen_care/screen_care_setting_ui.py
|
|
127
123
|
frontengine/ui/page/sound_player/__init__.py
|
|
128
124
|
frontengine/ui/page/sound_player/sound_player_setting_ui.py
|
|
129
|
-
frontengine/ui/page/stream/__init__.py
|
|
130
|
-
frontengine/ui/page/stream/stream_setting_ui.py
|
|
131
125
|
frontengine/ui/page/text/__init__.py
|
|
132
126
|
frontengine/ui/page/text/text_setting_ui.py
|
|
133
127
|
frontengine/ui/page/tools/__init__.py
|
|
@@ -208,10 +202,6 @@ frontengine/utils/multi_language/simplified_chinese.py
|
|
|
208
202
|
frontengine/utils/multi_language/traditional_chinese.py
|
|
209
203
|
frontengine/utils/now_playing/__init__.py
|
|
210
204
|
frontengine/utils/now_playing/now_playing.py
|
|
211
|
-
frontengine/utils/obs/__init__.py
|
|
212
|
-
frontengine/utils/obs/obs_client.py
|
|
213
|
-
frontengine/utils/obs/obs_protocol.py
|
|
214
|
-
frontengine/utils/obs/websocket_frames.py
|
|
215
205
|
frontengine/utils/pet_chat/__init__.py
|
|
216
206
|
frontengine/utils/pet_chat/pet_chat_service.py
|
|
217
207
|
frontengine/utils/platform_info/__init__.py
|
|
@@ -243,8 +233,6 @@ frontengine/utils/signage/signage_service.py
|
|
|
243
233
|
frontengine/utils/smart_pause/__init__.py
|
|
244
234
|
frontengine/utils/smart_pause/pause_rules.py
|
|
245
235
|
frontengine/utils/smart_pause/smart_pause_service.py
|
|
246
|
-
frontengine/utils/soundboard/__init__.py
|
|
247
|
-
frontengine/utils/soundboard/soundboard.py
|
|
248
236
|
frontengine/utils/system_stats/__init__.py
|
|
249
237
|
frontengine/utils/system_stats/system_stats.py
|
|
250
238
|
frontengine/utils/text_source/__init__.py
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
準星覆蓋層:在畫面正中央畫一個自訂準星,點擊穿透,不動到任何遊戲檔案。
|
|
3
|
-
|
|
4
|
-
這是純粹的疊圖——不注入遊戲、不讀取記憶體、不改動遊戲的任何東西。全螢幕
|
|
5
|
-
獨佔模式的遊戲會蓋在它上面,那是作業系統的堆疊規則,不是這裡能繞過的。
|
|
6
|
-
|
|
7
|
-
A crosshair overlay: draw a custom crosshair in the middle of the screen,
|
|
8
|
-
click-through, touching no game files.
|
|
9
|
-
|
|
10
|
-
It is only a layer on top - nothing is injected, no memory is read, no game is
|
|
11
|
-
modified. An exclusive-fullscreen game will cover it, which is how the OS
|
|
12
|
-
stacks windows and not something to work around.
|
|
13
|
-
"""
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
from typing import Any, Optional, Tuple
|
|
17
|
-
|
|
18
|
-
from PySide6.QtCore import QPointF, Qt
|
|
19
|
-
from PySide6.QtGui import QColor, QPainter, QPen, QScreen
|
|
20
|
-
|
|
21
|
-
from frontengine.show.base_widget import BaseWidget
|
|
22
|
-
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
23
|
-
|
|
24
|
-
STYLE_CROSS = "cross"
|
|
25
|
-
STYLE_DOT = "dot"
|
|
26
|
-
STYLE_CIRCLE = "circle"
|
|
27
|
-
STYLE_T_SHAPE = "t"
|
|
28
|
-
STYLES = (STYLE_CROSS, STYLE_DOT, STYLE_CIRCLE, STYLE_T_SHAPE)
|
|
29
|
-
|
|
30
|
-
DEFAULT_COLOR = "#00ff88"
|
|
31
|
-
DEFAULT_SIZE = 24
|
|
32
|
-
DEFAULT_THICKNESS = 2
|
|
33
|
-
DEFAULT_GAP = 6
|
|
34
|
-
MIN_SIZE = 4
|
|
35
|
-
MAX_SIZE = 200
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def normalize_style(style: Any) -> str:
|
|
39
|
-
"""把準星樣式正規化;不認得的一律當十字。"""
|
|
40
|
-
name = str(style or "").strip().lower()
|
|
41
|
-
return name if name in STYLES else STYLE_CROSS
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def clamp_size(value: Any, fallback: int = DEFAULT_SIZE) -> int:
|
|
45
|
-
"""準星尺寸夾在看得見又不誇張的範圍。"""
|
|
46
|
-
try:
|
|
47
|
-
return max(MIN_SIZE, min(MAX_SIZE, int(value)))
|
|
48
|
-
except (TypeError, ValueError):
|
|
49
|
-
return fallback
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def clamp_thickness(value: Any, fallback: int = DEFAULT_THICKNESS) -> int:
|
|
53
|
-
"""線寬夾在 1~12。"""
|
|
54
|
-
try:
|
|
55
|
-
return max(1, min(12, int(value)))
|
|
56
|
-
except (TypeError, ValueError):
|
|
57
|
-
return fallback
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def clamp_gap(value: Any, size: int = DEFAULT_SIZE, fallback: int = DEFAULT_GAP) -> int:
|
|
61
|
-
"""
|
|
62
|
-
中央空隙不能大到把準星吃光,所以上限跟著尺寸走。
|
|
63
|
-
The centre gap cannot swallow the crosshair, so its ceiling follows the size.
|
|
64
|
-
"""
|
|
65
|
-
try:
|
|
66
|
-
gap = int(value)
|
|
67
|
-
except (TypeError, ValueError):
|
|
68
|
-
gap = fallback
|
|
69
|
-
return max(0, min(clamp_size(size) - 1, gap))
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def arm_segments(size: int, gap: int) -> Tuple[Tuple[float, float], ...]:
|
|
73
|
-
"""
|
|
74
|
-
十字手臂的 (起點, 終點) 距離中心多遠。因為 clamp_gap 保證空隙一定小於
|
|
75
|
-
尺寸,所以手臂至少會有一個像素長——準星不會被空隙吃到看不見。
|
|
76
|
-
How far each arm starts and ends from the centre. clamp_gap keeps the gap
|
|
77
|
-
strictly inside the size, so an arm is always at least a pixel long: the
|
|
78
|
-
crosshair can never be swallowed by its own gap.
|
|
79
|
-
"""
|
|
80
|
-
length = clamp_size(size)
|
|
81
|
-
return ((clamp_gap(gap, length), length),)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class CrosshairWidget(BaseWidget):
|
|
85
|
-
"""
|
|
86
|
-
畫面中央的準星。位置固定在目標螢幕正中,不接受滑鼠(點擊會穿到遊戲)。
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
def __init__(self, style: str = STYLE_CROSS, color: str = DEFAULT_COLOR,
|
|
90
|
-
size: int = DEFAULT_SIZE, thickness: int = DEFAULT_THICKNESS,
|
|
91
|
-
gap: int = DEFAULT_GAP) -> None:
|
|
92
|
-
front_engine_logger.info(f"[CrosshairWidget] Init | style={style}")
|
|
93
|
-
super().__init__()
|
|
94
|
-
self.style = normalize_style(style)
|
|
95
|
-
candidate = QColor(color)
|
|
96
|
-
self.color = candidate if candidate.isValid() else QColor(DEFAULT_COLOR)
|
|
97
|
-
self.size = clamp_size(size)
|
|
98
|
-
self.thickness = clamp_thickness(thickness)
|
|
99
|
-
self.gap = clamp_gap(gap, self.size)
|
|
100
|
-
self.opacity = 1.0
|
|
101
|
-
self.resize(self.size * 2 + 8, self.size * 2 + 8)
|
|
102
|
-
|
|
103
|
-
def set_crosshair(self, style: Optional[str] = None, color: Optional[str] = None,
|
|
104
|
-
size: Optional[int] = None,
|
|
105
|
-
thickness=None, gap=None) -> None:
|
|
106
|
-
"""一次改好幾項設定,改完立刻重畫。"""
|
|
107
|
-
if style is not None:
|
|
108
|
-
self.style = normalize_style(style)
|
|
109
|
-
if color is not None:
|
|
110
|
-
candidate = QColor(color)
|
|
111
|
-
if candidate.isValid():
|
|
112
|
-
self.color = candidate
|
|
113
|
-
if size is not None:
|
|
114
|
-
self.size = clamp_size(size)
|
|
115
|
-
if thickness is not None:
|
|
116
|
-
self.thickness = clamp_thickness(thickness)
|
|
117
|
-
if gap is not None or size is not None:
|
|
118
|
-
self.gap = clamp_gap(self.gap if gap is None else gap, self.size)
|
|
119
|
-
self.resize(self.size * 2 + 8, self.size * 2 + 8)
|
|
120
|
-
self.centre_on_screen()
|
|
121
|
-
self.update()
|
|
122
|
-
|
|
123
|
-
def centre_on_screen(self, screen: Optional[QScreen] = None) -> None:
|
|
124
|
-
"""擺到螢幕正中央(準星要對準的是畫面中心)。"""
|
|
125
|
-
from PySide6.QtGui import QGuiApplication
|
|
126
|
-
|
|
127
|
-
target = screen or self.screen() or QGuiApplication.primaryScreen()
|
|
128
|
-
if target is None: # pragma: no cover - no screen at all
|
|
129
|
-
return
|
|
130
|
-
geometry = target.geometry()
|
|
131
|
-
self.move(geometry.x() + (geometry.width() - self.width()) // 2,
|
|
132
|
-
geometry.y() + (geometry.height() - self.height()) // 2)
|
|
133
|
-
|
|
134
|
-
def draw_content(self, painter: QPainter) -> None:
|
|
135
|
-
painter.setRenderHint(QPainter.RenderHint.Antialiasing, True)
|
|
136
|
-
pen = QPen(self.color, self.thickness)
|
|
137
|
-
pen.setCapStyle(Qt.PenCapStyle.FlatCap)
|
|
138
|
-
painter.setPen(pen)
|
|
139
|
-
centre = QPointF(self.width() / 2.0, self.height() / 2.0)
|
|
140
|
-
if self.style == STYLE_DOT:
|
|
141
|
-
painter.setBrush(self.color)
|
|
142
|
-
painter.drawEllipse(centre, self.thickness, self.thickness)
|
|
143
|
-
return
|
|
144
|
-
if self.style == STYLE_CIRCLE:
|
|
145
|
-
painter.setBrush(Qt.BrushStyle.NoBrush)
|
|
146
|
-
painter.drawEllipse(centre, float(self.size), float(self.size))
|
|
147
|
-
return
|
|
148
|
-
self._draw_arms(painter, centre)
|
|
149
|
-
|
|
150
|
-
def _draw_arms(self, painter: QPainter, centre: QPointF) -> None:
|
|
151
|
-
"""十字與 T 字共用的手臂繪製(T 字少了上面那一隻)。"""
|
|
152
|
-
for inner, outer in arm_segments(self.size, self.gap):
|
|
153
|
-
painter.drawLine(QPointF(centre.x() - outer, centre.y()),
|
|
154
|
-
QPointF(centre.x() - inner, centre.y()))
|
|
155
|
-
painter.drawLine(QPointF(centre.x() + inner, centre.y()),
|
|
156
|
-
QPointF(centre.x() + outer, centre.y()))
|
|
157
|
-
painter.drawLine(QPointF(centre.x(), centre.y() + inner),
|
|
158
|
-
QPointF(centre.x(), centre.y() + outer))
|
|
159
|
-
if self.style != STYLE_T_SHAPE:
|
|
160
|
-
painter.drawLine(QPointF(centre.x(), centre.y() - outer),
|
|
161
|
-
QPointF(centre.x(), centre.y() - inner))
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
提詞機:把講稿以可調速度往上捲,字夠大、可以左右鏡像(配提詞玻璃用)。
|
|
3
|
-
|
|
4
|
-
捲動用「每次前進幾個像素」而不是「每次一行」,這樣速度才會平順;到底之後
|
|
5
|
-
會停在最後一行,不會自己跳回開頭把人嚇一跳。
|
|
6
|
-
|
|
7
|
-
A teleprompter: scroll a script upward at an adjustable speed, in large type,
|
|
8
|
-
optionally mirrored for prompter glass.
|
|
9
|
-
|
|
10
|
-
Scrolling advances by pixels rather than by lines so the motion stays smooth,
|
|
11
|
-
and it stops at the last line rather than snapping back to the top mid-read.
|
|
12
|
-
"""
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from typing import Any, List, Optional
|
|
16
|
-
|
|
17
|
-
from PySide6.QtCore import Qt, QTimer
|
|
18
|
-
from PySide6.QtGui import QColor, QFont, QFontMetrics, QPainter, QTransform
|
|
19
|
-
|
|
20
|
-
from frontengine.show.base_widget import BaseWidget
|
|
21
|
-
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
22
|
-
from frontengine.utils.power_mode.power_mode import tier_interval
|
|
23
|
-
|
|
24
|
-
DEFAULT_SPEED = 40 # 像素/秒 / pixels per second
|
|
25
|
-
MIN_SPEED = 5
|
|
26
|
-
MAX_SPEED = 400
|
|
27
|
-
DEFAULT_FONT_SIZE = 32
|
|
28
|
-
MIN_FONT_SIZE = 10
|
|
29
|
-
MAX_FONT_SIZE = 120
|
|
30
|
-
_TICK_MS = 33
|
|
31
|
-
_SIDE_MARGIN = 40
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def clamp_speed(value: Any, fallback: int = DEFAULT_SPEED) -> int:
|
|
35
|
-
"""捲動速度夾在讀得完又跟得上的範圍。"""
|
|
36
|
-
try:
|
|
37
|
-
return max(MIN_SPEED, min(MAX_SPEED, int(value)))
|
|
38
|
-
except (TypeError, ValueError):
|
|
39
|
-
return fallback
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def clamp_font_size(value: Any, fallback: int = DEFAULT_FONT_SIZE) -> int:
|
|
43
|
-
"""字級夾在看得見的範圍。"""
|
|
44
|
-
try:
|
|
45
|
-
return max(MIN_FONT_SIZE, min(MAX_FONT_SIZE, int(value)))
|
|
46
|
-
except (TypeError, ValueError):
|
|
47
|
-
return fallback
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def wrap_lines(text: str, metrics: QFontMetrics, width: int) -> List[str]:
|
|
51
|
-
"""
|
|
52
|
-
依實際字寬把講稿折行;空行會保留(那是段落之間的呼吸)。
|
|
53
|
-
Wrap the script to the actual text width, keeping blank lines - they are the
|
|
54
|
-
pauses between paragraphs.
|
|
55
|
-
"""
|
|
56
|
-
usable = max(40, int(width))
|
|
57
|
-
lines: List[str] = []
|
|
58
|
-
for paragraph in str(text or "").splitlines():
|
|
59
|
-
if not paragraph.strip():
|
|
60
|
-
lines.append("")
|
|
61
|
-
continue
|
|
62
|
-
current = ""
|
|
63
|
-
for word in paragraph.split():
|
|
64
|
-
candidate = f"{current} {word}".strip()
|
|
65
|
-
if current and metrics.horizontalAdvance(candidate) > usable:
|
|
66
|
-
lines.append(current)
|
|
67
|
-
current = word
|
|
68
|
-
else:
|
|
69
|
-
current = candidate
|
|
70
|
-
if current:
|
|
71
|
-
lines.append(current)
|
|
72
|
-
return lines
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class TeleprompterWidget(BaseWidget):
|
|
76
|
-
"""
|
|
77
|
-
提詞機覆蓋層。捲動位置以像素計,速度、字級與鏡像都可以邊跑邊調。
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
def __init__(self, text: str = "", speed: int = DEFAULT_SPEED,
|
|
81
|
-
font_size: int = DEFAULT_FONT_SIZE, mirrored: bool = False) -> None:
|
|
82
|
-
front_engine_logger.info("[TeleprompterWidget] Init")
|
|
83
|
-
super().__init__()
|
|
84
|
-
self.script = str(text)
|
|
85
|
-
self.speed = clamp_speed(speed)
|
|
86
|
-
self.mirrored = bool(mirrored)
|
|
87
|
-
self.text_color = QColor("#ffffff")
|
|
88
|
-
self.opacity = 0.9
|
|
89
|
-
self.offset = 0.0
|
|
90
|
-
self._font = QFont()
|
|
91
|
-
self._font.setPointSize(clamp_font_size(font_size))
|
|
92
|
-
self._timer = QTimer(self)
|
|
93
|
-
self._timer.timeout.connect(self.advance)
|
|
94
|
-
|
|
95
|
-
@property
|
|
96
|
-
def font_size(self) -> int:
|
|
97
|
-
return self._font.pointSize()
|
|
98
|
-
|
|
99
|
-
def set_script(self, text: str) -> None:
|
|
100
|
-
"""換一份講稿並回到開頭。"""
|
|
101
|
-
self.script = str(text)
|
|
102
|
-
self.offset = 0.0
|
|
103
|
-
self.update()
|
|
104
|
-
|
|
105
|
-
def set_speed(self, speed: int) -> None:
|
|
106
|
-
self.speed = clamp_speed(speed)
|
|
107
|
-
|
|
108
|
-
def set_font_size(self, size: int) -> None:
|
|
109
|
-
self._font.setPointSize(clamp_font_size(size))
|
|
110
|
-
self.update()
|
|
111
|
-
|
|
112
|
-
def set_mirrored(self, mirrored: bool) -> None:
|
|
113
|
-
"""左右鏡像:透過提詞玻璃反射後才是正的。"""
|
|
114
|
-
self.mirrored = bool(mirrored)
|
|
115
|
-
self.update()
|
|
116
|
-
|
|
117
|
-
def lines(self) -> List[str]:
|
|
118
|
-
"""目前折行後的講稿。"""
|
|
119
|
-
return wrap_lines(self.script, QFontMetrics(self._font),
|
|
120
|
-
max(40, self.width() - _SIDE_MARGIN * 2))
|
|
121
|
-
|
|
122
|
-
def content_height(self) -> int:
|
|
123
|
-
"""整份講稿捲完需要多高。"""
|
|
124
|
-
return len(self.lines()) * QFontMetrics(self._font).lineSpacing()
|
|
125
|
-
|
|
126
|
-
def max_offset(self) -> float:
|
|
127
|
-
"""捲到底的位置(不會捲過頭)。"""
|
|
128
|
-
return float(max(0, self.content_height() - self.height() // 2))
|
|
129
|
-
|
|
130
|
-
def start(self) -> None:
|
|
131
|
-
self._timer.start(tier_interval(_TICK_MS, self.quality_tier))
|
|
132
|
-
|
|
133
|
-
def stop(self) -> None:
|
|
134
|
-
self._timer.stop()
|
|
135
|
-
|
|
136
|
-
def apply_quality_tier(self) -> None:
|
|
137
|
-
if self._timer.isActive():
|
|
138
|
-
self._timer.start(tier_interval(_TICK_MS, self.quality_tier))
|
|
139
|
-
|
|
140
|
-
def rewind(self) -> None:
|
|
141
|
-
"""回到講稿開頭。"""
|
|
142
|
-
self.offset = 0.0
|
|
143
|
-
self.update()
|
|
144
|
-
|
|
145
|
-
def advance(self, seconds: Optional[float] = None) -> float:
|
|
146
|
-
"""
|
|
147
|
-
前進一小段(預設一個 tick 的量),回傳新的捲動位置。捲到底就停住。
|
|
148
|
-
Advance one tick's worth and return the new offset, stopping at the end.
|
|
149
|
-
"""
|
|
150
|
-
step = self.speed * (seconds if seconds is not None else _TICK_MS / 1000.0)
|
|
151
|
-
self.offset = min(self.max_offset(), self.offset + step)
|
|
152
|
-
self.update()
|
|
153
|
-
return self.offset
|
|
154
|
-
|
|
155
|
-
def draw_content(self, painter: QPainter) -> None:
|
|
156
|
-
painter.setFont(self._font)
|
|
157
|
-
painter.setPen(self.text_color)
|
|
158
|
-
if self.mirrored:
|
|
159
|
-
painter.setTransform(QTransform().translate(self.width(), 0).scale(-1, 1))
|
|
160
|
-
spacing = QFontMetrics(self._font).lineSpacing()
|
|
161
|
-
top = self.height() // 2 - int(self.offset)
|
|
162
|
-
for index, line in enumerate(self.lines()):
|
|
163
|
-
y = top + index * spacing
|
|
164
|
-
if y < -spacing or y > self.height():
|
|
165
|
-
continue
|
|
166
|
-
painter.drawText(_SIDE_MARGIN, y, self.width() - _SIDE_MARGIN * 2, spacing,
|
|
167
|
-
Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter, line)
|
|
168
|
-
|
|
169
|
-
def closeEvent(self, event) -> None:
|
|
170
|
-
self.stop()
|
|
171
|
-
super().closeEvent(event)
|