frontengine 0.0.55__py3-none-any.whl → 0.0.56__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. frontengine/__init__.py +13 -14
  2. frontengine/show/gif/paint_gif.py +4 -2
  3. frontengine/show/image/paint_image.py +4 -2
  4. frontengine/show/sound_player/sound_effect.py +1 -2
  5. frontengine/show/sound_player/sound_player.py +1 -2
  6. frontengine/show/text/draw_text.py +4 -2
  7. frontengine/show/video/video_player.py +1 -2
  8. frontengine/show/web/webview.py +1 -3
  9. frontengine/{ui/main/system_tray → system_tray}/extend_system_tray.py +1 -3
  10. frontengine/ui/dialog/choose_file_dialog.py +21 -36
  11. frontengine/ui/{main/main_ui.py → main_ui.py} +37 -44
  12. frontengine/ui/menu/help_menu.py +25 -0
  13. frontengine/ui/menu/how_to_menu.py +14 -0
  14. frontengine/ui/{main → menu}/language_menu.py +10 -10
  15. frontengine/ui/{setting → page}/control_center/control_center_ui.py +9 -12
  16. frontengine/ui/{setting → page}/gif/gif_setting_ui.py +6 -6
  17. frontengine/ui/{setting → page}/image/image_setting_ui.py +6 -6
  18. frontengine/ui/{setting → page}/scene_setting/scene_setting_ui.py +8 -8
  19. frontengine/ui/{setting → page}/scene_setting/scene_tabs/Image.py +1 -1
  20. frontengine/ui/{setting → page}/scene_setting/scene_tabs/gif.py +1 -1
  21. frontengine/ui/{setting → page}/scene_setting/scene_tabs/scene_control.py +3 -2
  22. frontengine/ui/{setting → page}/scene_setting/scene_tabs/sound.py +1 -1
  23. frontengine/ui/{setting → page}/scene_setting/scene_tabs/text.py +1 -1
  24. frontengine/ui/{setting → page}/scene_setting/scene_tabs/ui.py +1 -1
  25. frontengine/ui/{setting → page}/scene_setting/scene_tabs/video.py +1 -1
  26. frontengine/ui/{setting → page}/scene_setting/scene_tabs/web.py +1 -1
  27. frontengine/ui/{setting → page}/text/text_setting_ui.py +6 -6
  28. frontengine/ui/{setting → page}/video/video_setting_ui.py +10 -6
  29. frontengine/ui/{setting → page}/web/web_setting_ui.py +5 -5
  30. frontengine/user_setting/user_setting_file.py +2 -1
  31. frontengine/utils/browser/browser.py +5 -0
  32. frontengine/utils/multi_language/english.py +5 -0
  33. frontengine/utils/multi_language/traditional_chinese.py +5 -0
  34. {frontengine-0.0.55.dist-info → frontengine-0.0.56.dist-info}/METADATA +3 -50
  35. frontengine-0.0.56.dist-info/RECORD +103 -0
  36. {frontengine-0.0.55.dist-info → frontengine-0.0.56.dist-info}/WHEEL +1 -1
  37. frontengine/show/chat/chat_toast.py +0 -55
  38. frontengine/show/image_generation/image_generation_show.py +0 -43
  39. frontengine/ui/setting/chat/chat_model.py +0 -65
  40. frontengine/ui/setting/chat/chat_scene_input.py +0 -72
  41. frontengine/ui/setting/chat/chat_scene_setting.py +0 -187
  42. frontengine/ui/setting/chat/chatthread.py +0 -78
  43. frontengine/ui/setting/chat/speech_to_text.py +0 -70
  44. frontengine/ui/setting/image_generation/generation_image_thread.py +0 -32
  45. frontengine/ui/setting/image_generation/image_generation_input.py +0 -63
  46. frontengine/ui/setting/text/__init__.py +0 -0
  47. frontengine/ui/setting/video/__init__.py +0 -0
  48. frontengine/ui/setting/web/__init__.py +0 -0
  49. frontengine-0.0.55.dist-info/RECORD +0 -112
  50. /frontengine/{show/chat → system_tray}/__init__.py +0 -0
  51. /frontengine/{show/image_generation → ui/menu}/__init__.py +0 -0
  52. /frontengine/ui/{main → page}/__init__.py +0 -0
  53. /frontengine/ui/{main/system_tray → page/control_center}/__init__.py +0 -0
  54. /frontengine/ui/{setting → page/gif}/__init__.py +0 -0
  55. /frontengine/ui/{setting/chat → page/image}/__init__.py +0 -0
  56. /frontengine/ui/{setting/control_center → page/scene_setting}/__init__.py +0 -0
  57. /frontengine/ui/{setting/gif → page/scene_setting/scene_tabs}/__init__.py +0 -0
  58. /frontengine/ui/{setting → page}/scene_setting/scene_tabs/tableview_model.py +0 -0
  59. /frontengine/ui/{setting/image → page/sound_player}/__init__.py +0 -0
  60. /frontengine/ui/{setting → page}/sound_player/sound_player_setting_ui.py +0 -0
  61. /frontengine/ui/{setting/image_generation → page/text}/__init__.py +0 -0
  62. /frontengine/ui/{setting/scene_setting → page/video}/__init__.py +0 -0
  63. /frontengine/ui/{setting/scene_setting/scene_tabs → page/web}/__init__.py +0 -0
  64. /frontengine/{ui/setting/sound_player → utils/browser}/__init__.py +0 -0
  65. {frontengine-0.0.55.dist-info → frontengine-0.0.56.dist-info}/LICENSE +0 -0
  66. {frontengine-0.0.55.dist-info → frontengine-0.0.56.dist-info}/top_level.txt +0 -0
