frontengine 1.0.71__tar.gz → 1.0.73__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.71 → frontengine-1.0.73}/PKG-INFO +1 -1
- frontengine-1.0.73/frontengine/show/draggable_window.py +65 -0
- frontengine-1.0.73/frontengine/show/pinned/pinned_image.py +103 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/replica/replica_widget.py +2 -26
- frontengine-1.0.73/frontengine/ui/dialog/preset_schedule_dialog.py +150 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/main_ui.py +3 -1
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/menu/settings_menu.py +9 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/tools/tools_setting_ui.py +36 -1
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/english.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/france.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/germany.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/italy.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/russian.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/simplified_chinese.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/traditional_chinese.py +15 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/preset_schedule/preset_schedule_service.py +48 -1
- frontengine-1.0.73/frontengine/utils/workshop/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/PKG-INFO +1 -1
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/SOURCES.txt +4 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/pyproject.toml +1 -1
- {frontengine-1.0.71 → frontengine-1.0.73}/LICENSE +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/README.md +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/__main__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/base_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/camera/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/camera/camera_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/canvas/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/canvas/whiteboard_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/capture/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/capture/region_capture.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/focus_shield/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/gif/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/gif/paint_gif.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/image/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/image/paint_image.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/load/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/load/load_someone_make_ui.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/measure/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/measure/measure_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/monitor/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/monitor/monitor_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/notes/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/notes/sticky_note_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/overlay_factory.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/particle/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/particle/particle_ui.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/pet/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/pet/desktop_pet.py +0 -0
- {frontengine-1.0.71/frontengine/show/presentation → frontengine-1.0.73/frontengine/show/pinned}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/show/replica → frontengine-1.0.73/frontengine/show/presentation}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/presentation/annotation_overlay.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/presentation/cursor_effects.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/presentation/keystroke_display.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/presentation/magnifier.py +0 -0
- {frontengine-1.0.71/frontengine/show/scene → frontengine-1.0.73/frontengine/show/replica}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/show/screen_care → frontengine-1.0.73/frontengine/show/scene}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/scene/extend_graphic_scene.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/scene/extend_graphic_view.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/scene/scene.py +0 -0
- {frontengine-1.0.71/frontengine/show/shortcuts → frontengine-1.0.73/frontengine/show/screen_care}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/screen_care/color_vision_widget.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/screen_care/screen_filter.py +0 -0
- {frontengine-1.0.71/frontengine/show/sound_player → frontengine-1.0.73/frontengine/show/shortcuts}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/shortcuts/shortcut_sheet.py +0 -0
- {frontengine-1.0.71/frontengine/show/spectrum → frontengine-1.0.73/frontengine/show/sound_player}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/sound_player/sound_effect.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/sound_player/sound_player.py +0 -0
- {frontengine-1.0.71/frontengine/show/text → frontengine-1.0.73/frontengine/show/spectrum}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/spectrum/spectrum_widget.py +0 -0
- {frontengine-1.0.71/frontengine/show/toast → frontengine-1.0.73/frontengine/show/text}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/text/draw_text.py +0 -0
- {frontengine-1.0.71/frontengine/show/video → frontengine-1.0.73/frontengine/show/toast}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/toast/toast_widget.py +0 -0
- {frontengine-1.0.71/frontengine/show/wallpaper → frontengine-1.0.73/frontengine/show/video}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/video/video_player.py +0 -0
- {frontengine-1.0.71/frontengine/show/web → frontengine-1.0.73/frontengine/show/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
- {frontengine-1.0.71/frontengine/system_tray → frontengine-1.0.73/frontengine/show/web}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/web/webview.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/show/window_helpers.py +0 -0
- {frontengine-1.0.71/frontengine/ui → frontengine-1.0.73/frontengine/system_tray}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/system_tray/extend_system_tray.py +0 -0
- {frontengine-1.0.71/frontengine/ui/color → frontengine-1.0.73/frontengine/ui}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/ui/dialog → frontengine-1.0.73/frontengine/ui/color}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/color/global_color.py +0 -0
- {frontengine-1.0.71/frontengine/ui/menu → frontengine-1.0.73/frontengine/ui/dialog}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/reminder_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/signage_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
- {frontengine-1.0.71/frontengine/ui/nav → frontengine-1.0.73/frontengine/ui/menu}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/menu/help_menu.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/menu/how_to_menu.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/menu/language_menu.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/menu/preset_menu.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page → frontengine-1.0.73/frontengine/ui/nav}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/nav/sidebar.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/control_center → frontengine-1.0.73/frontengine/ui/page}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/focus → frontengine-1.0.73/frontengine/ui/page/control_center}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/gif → frontengine-1.0.73/frontengine/ui/page/focus}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/image → frontengine-1.0.73/frontengine/ui/page/gif}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/particle → frontengine-1.0.73/frontengine/ui/page/image}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/image/image_setting_ui.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/layout_kit.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/pet → frontengine-1.0.73/frontengine/ui/page/particle}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/presentation → frontengine-1.0.73/frontengine/ui/page/pet}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/scene_setting → frontengine-1.0.73/frontengine/ui/page/presentation}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/scene_setting/scene_page → frontengine-1.0.73/frontengine/ui/page/scene_setting}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/screen_care → frontengine-1.0.73/frontengine/ui/page/scene_setting/scene_page}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/sound_player → frontengine-1.0.73/frontengine/ui/page/screen_care}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/text → frontengine-1.0.73/frontengine/ui/page/sound_player}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/tools → frontengine-1.0.73/frontengine/ui/page/text}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/text/text_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/video → frontengine-1.0.73/frontengine/ui/page/tools}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/utils.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/wallpaper → frontengine-1.0.73/frontengine/ui/page/video}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/video/video_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/web → frontengine-1.0.73/frontengine/ui/page/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/page/widgets → frontengine-1.0.73/frontengine/ui/page/web}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/web/web_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/ui/style → frontengine-1.0.73/frontengine/ui/page/widgets}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
- {frontengine-1.0.71/frontengine/user_setting → frontengine-1.0.73/frontengine/ui/style}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/ui/style/app_style.py +0 -0
- {frontengine-1.0.71/frontengine/utils → frontengine-1.0.73/frontengine/user_setting}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/user_setting/preset_repository.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/user_setting/scene_setting.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/user_setting/user_setting_file.py +0 -0
- {frontengine-1.0.71/frontengine/utils/app_profile → frontengine-1.0.73/frontengine/utils}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/utils/audio_meter → frontengine-1.0.73/frontengine/utils/app_profile}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/app_profile/app_profile_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/autostart → frontengine-1.0.73/frontengine/utils/audio_meter}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/screen_audio.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
- {frontengine-1.0.71/frontengine/utils/break_reminder → frontengine-1.0.73/frontengine/utils/autostart}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/autostart/autostart_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/browser → frontengine-1.0.73/frontengine/utils/break_reminder}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/break_reminder/break_reminder.py +0 -0
- {frontengine-1.0.71/frontengine/utils/clipboard → frontengine-1.0.73/frontengine/utils/browser}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/browser/browser.py +0 -0
- {frontengine-1.0.71/frontengine/utils/color_vision → frontengine-1.0.73/frontengine/utils/clipboard}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/clipboard/clipboard_history.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
- {frontengine-1.0.71/frontengine/utils/critical_exit → frontengine-1.0.73/frontengine/utils/color_vision}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/color_vision/color_vision.py +0 -0
- {frontengine-1.0.71/frontengine/utils/focus_shield → frontengine-1.0.73/frontengine/utils/critical_exit}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/critical_exit/critical_exit.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/critical_exit/win32_vk.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/exception/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/exception/exception_tags.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/exception/exceptions.py +0 -0
- {frontengine-1.0.71/frontengine/utils/focus_timer → frontengine-1.0.73/frontengine/utils/focus_shield}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/focus_shield/focus_shield.py +0 -0
- {frontengine-1.0.71/frontengine/utils/hotkey → frontengine-1.0.73/frontengine/utils/focus_timer}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/focus_timer/focus_timer.py +0 -0
- {frontengine-1.0.71/frontengine/utils/input_watch → frontengine-1.0.73/frontengine/utils/hotkey}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/hotkey/hotkey_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/json → frontengine-1.0.73/frontengine/utils/input_watch}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/input_watch/input_watch_service.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/input_watch/typing_watch.py +0 -0
- {frontengine-1.0.71/frontengine/utils/keep_awake → frontengine-1.0.73/frontengine/utils/json}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/json/json_file.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/json/json_repository.py +0 -0
- {frontengine-1.0.71/frontengine/utils/logging → frontengine-1.0.73/frontengine/utils/keep_awake}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/keep_awake/keep_awake.py +0 -0
- {frontengine-1.0.71/frontengine/utils/measure → frontengine-1.0.73/frontengine/utils/logging}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/logging/loggin_instance.py +0 -0
- {frontengine-1.0.71/frontengine/utils/midi → frontengine-1.0.73/frontengine/utils/measure}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/measure/measure.py +0 -0
- {frontengine-1.0.71/frontengine/utils/multi_language → frontengine-1.0.73/frontengine/utils/midi}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/midi/midi_input.py +0 -0
- {frontengine-1.0.71/frontengine/utils/now_playing → frontengine-1.0.73/frontengine/utils/multi_language}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/language_wrapper.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/multi_language/retranslate.py +0 -0
- {frontengine-1.0.71/frontengine/utils/pet_chat → frontengine-1.0.73/frontengine/utils/now_playing}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/now_playing/now_playing.py +0 -0
- {frontengine-1.0.71/frontengine/utils/platform_info → frontengine-1.0.73/frontengine/utils/pet_chat}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/playlist → frontengine-1.0.73/frontengine/utils/platform_info}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/platform_info/platform_info.py +0 -0
- {frontengine-1.0.71/frontengine/utils/plugins → frontengine-1.0.73/frontengine/utils/playlist}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/playlist/playlist.py +0 -0
- {frontengine-1.0.71/frontengine/utils/power_mode → frontengine-1.0.73/frontengine/utils/plugins}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/plugins/plugin_loader.py +0 -0
- {frontengine-1.0.71/frontengine/utils/preset_schedule → frontengine-1.0.73/frontengine/utils/power_mode}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/power_mode/power_mode.py +0 -0
- {frontengine-1.0.71/frontengine/utils/recording → frontengine-1.0.73/frontengine/utils/preset_schedule}/__init__.py +0 -0
- {frontengine-1.0.71/frontengine/utils/redirect_manager → frontengine-1.0.73/frontengine/utils/recording}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/recording/frame_recorder.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/recording/gif_writer.py +0 -0
- {frontengine-1.0.71/frontengine/utils/reminder → frontengine-1.0.73/frontengine/utils/redirect_manager}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
- {frontengine-1.0.71/frontengine/utils/remote → frontengine-1.0.73/frontengine/utils/reminder}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/reminder/reminder_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/screen_privacy → frontengine-1.0.73/frontengine/utils/remote}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/remote/remote_server.py +0 -0
- {frontengine-1.0.71/frontengine/utils/screen_text → frontengine-1.0.73/frontengine/utils/screen_privacy}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/screen_privacy/share_watch.py +0 -0
- {frontengine-1.0.71/frontengine/utils/screensaver → frontengine-1.0.73/frontengine/utils/screen_text}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/screen_text/screen_text_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/signage → frontengine-1.0.73/frontengine/utils/screensaver}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/screensaver/screensaver_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/smart_pause → frontengine-1.0.73/frontengine/utils/signage}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/signage/signage_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/steam → frontengine-1.0.73/frontengine/utils/smart_pause}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/smart_pause/pause_rules.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/system_stats → frontengine-1.0.73/frontengine/utils/steam}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/steam/steam_language.py +0 -0
- {frontengine-1.0.71/frontengine/utils/text_source → frontengine-1.0.73/frontengine/utils/system_stats}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/system_stats/system_stats.py +0 -0
- {frontengine-1.0.71/frontengine/utils/theme_schedule → frontengine-1.0.73/frontengine/utils/text_source}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/text_source/text_source.py +0 -0
- {frontengine-1.0.71/frontengine/utils/usage_tracking → frontengine-1.0.73/frontengine/utils/theme_schedule}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
- {frontengine-1.0.71/frontengine/utils/virtual_camera → frontengine-1.0.73/frontengine/utils/usage_tracking}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/usage_tracking/usage_service.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
- {frontengine-1.0.71/frontengine/utils/weather → frontengine-1.0.73/frontengine/utils/virtual_camera}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
- {frontengine-1.0.71/frontengine/utils/window_pin → frontengine-1.0.73/frontengine/utils/weather}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/weather/weather_service.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/web_url.py +0 -0
- {frontengine-1.0.71/frontengine/utils/window_replica → frontengine-1.0.73/frontengine/utils/window_pin}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/window_pin/window_layout.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/window_pin/window_pin.py +0 -0
- {frontengine-1.0.71/frontengine/utils/workshop → frontengine-1.0.73/frontengine/utils/window_replica}/__init__.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine/utils/workshop/workshop_content.py +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/dependency_links.txt +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/entry_points.txt +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/requires.txt +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/frontengine.egg-info/top_level.txt +0 -0
- {frontengine-1.0.71 → frontengine-1.0.73}/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.73
|
|
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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""
|
|
2
|
+
可拖曳的置頂小視窗:釘選截圖與視窗複本共用的底座。
|
|
3
|
+
|
|
4
|
+
這兩者都是「拿來對照的東西」而不是背景,所以都需要同一套行為:沒有邊框、永遠在
|
|
5
|
+
最上層、可以拖到順手的位置、雙擊或 Escape 關掉。兩邊各寫一份的話,改了其中一個
|
|
6
|
+
的關閉方式,另一個就會變成另一種操作邏輯——而使用者不會知道為什麼。
|
|
7
|
+
|
|
8
|
+
A draggable always-on-top window: the base shared by the pinned capture and the
|
|
9
|
+
window replica.
|
|
10
|
+
|
|
11
|
+
Both are things you refer to rather than backdrops, so both need the same
|
|
12
|
+
behaviour: no frame, always on top, draggable somewhere convenient, closed with a
|
|
13
|
+
double-click or Escape. Written twice, changing how one of them closes would
|
|
14
|
+
quietly leave the other behaving differently, with nothing to explain why.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from typing import Optional
|
|
19
|
+
|
|
20
|
+
from PySide6.QtCore import QPoint, Qt
|
|
21
|
+
from PySide6.QtWidgets import QWidget
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DraggableTopWindow(QWidget):
|
|
25
|
+
"""無邊框、置頂、可拖曳、雙擊或 Escape 關閉。"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, parent: Optional[QWidget] = None) -> None:
|
|
28
|
+
super().__init__(parent)
|
|
29
|
+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
|
|
30
|
+
self.setWindowFlags(
|
|
31
|
+
Qt.WindowType.FramelessWindowHint
|
|
32
|
+
| Qt.WindowType.WindowStaysOnTopHint
|
|
33
|
+
| Qt.WindowType.Tool)
|
|
34
|
+
self.setWindowTitle("FrontEngine")
|
|
35
|
+
self._drag_origin: Optional[QPoint] = None
|
|
36
|
+
|
|
37
|
+
def mousePressEvent(self, event) -> None:
|
|
38
|
+
if event.button() == Qt.MouseButton.LeftButton:
|
|
39
|
+
self._drag_origin = event.globalPosition().toPoint() - self.frameGeometry().topLeft()
|
|
40
|
+
event.accept()
|
|
41
|
+
|
|
42
|
+
def mouseMoveEvent(self, event) -> None:
|
|
43
|
+
if self._drag_origin is not None and event.buttons() & Qt.MouseButton.LeftButton:
|
|
44
|
+
self.move(event.globalPosition().toPoint() - self._drag_origin)
|
|
45
|
+
event.accept()
|
|
46
|
+
|
|
47
|
+
def mouseReleaseEvent(self, event) -> None:
|
|
48
|
+
self._drag_origin = None
|
|
49
|
+
event.accept()
|
|
50
|
+
|
|
51
|
+
def mouseDoubleClickEvent(self, event) -> None:
|
|
52
|
+
"""
|
|
53
|
+
雙擊關掉。沒有標題列就沒有右上角的叉,總得留一個看得懂的出口,否則使用者
|
|
54
|
+
只能去工作管理員。
|
|
55
|
+
Double-click closes. With no title bar there is no cross in the corner, and
|
|
56
|
+
something covering the screen with no way out leaves only the task manager.
|
|
57
|
+
"""
|
|
58
|
+
self.close()
|
|
59
|
+
event.accept()
|
|
60
|
+
|
|
61
|
+
def keyPressEvent(self, event) -> None:
|
|
62
|
+
if event.key() == Qt.Key.Key_Escape:
|
|
63
|
+
self.close()
|
|
64
|
+
return
|
|
65
|
+
super().keyPressEvent(event)
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""
|
|
2
|
+
把截下來的一塊畫面釘在螢幕上。
|
|
3
|
+
|
|
4
|
+
區域截圖原本只能送到剪貼簿或存成檔案——想「一邊看著這段規格一邊改程式」的話,
|
|
5
|
+
得自己找一個看圖程式打開再想辦法讓它保持在最上層。釘選就是把中間那幾步拿掉。
|
|
6
|
+
|
|
7
|
+
和圖片覆蓋層的差別在來源與互動:圖片覆蓋層吃**檔案路徑**、點擊穿透;這個吃記憶體
|
|
8
|
+
裡的 `QPixmap`,而且要能拖、能縮放、能關掉——截下來的東西是拿來對照的,不是背景。
|
|
9
|
+
|
|
10
|
+
Pin a captured piece of screen on top.
|
|
11
|
+
|
|
12
|
+
Region capture could only reach the clipboard or a file: wanting to read a
|
|
13
|
+
specification while editing code meant opening an image viewer and finding a way
|
|
14
|
+
to keep it on top. Pinning removes the steps in between.
|
|
15
|
+
|
|
16
|
+
It differs from the image overlay in both source and behaviour: that one takes a
|
|
17
|
+
**file path** and passes clicks through, while this takes a `QPixmap` already in
|
|
18
|
+
memory and has to be draggable, resizable and closable - a capture is something
|
|
19
|
+
you refer to, not a backdrop.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import Optional, Tuple
|
|
24
|
+
|
|
25
|
+
from PySide6.QtGui import QPainter, QPixmap
|
|
26
|
+
from PySide6.QtWidgets import QWidget
|
|
27
|
+
|
|
28
|
+
from frontengine.show.draggable_window import DraggableTopWindow
|
|
29
|
+
|
|
30
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
31
|
+
|
|
32
|
+
MIN_PINNED_SIZE = 48
|
|
33
|
+
MAX_ZOOM = 4.0
|
|
34
|
+
MIN_ZOOM = 0.1
|
|
35
|
+
ZOOM_STEP = 1.1
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def zoom_size(base: Tuple[int, int], zoom: float) -> Tuple[int, int]:
|
|
39
|
+
"""
|
|
40
|
+
縮放後的大小,維持長寬比並夾在可用範圍內。
|
|
41
|
+
|
|
42
|
+
純算術,所以縮放不必開視窗就能驗。下限存在的理由和複本一樣:縮到剩幾像素的
|
|
43
|
+
圖片既拖不動也關不掉,等於卡在畫面上。
|
|
44
|
+
The scaled size, keeping the aspect ratio and clamped to a usable range.
|
|
45
|
+
|
|
46
|
+
Pure arithmetic, so zooming can be checked without a window. The floor is
|
|
47
|
+
there for the same reason as the replica's: an image a few pixels across can
|
|
48
|
+
be neither dragged nor closed, so it is simply stuck on screen.
|
|
49
|
+
"""
|
|
50
|
+
width, height = base
|
|
51
|
+
if width <= 0 or height <= 0:
|
|
52
|
+
return (MIN_PINNED_SIZE, MIN_PINNED_SIZE)
|
|
53
|
+
factor = max(MIN_ZOOM, min(MAX_ZOOM, float(zoom)))
|
|
54
|
+
return (max(MIN_PINNED_SIZE, int(width * factor)),
|
|
55
|
+
max(MIN_PINNED_SIZE, int(height * factor)))
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def clamp_zoom(zoom: float) -> float:
|
|
59
|
+
"""把縮放倍率夾在可用範圍內。"""
|
|
60
|
+
try:
|
|
61
|
+
return max(MIN_ZOOM, min(MAX_ZOOM, float(zoom)))
|
|
62
|
+
except (TypeError, ValueError):
|
|
63
|
+
return 1.0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class PinnedImageWidget(DraggableTopWindow):
|
|
67
|
+
"""釘在最上層的一張圖:可拖曳、可滾輪縮放、雙擊或 Escape 關閉。"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, pixmap: QPixmap, opacity_percent: int = 100,
|
|
70
|
+
parent: Optional[QWidget] = None) -> None:
|
|
71
|
+
super().__init__(parent)
|
|
72
|
+
self.pixmap = pixmap if pixmap is not None else QPixmap()
|
|
73
|
+
self.zoom = 1.0
|
|
74
|
+
self.setWindowOpacity(max(0.1, min(1.0, opacity_percent / 100.0)))
|
|
75
|
+
|
|
76
|
+
base = (self.pixmap.width(), self.pixmap.height())
|
|
77
|
+
front_engine_logger.info(f"[PinnedImageWidget] Init | size={base}")
|
|
78
|
+
self.resize(*zoom_size(base, 1.0))
|
|
79
|
+
|
|
80
|
+
def base_size(self) -> Tuple[int, int]:
|
|
81
|
+
return (self.pixmap.width(), self.pixmap.height())
|
|
82
|
+
|
|
83
|
+
def apply_zoom(self, zoom: float) -> None:
|
|
84
|
+
"""套用縮放倍率並跟著改變視窗大小。"""
|
|
85
|
+
self.zoom = clamp_zoom(zoom)
|
|
86
|
+
self.resize(*zoom_size(self.base_size(), self.zoom))
|
|
87
|
+
|
|
88
|
+
def paintEvent(self, event) -> None:
|
|
89
|
+
painter = QPainter(self)
|
|
90
|
+
if self.pixmap.isNull():
|
|
91
|
+
return
|
|
92
|
+
# 縮放時用平滑轉換:釘起來的多半是文字或介面截圖,鋸齒會直接讓它讀不了。
|
|
93
|
+
# Smooth transformation: what gets pinned is usually text or an interface,
|
|
94
|
+
# and aliasing makes exactly that unreadable.
|
|
95
|
+
painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform, True)
|
|
96
|
+
painter.drawPixmap(self.rect(), self.pixmap)
|
|
97
|
+
|
|
98
|
+
def wheelEvent(self, event) -> None:
|
|
99
|
+
steps = event.angleDelta().y() / 120.0
|
|
100
|
+
if steps:
|
|
101
|
+
self.apply_zoom(self.zoom * (ZOOM_STEP ** steps))
|
|
102
|
+
event.accept()
|
|
103
|
+
|
|
@@ -14,7 +14,7 @@ from __future__ import annotations
|
|
|
14
14
|
|
|
15
15
|
from typing import Optional
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from frontengine.show.draggable_window import DraggableTopWindow
|
|
18
18
|
from PySide6.QtGui import QColor, QPainter
|
|
19
19
|
from PySide6.QtWidgets import QWidget
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@ from frontengine.utils.window_replica.dwm_thumbnail import (
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class WindowReplicaWidget(
|
|
27
|
+
class WindowReplicaWidget(DraggableTopWindow):
|
|
28
28
|
"""顯示另一個視窗即時畫面的小視窗。"""
|
|
29
29
|
|
|
30
30
|
def __init__(self, source_handle: int, title: str = "",
|
|
@@ -32,11 +32,6 @@ class WindowReplicaWidget(QWidget):
|
|
|
32
32
|
crop: Optional[tuple] = None) -> None:
|
|
33
33
|
front_engine_logger.info(f"[WindowReplicaWidget] Init | source={source_handle}")
|
|
34
34
|
super().__init__(parent)
|
|
35
|
-
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
|
|
36
|
-
self.setWindowFlags(
|
|
37
|
-
Qt.WindowType.FramelessWindowHint
|
|
38
|
-
| Qt.WindowType.WindowStaysOnTopHint
|
|
39
|
-
| Qt.WindowType.Tool)
|
|
40
35
|
self.setWindowTitle(title or "FrontEngine")
|
|
41
36
|
self.setMinimumSize(MIN_REPLICA_SIZE, MIN_REPLICA_SIZE)
|
|
42
37
|
|
|
@@ -48,7 +43,6 @@ class WindowReplicaWidget(QWidget):
|
|
|
48
43
|
# the source after that window is resized.
|
|
49
44
|
self.crop = crop
|
|
50
45
|
self.thumbnail = DwmThumbnail()
|
|
51
|
-
self._drag_origin: Optional[QPoint] = None
|
|
52
46
|
|
|
53
47
|
self.resize(DEFAULT_REPLICA_WIDTH, int(DEFAULT_REPLICA_WIDTH * 9 / 16))
|
|
54
48
|
|
|
@@ -109,24 +103,6 @@ class WindowReplicaWidget(QWidget):
|
|
|
109
103
|
painter = QPainter(self)
|
|
110
104
|
painter.fillRect(self.rect(), QColor(0, 0, 0))
|
|
111
105
|
|
|
112
|
-
def mousePressEvent(self, event) -> None:
|
|
113
|
-
if event.button() == Qt.MouseButton.LeftButton:
|
|
114
|
-
self._drag_origin = event.globalPosition().toPoint() - self.frameGeometry().topLeft()
|
|
115
|
-
event.accept()
|
|
116
|
-
|
|
117
|
-
def mouseMoveEvent(self, event) -> None:
|
|
118
|
-
if self._drag_origin is not None and event.buttons() & Qt.MouseButton.LeftButton:
|
|
119
|
-
self.move(event.globalPosition().toPoint() - self._drag_origin)
|
|
120
|
-
event.accept()
|
|
121
|
-
|
|
122
|
-
def mouseReleaseEvent(self, event) -> None:
|
|
123
|
-
self._drag_origin = None
|
|
124
|
-
event.accept()
|
|
125
|
-
|
|
126
|
-
def mouseDoubleClickEvent(self, event) -> None:
|
|
127
|
-
"""雙擊關掉——沒有標題列,總得有一個看得懂的出口。"""
|
|
128
|
-
self.close()
|
|
129
|
-
event.accept()
|
|
130
106
|
|
|
131
107
|
def closeEvent(self, event) -> None:
|
|
132
108
|
# 縮圖是系統資源,視窗沒了也不會自己消失。從標題列以外的任何路徑關閉時
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""
|
|
2
|
+
預設集排程設定:星期幾、幾點幾分,套用哪一個預設集。
|
|
3
|
+
|
|
4
|
+
這個排程本來就在跑,卻沒有任何介面——只能手動改 `user_setting.json`,連時間都
|
|
5
|
+
不能在畫面上設。所以這裡不只是加上星期,是讓這個功能第一次真的到得了。
|
|
6
|
+
|
|
7
|
+
Preset schedule settings: which days, what time, which preset.
|
|
8
|
+
|
|
9
|
+
The schedule was already running with no interface at all - it could only be
|
|
10
|
+
configured by hand-editing `user_setting.json`, down to the time of day. So this
|
|
11
|
+
is not only about adding days: it is what makes the feature reachable at all.
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from typing import Any, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from PySide6.QtWidgets import (
|
|
18
|
+
QCheckBox, QComboBox, QDialog, QDialogButtonBox, QGridLayout, QLabel, QSpinBox, QWidget,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from frontengine.user_setting.preset_repository import PresetRepository
|
|
22
|
+
from frontengine.user_setting.user_setting_file import user_setting_dict, write_user_setting
|
|
23
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
24
|
+
from frontengine.utils.multi_language.language_wrapper import language_wrapper
|
|
25
|
+
from frontengine.utils.multi_language.retranslate import tr
|
|
26
|
+
from frontengine.utils.preset_schedule.preset_schedule_service import (
|
|
27
|
+
DEFAULT_PRESET_SCHEDULE, normalize_days,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
SETTING_KEY = "preset_schedule"
|
|
31
|
+
|
|
32
|
+
# 0 = 週一,和 datetime.weekday() 一致
|
|
33
|
+
# 0 = Monday, matching datetime.weekday()
|
|
34
|
+
DAY_KEYS = (
|
|
35
|
+
("weekday_monday", "Mon"),
|
|
36
|
+
("weekday_tuesday", "Tue"),
|
|
37
|
+
("weekday_wednesday", "Wed"),
|
|
38
|
+
("weekday_thursday", "Thu"),
|
|
39
|
+
("weekday_friday", "Fri"),
|
|
40
|
+
("weekday_saturday", "Sat"),
|
|
41
|
+
("weekday_sunday", "Sun"),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _t(key: str, fallback: str) -> str:
|
|
46
|
+
return language_wrapper.language_word_dict.get(key, fallback)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def current_settings() -> Dict[str, Any]:
|
|
50
|
+
"""目前的排程設定(缺項目補預設值)。"""
|
|
51
|
+
stored = user_setting_dict.get(SETTING_KEY)
|
|
52
|
+
settings = dict(DEFAULT_PRESET_SCHEDULE)
|
|
53
|
+
if isinstance(stored, dict):
|
|
54
|
+
settings.update({key: stored[key] for key in DEFAULT_PRESET_SCHEDULE if key in stored})
|
|
55
|
+
settings["days"] = normalize_days(settings.get("days"))
|
|
56
|
+
settings["enabled"] = bool(settings.get("enabled"))
|
|
57
|
+
return settings
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PresetScheduleDialog(QDialog):
|
|
61
|
+
"""設定哪幾天、幾點,自動套用哪一個預設集。"""
|
|
62
|
+
|
|
63
|
+
def __init__(self, parent: Optional[QWidget] = None, repository=None) -> None:
|
|
64
|
+
front_engine_logger.info("[PresetScheduleDialog] Init")
|
|
65
|
+
super().__init__(parent)
|
|
66
|
+
self.setWindowTitle(_t("preset_schedule_title", "Scheduled preset"))
|
|
67
|
+
settings = current_settings()
|
|
68
|
+
self._repository = repository or PresetRepository()
|
|
69
|
+
|
|
70
|
+
self.enable_checkbox = tr(QCheckBox(), "preset_schedule_enable", "Apply a preset on a schedule")
|
|
71
|
+
self.enable_checkbox.setChecked(settings["enabled"])
|
|
72
|
+
|
|
73
|
+
self.preset_label = tr(QLabel(), "preset_schedule_preset", "Preset")
|
|
74
|
+
self.preset_combobox = QComboBox()
|
|
75
|
+
# 只列真的存在的預設集:讓人自己打名字的話,打錯了要等到排程觸發的那一刻
|
|
76
|
+
# 才會發現什麼都沒發生。
|
|
77
|
+
# Only presets that exist are listed: with a free-text name, a typo is
|
|
78
|
+
# discovered when the schedule fires and nothing happens.
|
|
79
|
+
for name in self._preset_names():
|
|
80
|
+
self.preset_combobox.addItem(name, name)
|
|
81
|
+
index = self.preset_combobox.findData(settings.get("preset"))
|
|
82
|
+
if index >= 0:
|
|
83
|
+
self.preset_combobox.setCurrentIndex(index)
|
|
84
|
+
|
|
85
|
+
self.time_label = tr(QLabel(), "preset_schedule_time", "At")
|
|
86
|
+
self.hour_spinbox = QSpinBox()
|
|
87
|
+
self.hour_spinbox.setRange(0, 23)
|
|
88
|
+
self.hour_spinbox.setValue(int(settings.get("hour", 9)) % 24)
|
|
89
|
+
self.minute_spinbox = QSpinBox()
|
|
90
|
+
self.minute_spinbox.setRange(0, 59)
|
|
91
|
+
self.minute_spinbox.setValue(int(settings.get("minute", 0)) % 60)
|
|
92
|
+
|
|
93
|
+
self.days_label = tr(QLabel(), "preset_schedule_days", "On")
|
|
94
|
+
self.day_checkboxes: List[QCheckBox] = []
|
|
95
|
+
days_holder = QWidget()
|
|
96
|
+
days_layout = QGridLayout(days_holder)
|
|
97
|
+
days_layout.setContentsMargins(0, 0, 0, 0)
|
|
98
|
+
for index, (key, fallback) in enumerate(DAY_KEYS):
|
|
99
|
+
checkbox = tr(QCheckBox(), key, fallback)
|
|
100
|
+
checkbox.setChecked(index in settings["days"])
|
|
101
|
+
days_layout.addWidget(checkbox, index // 4, index % 4)
|
|
102
|
+
self.day_checkboxes.append(checkbox)
|
|
103
|
+
|
|
104
|
+
self.hint_label = tr(
|
|
105
|
+
QLabel(), "preset_schedule_hint",
|
|
106
|
+
"With no day ticked it runs every day. It fires once as the time passes, "
|
|
107
|
+
"so starting FrontEngine after that time will not apply it late.")
|
|
108
|
+
self.hint_label.setWordWrap(True)
|
|
109
|
+
|
|
110
|
+
buttons = QDialogButtonBox(
|
|
111
|
+
QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
|
|
112
|
+
buttons.accepted.connect(self.accept)
|
|
113
|
+
buttons.rejected.connect(self.reject)
|
|
114
|
+
|
|
115
|
+
layout = QGridLayout(self)
|
|
116
|
+
layout.addWidget(self.enable_checkbox, 0, 0, 1, 3)
|
|
117
|
+
layout.addWidget(self.preset_label, 1, 0)
|
|
118
|
+
layout.addWidget(self.preset_combobox, 1, 1, 1, 2)
|
|
119
|
+
layout.addWidget(self.time_label, 2, 0)
|
|
120
|
+
layout.addWidget(self.hour_spinbox, 2, 1)
|
|
121
|
+
layout.addWidget(self.minute_spinbox, 2, 2)
|
|
122
|
+
layout.addWidget(self.days_label, 3, 0)
|
|
123
|
+
layout.addWidget(days_holder, 3, 1, 1, 2)
|
|
124
|
+
layout.addWidget(self.hint_label, 4, 0, 1, 3)
|
|
125
|
+
layout.addWidget(buttons, 5, 0, 1, 3)
|
|
126
|
+
|
|
127
|
+
def _preset_names(self) -> List[str]:
|
|
128
|
+
try:
|
|
129
|
+
return [name for name in self._repository.list_presets()
|
|
130
|
+
if not name.startswith("__")]
|
|
131
|
+
except OSError as error: # pragma: no cover - filesystem boundary
|
|
132
|
+
front_engine_logger.warning(f"[PresetScheduleDialog] list failed: {error!r}")
|
|
133
|
+
return []
|
|
134
|
+
|
|
135
|
+
def collect(self) -> Dict[str, Any]:
|
|
136
|
+
"""把畫面上的選擇讀成設定。"""
|
|
137
|
+
return {
|
|
138
|
+
"enabled": self.enable_checkbox.isChecked(),
|
|
139
|
+
"preset": self.preset_combobox.currentData() or "",
|
|
140
|
+
"hour": self.hour_spinbox.value(),
|
|
141
|
+
"minute": self.minute_spinbox.value(),
|
|
142
|
+
"days": [index for index, box in enumerate(self.day_checkboxes) if box.isChecked()],
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
def accept(self) -> None:
|
|
146
|
+
user_setting_dict[SETTING_KEY] = self.collect()
|
|
147
|
+
write_user_setting()
|
|
148
|
+
front_engine_logger.info(
|
|
149
|
+
f"[PresetScheduleDialog] saved | {user_setting_dict[SETTING_KEY]}")
|
|
150
|
+
super().accept()
|
|
@@ -398,7 +398,8 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
398
398
|
"now_playing_widget_list", "note_widget_list"):
|
|
399
399
|
self.control_center_ui.register_overlay_source(
|
|
400
400
|
lambda attribute=attribute: getattr(self.widgets_setting_ui, attribute, []))
|
|
401
|
-
for attribute in ("measure_widget_list", "capture_widget_list", "camera_widget_list"
|
|
401
|
+
for attribute in ("measure_widget_list", "capture_widget_list", "camera_widget_list",
|
|
402
|
+
"pinned_widget_list"):
|
|
402
403
|
self.control_center_ui.register_overlay_source(
|
|
403
404
|
lambda attribute=attribute: getattr(self.tools_setting_ui, attribute, []))
|
|
404
405
|
|
|
@@ -929,6 +930,7 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
929
930
|
self.widgets_setting_ui.stop_spectrum()
|
|
930
931
|
if getattr(self, "tools_setting_ui", None) is not None:
|
|
931
932
|
self.tools_setting_ui.release_pinned_windows()
|
|
933
|
+
self.tools_setting_ui.close_pinned()
|
|
932
934
|
# 複本註冊的是 DWM 縮圖,那是系統資源:視窗沒了也不會自己消失。
|
|
933
935
|
# A replica holds a DWM thumbnail, a system resource that does not
|
|
934
936
|
# go away just because the process is closing.
|
|
@@ -12,6 +12,7 @@ from frontengine.ui.dialog.hotkey_settings_dialog import HotkeySettingsDialog
|
|
|
12
12
|
from frontengine.ui.dialog.reminder_dialog import ReminderDialog
|
|
13
13
|
from frontengine.ui.dialog.remote_control_dialog import RemoteControlDialog
|
|
14
14
|
from frontengine.ui.dialog.screen_privacy_dialog import ScreenPrivacyDialog
|
|
15
|
+
from frontengine.ui.dialog.preset_schedule_dialog import PresetScheduleDialog
|
|
15
16
|
from frontengine.ui.dialog.screensaver_dialog import ScreensaverDialog
|
|
16
17
|
from frontengine.utils.keep_awake.keep_awake import available as keep_awake_available
|
|
17
18
|
from frontengine.ui.dialog.signage_dialog import SignageDialog
|
|
@@ -124,6 +125,14 @@ def build_settings_menu(ui: "FrontEngineMainUI") -> None:
|
|
|
124
125
|
menu.addAction(screensaver_action)
|
|
125
126
|
ui.screensaver_action = screensaver_action
|
|
126
127
|
|
|
128
|
+
preset_schedule_action = QAction(
|
|
129
|
+
_t("settings_menu_preset_schedule", "Scheduled preset..."), menu)
|
|
130
|
+
retranslator.bind(preset_schedule_action, "settings_menu_preset_schedule",
|
|
131
|
+
"Scheduled preset...")
|
|
132
|
+
preset_schedule_action.triggered.connect(lambda: PresetScheduleDialog(ui).exec())
|
|
133
|
+
menu.addAction(preset_schedule_action)
|
|
134
|
+
ui.preset_schedule_action = preset_schedule_action
|
|
135
|
+
|
|
127
136
|
signage_action = QAction(_t("settings_menu_signage", "Signage mode..."), menu)
|
|
128
137
|
retranslator.bind(signage_action, "settings_menu_signage", "Signage mode...")
|
|
129
138
|
signage_action.triggered.connect(lambda: _open_signage_dialog(ui))
|
|
@@ -18,6 +18,7 @@ from frontengine.show.camera.camera_widget import (
|
|
|
18
18
|
SHAPE_CIRCLE, SHAPE_RECTANGLE, SHAPE_ROUNDED, CameraWidget, list_cameras,
|
|
19
19
|
)
|
|
20
20
|
from frontengine.show.capture.region_capture import RegionCaptureWidget, is_usable
|
|
21
|
+
from frontengine.show.pinned.pinned_image import PinnedImageWidget
|
|
21
22
|
from frontengine.show.measure.measure_widget import (
|
|
22
23
|
MODE_ANGLE, MODE_COLOR, MODE_RULER, MeasureWidget,
|
|
23
24
|
)
|
|
@@ -77,6 +78,9 @@ class ToolsSettingUI(SettingPage):
|
|
|
77
78
|
self.last_screen_text: Optional[str] = None
|
|
78
79
|
self.last_recording: Optional[str] = None
|
|
79
80
|
self.capture_widget_list: List[RegionCaptureWidget] = []
|
|
81
|
+
# 釘住的截圖:使用者自己關掉之外,主程式結束時也要收乾淨
|
|
82
|
+
# Pinned captures: closed by the user, and swept up on shutdown too
|
|
83
|
+
self.pinned_widget_list: List[PinnedImageWidget] = []
|
|
80
84
|
self.camera_widget_list: List[CameraWidget] = []
|
|
81
85
|
# 存畫面本身,不要存那個覆蓋層:框選完它就自己 close() 了,而
|
|
82
86
|
# WA_DeleteOnClose 會把底層物件銷毀,留下來的參考碰一下就 RuntimeError,
|
|
@@ -131,7 +135,8 @@ class ToolsSettingUI(SettingPage):
|
|
|
131
135
|
measure.add_inline(self.measure_button)
|
|
132
136
|
|
|
133
137
|
capture = self.add_section(self.capture_label)
|
|
134
|
-
capture.add_inline(self.capture_button, self.capture_copy_button
|
|
138
|
+
capture.add_inline(self.capture_button, self.capture_copy_button,
|
|
139
|
+
self.capture_pin_button)
|
|
135
140
|
|
|
136
141
|
screen_text = self.add_section(self.screen_text_label)
|
|
137
142
|
screen_text.add_row("tools_action", self.screen_text_combobox, "Action")
|
|
@@ -189,6 +194,8 @@ class ToolsSettingUI(SettingPage):
|
|
|
189
194
|
self.capture_button = tr(QPushButton(), "tools_capture_start", "Capture area")
|
|
190
195
|
self.capture_button.clicked.connect(self.start_capture)
|
|
191
196
|
self.capture_copy_button = tr(QPushButton(), "tools_capture_copy", "Copy last")
|
|
197
|
+
self.capture_pin_button = tr(QPushButton(), "tools_capture_pin", "Pin last")
|
|
198
|
+
self.capture_pin_button.clicked.connect(self.pin_last_capture)
|
|
192
199
|
self.capture_copy_button.clicked.connect(self.copy_last_capture)
|
|
193
200
|
|
|
194
201
|
def _build_screen_text_row(self) -> None:
|
|
@@ -311,6 +318,34 @@ class ToolsSettingUI(SettingPage):
|
|
|
311
318
|
if widget in self.capture_widget_list:
|
|
312
319
|
self.capture_widget_list.remove(widget)
|
|
313
320
|
|
|
321
|
+
def pin_last_capture(self) -> Optional[PinnedImageWidget]:
|
|
322
|
+
"""
|
|
323
|
+
把最近一次的截圖釘在畫面上。沒有截過就什麼都不做——開一個空白視窗只會讓
|
|
324
|
+
使用者以為截圖壞了。
|
|
325
|
+
Pin the most recent capture. With nothing captured this does nothing: an
|
|
326
|
+
empty window would read as the capture having failed.
|
|
327
|
+
"""
|
|
328
|
+
if self.last_capture is None or self.last_capture.isNull():
|
|
329
|
+
front_engine_logger.info("[ToolsSettingUI] nothing captured to pin")
|
|
330
|
+
return None
|
|
331
|
+
pinned = PinnedImageWidget(self.last_capture)
|
|
332
|
+
pinned.show()
|
|
333
|
+
self.pinned_widget_list.append(pinned)
|
|
334
|
+
return pinned
|
|
335
|
+
|
|
336
|
+
def close_pinned(self) -> None:
|
|
337
|
+
"""關掉所有釘住的截圖(主程式關閉時呼叫)。"""
|
|
338
|
+
# 用切片而不是 list():邊走邊關的時候原清單有可能被動到,而 Sonar 對
|
|
339
|
+
# list() 會抱怨、對切片不會。
|
|
340
|
+
# A slice rather than list(): the original can still be touched while
|
|
341
|
+
# closing, and Sonar objects to list() but not to slicing.
|
|
342
|
+
for pinned in self.pinned_widget_list[:]:
|
|
343
|
+
try:
|
|
344
|
+
pinned.close()
|
|
345
|
+
except RuntimeError: # pragma: no cover - 底層物件已消失
|
|
346
|
+
pass
|
|
347
|
+
self.pinned_widget_list.clear()
|
|
348
|
+
|
|
314
349
|
def copy_last_capture(self) -> bool:
|
|
315
350
|
"""把最近一次的截圖再放進剪貼簿一次。"""
|
|
316
351
|
if self.last_capture is None or self.last_capture.isNull():
|
|
@@ -266,6 +266,20 @@ english_word_dict = {
|
|
|
266
266
|
# Target monitor / control center
|
|
267
267
|
"target_monitor_label": "Target monitor",
|
|
268
268
|
"target_monitor_ask": "Ask",
|
|
269
|
+
"settings_menu_preset_schedule": "Scheduled preset...",
|
|
270
|
+
"preset_schedule_title": "Scheduled preset",
|
|
271
|
+
"preset_schedule_enable": "Apply a preset on a schedule",
|
|
272
|
+
"preset_schedule_preset": "Preset",
|
|
273
|
+
"preset_schedule_time": "At",
|
|
274
|
+
"preset_schedule_days": "On",
|
|
275
|
+
"preset_schedule_hint": "With no day ticked it runs every day. It fires once as the time passes, so starting FrontEngine after that time will not apply it late.",
|
|
276
|
+
"weekday_monday": "Mon",
|
|
277
|
+
"weekday_tuesday": "Tue",
|
|
278
|
+
"weekday_wednesday": "Wed",
|
|
279
|
+
"weekday_thursday": "Thu",
|
|
280
|
+
"weekday_friday": "Fri",
|
|
281
|
+
"weekday_saturday": "Sat",
|
|
282
|
+
"weekday_sunday": "Sun",
|
|
269
283
|
"control_center_hide_all": "Hide all",
|
|
270
284
|
"control_center_show_all": "Show all",
|
|
271
285
|
"control_center_lock_all": "Lock overlays",
|
|
@@ -528,6 +542,7 @@ english_word_dict = {
|
|
|
528
542
|
"tools_measure_start": 'Start measuring',
|
|
529
543
|
"tools_measure_stop": 'Stop measuring',
|
|
530
544
|
"tools_color_format": 'Copy colour as',
|
|
545
|
+
"tools_capture_pin": "Pin last",
|
|
531
546
|
"tools_capture_label": 'Region capture',
|
|
532
547
|
"tools_capture_start": 'Capture area',
|
|
533
548
|
"tools_capture_copy": 'Copy last',
|
|
@@ -265,6 +265,20 @@ french_word_dict = {
|
|
|
265
265
|
"preset_no_presets": "Aucun préréglage enregistré pour l'instant.",
|
|
266
266
|
"target_monitor_label": "Écran cible",
|
|
267
267
|
"target_monitor_ask": "Demander",
|
|
268
|
+
"settings_menu_preset_schedule": "Préréglage programmé...",
|
|
269
|
+
"preset_schedule_title": "Préréglage programmé",
|
|
270
|
+
"preset_schedule_enable": "Appliquer un préréglage selon un horaire",
|
|
271
|
+
"preset_schedule_preset": "Préréglage",
|
|
272
|
+
"preset_schedule_time": "À",
|
|
273
|
+
"preset_schedule_days": "Le",
|
|
274
|
+
"preset_schedule_hint": "Sans jour coché, cela s'applique tous les jours. Le déclenchement a lieu au passage de l'heure : démarrer FrontEngine après ne le rattrape pas.",
|
|
275
|
+
"weekday_monday": "Lun",
|
|
276
|
+
"weekday_tuesday": "Mar",
|
|
277
|
+
"weekday_wednesday": "Mer",
|
|
278
|
+
"weekday_thursday": "Jeu",
|
|
279
|
+
"weekday_friday": "Ven",
|
|
280
|
+
"weekday_saturday": "Sam",
|
|
281
|
+
"weekday_sunday": "Dim",
|
|
268
282
|
"control_center_hide_all": "Tout masquer",
|
|
269
283
|
"control_center_show_all": "Tout afficher",
|
|
270
284
|
"control_center_lock_all": "Verrouiller les calques",
|
|
@@ -518,6 +532,7 @@ french_word_dict = {
|
|
|
518
532
|
"tools_measure_start": "Commencer à mesurer",
|
|
519
533
|
"tools_measure_stop": "Arrêter de mesurer",
|
|
520
534
|
"tools_color_format": "Copier la couleur en",
|
|
535
|
+
"tools_capture_pin": "Épingler la dernière",
|
|
521
536
|
"tools_capture_label": "Capture de zone",
|
|
522
537
|
"tools_capture_start": "Capturer une zone",
|
|
523
538
|
"tools_capture_copy": "Copier la dernière",
|
|
@@ -265,6 +265,20 @@ germany_word_dict = {
|
|
|
265
265
|
"preset_no_presets": "Noch keine Voreinstellungen gespeichert.",
|
|
266
266
|
"target_monitor_label": "Zielbildschirm",
|
|
267
267
|
"target_monitor_ask": "Nachfragen",
|
|
268
|
+
"settings_menu_preset_schedule": "Geplante Voreinstellung...",
|
|
269
|
+
"preset_schedule_title": "Geplante Voreinstellung",
|
|
270
|
+
"preset_schedule_enable": "Voreinstellung nach Zeitplan anwenden",
|
|
271
|
+
"preset_schedule_preset": "Voreinstellung",
|
|
272
|
+
"preset_schedule_time": "Um",
|
|
273
|
+
"preset_schedule_days": "An",
|
|
274
|
+
"preset_schedule_hint": "Ohne angehakten Tag läuft es täglich. Es löst beim Überschreiten der Uhrzeit einmal aus; ein späterer Start holt es nicht nach.",
|
|
275
|
+
"weekday_monday": "Mo",
|
|
276
|
+
"weekday_tuesday": "Di",
|
|
277
|
+
"weekday_wednesday": "Mi",
|
|
278
|
+
"weekday_thursday": "Do",
|
|
279
|
+
"weekday_friday": "Fr",
|
|
280
|
+
"weekday_saturday": "Sa",
|
|
281
|
+
"weekday_sunday": "So",
|
|
268
282
|
"control_center_hide_all": "Alle ausblenden",
|
|
269
283
|
"control_center_show_all": "Alle anzeigen",
|
|
270
284
|
"control_center_lock_all": "Overlays sperren",
|
|
@@ -521,6 +535,7 @@ germany_word_dict = {
|
|
|
521
535
|
"tools_measure_start": "Messen starten",
|
|
522
536
|
"tools_measure_stop": "Messen beenden",
|
|
523
537
|
"tools_color_format": "Farbe kopieren als",
|
|
538
|
+
"tools_capture_pin": "Letzten anheften",
|
|
524
539
|
"tools_capture_label": "Bereichsaufnahme",
|
|
525
540
|
"tools_capture_start": "Bereich aufnehmen",
|
|
526
541
|
"tools_capture_copy": "Letzte kopieren",
|
|
@@ -265,6 +265,20 @@ italian_word_dict = {
|
|
|
265
265
|
"preset_no_presets": "Nessuna preimpostazione salvata finora.",
|
|
266
266
|
"target_monitor_label": "Schermo di destinazione",
|
|
267
267
|
"target_monitor_ask": "Chiedi",
|
|
268
|
+
"settings_menu_preset_schedule": "Preimpostazione pianificata...",
|
|
269
|
+
"preset_schedule_title": "Preimpostazione pianificata",
|
|
270
|
+
"preset_schedule_enable": "Applica una preimpostazione a orario",
|
|
271
|
+
"preset_schedule_preset": "Preimpostazione",
|
|
272
|
+
"preset_schedule_time": "Alle",
|
|
273
|
+
"preset_schedule_days": "Nei giorni",
|
|
274
|
+
"preset_schedule_hint": "Senza giorni selezionati vale tutti i giorni. Scatta nel momento in cui l'ora viene superata: avviare FrontEngine dopo non la recupera.",
|
|
275
|
+
"weekday_monday": "Lun",
|
|
276
|
+
"weekday_tuesday": "Mar",
|
|
277
|
+
"weekday_wednesday": "Mer",
|
|
278
|
+
"weekday_thursday": "Gio",
|
|
279
|
+
"weekday_friday": "Ven",
|
|
280
|
+
"weekday_saturday": "Sab",
|
|
281
|
+
"weekday_sunday": "Dom",
|
|
268
282
|
"control_center_hide_all": "Nascondi tutto",
|
|
269
283
|
"control_center_show_all": "Mostra tutto",
|
|
270
284
|
"control_center_lock_all": "Blocca gli overlay",
|
|
@@ -518,6 +532,7 @@ italian_word_dict = {
|
|
|
518
532
|
"tools_measure_start": "Inizia a misurare",
|
|
519
533
|
"tools_measure_stop": "Smetti di misurare",
|
|
520
534
|
"tools_color_format": "Copia il colore come",
|
|
535
|
+
"tools_capture_pin": "Fissa l'ultima",
|
|
521
536
|
"tools_capture_label": "Cattura di un'area",
|
|
522
537
|
"tools_capture_start": "Cattura un'area",
|
|
523
538
|
"tools_capture_copy": "Copia l'ultima",
|
|
@@ -265,6 +265,20 @@ russian_word_dict = {
|
|
|
265
265
|
"preset_no_presets": "Пресеты пока не сохранены.",
|
|
266
266
|
"target_monitor_label": "Целевой экран",
|
|
267
267
|
"target_monitor_ask": "Спрашивать",
|
|
268
|
+
"settings_menu_preset_schedule": "Пресет по расписанию...",
|
|
269
|
+
"preset_schedule_title": "Пресет по расписанию",
|
|
270
|
+
"preset_schedule_enable": "Применять пресет по расписанию",
|
|
271
|
+
"preset_schedule_preset": "Пресет",
|
|
272
|
+
"preset_schedule_time": "В",
|
|
273
|
+
"preset_schedule_days": "По дням",
|
|
274
|
+
"preset_schedule_hint": "Если ни один день не отмечен, срабатывает каждый день. Срабатывает в момент наступления времени: запуск FrontEngine позже не применит его задним числом.",
|
|
275
|
+
"weekday_monday": "Пн",
|
|
276
|
+
"weekday_tuesday": "Вт",
|
|
277
|
+
"weekday_wednesday": "Ср",
|
|
278
|
+
"weekday_thursday": "Чт",
|
|
279
|
+
"weekday_friday": "Пт",
|
|
280
|
+
"weekday_saturday": "Сб",
|
|
281
|
+
"weekday_sunday": "Вс",
|
|
268
282
|
"control_center_hide_all": "Скрыть всё",
|
|
269
283
|
"control_center_show_all": "Показать всё",
|
|
270
284
|
"control_center_lock_all": "Заблокировать слои",
|
|
@@ -518,6 +532,7 @@ russian_word_dict = {
|
|
|
518
532
|
"tools_measure_start": "Начать измерение",
|
|
519
533
|
"tools_measure_stop": "Остановить измерение",
|
|
520
534
|
"tools_color_format": "Копировать цвет как",
|
|
535
|
+
"tools_capture_pin": "Закрепить последний",
|
|
521
536
|
"tools_capture_label": "Снимок области",
|
|
522
537
|
"tools_capture_start": "Снять область",
|
|
523
538
|
"tools_capture_copy": "Копировать последний",
|