frontengine 1.0.68__tar.gz → 1.0.70__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.68 → frontengine-1.0.70}/PKG-INFO +1 -1
- frontengine-1.0.70/frontengine/show/shortcuts/shortcut_sheet.py +152 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/hotkey_settings_dialog.py +15 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/main_ui.py +42 -1
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/menu/help_menu.py +12 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/menu/settings_menu.py +29 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/user_setting/user_setting_file.py +1 -0
- frontengine-1.0.70/frontengine/utils/keep_awake/keep_awake.py +154 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/english.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/france.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/germany.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/italy.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/russian.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/simplified_chinese.py +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/traditional_chinese.py +4 -0
- frontengine-1.0.70/frontengine/utils/window_replica/__init__.py +0 -0
- frontengine-1.0.70/frontengine/utils/workshop/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/PKG-INFO +1 -1
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/SOURCES.txt +4 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/pyproject.toml +1 -1
- {frontengine-1.0.68 → frontengine-1.0.70}/LICENSE +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/README.md +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/__main__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/base_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/camera/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/camera/camera_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/canvas/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/canvas/whiteboard_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/capture/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/capture/region_capture.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/focus_shield/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/gif/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/gif/paint_gif.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/image/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/image/paint_image.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/load/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/load/load_someone_make_ui.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/measure/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/measure/measure_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/monitor/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/monitor/monitor_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/notes/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/notes/sticky_note_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/overlay_factory.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/particle/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/particle/particle_ui.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/pet/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/pet/desktop_pet.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/presentation/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/presentation/annotation_overlay.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/presentation/cursor_effects.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/presentation/keystroke_display.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/presentation/magnifier.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/replica/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/replica/replica_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/scene/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/scene/extend_graphic_scene.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/scene/extend_graphic_view.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/scene/scene.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/screen_care/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/screen_care/color_vision_widget.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/screen_care/screen_filter.py +0 -0
- {frontengine-1.0.68/frontengine/show/sound_player → frontengine-1.0.70/frontengine/show/shortcuts}/__init__.py +0 -0
- {frontengine-1.0.68/frontengine/show/spectrum → frontengine-1.0.70/frontengine/show/sound_player}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/sound_player/sound_effect.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/sound_player/sound_player.py +0 -0
- {frontengine-1.0.68/frontengine/show/text → frontengine-1.0.70/frontengine/show/spectrum}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/spectrum/spectrum_widget.py +0 -0
- {frontengine-1.0.68/frontengine/show/toast → frontengine-1.0.70/frontengine/show/text}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/text/draw_text.py +0 -0
- {frontengine-1.0.68/frontengine/show/video → frontengine-1.0.70/frontengine/show/toast}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/toast/toast_widget.py +0 -0
- {frontengine-1.0.68/frontengine/show/wallpaper → frontengine-1.0.70/frontengine/show/video}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/video/video_player.py +0 -0
- {frontengine-1.0.68/frontengine/show/web → frontengine-1.0.70/frontengine/show/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
- {frontengine-1.0.68/frontengine/system_tray → frontengine-1.0.70/frontengine/show/web}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/web/webview.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/show/window_helpers.py +0 -0
- {frontengine-1.0.68/frontengine/ui → frontengine-1.0.70/frontengine/system_tray}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/system_tray/extend_system_tray.py +0 -0
- {frontengine-1.0.68/frontengine/ui/color → frontengine-1.0.70/frontengine/ui}/__init__.py +0 -0
- {frontengine-1.0.68/frontengine/ui/dialog → frontengine-1.0.70/frontengine/ui/color}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/color/global_color.py +0 -0
- {frontengine-1.0.68/frontengine/ui/menu → frontengine-1.0.70/frontengine/ui/dialog}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/reminder_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/signage_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
- {frontengine-1.0.68/frontengine/ui/nav → frontengine-1.0.70/frontengine/ui/menu}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/menu/how_to_menu.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/menu/language_menu.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/menu/preset_menu.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page → frontengine-1.0.70/frontengine/ui/nav}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/nav/sidebar.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/control_center → frontengine-1.0.70/frontengine/ui/page}/__init__.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/focus → frontengine-1.0.70/frontengine/ui/page/control_center}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/gif → frontengine-1.0.70/frontengine/ui/page/focus}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/image → frontengine-1.0.70/frontengine/ui/page/gif}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/particle → frontengine-1.0.70/frontengine/ui/page/image}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/image/image_setting_ui.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/layout_kit.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/pet → frontengine-1.0.70/frontengine/ui/page/particle}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/presentation → frontengine-1.0.70/frontengine/ui/page/pet}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/scene_setting → frontengine-1.0.70/frontengine/ui/page/presentation}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/scene_setting/scene_page → frontengine-1.0.70/frontengine/ui/page/scene_setting}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/screen_care → frontengine-1.0.70/frontengine/ui/page/scene_setting/scene_page}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/sound_player → frontengine-1.0.70/frontengine/ui/page/screen_care}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/text → frontengine-1.0.70/frontengine/ui/page/sound_player}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/tools → frontengine-1.0.70/frontengine/ui/page/text}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/text/text_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/video → frontengine-1.0.70/frontengine/ui/page/tools}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/utils.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/wallpaper → frontengine-1.0.70/frontengine/ui/page/video}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/video/video_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/web → frontengine-1.0.70/frontengine/ui/page/wallpaper}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/page/widgets → frontengine-1.0.70/frontengine/ui/page/web}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/web/web_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/ui/style → frontengine-1.0.70/frontengine/ui/page/widgets}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
- {frontengine-1.0.68/frontengine/user_setting → frontengine-1.0.70/frontengine/ui/style}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/ui/style/app_style.py +0 -0
- {frontengine-1.0.68/frontengine/utils → frontengine-1.0.70/frontengine/user_setting}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/user_setting/preset_repository.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/user_setting/scene_setting.py +0 -0
- {frontengine-1.0.68/frontengine/utils/app_profile → frontengine-1.0.70/frontengine/utils}/__init__.py +0 -0
- {frontengine-1.0.68/frontengine/utils/audio_meter → frontengine-1.0.70/frontengine/utils/app_profile}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/app_profile/app_profile_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/autostart → frontengine-1.0.70/frontengine/utils/audio_meter}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/screen_audio.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
- {frontengine-1.0.68/frontengine/utils/break_reminder → frontengine-1.0.70/frontengine/utils/autostart}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/autostart/autostart_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/browser → frontengine-1.0.70/frontengine/utils/break_reminder}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/break_reminder/break_reminder.py +0 -0
- {frontengine-1.0.68/frontengine/utils/clipboard → frontengine-1.0.70/frontengine/utils/browser}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/browser/browser.py +0 -0
- {frontengine-1.0.68/frontengine/utils/color_vision → frontengine-1.0.70/frontengine/utils/clipboard}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/clipboard/clipboard_history.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
- {frontengine-1.0.68/frontengine/utils/critical_exit → frontengine-1.0.70/frontengine/utils/color_vision}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/color_vision/color_vision.py +0 -0
- {frontengine-1.0.68/frontengine/utils/focus_shield → frontengine-1.0.70/frontengine/utils/critical_exit}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/critical_exit/critical_exit.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/critical_exit/win32_vk.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/exception/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/exception/exception_tags.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/exception/exceptions.py +0 -0
- {frontengine-1.0.68/frontengine/utils/focus_timer → frontengine-1.0.70/frontengine/utils/focus_shield}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/focus_shield/focus_shield.py +0 -0
- {frontengine-1.0.68/frontengine/utils/hotkey → frontengine-1.0.70/frontengine/utils/focus_timer}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/focus_timer/focus_timer.py +0 -0
- {frontengine-1.0.68/frontengine/utils/input_watch → frontengine-1.0.70/frontengine/utils/hotkey}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/hotkey/hotkey_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/json → frontengine-1.0.70/frontengine/utils/input_watch}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/input_watch/input_watch_service.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/input_watch/typing_watch.py +0 -0
- {frontengine-1.0.68/frontengine/utils/logging → frontengine-1.0.70/frontengine/utils/json}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/json/json_file.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/json/json_repository.py +0 -0
- {frontengine-1.0.68/frontengine/utils/measure → frontengine-1.0.70/frontengine/utils/keep_awake}/__init__.py +0 -0
- {frontengine-1.0.68/frontengine/utils/midi → frontengine-1.0.70/frontengine/utils/logging}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/logging/loggin_instance.py +0 -0
- {frontengine-1.0.68/frontengine/utils/multi_language → frontengine-1.0.70/frontengine/utils/measure}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/measure/measure.py +0 -0
- {frontengine-1.0.68/frontengine/utils/now_playing → frontengine-1.0.70/frontengine/utils/midi}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/midi/midi_input.py +0 -0
- {frontengine-1.0.68/frontengine/utils/pet_chat → frontengine-1.0.70/frontengine/utils/multi_language}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/language_wrapper.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/retranslate.py +0 -0
- {frontengine-1.0.68/frontengine/utils/platform_info → frontengine-1.0.70/frontengine/utils/now_playing}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/now_playing/now_playing.py +0 -0
- {frontengine-1.0.68/frontengine/utils/playlist → frontengine-1.0.70/frontengine/utils/pet_chat}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/plugins → frontengine-1.0.70/frontengine/utils/platform_info}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/platform_info/platform_info.py +0 -0
- {frontengine-1.0.68/frontengine/utils/power_mode → frontengine-1.0.70/frontengine/utils/playlist}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/playlist/playlist.py +0 -0
- {frontengine-1.0.68/frontengine/utils/preset_schedule → frontengine-1.0.70/frontengine/utils/plugins}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/plugins/plugin_loader.py +0 -0
- {frontengine-1.0.68/frontengine/utils/recording → frontengine-1.0.70/frontengine/utils/power_mode}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/power_mode/power_mode.py +0 -0
- {frontengine-1.0.68/frontengine/utils/redirect_manager → frontengine-1.0.70/frontengine/utils/preset_schedule}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/reminder → frontengine-1.0.70/frontengine/utils/recording}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/recording/frame_recorder.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/recording/gif_writer.py +0 -0
- {frontengine-1.0.68/frontengine/utils/remote → frontengine-1.0.70/frontengine/utils/redirect_manager}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
- {frontengine-1.0.68/frontengine/utils/screen_privacy → frontengine-1.0.70/frontengine/utils/reminder}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/reminder/reminder_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/screen_text → frontengine-1.0.70/frontengine/utils/remote}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/remote/remote_server.py +0 -0
- {frontengine-1.0.68/frontengine/utils/screensaver → frontengine-1.0.70/frontengine/utils/screen_privacy}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/screen_privacy/share_watch.py +0 -0
- {frontengine-1.0.68/frontengine/utils/signage → frontengine-1.0.70/frontengine/utils/screen_text}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/screen_text/screen_text_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/smart_pause → frontengine-1.0.70/frontengine/utils/screensaver}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/screensaver/screensaver_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/steam → frontengine-1.0.70/frontengine/utils/signage}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/signage/signage_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/system_stats → frontengine-1.0.70/frontengine/utils/smart_pause}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/smart_pause/pause_rules.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/text_source → frontengine-1.0.70/frontengine/utils/steam}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/steam/steam_language.py +0 -0
- {frontengine-1.0.68/frontengine/utils/theme_schedule → frontengine-1.0.70/frontengine/utils/system_stats}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/system_stats/system_stats.py +0 -0
- {frontengine-1.0.68/frontengine/utils/usage_tracking → frontengine-1.0.70/frontengine/utils/text_source}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/text_source/text_source.py +0 -0
- {frontengine-1.0.68/frontengine/utils/virtual_camera → frontengine-1.0.70/frontengine/utils/theme_schedule}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
- {frontengine-1.0.68/frontengine/utils/weather → frontengine-1.0.70/frontengine/utils/usage_tracking}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/usage_tracking/usage_service.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
- {frontengine-1.0.68/frontengine/utils/window_pin → frontengine-1.0.70/frontengine/utils/virtual_camera}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
- {frontengine-1.0.68/frontengine/utils/window_replica → frontengine-1.0.70/frontengine/utils/weather}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/weather/weather_service.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/web_url.py +0 -0
- {frontengine-1.0.68/frontengine/utils/workshop → frontengine-1.0.70/frontengine/utils/window_pin}/__init__.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/window_pin/window_layout.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/window_pin/window_pin.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/workshop/workshop_content.py +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/dependency_links.txt +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/entry_points.txt +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/requires.txt +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/frontengine.egg-info/top_level.txt +0 -0
- {frontengine-1.0.68 → frontengine-1.0.70}/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.70
|
|
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,152 @@
|
|
|
1
|
+
"""
|
|
2
|
+
快速鍵速查表:把目前綁定的全域快速鍵列在畫面上。
|
|
3
|
+
|
|
4
|
+
快速鍵改得掉,所以印在說明文件裡的那份遲早會過時;這一份是直接從實際生效的綁定
|
|
5
|
+
讀出來的,改過就跟著改。
|
|
6
|
+
|
|
7
|
+
排版與文字是純函式(`sheet_rows`),所以「顯示的內容對不對」不必開視窗就能驗。
|
|
8
|
+
|
|
9
|
+
A shortcut cheat sheet: the global shortcuts as they are actually bound.
|
|
10
|
+
|
|
11
|
+
Shortcuts can be rebound, so any list written into the documentation goes stale;
|
|
12
|
+
this one is read from the bindings in force and follows them.
|
|
13
|
+
|
|
14
|
+
The rows are produced by a pure function (`sheet_rows`), so what it says can be
|
|
15
|
+
checked without opening a window.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Dict, List, Optional, Tuple
|
|
20
|
+
|
|
21
|
+
from PySide6.QtCore import Qt
|
|
22
|
+
from PySide6.QtGui import QColor, QFont, QPainter
|
|
23
|
+
from PySide6.QtWidgets import QApplication
|
|
24
|
+
|
|
25
|
+
from frontengine.show.base_widget import BaseWidget
|
|
26
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
27
|
+
|
|
28
|
+
# pynput 的寫法轉成看得懂的樣子
|
|
29
|
+
# pynput spellings turned into something readable
|
|
30
|
+
_PRETTY = {
|
|
31
|
+
"ctrl": "Ctrl", "alt": "Alt", "shift": "Shift", "cmd": "Cmd",
|
|
32
|
+
"up": "Up", "down": "Down", "left": "Left", "right": "Right",
|
|
33
|
+
"space": "Space", "enter": "Enter", "esc": "Esc", "tab": "Tab",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def pretty_combo(combo: str) -> str:
|
|
38
|
+
"""
|
|
39
|
+
把 `<ctrl>+<shift>+<f12>` 變成 `Ctrl + Shift + F12`。
|
|
40
|
+
|
|
41
|
+
使用者是在對照畫面上按下去的手指,不是在讀設定檔,所以尖括號和小寫都要去掉。
|
|
42
|
+
Turn `<ctrl>+<shift>+<f12>` into `Ctrl + Shift + F12`. The reader is matching
|
|
43
|
+
this against their fingers, not against a settings file, so the angle
|
|
44
|
+
brackets and the lower case go.
|
|
45
|
+
"""
|
|
46
|
+
parts = []
|
|
47
|
+
for raw in str(combo or "").split("+"):
|
|
48
|
+
name = raw.strip().strip("<>").strip()
|
|
49
|
+
if not name:
|
|
50
|
+
continue
|
|
51
|
+
if name in _PRETTY:
|
|
52
|
+
parts.append(_PRETTY[name])
|
|
53
|
+
elif len(name) > 1 and name[0] == "f" and name[1:].isdigit():
|
|
54
|
+
parts.append(name.upper())
|
|
55
|
+
else:
|
|
56
|
+
parts.append(name.upper() if len(name) == 1 else name.capitalize())
|
|
57
|
+
return " + ".join(parts)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def sheet_rows(bindings: Dict[str, str], label_for) -> List[Tuple[str, str]]:
|
|
61
|
+
"""
|
|
62
|
+
產生 (快速鍵, 動作說明) 的清單,依動作說明排序。
|
|
63
|
+
|
|
64
|
+
`bindings` 是「組合字串 -> 動作名稱」,和 HotkeyService 用的同一份,所以這裡
|
|
65
|
+
列出來的一定就是實際會生效的。沒有綁定時回傳空清單,呼叫端才能說「沒有」而
|
|
66
|
+
不是開一個空白視窗。
|
|
67
|
+
Rows of (shortcut, what it does), sorted by the description.
|
|
68
|
+
|
|
69
|
+
`bindings` is the same combo-to-action mapping HotkeyService uses, so what
|
|
70
|
+
is listed is what will actually fire. With nothing bound this returns an
|
|
71
|
+
empty list, so the caller can say so rather than opening a blank window.
|
|
72
|
+
"""
|
|
73
|
+
rows = []
|
|
74
|
+
for combo, action in (bindings or {}).items():
|
|
75
|
+
if not combo or not action:
|
|
76
|
+
continue
|
|
77
|
+
rows.append((pretty_combo(combo), label_for(action)))
|
|
78
|
+
return sorted(rows, key=lambda row: row[1].lower())
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ShortcutSheetWidget(BaseWidget):
|
|
82
|
+
"""把速查表畫在畫面中央,點擊穿透。"""
|
|
83
|
+
|
|
84
|
+
PADDING = 28
|
|
85
|
+
LINE_SPACING = 10
|
|
86
|
+
|
|
87
|
+
def __init__(self, rows: List[Tuple[str, str]], title: str = "Shortcuts",
|
|
88
|
+
font_size: int = 20, opacity: float = 0.9) -> None:
|
|
89
|
+
front_engine_logger.info(f"[ShortcutSheetWidget] Init | rows={len(rows)}")
|
|
90
|
+
super().__init__()
|
|
91
|
+
self.opacity = max(0.1, min(1.0, float(opacity)))
|
|
92
|
+
self.rows = list(rows)
|
|
93
|
+
self.title = title
|
|
94
|
+
self.font_size = max(10, int(font_size))
|
|
95
|
+
self.text_color = QColor("#ffffff")
|
|
96
|
+
self.key_color = QColor("#ffd740")
|
|
97
|
+
self.background_color = QColor(0, 0, 0, 210)
|
|
98
|
+
|
|
99
|
+
def sizeHint(self): # pragma: no cover - Qt geometry
|
|
100
|
+
screen = QApplication.primaryScreen()
|
|
101
|
+
available = screen.availableGeometry() if screen is not None else None
|
|
102
|
+
if available is None:
|
|
103
|
+
return super().sizeHint()
|
|
104
|
+
return available.size() / 2
|
|
105
|
+
|
|
106
|
+
def draw_content(self, painter: QPainter) -> None:
|
|
107
|
+
painter.fillRect(self.rect(), self.background_color)
|
|
108
|
+
|
|
109
|
+
title_font = QFont()
|
|
110
|
+
title_font.setPixelSize(int(self.font_size * 1.3))
|
|
111
|
+
title_font.setBold(True)
|
|
112
|
+
painter.setFont(title_font)
|
|
113
|
+
painter.setPen(self.text_color)
|
|
114
|
+
y = self.PADDING + int(self.font_size * 1.3)
|
|
115
|
+
painter.drawText(self.PADDING, y, self.title)
|
|
116
|
+
|
|
117
|
+
row_font = QFont()
|
|
118
|
+
row_font.setPixelSize(self.font_size)
|
|
119
|
+
painter.setFont(row_font)
|
|
120
|
+
y += int(self.font_size * 1.4)
|
|
121
|
+
|
|
122
|
+
# 左欄放快速鍵、右欄放說明。欄寬固定,兩欄才會各自對齊成一直線。
|
|
123
|
+
# Shortcut on the left, description on the right, at a fixed column so
|
|
124
|
+
# both line up rather than drifting with the text.
|
|
125
|
+
key_column = self.PADDING
|
|
126
|
+
text_column = self.PADDING + int(self.font_size * 11)
|
|
127
|
+
for combo, description in self.rows:
|
|
128
|
+
y += self.font_size + self.LINE_SPACING
|
|
129
|
+
painter.setPen(self.key_color)
|
|
130
|
+
painter.drawText(key_column, y, combo)
|
|
131
|
+
painter.setPen(self.text_color)
|
|
132
|
+
painter.drawText(text_column, y, description)
|
|
133
|
+
|
|
134
|
+
def keyPressEvent(self, event) -> None: # pragma: no cover - Qt event
|
|
135
|
+
if event.key() in (Qt.Key.Key_Escape,):
|
|
136
|
+
self.close()
|
|
137
|
+
return
|
|
138
|
+
super().keyPressEvent(event)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def build_sheet(bindings: Dict[str, str], label_for, title: str = "Shortcuts",
|
|
142
|
+
font_size: int = 20) -> Optional[ShortcutSheetWidget]:
|
|
143
|
+
"""
|
|
144
|
+
建立速查表;沒有任何綁定時回傳 None。
|
|
145
|
+
Build the sheet, or None when nothing is bound - an empty black rectangle
|
|
146
|
+
explains nothing.
|
|
147
|
+
"""
|
|
148
|
+
rows = sheet_rows(bindings, label_for)
|
|
149
|
+
if not rows:
|
|
150
|
+
front_engine_logger.info("[ShortcutSheetWidget] nothing bound, not showing")
|
|
151
|
+
return None
|
|
152
|
+
return ShortcutSheetWidget(rows, title=title, font_size=font_size)
|
|
@@ -32,6 +32,7 @@ _ACTION_LABELS: Dict[str, Tuple[str, str]] = {
|
|
|
32
32
|
"opacity_down": ("hotkey_opacity_down", "Opacity down"),
|
|
33
33
|
"dashboard_next": ("web_dashboard_next", "Next page"),
|
|
34
34
|
"toggle_lock": ("hotkey_toggle_lock", "Lock / unlock overlays"),
|
|
35
|
+
"show_shortcuts": ("hotkey_show_shortcuts", "Show this shortcut list"),
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
|
|
@@ -39,6 +40,20 @@ def _t(key: str, fallback: str) -> str:
|
|
|
39
40
|
return language_wrapper.language_word_dict.get(key, fallback)
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
def action_label(action: str) -> str:
|
|
44
|
+
"""
|
|
45
|
+
動作名稱的顯示文字,翻不到就退回動作名稱本身。
|
|
46
|
+
|
|
47
|
+
速查表和這個對話框共用同一張表:兩邊各記一份的話,改了快速鍵的說明只會改到
|
|
48
|
+
其中一邊,而使用者看到的是兩個不同的名字。
|
|
49
|
+
The display text for an action, falling back to the action name. The cheat
|
|
50
|
+
sheet and this dialog share one table: with a copy each, renaming a shortcut
|
|
51
|
+
updates only one of them and the user sees two different names.
|
|
52
|
+
"""
|
|
53
|
+
key, fallback = _ACTION_LABELS.get(action, ("", str(action)))
|
|
54
|
+
return _t(key, fallback) if key else fallback
|
|
55
|
+
|
|
56
|
+
|
|
42
57
|
class HotkeySettingsDialog(QDialog):
|
|
43
58
|
"""
|
|
44
59
|
讓使用者以 pynput 組合鍵語法(例如 <ctrl>+<shift>+<f12>)重新綁定全域
|
|
@@ -15,6 +15,7 @@ from qt_material import apply_stylesheet
|
|
|
15
15
|
from frontengine.ui.nav.sidebar import NavigationSidebar
|
|
16
16
|
from frontengine.ui.style.app_style import apply_app_style
|
|
17
17
|
|
|
18
|
+
from frontengine.show.shortcuts.shortcut_sheet import build_sheet
|
|
18
19
|
from frontengine.show.toast.toast_widget import show_toast
|
|
19
20
|
from frontengine.system_tray.extend_system_tray import ExtendSystemTray
|
|
20
21
|
from frontengine.ui.menu.help_menu import build_help_menu
|
|
@@ -52,9 +53,10 @@ from frontengine.utils.steam.steam_language import steam_language
|
|
|
52
53
|
from frontengine.utils.critical_exit.critical_exit import CriticalExit
|
|
53
54
|
from frontengine.utils.critical_exit.win32_vk import keyboard_keys_table
|
|
54
55
|
from frontengine.utils.hotkey.hotkey_service import HotkeyService
|
|
56
|
+
from frontengine.utils.keep_awake.keep_awake import KeepAwake
|
|
55
57
|
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
56
58
|
from frontengine.utils.multi_language.language_wrapper import language_wrapper
|
|
57
|
-
from frontengine.utils.multi_language.retranslate import retranslator
|
|
59
|
+
from frontengine.utils.multi_language.retranslate import retranslator, translate
|
|
58
60
|
from frontengine.utils.plugins.plugin_loader import load_plugins
|
|
59
61
|
from frontengine.utils.preset_schedule.preset_schedule_service import PresetScheduleService
|
|
60
62
|
from frontengine.ui.dialog.remote_control_dialog import (
|
|
@@ -65,6 +67,7 @@ from frontengine.ui.dialog.signage_dialog import current_settings as current_sig
|
|
|
65
67
|
from frontengine.utils.signage.signage_service import SignageService
|
|
66
68
|
from frontengine.utils.midi.midi_input import MidiInput, binding_key
|
|
67
69
|
from frontengine.utils.remote.remote_server import RemoteServer
|
|
70
|
+
from frontengine.ui.dialog.hotkey_settings_dialog import action_label as hotkey_action_label
|
|
68
71
|
from frontengine.ui.dialog.smart_pause_dialog import current_rules
|
|
69
72
|
from frontengine.utils.screen_privacy.share_watch import ShareWatchService
|
|
70
73
|
from frontengine.utils.screensaver.screensaver_service import ScreensaverService
|
|
@@ -330,6 +333,12 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
330
333
|
)
|
|
331
334
|
self.preset_schedule_service.start()
|
|
332
335
|
|
|
336
|
+
# 保持喚醒:覆蓋層放著的時候別讓螢幕睡著
|
|
337
|
+
# Keep awake: do not let the display sleep while an overlay is up
|
|
338
|
+
self.keep_awake = KeepAwake()
|
|
339
|
+
if user_setting_dict.get("keep_awake"):
|
|
340
|
+
self.keep_awake.enable()
|
|
341
|
+
|
|
333
342
|
# 閒置夠久就把選定的覆蓋層放上來 / Show the chosen overlay once idle
|
|
334
343
|
self._screensaver_overlays: list = []
|
|
335
344
|
self.screensaver_service = ScreensaverService(
|
|
@@ -682,6 +691,33 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
682
691
|
self.web_setting_ui.show_next_dashboard_page()
|
|
683
692
|
elif action == "toggle_lock":
|
|
684
693
|
self.control_center_ui.toggle_lock_all()
|
|
694
|
+
elif action == "show_shortcuts":
|
|
695
|
+
self.toggle_shortcut_sheet()
|
|
696
|
+
|
|
697
|
+
def toggle_shortcut_sheet(self) -> None:
|
|
698
|
+
"""
|
|
699
|
+
開關快速鍵速查表。已經開著就收起來,所以同一個快速鍵按第二次是關閉——
|
|
700
|
+
不然使用者得去找別的方法把它關掉。
|
|
701
|
+
Toggle the shortcut sheet: pressing the same shortcut again closes it,
|
|
702
|
+
rather than leaving the user hunting for another way to dismiss it.
|
|
703
|
+
"""
|
|
704
|
+
existing = getattr(self, "shortcut_sheet", None)
|
|
705
|
+
if existing is not None:
|
|
706
|
+
try:
|
|
707
|
+
existing.close()
|
|
708
|
+
except RuntimeError: # pragma: no cover - 底層物件已消失
|
|
709
|
+
pass
|
|
710
|
+
self.shortcut_sheet = None
|
|
711
|
+
return
|
|
712
|
+
sheet = build_sheet(
|
|
713
|
+
get_hotkey_bindings(),
|
|
714
|
+
lambda action: hotkey_action_label(action),
|
|
715
|
+
title=translate("shortcut_sheet_title", "Shortcuts"))
|
|
716
|
+
if sheet is None:
|
|
717
|
+
return
|
|
718
|
+
sheet.set_ui_window_flag()
|
|
719
|
+
sheet.showFullScreen()
|
|
720
|
+
self.shortcut_sheet = sheet
|
|
685
721
|
|
|
686
722
|
def _on_smart_pause_changed(self, paused: bool, reason: str) -> None:
|
|
687
723
|
"""
|
|
@@ -858,6 +894,11 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
858
894
|
if user_setting_dict.get("restore_last_session"):
|
|
859
895
|
save_last_session(self)
|
|
860
896
|
self._stop_services()
|
|
897
|
+
# 執行緒執行狀態跟著行程活著,不放開的話關掉程式之後螢幕還是不會睡。
|
|
898
|
+
# The execution state lives with the process: without releasing it the
|
|
899
|
+
# display keeps refusing to sleep after the application is gone.
|
|
900
|
+
if getattr(self, "keep_awake", None) is not None:
|
|
901
|
+
self.keep_awake.disable()
|
|
861
902
|
self._save_page_state()
|
|
862
903
|
self._save_window_geometry()
|
|
863
904
|
write_user_setting()
|
|
@@ -36,6 +36,18 @@ def build_help_menu(ui_we_want_to_set: FrontEngineMainUI) -> None:
|
|
|
36
36
|
"How to use..."
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
+
# 也要能從選單開。只能用快速鍵叫出來的「快速鍵速查表」是個笑話:不知道快速鍵
|
|
40
|
+
# 的人正是最需要它的人。
|
|
41
|
+
# It has to be reachable from the menu too. A shortcut sheet you can only open
|
|
42
|
+
# with a shortcut is a joke: the person who does not know the shortcuts is
|
|
43
|
+
# exactly who needs it.
|
|
44
|
+
_add_action(
|
|
45
|
+
help_menu,
|
|
46
|
+
"shortcut_sheet_action",
|
|
47
|
+
lambda: ui_we_want_to_set.toggle_shortcut_sheet(),
|
|
48
|
+
"Shortcut list..."
|
|
49
|
+
)
|
|
50
|
+
|
|
39
51
|
_add_action(
|
|
40
52
|
help_menu,
|
|
41
53
|
"help_menu_open_issue",
|
|
@@ -13,6 +13,7 @@ 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
15
|
from frontengine.ui.dialog.screensaver_dialog import ScreensaverDialog
|
|
16
|
+
from frontengine.utils.keep_awake.keep_awake import available as keep_awake_available
|
|
16
17
|
from frontengine.ui.dialog.signage_dialog import SignageDialog
|
|
17
18
|
from frontengine.ui.dialog.smart_pause_dialog import SmartPauseDialog
|
|
18
19
|
from frontengine.ui.dialog.usage_report_dialog import UsageReportDialog
|
|
@@ -73,6 +74,15 @@ def build_settings_menu(ui: "FrontEngineMainUI") -> None:
|
|
|
73
74
|
menu.addAction(autostart_action)
|
|
74
75
|
ui.autostart_action = autostart_action
|
|
75
76
|
|
|
77
|
+
keep_awake_action = QAction(_t("settings_menu_keep_awake", "Keep the screen awake"), menu)
|
|
78
|
+
retranslator.bind(keep_awake_action, "settings_menu_keep_awake", "Keep the screen awake")
|
|
79
|
+
keep_awake_action.setCheckable(True)
|
|
80
|
+
keep_awake_action.setChecked(bool(user_setting_dict.get("keep_awake")))
|
|
81
|
+
keep_awake_action.setEnabled(keep_awake_available())
|
|
82
|
+
keep_awake_action.toggled.connect(lambda checked: _toggle_keep_awake(ui, checked))
|
|
83
|
+
menu.addAction(keep_awake_action)
|
|
84
|
+
ui.keep_awake_action = keep_awake_action
|
|
85
|
+
|
|
76
86
|
restore_action = QAction(_t("settings_menu_restore_session", "Restore last session"), menu)
|
|
77
87
|
retranslator.bind(restore_action, "settings_menu_restore_session", "Restore last session")
|
|
78
88
|
restore_action.setCheckable(True)
|
|
@@ -180,6 +190,25 @@ def _dispose(dialog: QDialog) -> None:
|
|
|
180
190
|
dialog.deleteLater()
|
|
181
191
|
|
|
182
192
|
|
|
193
|
+
def _toggle_keep_awake(ui: "FrontEngineMainUI", enabled: bool) -> None:
|
|
194
|
+
"""開關保持喚醒,並把選擇記下來。做不到時把勾勾拿掉,不要留一個假的開著。"""
|
|
195
|
+
service = getattr(ui, "keep_awake", None)
|
|
196
|
+
if service is None:
|
|
197
|
+
return
|
|
198
|
+
if enabled and not service.enable():
|
|
199
|
+
# 開不起來就把選單的勾勾收回去:勾著卻沒生效比沒有這個選項更糟。
|
|
200
|
+
# If it could not be held, untick: a ticked box that does nothing is
|
|
201
|
+
# worse than no box at all.
|
|
202
|
+
action = getattr(ui, "keep_awake_action", None)
|
|
203
|
+
if action is not None:
|
|
204
|
+
action.setChecked(False)
|
|
205
|
+
return
|
|
206
|
+
if not enabled:
|
|
207
|
+
service.disable()
|
|
208
|
+
user_setting_dict["keep_awake"] = bool(enabled)
|
|
209
|
+
write_user_setting()
|
|
210
|
+
|
|
211
|
+
|
|
183
212
|
def _open_signage_dialog(ui: "FrontEngineMainUI") -> None:
|
|
184
213
|
"""開看板設定;按下確定後立刻套用新的輪播狀態。"""
|
|
185
214
|
front_engine_logger.info("[SettingsMenu] open SignageDialog")
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""
|
|
2
|
+
保持喚醒:開著覆蓋層的時候別讓螢幕睡著。
|
|
3
|
+
|
|
4
|
+
這是螢幕保護的另一面。放了影片、看板或簡報層在畫面上,系統照樣會在幾分鐘後把
|
|
5
|
+
螢幕關掉——那正是最不該關的時候。
|
|
6
|
+
|
|
7
|
+
三個平台各自用系統既有的方式,都不需要新相依:Windows 是一個 Win32 呼叫,
|
|
8
|
+
macOS 與 Linux 是常駐一個系統本來就有的小程式(`caffeinate` / `systemd-inhibit`)
|
|
9
|
+
並在結束時終止它。做不到的平台照實回報,不假裝成功。
|
|
10
|
+
|
|
11
|
+
Keep awake: stop the screen sleeping while an overlay is up.
|
|
12
|
+
|
|
13
|
+
This is the other side of the screensaver. With a video, a signage rotation or a
|
|
14
|
+
presenting layer on screen, the system still blanks the display after a few
|
|
15
|
+
minutes - exactly when it should not.
|
|
16
|
+
|
|
17
|
+
Each platform uses what it already has, with no new dependency: one Win32 call on
|
|
18
|
+
Windows, and on macOS and Linux a small program that ships with the system
|
|
19
|
+
(`caffeinate` / `systemd-inhibit`) held open and terminated on release. A
|
|
20
|
+
platform that cannot do it says so rather than pretending.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import shutil
|
|
25
|
+
import subprocess # nosec B404 - only runs the fixed argv in _HELPERS below
|
|
26
|
+
import sys
|
|
27
|
+
from typing import List, Optional
|
|
28
|
+
|
|
29
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
30
|
+
|
|
31
|
+
# SetThreadExecutionState 的旗標 / Flags for SetThreadExecutionState
|
|
32
|
+
ES_CONTINUOUS = 0x80000000
|
|
33
|
+
ES_SYSTEM_REQUIRED = 0x00000001
|
|
34
|
+
ES_DISPLAY_REQUIRED = 0x00000002
|
|
35
|
+
|
|
36
|
+
# 非 Windows 平台用的常駐小程式。argv 全部寫死在這裡,沒有任何外部輸入。
|
|
37
|
+
# The helper held open on the other platforms. Every argv is literal here; no
|
|
38
|
+
# outside input reaches it.
|
|
39
|
+
_HELPERS = {
|
|
40
|
+
"darwin": ["/usr/bin/caffeinate", "-dimsu"],
|
|
41
|
+
"linux": ["systemd-inhibit", "--what=idle:sleep",
|
|
42
|
+
"--who=FrontEngine", "--why=Overlay on screen", "--mode=block",
|
|
43
|
+
"sleep", "infinity"],
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def helper_command() -> Optional[List[str]]:
|
|
48
|
+
"""這個平台要跑哪一個小程式;Windows 或找不到程式時回傳 None。"""
|
|
49
|
+
command = _HELPERS.get(sys.platform)
|
|
50
|
+
if command is None:
|
|
51
|
+
return None
|
|
52
|
+
return command if shutil.which(command[0]) else None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def available() -> bool:
|
|
56
|
+
"""這個平台能不能阻止螢幕睡著。"""
|
|
57
|
+
if sys.platform == "win32":
|
|
58
|
+
return True
|
|
59
|
+
return helper_command() is not None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class KeepAwake:
|
|
63
|
+
"""
|
|
64
|
+
保持喚醒的開關。enable() 開始、disable() 放開,兩者重複呼叫都是安全的。
|
|
65
|
+
|
|
66
|
+
**一定要記得放開。** Windows 的執行緒執行狀態會跟著行程活著,忘了還原的話,
|
|
67
|
+
使用者關掉這個選項、甚至關掉整個程式之後,螢幕還是不會依設定睡著——而且看不出
|
|
68
|
+
是誰造成的。
|
|
69
|
+
A keep-awake switch. enable() holds it, disable() lets go, and both are safe
|
|
70
|
+
to call twice.
|
|
71
|
+
|
|
72
|
+
**Releasing matters.** The Windows execution state lives as long as the
|
|
73
|
+
process: forget to restore it and the display stops sleeping even after the
|
|
74
|
+
user switches the option off, with nothing on screen to say why.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def __init__(self) -> None:
|
|
78
|
+
self._active = False
|
|
79
|
+
self._process: Optional[subprocess.Popen] = None
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def active(self) -> bool:
|
|
83
|
+
return self._active
|
|
84
|
+
|
|
85
|
+
def enable(self, keep_display_on: bool = True) -> bool:
|
|
86
|
+
"""開始保持喚醒;做不到就回傳 False。"""
|
|
87
|
+
if self._active:
|
|
88
|
+
return True
|
|
89
|
+
if not available():
|
|
90
|
+
front_engine_logger.info("[KeepAwake] not supported on this platform")
|
|
91
|
+
return False
|
|
92
|
+
if sys.platform == "win32":
|
|
93
|
+
if not self._windows_state(keep_display_on):
|
|
94
|
+
return False
|
|
95
|
+
elif not self._start_helper():
|
|
96
|
+
return False
|
|
97
|
+
self._active = True
|
|
98
|
+
front_engine_logger.info(f"[KeepAwake] on | display={keep_display_on}")
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
def disable(self) -> None:
|
|
102
|
+
"""放開,讓系統回到原本的睡眠設定。重複呼叫是安全的。"""
|
|
103
|
+
if not self._active:
|
|
104
|
+
return
|
|
105
|
+
if sys.platform == "win32":
|
|
106
|
+
self._windows_state(False, release=True)
|
|
107
|
+
self._stop_helper()
|
|
108
|
+
self._active = False
|
|
109
|
+
front_engine_logger.info("[KeepAwake] off")
|
|
110
|
+
|
|
111
|
+
# --- platform boundaries ---------------------------------------------
|
|
112
|
+
@staticmethod
|
|
113
|
+
def _windows_state(keep_display_on: bool, release: bool = False) -> bool: # pragma: no cover - Win32
|
|
114
|
+
try:
|
|
115
|
+
import ctypes
|
|
116
|
+
|
|
117
|
+
if release:
|
|
118
|
+
flags = ES_CONTINUOUS
|
|
119
|
+
else:
|
|
120
|
+
flags = ES_CONTINUOUS | ES_SYSTEM_REQUIRED
|
|
121
|
+
if keep_display_on:
|
|
122
|
+
flags |= ES_DISPLAY_REQUIRED
|
|
123
|
+
# 回傳 0 代表失敗;不檢查的話會以為已經開著,其實螢幕照樣會睡。
|
|
124
|
+
# A zero return means it failed; unchecked, this would report success
|
|
125
|
+
# while the display goes on sleeping anyway.
|
|
126
|
+
return bool(ctypes.windll.kernel32.SetThreadExecutionState(ctypes.c_uint(flags)))
|
|
127
|
+
except Exception as error:
|
|
128
|
+
front_engine_logger.warning(f"[KeepAwake] SetThreadExecutionState failed: {error!r}")
|
|
129
|
+
return False
|
|
130
|
+
|
|
131
|
+
def _start_helper(self) -> bool: # pragma: no cover - process boundary
|
|
132
|
+
command = helper_command()
|
|
133
|
+
if command is None:
|
|
134
|
+
return False
|
|
135
|
+
try:
|
|
136
|
+
self._process = subprocess.Popen( # nosec B603 # nosemgrep - literal argv, shell=False
|
|
137
|
+
command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
|
138
|
+
stdin=subprocess.DEVNULL, shell=False)
|
|
139
|
+
return True
|
|
140
|
+
except OSError as error:
|
|
141
|
+
front_engine_logger.warning(f"[KeepAwake] helper failed: {error!r}")
|
|
142
|
+
self._process = None
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
def _stop_helper(self) -> None: # pragma: no cover - process boundary
|
|
146
|
+
process = self._process
|
|
147
|
+
self._process = None
|
|
148
|
+
if process is None:
|
|
149
|
+
return
|
|
150
|
+
try:
|
|
151
|
+
process.terminate()
|
|
152
|
+
process.wait(timeout=5)
|
|
153
|
+
except Exception as error:
|
|
154
|
+
front_engine_logger.warning(f"[KeepAwake] helper stop failed: {error!r}")
|
|
@@ -465,6 +465,7 @@ english_word_dict = {
|
|
|
465
465
|
"pet_chatter_battery": "Battery's low - plug me in?|Low power, careful!|Find a charger soon?|Running on fumes here~",
|
|
466
466
|
"pet_start": "Spawn pet",
|
|
467
467
|
"pet_message_box_text": "Pet image not found",
|
|
468
|
+
"settings_menu_keep_awake": "Keep the screen awake",
|
|
468
469
|
"settings_menu_smart_pause": "Smart pause...",
|
|
469
470
|
"settings_menu_app_profiles": "App profiles...",
|
|
470
471
|
"settings_menu_reminders": "Reminders...",
|
|
@@ -568,6 +569,9 @@ english_word_dict = {
|
|
|
568
569
|
"clipboard_clear": 'Clear (keep pinned)',
|
|
569
570
|
"clipboard_persist": 'Keep this history between sessions',
|
|
570
571
|
"clipboard_hint": 'History stays on this machine and is never sent anywhere. Unless you tick the box above it is kept in memory only, because clipboards often hold passwords.',
|
|
572
|
+
"shortcut_sheet_title": "Shortcuts",
|
|
573
|
+
"shortcut_sheet_action": "Shortcut list...",
|
|
574
|
+
"hotkey_show_shortcuts": "Show this shortcut list",
|
|
571
575
|
"tools_layout_label": 'Window layout',
|
|
572
576
|
"tools_layout_name": 'Layout name',
|
|
573
577
|
"tools_layout_save": 'Save layout',
|
|
@@ -455,6 +455,7 @@ french_word_dict = {
|
|
|
455
455
|
"pet_chatter_battery": "La batterie est faible — tu me branches ?|Peu d'énergie, attention !|On trouve un chargeur ?|Je suis sur la réserve~",
|
|
456
456
|
"pet_start": "Faire apparaître la mascotte",
|
|
457
457
|
"pet_message_box_text": "Image de mascotte introuvable",
|
|
458
|
+
"settings_menu_keep_awake": "Garder l'écran allumé",
|
|
458
459
|
"settings_menu_smart_pause": "Pause intelligente…",
|
|
459
460
|
"settings_menu_app_profiles": "Profils d'application…",
|
|
460
461
|
"settings_menu_reminders": "Rappels…",
|
|
@@ -558,6 +559,9 @@ french_word_dict = {
|
|
|
558
559
|
"clipboard_clear": "Effacer (garder les épinglés)",
|
|
559
560
|
"clipboard_persist": "Conserver cet historique d'une session à l'autre",
|
|
560
561
|
"clipboard_hint": "L'historique reste sur cette machine et n'est jamais envoyé ailleurs. Sauf si vous cochez la case ci-dessus, il n'est gardé qu'en mémoire, car les presse-papiers contiennent souvent des mots de passe.",
|
|
562
|
+
"shortcut_sheet_title": "Raccourcis",
|
|
563
|
+
"shortcut_sheet_action": "Liste des raccourcis...",
|
|
564
|
+
"hotkey_show_shortcuts": "Afficher cette liste de raccourcis",
|
|
561
565
|
"tools_layout_label": "Disposition des fenêtres",
|
|
562
566
|
"tools_layout_name": "Nom de la disposition",
|
|
563
567
|
"tools_layout_save": "Enregistrer la disposition",
|
|
@@ -457,6 +457,7 @@ germany_word_dict = {
|
|
|
457
457
|
"pet_chatter_battery": "Der Akku ist fast leer – steckst du mich an?|Wenig Energie, pass auf!|Bald ein Ladegerät finden?|Ich laufe auf Reserve~",
|
|
458
458
|
"pet_start": "Haustier erzeugen",
|
|
459
459
|
"pet_message_box_text": "Haustier-Bild nicht gefunden",
|
|
460
|
+
"settings_menu_keep_awake": "Bildschirm wach halten",
|
|
460
461
|
"settings_menu_smart_pause": "Intelligente Pause …",
|
|
461
462
|
"settings_menu_app_profiles": "App-Profile …",
|
|
462
463
|
"settings_menu_reminders": "Erinnerungen …",
|
|
@@ -561,6 +562,9 @@ germany_word_dict = {
|
|
|
561
562
|
"clipboard_clear": "Löschen (Angeheftetes behalten)",
|
|
562
563
|
"clipboard_persist": "Diesen Verlauf über Sitzungen hinweg behalten",
|
|
563
564
|
"clipboard_hint": "Der Verlauf bleibt auf diesem Rechner und wird niemals irgendwohin gesendet. Solange Sie das Kästchen oben nicht ankreuzen, bleibt er nur im Arbeitsspeicher – denn in Zwischenablagen stehen oft Passwörter.",
|
|
565
|
+
"shortcut_sheet_title": "Tastenkürzel",
|
|
566
|
+
"shortcut_sheet_action": "Tastenkürzel-Liste...",
|
|
567
|
+
"hotkey_show_shortcuts": "Diese Tastenkürzel-Liste anzeigen",
|
|
564
568
|
"tools_layout_label": "Fensteranordnung",
|
|
565
569
|
"tools_layout_name": "Name der Anordnung",
|
|
566
570
|
"tools_layout_save": "Anordnung speichern",
|
|
@@ -455,6 +455,7 @@ italian_word_dict = {
|
|
|
455
455
|
"pet_chatter_battery": "La batteria è quasi scarica — mi attacchi alla presa?|Poca energia, attenta!|Cerchiamo un caricabatterie?|Sono agli sgoccioli~",
|
|
456
456
|
"pet_start": "Fai comparire la mascotte",
|
|
457
457
|
"pet_message_box_text": "Immagine della mascotte non trovata",
|
|
458
|
+
"settings_menu_keep_awake": "Mantieni lo schermo attivo",
|
|
458
459
|
"settings_menu_smart_pause": "Pausa intelligente…",
|
|
459
460
|
"settings_menu_app_profiles": "Profili applicazione…",
|
|
460
461
|
"settings_menu_reminders": "Promemoria…",
|
|
@@ -558,6 +559,9 @@ italian_word_dict = {
|
|
|
558
559
|
"clipboard_clear": "Cancella (mantieni i fissati)",
|
|
559
560
|
"clipboard_persist": "Conserva questa cronologia tra una sessione e l'altra",
|
|
560
561
|
"clipboard_hint": "La cronologia resta su questa macchina e non viene mai inviata altrove. Se non spunti la casella qui sopra viene tenuta solo in memoria, perché negli appunti finiscono spesso delle password.",
|
|
562
|
+
"shortcut_sheet_title": "Scorciatoie",
|
|
563
|
+
"shortcut_sheet_action": "Elenco scorciatoie...",
|
|
564
|
+
"hotkey_show_shortcuts": "Mostra questo elenco di scorciatoie",
|
|
561
565
|
"tools_layout_label": "Disposizione delle finestre",
|
|
562
566
|
"tools_layout_name": "Nome della disposizione",
|
|
563
567
|
"tools_layout_save": "Salva la disposizione",
|
|
@@ -455,6 +455,7 @@ russian_word_dict = {
|
|
|
455
455
|
"pet_chatter_battery": "Батарея на исходе — подключишь меня?|Мало заряда, осторожнее!|Найдём зарядку?|Я на последних каплях~",
|
|
456
456
|
"pet_start": "Призвать питомца",
|
|
457
457
|
"pet_message_box_text": "Изображение питомца не найдено",
|
|
458
|
+
"settings_menu_keep_awake": "Не давать экрану гаснуть",
|
|
458
459
|
"settings_menu_smart_pause": "Умная пауза…",
|
|
459
460
|
"settings_menu_app_profiles": "Профили приложений…",
|
|
460
461
|
"settings_menu_reminders": "Напоминания…",
|
|
@@ -558,6 +559,9 @@ russian_word_dict = {
|
|
|
558
559
|
"clipboard_clear": "Очистить (оставить закреплённые)",
|
|
559
560
|
"clipboard_persist": "Сохранять эту историю между сеансами",
|
|
560
561
|
"clipboard_hint": "История остаётся на этом компьютере и никуда не отправляется. Пока флажок выше не установлен, она хранится только в памяти — ведь в буфере обмена часто оказываются пароли.",
|
|
562
|
+
"shortcut_sheet_title": "Горячие клавиши",
|
|
563
|
+
"shortcut_sheet_action": "Список горячих клавиш...",
|
|
564
|
+
"hotkey_show_shortcuts": "Показать этот список",
|
|
561
565
|
"tools_layout_label": "Расположение окон",
|
|
562
566
|
"tools_layout_name": "Название расположения",
|
|
563
567
|
"tools_layout_save": "Сохранить расположение",
|
{frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/simplified_chinese.py
RENAMED
|
@@ -456,6 +456,7 @@ simplified_chinese_word_dict = {
|
|
|
456
456
|
"pet_chatter_battery": "电池快没了 — 帮我插电?|电量低,小心点!|快找个充电器?|快撑不住了~",
|
|
457
457
|
"pet_start": "召唤宠物",
|
|
458
458
|
"pet_message_box_text": "找不到宠物图档",
|
|
459
|
+
"settings_menu_keep_awake": "保持屏幕唤醒",
|
|
459
460
|
"settings_menu_smart_pause": "智慧暂停…",
|
|
460
461
|
"settings_menu_app_profiles": "应用情境…",
|
|
461
462
|
"settings_menu_reminders": "提醒…",
|
|
@@ -560,6 +561,9 @@ simplified_chinese_word_dict = {
|
|
|
560
561
|
"clipboard_clear": "清除(保留钉选)",
|
|
561
562
|
"clipboard_persist": "跨工作阶段保留这份历史",
|
|
562
563
|
"clipboard_hint": "历史只留在这台机器上,不会送到任何地方。除非你勾选上面那个选项,否则只保存在记忆体里 — 因为剪贴板常常有密码。",
|
|
564
|
+
"shortcut_sheet_title": "快捷键",
|
|
565
|
+
"shortcut_sheet_action": "快捷键一览⋯",
|
|
566
|
+
"hotkey_show_shortcuts": "显示快捷键一览",
|
|
563
567
|
"tools_layout_label": "视窗版面",
|
|
564
568
|
"tools_layout_name": "版面名称",
|
|
565
569
|
"tools_layout_save": "储存版面",
|
{frontengine-1.0.68 → frontengine-1.0.70}/frontengine/utils/multi_language/traditional_chinese.py
RENAMED
|
@@ -464,6 +464,7 @@ traditional_chinese_word_dict = {
|
|
|
464
464
|
"pet_chatter_battery": "電量很低,幫我插電好嗎?|快沒電了,小心!|該找充電器囉?|我快撐不住了~",
|
|
465
465
|
"pet_start": "召喚寵物",
|
|
466
466
|
"pet_message_box_text": "找不到寵物圖片",
|
|
467
|
+
"settings_menu_keep_awake": "保持螢幕喚醒",
|
|
467
468
|
"settings_menu_smart_pause": "智慧暫停…",
|
|
468
469
|
"settings_menu_app_profiles": "程式對應預設集…",
|
|
469
470
|
"settings_menu_reminders": "自訂提醒…",
|
|
@@ -567,6 +568,9 @@ traditional_chinese_word_dict = {
|
|
|
567
568
|
"clipboard_clear": '清空(保留釘選)',
|
|
568
569
|
"clipboard_persist": '跨工作階段保存這份歷史',
|
|
569
570
|
"clipboard_hint": '歷史只留在本機、不會傳到任何地方。沒有勾選上面那項時只存在記憶體,因為剪貼簿裡常常有密碼。',
|
|
571
|
+
"shortcut_sheet_title": "快速鍵",
|
|
572
|
+
"shortcut_sheet_action": "快速鍵一覽⋯",
|
|
573
|
+
"hotkey_show_shortcuts": "顯示快速鍵一覽",
|
|
570
574
|
"tools_layout_label": '視窗版面',
|
|
571
575
|
"tools_layout_name": '版面名稱',
|
|
572
576
|
"tools_layout_save": '儲存版面',
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frontengine
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.70
|
|
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
|