frontengine/__init__.py CHANGED
@@ -7,20 +7,19 @@ from frontengine.show.sound_player.sound_player import SoundPlayer
7
7
  from frontengine.show.text.draw_text import TextWidget
8
8
  from frontengine.show.video.video_player import VideoWidget
9
9
  from frontengine.show.web.webview import WebWidget
10
- from frontengine.ui.main.main_ui import start_front_engine
10
+ from frontengine.ui.main_ui import start_front_engine
11
11
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
12
- from frontengine.ui.setting.text.text_setting_ui import TextSettingUI
13
- from frontengine.ui.setting.web.web_setting_ui import WEBSettingUI
14
- from frontengine.ui.setting.gif.gif_setting_ui import GIFSettingUI
15
- from frontengine.ui.setting.image.image_setting_ui import ImageSettingUI
16
- from frontengine.ui.setting.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
17
- from frontengine.ui.setting.video.video_setting_ui import VideoSettingUI
18
- from frontengine.ui.setting.control_center.control_center_ui import ControlCenterUI
19
- from frontengine.ui.setting.scene_setting.scene_setting_ui import SceneSettingUI
20
- from frontengine.ui.main.main_ui import FrontEngineMainUI
21
- from frontengine.ui.setting.scene_setting.scene_setting_ui import SceneControlSettingUI
22
- from frontengine.ui.setting.chat.chat_scene_setting import ChatSceneUI
23
- from frontengine.ui.main.main_ui import FrontEngine_EXTEND_TAB
12
+ from frontengine.ui.page.text.text_setting_ui import TextSettingUI
13
+ from frontengine.ui.page.web.web_setting_ui import WEBSettingUI
14
+ from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
15
+ from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
16
+ from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
17
+ from frontengine.ui.page.video.video_setting_ui import VideoSettingUI
18
+ from frontengine.ui.page.control_center.control_center_ui import ControlCenterUI
19
+ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
20
+ from frontengine.ui.main_ui import FrontEngineMainUI
21
+ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneControlSettingUI
22
+ from frontengine.ui.main_ui import FrontEngine_EXTEND_TAB
24
23
  from frontengine.utils.redirect_manager.redirect_manager_class import RedirectManager
25
24
 
26
25
  __all__ = [
@@ -28,5 +27,5 @@ __all__ = [
28
27
  "WebWidget", "ImageWidget", "VideoWidget", "language_wrapper", "load_extend_ui_file", "load_ui_file",
29
28
  "TextSettingUI", "WEBSettingUI", "GIFSettingUI", "ImageSettingUI", "SoundPlayerSettingUI",
30
29
  "VideoSettingUI", "ControlCenterUI", "SceneSettingUI", "FrontEngineMainUI", "SceneControlSettingUI",
31
- "ChatSceneUI", "FrontEngine_EXTEND_TAB", "RedirectManager"
30
+ "FrontEngine_EXTEND_TAB", "RedirectManager"
32
31
  ]
@@ -10,8 +10,10 @@ from frontengine.utils.multi_language.language_wrapper import language_wrapper
10
10
 
11
11
  class GifWidget(QWidget):
12
12
 
13
- def __init__(self, gif_image_path: str):
13
+ def __init__(self, gif_image_path: str, draw_location_x: int = 0, draw_location_y: int = 0):
14
14
  super().__init__()
15
+ self.draw_location_x = draw_location_x
16
+ self.draw_location_y = draw_location_y
15
17
  self.opacity: float = 0.2
16
18
  self.speed: int = 100
17
19
  self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
@@ -61,7 +63,7 @@ class GifWidget(QWidget):
61
63
  painter.setOpacity(self.opacity)
62
64
  painter.drawPixmap(
63
65
  QRect(
64
- self.x(), self.y(), self.width(), self.height()
66
+ self.draw_location_x, self.draw_location_y, self.width(), self.height()
65
67
  ),
66
68
  current_gif_frame
67
69
  )
@@ -10,8 +10,10 @@ from frontengine.utils.multi_language.language_wrapper import language_wrapper
10
10
 
11
11
  class ImageWidget(QWidget):
12
12
 
13
- def __init__(self, image_path: str):
13
+ def __init__(self, image_path: str, draw_location_x: int = 0, draw_location_y: int = 0):
14
14
  super().__init__()
15
+ self.draw_location_x = draw_location_x
16
+ self.draw_location_y = draw_location_y
15
17
  self.opacity: float = 0.2
16
18
  self.image_path: Path = Path(image_path)
17
19
  if self.image_path.exists() and self.image_path.is_file():
@@ -48,7 +50,7 @@ class ImageWidget(QWidget):
48
50
  painter = QPainter(self)
49
51
  painter.setOpacity(self.opacity)
50
52
  painter.drawImage(
51
- QRect(self.x(), self.y(), self.width(), self.height()),
53
+ QRect(self.draw_location_x, self.draw_location_y, self.width(), self.height()),
52
54
  self.image)
53
55
  painter.restore()
54
56
 
@@ -26,8 +26,7 @@ class SoundEffectWidget(QWidget):
26
26
  self.sound_path = Path(sound_path)
27
27
  if self.sound_path.exists() and self.sound_path.is_file():
28
28
  # QUrl non ascii path encode, Avoid read wrong path and file name
29
- source = QUrl.fromLocalFile(str(self.sound_path).encode())
30
- source = source.fromEncoded(source.toEncoded())
29
+ source = QUrl.fromLocalFile(str(self.sound_path))
31
30
  print(f"Origin file {str(self.sound_path)}")
32
31
  self.sound_player.setSource(source)
33
32
  # -2 means loop forever
@@ -28,8 +28,7 @@ class SoundPlayer(QWidget):
28
28
  self.media_player.setAudioOutput(self.media_player_audio)
29
29
  self.media_player_audio = self.media_player.audioOutput()
30
30
  # QUrl non ascii path encode, Avoid read wrong path and file name
31
- source = QUrl.fromLocalFile(str(self.sound_path).encode())
32
- source = source.fromEncoded(source.toEncoded())
31
+ source = QUrl.fromLocalFile(str(self.sound_path))
33
32
  print(f"Origin file {str(self.sound_path)}")
34
33
  self.media_player.setSource(source)
35
34
  self.media_player.setLoops(-1)
@@ -8,8 +8,10 @@ from PySide6.QtWidgets import QWidget
8
8
 
9
9
  class TextWidget(QWidget):
10
10
 
11
- def __init__(self, text: str):
11
+ def __init__(self, text: str, draw_location_x: int = 0, draw_location_y: int = 0):
12
12
  super().__init__()
13
+ self.draw_location_x = draw_location_x
14
+ self.draw_location_y = draw_location_y
13
15
  self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
14
16
  self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
15
17
  self.text = text
@@ -46,7 +48,7 @@ class TextWidget(QWidget):
46
48
  painter.setPen(Qt.GlobalColor.black)
47
49
  painter.setOpacity(self.opacity)
48
50
  painter.drawText(
49
- QRect(self.x(), self.y(), self.width(), self.height()),
51
+ QRect(self.draw_location_x, self.draw_location_y, self.width(), self.height()),
50
52
  Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
51
53
  self.text
52
54
  )
@@ -27,8 +27,7 @@ class VideoWidget(QVideoWidget):
27
27
  self.video_file_path = str(self.video_path)
28
28
  self.audioOutput = QAudioOutput()
29
29
  # QUrl non ascii path encode, Avoid read wrong path and file name
30
- source = QUrl.fromLocalFile(str(self.video_file_path).encode())
31
- source = source.fromEncoded(source.toEncoded())
30
+ source = QUrl.fromLocalFile(str(self.video_file_path))
32
31
  print(f"Origin file {str(self.video_file_path)}")
33
32
  self.media_player.setSource(source)
34
33
  self.media_player.setVideoOutput(self)
@@ -21,8 +21,7 @@ class WebWidget(QWebEngineView):
21
21
  self.web_url = Path(url)
22
22
  if self.web_url.exists() and self.web_url.is_file():
23
23
  # QUrl non ascii path encode, Avoid read wrong path and file name
24
- source = QUrl.fromLocalFile(str(self.web_url).encode())
25
- source = source.fromEncoded(source.toEncoded())
24
+ source = QUrl.fromLocalFile(str(self.web_url))
26
25
  print(f"Origin file {str(self.web_url)}")
27
26
  self.load(source)
28
27
  else:
@@ -64,4 +63,3 @@ class WebWidget(QWebEngineView):
64
63
 
65
64
  def mouseGrabber(self) -> None:
66
65
  super().mouseGrabber()
67
-
@@ -3,8 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  if TYPE_CHECKING:
6
- from frontengine.ui.main.main_ui import FrontEngineMainUI
7
- import sys
6
+ from frontengine.ui.main_ui import FrontEngineMainUI
8
7
 
9
8
  from PySide6.QtGui import QAction
10
9
  from PySide6.QtWidgets import QSystemTrayIcon, QMenu
@@ -34,7 +33,6 @@ class ExtendSystemTray(QSystemTrayIcon):
34
33
  def close_all(self):
35
34
  self.setVisible(False)
36
35
  self.main_window.close()
37
- sys.exit(0)
38
36
 
39
37
  def clicked(self, reason):
40
38
  if reason == self.ActivationReason.DoubleClick:
@@ -1,4 +1,3 @@
1
- import shutil
2
1
  from pathlib import Path
3
2
 
4
3
  from PySide6.QtWidgets import QMessageBox, QWidget, QFileDialog
@@ -8,7 +7,7 @@ from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
7
 
9
8
 
10
9
  def choose_file(
11
- trigger_ui: QWidget, file_filter: str, save_path: Path, extensions: list, warning_message: str) -> str:
10
+ trigger_ui: QWidget, file_filter: str, extensions: list, warning_message: str) -> str:
12
11
  front_engine_logger.info("choose_file")
13
12
  file_path = QFileDialog().getOpenFileName(
14
13
  parent=trigger_ui,
@@ -16,79 +15,65 @@ def choose_file(
16
15
  filter=file_filter
17
16
  )[0]
18
17
  file_path = Path(file_path)
19
- if file_path.is_file() and file_path.exists():
20
- file_save_path = save_path
21
- if not file_save_path.exists() or not file_save_path.is_dir():
22
- file_save_path.mkdir(parents=True, exist_ok=True)
23
- if file_path.suffix.lower() in extensions:
24
- try:
25
- new_file_path = shutil.copy(file_path, file_save_path)
26
- except shutil.SameFileError:
27
- new_file_path = str(Path(f"{file_save_path}/{file_path.name}"))
28
- return new_file_path
29
- else:
30
- message_box = QMessageBox(trigger_ui)
31
- message_box.setText(
32
- warning_message
33
- )
34
- message_box.show()
18
+ if file_path.is_file() and file_path.exists() and file_path.suffix.lower() in extensions:
19
+ return str(file_path)
20
+ else:
21
+ message_box = QMessageBox(trigger_ui)
22
+ message_box.setText(
23
+ warning_message
24
+ )
25
+ message_box.show()
35
26
 
36
27
 
37
28
  def choose_gif(
38
- trigger_ui: QWidget, file_filter: str = "GIF WEBP (*.gif;*.webp)",
39
- save_path: Path = Path(str(Path.cwd()) + "/gif"), extensions: list = None) -> str:
29
+ trigger_ui: QWidget, file_filter: str = "GIF WEBP (*.gif;*.webp)", extensions: list = None) -> str:
40
30
  front_engine_logger.info("choose_gif")
41
31
  extensions = extensions or [".gif", ".webp"]
42
32
  return choose_file(
43
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
33
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
44
34
  warning_message=language_wrapper.language_word_dict.get("gif_setting_message_box"))
45
35
 
46
36
 
47
37
  def choose_image(
48
- trigger_ui: QWidget, file_filter: str = "Images (*.png;*.jpg;*.webp)",
49
- save_path: Path = Path(str(Path.cwd()) + "/image"), extensions: list = None) -> str:
38
+ trigger_ui: QWidget, file_filter: str = "Images (*.png;*.jpg;*.webp)", extensions: list = None) -> str:
50
39
  front_engine_logger.info("choose_image")
51
40
  extensions = extensions or [".png", ".jpg", ".webp"]
52
41
  return choose_file(
53
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
42
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
54
43
  warning_message=language_wrapper.language_word_dict.get("image_setting_message_box"))
55
44
 
56
45
 
57
46
  def choose_wav_sound(
58
- trigger_ui: QWidget, file_filter: str = "WAV (*.wav)",
59
- save_path: Path = Path(str(Path.cwd()) + "/sound"), extensions: list = None) -> str:
47
+ trigger_ui: QWidget, file_filter: str = "WAV (*.wav)", extensions: list = None) -> str:
60
48
  front_engine_logger.info("choose_wav_sound")
61
49
  extensions = extensions or [".wav"]
62
50
  return choose_file(
63
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
51
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
64
52
  warning_message=language_wrapper.language_word_dict.get("sound_player_setting_message_box_sound"))
65
53
 
66
54
 
67
55
  def choose_player_sound(
68
- trigger_ui: QWidget, file_filter: str = "Sound (*.mp4;*.mp3;*.wav)",
69
- save_path: Path = Path(str(Path.cwd()) + "/sound"), extensions: list = None) -> str:
56
+ trigger_ui: QWidget, file_filter: str = "Sound (*.mp4;*.mp3;*.wav)", extensions: list = None) -> str:
70
57
  front_engine_logger.info("choose_player_sound")
71
58
  extensions = extensions or [".mp3", ".mp4", ".wav"]
72
59
  return choose_file(
73
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
60
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
74
61
  warning_message=language_wrapper.language_word_dict.get("sound_player_setting_message_box_sound"))
75
62
 
76
63
 
77
64
  def choose_video(
78
- trigger_ui: QWidget, file_filter: str = "Video (*.mp4;)",
79
- save_path: Path = Path(str(Path.cwd()) + "/video"), extensions: list = None) -> str:
65
+ trigger_ui: QWidget, file_filter: str = "Video (*.mp4;)", extensions: list = None) -> str:
80
66
  front_engine_logger.info("choose_video")
81
67
  extensions = extensions or [".mp4"]
82
68
  return choose_file(
83
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
69
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
84
70
  warning_message=language_wrapper.language_word_dict.get("video_setting_message_box"))
85
71
 
86
72
 
87
73
  def choose_scene_json(
88
- trigger_ui: QWidget, file_filter: str = "Json (*.json;)",
89
- save_path: Path = Path(str(Path.cwd()) + "/scene"), extensions: list = None) -> str:
74
+ trigger_ui: QWidget, file_filter: str = "Json (*.json;)", extensions: list = None) -> str:
90
75
  front_engine_logger.info("choose_scene_json")
91
76
  extensions = extensions or [".json"]
92
77
  return choose_file(
93
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
78
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
94
79
  warning_message=language_wrapper.language_word_dict.get("scene_choose_message_box"))
@@ -3,23 +3,22 @@ import sys
3
3
  from pathlib import Path
4
4
  from typing import Dict, Type
5
5
 
6
- from PySide6.QtCore import QTimer
7
- from PySide6.QtGui import QIcon, QAction
6
+ from PySide6.QtCore import QTimer, QCoreApplication
7
+ from PySide6.QtGui import QIcon, QAction, Qt
8
8
  from PySide6.QtWidgets import QMainWindow, QApplication, QGridLayout, QTabWidget, QMenuBar, QWidget
9
9
  from qt_material import apply_stylesheet, QtStyleTools
10
10
 
11
- from frontengine.ui.main.language_menu import build_language_menu
12
- from frontengine.ui.main.system_tray.extend_system_tray import ExtendSystemTray
13
- from frontengine.ui.setting.chat.chat_scene_setting import ChatSceneUI
14
- from frontengine.ui.setting.control_center.control_center_ui import ControlCenterUI
15
- from frontengine.ui.setting.gif.gif_setting_ui import GIFSettingUI
16
- from frontengine.ui.setting.image.image_setting_ui import ImageSettingUI
17
- from frontengine.ui.setting.scene_setting.scene_setting_ui import SceneSettingUI
18
- from frontengine.ui.setting.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
19
- from frontengine.ui.setting.text.text_setting_ui import TextSettingUI
20
- from frontengine.ui.setting.video.video_setting_ui import VideoSettingUI
21
- from frontengine.ui.setting.web.web_setting_ui import WEBSettingUI
22
- from frontengine.ui.setting.image_generation.image_generation_input import ImageGenerationUI
11
+ from frontengine.system_tray.extend_system_tray import ExtendSystemTray
12
+ from frontengine.ui.menu.help_menu import build_help_menu
13
+ from frontengine.ui.menu.language_menu import build_language_menu
14
+ from frontengine.ui.page.control_center.control_center_ui import ControlCenterUI
15
+ from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
16
+ from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
17
+ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
18
+ from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
19
+ from frontengine.ui.page.text.text_setting_ui import TextSettingUI
20
+ from frontengine.ui.page.video.video_setting_ui import VideoSettingUI
21
+ from frontengine.ui.page.web.web_setting_ui import WEBSettingUI
23
22
  from frontengine.user_setting.user_setting_file import write_user_setting, read_user_setting, user_setting_dict
24
23
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
25
24
 
@@ -32,6 +31,7 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
32
31
  super().__init__()
33
32
  # User setting
34
33
  self.id = "FrontEngine"
34
+ QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling)
35
35
  if sys.platform in ["win32", "cygwin", "msys"]:
36
36
  from ctypes import windll
37
37
  windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
@@ -51,8 +51,6 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
51
51
  self.gif_setting_ui = GIFSettingUI()
52
52
  self.sound_player_setting_ui = SoundPlayerSettingUI()
53
53
  self.text_setting_ui = TextSettingUI()
54
- self.image_generation_ui = ImageGenerationUI()
55
- self.chat_scene_ui = ChatSceneUI()
56
54
  self.scene_setting_ui = SceneSettingUI()
57
55
  self.control_center_ui = ControlCenterUI(
58
56
  self.video_setting_ui,
@@ -61,12 +59,10 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
61
59
  self.gif_setting_ui,
62
60
  self.sound_player_setting_ui,
63
61
  self.text_setting_ui,
64
- self.scene_setting_ui,
65
- self.chat_scene_ui
62
+ self.scene_setting_ui
66
63
  )
67
64
  # Style menu bar
68
65
  self.menu_bar = QMenuBar()
69
- build_language_menu(self)
70
66
  self.add_style_menu()
71
67
  self.setMenuBar(self.menu_bar)
72
68
  self.tab_widget.addTab(
@@ -91,20 +87,14 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
91
87
  self.scene_setting_ui,
92
88
  language_wrapper.language_word_dict.get("tab_scene_text")
93
89
  )
94
- self.tab_widget.addTab(
95
- self.chat_scene_ui,
96
- language_wrapper.language_word_dict.get("chat_ui_text")
97
- )
98
90
  self.tab_widget.addTab(
99
91
  self.control_center_ui,
100
92
  language_wrapper.language_word_dict.get("tab_control_center_text")
101
93
  )
102
- self.tab_widget.addTab(
103
- self.image_generation_ui,
104
- language_wrapper.language_word_dict.get("image_generation_tab")
105
- )
106
94
  for widget_name, widget in FrontEngine_EXTEND_TAB.items():
107
95
  self.tab_widget.addTab(widget(), widget_name)
96
+ build_language_menu(self)
97
+ build_help_menu(self)
108
98
  # Set Icon
109
99
  self.icon_path = Path(os.getcwd() + "/je_driver_icon.ico")
110
100
  self.icon = QIcon(str(self.icon_path))
@@ -123,7 +113,8 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
123
113
  self.debug_timer.start()
124
114
 
125
115
  def startup_setting(self) -> None:
126
- pass
116
+ apply_stylesheet(self, theme=user_setting_dict.get("theme"))
117
+ self.showMaximized()
127
118
 
128
119
  def add_style_menu(self) -> None:
129
120
  self.menu_bar.style_menu = self.menu_bar.addMenu(
@@ -141,22 +132,26 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
141
132
 
142
133
  def set_style(self) -> None:
143
134
  self.apply_stylesheet(self, self.sender().text())
135
+ user_setting_dict.update({"theme": self.sender().text()})
144
136
 
145
137
  def closeEvent(self, event) -> None:
146
- if self.show_system_tray_ray and self.system_tray.isVisible():
147
- self.hide()
148
- event.ignore()
138
+ if ExtendSystemTray.isSystemTrayAvailable() and self.show_system_tray_ray:
139
+ if self.system_tray.isVisible():
140
+ self.hide()
141
+ event.ignore()
149
142
  else:
150
143
  super().closeEvent(event)
151
- self.video_setting_ui.video_widget_list.clear()
152
- self.image_setting_ui.image_widget_list.clear()
153
- self.web_setting_ui.web_widget_list.clear()
154
- self.gif_setting_ui.gif_widget_list.clear()
155
- self.sound_player_setting_ui.sound_widget_list.clear()
156
- self.text_setting_ui.text_widget_list.clear()
157
- self.chat_scene_ui.close_scene()
158
- self.chat_scene_ui.close()
159
- write_user_setting()
144
+
145
+ def close(self):
146
+ write_user_setting()
147
+ self.video_setting_ui.video_widget_list.clear()
148
+ self.image_setting_ui.image_widget_list.clear()
149
+ self.web_setting_ui.web_widget_list.clear()
150
+ self.gif_setting_ui.gif_widget_list.clear()
151
+ self.sound_player_setting_ui.sound_widget_list.clear()
152
+ self.text_setting_ui.text_widget_list.clear()
153
+ super().close()
154
+ QCoreApplication.exit(0)
160
155
 
161
156
  @classmethod
162
157
  def debug_close(cls):
@@ -164,12 +159,10 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
164
159
 
165
160
 
166
161
  def start_front_engine(debug: bool = False) -> None:
167
- new_editor = QApplication(sys.argv)
162
+ main_app = QApplication(sys.argv)
168
163
  window = FrontEngineMainUI(debug=debug)
169
- apply_stylesheet(new_editor, theme='dark_amber.xml')
170
- window.showMaximized()
171
164
  try:
172
165
  window.startup_setting()
173
166
  except Exception as error:
174
167
  print(repr(error))
175
- sys.exit(new_editor.exec())
168
+ sys.exit(main_app.exec())
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ if TYPE_CHECKING:
5
+ from frontengine.ui.main_ui import FrontEngineMainUI
6
+
7
+ from frontengine.utils.browser.browser import open_browser
8
+ from PySide6.QtGui import QAction
9
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
10
+
11
+
12
+ def build_help_menu(ui_we_want_to_set: FrontEngineMainUI) -> None:
13
+ ui_we_want_to_set.help_menu = ui_we_want_to_set.menu_bar.addMenu(
14
+ language_wrapper.language_word_dict.get("help_menu_label")
15
+ )
16
+ ui_we_want_to_set.help_menu.open_issue_action = QAction(
17
+ language_wrapper.language_word_dict.get("help_menu_open_issue")
18
+ )
19
+ ui_we_want_to_set.help_menu.open_issue_action.triggered.connect(
20
+ lambda: open_browser("https://github.com/Integration-Automation/FrontEngine/issues")
21
+ )
22
+ ui_we_want_to_set.help_menu.addAction(
23
+ ui_we_want_to_set.help_menu.open_issue_action
24
+ )
25
+
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ if TYPE_CHECKING:
5
+ from frontengine.ui.main_ui import FrontEngineMainUI
6
+ from PySide6.QtGui import QAction
7
+
8
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
9
+
10
+
11
+ def build_how_to_menu(ui_we_want_to_set: FrontEngineMainUI) -> None:
12
+ ui_we_want_to_set.menu_bar.how_to_menu = ui_we_want_to_set.menu_bar.addMenu(
13
+ language_wrapper.language_word_dict.get("menu_bar_language")
14
+ )
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  if TYPE_CHECKING:
6
- from frontengine.ui.main.main_ui import FrontEngineMainUI
6
+ from frontengine.ui.main_ui import FrontEngineMainUI
7
7
  from PySide6.QtGui import QAction
8
8
  from PySide6.QtWidgets import QMessageBox
9
9
 
@@ -12,26 +12,26 @@ from frontengine.utils.multi_language.language_wrapper import language_wrapper
12
12
 
13
13
 
14
14
  def build_language_menu(ui_we_want_to_set: FrontEngineMainUI) -> None:
15
- ui_we_want_to_set.menu_bar.language_menu = ui_we_want_to_set.menu_bar.addMenu(
15
+ ui_we_want_to_set.language_menu = ui_we_want_to_set.menu_bar.addMenu(
16
16
  language_wrapper.language_word_dict.get("menu_bar_language")
17
17
  )
18
- ui_we_want_to_set.menu_bar.language_menu.change_to_english_language_action = QAction(
18
+ ui_we_want_to_set.language_menu.change_to_english_language_action = QAction(
19
19
  language_wrapper.language_word_dict.get("language_menu_bar_english")
20
20
  )
21
- ui_we_want_to_set.menu_bar.language_menu.change_to_english_language_action.triggered.connect(
21
+ ui_we_want_to_set.language_menu.change_to_english_language_action.triggered.connect(
22
22
  lambda: set_language("English", ui_we_want_to_set)
23
23
  )
24
- ui_we_want_to_set.menu_bar.language_menu.change_to_traditional_chinese_language_action = QAction(
24
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action = QAction(
25
25
  language_wrapper.language_word_dict.get("language_menu_bar_traditional_chinese")
26
26
  )
27
- ui_we_want_to_set.menu_bar.language_menu.change_to_traditional_chinese_language_action.triggered.connect(
27
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action.triggered.connect(
28
28
  lambda: set_language("Traditional_Chinese", ui_we_want_to_set)
29
29
  )
30
- ui_we_want_to_set.menu_bar.language_menu.addAction(
31
- ui_we_want_to_set.menu_bar.language_menu.change_to_english_language_action
30
+ ui_we_want_to_set.language_menu.addAction(
31
+ ui_we_want_to_set.language_menu.change_to_english_language_action
32
32
  )
33
- ui_we_want_to_set.menu_bar.language_menu.addAction(
34
- ui_we_want_to_set.menu_bar.language_menu.change_to_traditional_chinese_language_action
33
+ ui_we_want_to_set.language_menu.addAction(
34
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action
35
35
  )
36
36
 
37
37
 
@@ -2,14 +2,13 @@ from PySide6.QtCore import QTimer, Qt
2
2
  from PySide6.QtWidgets import QGridLayout, QWidget, QPushButton, QTextEdit, QScrollArea
3
3
 
4
4
  from frontengine.ui.color.global_color import error_color, output_color
5
- from frontengine.ui.setting.chat.chat_scene_setting import ChatSceneUI
6
- from frontengine.ui.setting.gif.gif_setting_ui import GIFSettingUI
7
- from frontengine.ui.setting.image.image_setting_ui import ImageSettingUI
8
- from frontengine.ui.setting.scene_setting.scene_setting_ui import SceneSettingUI
9
- from frontengine.ui.setting.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
10
- from frontengine.ui.setting.text.text_setting_ui import TextSettingUI
11
- from frontengine.ui.setting.video.video_setting_ui import VideoSettingUI
12
- from frontengine.ui.setting.web.web_setting_ui import WEBSettingUI
5
+ from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
6
+ from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
7
+ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
8
+ from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
9
+ from frontengine.ui.page.text.text_setting_ui import TextSettingUI
10
+ from frontengine.ui.page.video.video_setting_ui import VideoSettingUI
11
+ from frontengine.ui.page.web.web_setting_ui import WEBSettingUI
13
12
  from frontengine.utils.logging.loggin_instance import front_engine_logger
14
13
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
15
14
  from frontengine.utils.redirect_manager.redirect_manager_class import redirect_manager_instance
@@ -25,8 +24,7 @@ class ControlCenterUI(QWidget):
25
24
  gif_setting_ui: GIFSettingUI,
26
25
  sound_player_setting_ui: SoundPlayerSettingUI,
27
26
  text_setting_ui: TextSettingUI,
28
- scene_setting_ui: SceneSettingUI,
29
- chat_scene_ui: ChatSceneUI
27
+ scene_setting_ui: SceneSettingUI
30
28
  ):
31
29
  super().__init__()
32
30
  # Layout
@@ -41,7 +39,6 @@ class ControlCenterUI(QWidget):
41
39
  self.sound_player_setting_ui = sound_player_setting_ui
42
40
  self.text_setting_ui = text_setting_ui
43
41
  self.scene_setting_ui = scene_setting_ui
44
- self.chat_scene_ui = chat_scene_ui
45
42
  # Close video widget
46
43
  self.clear_video_button = QPushButton(
47
44
  language_wrapper.language_word_dict.get("control_center_close_all_video")
@@ -116,7 +113,7 @@ class ControlCenterUI(QWidget):
116
113
  self.redirect_timer.setInterval(10)
117
114
  self.redirect_timer.timeout.connect(self.redirect)
118
115
  self.redirect_timer.start()
119
- # redirect_manager_instance.set_redirect(self, True)
116
+ redirect_manager_instance.set_redirect(self, True)
120
117
 
121
118
  def clear_video(self) -> None:
122
119
  front_engine_logger.info("clear_video")
@@ -1,5 +1,5 @@
1
1
  from PySide6.QtCore import Qt
2
- from PySide6.QtGui import QScreen
2
+ from PySide6.QtGui import QGuiApplication
3
3
  from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSlider, QPushButton, QMessageBox, \
4
4
  QCheckBox
5
5
 
@@ -103,15 +103,15 @@ class GIFSettingUI(QWidget):
103
103
  message_box.show()
104
104
  else:
105
105
  front_engine_logger.info("start_play_gif")
106
- if self.show_all_screen:
106
+ if not self.show_all_screen:
107
107
  gif_widget = self._create_gif_widget()
108
108
  gif_widget.showFullScreen()
109
109
  else:
110
- monitors = QScreen.virtualSiblings(self.screen())
111
- for screen in monitors:
112
- monitor = screen.availableGeometry()
110
+ monitors = QGuiApplication.screens()
111
+ for monitor in monitors:
113
112
  gif_widget = self._create_gif_widget()
114
- gif_widget.move(monitor.left(), monitor.top())
113
+ gif_widget.setScreen(monitor)
114
+ gif_widget.move(monitor.availableGeometry().topLeft())
115
115
  gif_widget.showFullScreen()
116
116
 
117
117
  def choose_and_copy_file_to_cwd_gif_dir_then_play(self) -> None:
@@ -1,5 +1,5 @@
1
1
  from PySide6.QtCore import Qt
2
- from PySide6.QtGui import QScreen
2
+ from PySide6.QtGui import QScreen, QGuiApplication
3
3
  from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QPushButton, QMessageBox, \
4
4
  QCheckBox
5
5
 
@@ -88,15 +88,15 @@ class ImageSettingUI(QWidget):
88
88
  message_box.show()
89
89
  else:
90
90
  front_engine_logger.info("start_play_image")
91
- if self.show_all_screen:
91
+ if not self.show_all_screen:
92
92
  image_widget = self._create_image_widget()
93
93
  image_widget.showFullScreen()
94
94
  else:
95
- monitors = QScreen.virtualSiblings(self.screen())
96
- for screen in monitors:
97
- monitor = screen.availableGeometry()
95
+ monitors = QGuiApplication.screens()
96
+ for monitor in monitors:
98
97
  image_widget = self._create_image_widget()
99
- image_widget.move(monitor.left(), monitor.top())
98
+ image_widget.setScreen(monitor)
99
+ image_widget.move(monitor.availableGeometry().topLeft())
100
100
  image_widget.showFullScreen()
101
101
 
102
102
  def choose_and_copy_file_to_cwd_image_dir_then_play(self) -> None: