frontengine 0.0.55__py3-none-any.whl → 0.0.57__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 (91) hide show
  1. frontengine/__init__.py +13 -15
  2. frontengine/show/gif/paint_gif.py +4 -2
  3. frontengine/show/image/paint_image.py +4 -2
  4. frontengine/show/scene/extend_graphic_scene.py +0 -1
  5. frontengine/show/scene/extend_graphic_view.py +2 -1
  6. frontengine/show/scene/scene.py +23 -41
  7. frontengine/show/sound_player/sound_effect.py +1 -2
  8. frontengine/show/sound_player/sound_player.py +1 -2
  9. frontengine/show/text/draw_text.py +31 -4
  10. frontengine/show/video/video_player.py +1 -2
  11. frontengine/show/web/webview.py +1 -3
  12. frontengine/{ui/main/system_tray → system_tray}/extend_system_tray.py +1 -3
  13. frontengine/ui/dialog/choose_file_dialog.py +19 -43
  14. frontengine/ui/{main/main_ui.py → main_ui.py} +39 -44
  15. frontengine/ui/menu/help_menu.py +25 -0
  16. frontengine/ui/menu/how_to_menu.py +25 -0
  17. frontengine/ui/{main → menu}/language_menu.py +10 -10
  18. frontengine/ui/{setting → page}/control_center/control_center_ui.py +11 -18
  19. frontengine/ui/{setting → page}/gif/gif_setting_ui.py +20 -8
  20. frontengine/ui/{setting → page}/image/image_setting_ui.py +19 -7
  21. frontengine/ui/page/scene_setting/scene_manager.py +96 -0
  22. frontengine/ui/page/scene_setting/scene_page/gif.py +102 -0
  23. frontengine/ui/page/scene_setting/scene_page/image.py +83 -0
  24. frontengine/ui/page/scene_setting/scene_page/sound.py +84 -0
  25. frontengine/ui/page/scene_setting/scene_page/text.py +93 -0
  26. frontengine/ui/page/scene_setting/scene_page/video.py +122 -0
  27. frontengine/ui/page/scene_setting/scene_page/web.py +66 -0
  28. frontengine/ui/page/scene_setting/scene_setting_ui.py +55 -0
  29. frontengine/ui/{setting → page}/sound_player/sound_player_setting_ui.py +0 -1
  30. frontengine/ui/{setting → page}/text/text_setting_ui.py +39 -11
  31. frontengine/ui/page/utils.py +23 -0
  32. frontengine/ui/{setting → page}/video/video_setting_ui.py +23 -7
  33. frontengine/ui/{setting → page}/web/web_setting_ui.py +19 -7
  34. frontengine/user_setting/scene_setting.py +34 -0
  35. frontengine/user_setting/user_setting_file.py +2 -1
  36. frontengine/utils/browser/browser.py +5 -0
  37. frontengine/utils/multi_language/english.py +14 -2
  38. frontengine/utils/multi_language/traditional_chinese.py +15 -2
  39. {frontengine-0.0.55.dist-info → frontengine-0.0.57.dist-info}/METADATA +3 -50
  40. frontengine-0.0.57.dist-info/RECORD +91 -0
  41. {frontengine-0.0.55.dist-info → frontengine-0.0.57.dist-info}/WHEEL +1 -1
  42. frontengine/show/chat/chat_toast.py +0 -55
  43. frontengine/show/image_generation/image_generation_show.py +0 -43
  44. frontengine/ui/setting/chat/chat_model.py +0 -65
  45. frontengine/ui/setting/chat/chat_scene_input.py +0 -72
  46. frontengine/ui/setting/chat/chat_scene_setting.py +0 -187
  47. frontengine/ui/setting/chat/chatthread.py +0 -78
  48. frontengine/ui/setting/chat/speech_to_text.py +0 -70
  49. frontengine/ui/setting/image_generation/generation_image_thread.py +0 -32
  50. frontengine/ui/setting/image_generation/image_generation_input.py +0 -63
  51. frontengine/ui/setting/scene_setting/scene_setting_ui.py +0 -48
  52. frontengine/ui/setting/scene_setting/scene_tabs/Image.py +0 -61
  53. frontengine/ui/setting/scene_setting/scene_tabs/gif.py +0 -74
  54. frontengine/ui/setting/scene_setting/scene_tabs/scene_control.py +0 -77
  55. frontengine/ui/setting/scene_setting/scene_tabs/sound.py +0 -44
  56. frontengine/ui/setting/scene_setting/scene_tabs/tableview_model.py +0 -65
  57. frontengine/ui/setting/scene_setting/scene_tabs/text.py +0 -77
  58. frontengine/ui/setting/scene_setting/scene_tabs/ui.py +0 -56
  59. frontengine/ui/setting/scene_setting/scene_tabs/video.py +0 -88
  60. frontengine/ui/setting/scene_setting/scene_tabs/web.py +0 -74
  61. frontengine/ui/setting/text/__init__.py +0 -0
  62. frontengine/ui/setting/video/__init__.py +0 -0
  63. frontengine/ui/setting/web/__init__.py +0 -0
  64. frontengine/user_setting/gif/__init__.py +0 -0
  65. frontengine/user_setting/gif/gif_setting.py +0 -5
  66. frontengine/user_setting/image/__init__.py +0 -0
  67. frontengine/user_setting/image/image_setting.py +0 -4
  68. frontengine/user_setting/sound/__init__.py +0 -0
  69. frontengine/user_setting/sound/sound_setting.py +0 -4
  70. frontengine/user_setting/text/__init__.py +0 -0
  71. frontengine/user_setting/text/text_setting.py +0 -5
  72. frontengine/user_setting/video/__init__.py +0 -0
  73. frontengine/user_setting/video/video_setting.py +0 -6
  74. frontengine/user_setting/web/__init__.py +0 -0
  75. frontengine/user_setting/web/web_setting.py +0 -4
  76. frontengine-0.0.55.dist-info/RECORD +0 -112
  77. /frontengine/{show/chat → system_tray}/__init__.py +0 -0
  78. /frontengine/{show/image_generation → ui/menu}/__init__.py +0 -0
  79. /frontengine/ui/{main → page}/__init__.py +0 -0
  80. /frontengine/ui/{main/system_tray → page/control_center}/__init__.py +0 -0
  81. /frontengine/ui/{setting → page/gif}/__init__.py +0 -0
  82. /frontengine/ui/{setting/chat → page/image}/__init__.py +0 -0
  83. /frontengine/ui/{setting/control_center → page/scene_setting}/__init__.py +0 -0
  84. /frontengine/ui/{setting/gif → page/scene_setting/scene_page}/__init__.py +0 -0
  85. /frontengine/ui/{setting/image → page/sound_player}/__init__.py +0 -0
  86. /frontengine/ui/{setting/image_generation → page/text}/__init__.py +0 -0
  87. /frontengine/ui/{setting/scene_setting → page/video}/__init__.py +0 -0
  88. /frontengine/ui/{setting/scene_setting/scene_tabs → page/web}/__init__.py +0 -0
  89. /frontengine/{ui/setting/sound_player → utils/browser}/__init__.py +0 -0
  90. {frontengine-0.0.55.dist-info → frontengine-0.0.57.dist-info}/LICENSE +0 -0
  91. {frontengine-0.0.55.dist-info → frontengine-0.0.57.dist-info}/top_level.txt +0 -0
frontengine/__init__.py CHANGED
@@ -7,26 +7,24 @@ 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.main_ui import FrontEngine_EXTEND_TAB
24
22
  from frontengine.utils.redirect_manager.redirect_manager_class import RedirectManager
25
23
 
26
24
  __all__ = [
27
25
  "start_front_engine", "GifWidget", "SoundPlayer", "SoundEffectWidget", "TextWidget",
28
26
  "WebWidget", "ImageWidget", "VideoWidget", "language_wrapper", "load_extend_ui_file", "load_ui_file",
29
27
  "TextSettingUI", "WEBSettingUI", "GIFSettingUI", "ImageSettingUI", "SoundPlayerSettingUI",
30
- "VideoSettingUI", "ControlCenterUI", "SceneSettingUI", "FrontEngineMainUI", "SceneControlSettingUI",
31
- "ChatSceneUI", "FrontEngine_EXTEND_TAB", "RedirectManager"
28
+ "VideoSettingUI", "ControlCenterUI", "SceneSettingUI", "FrontEngineMainUI",
29
+ "FrontEngine_EXTEND_TAB", "RedirectManager"
32
30
  ]
@@ -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
 
@@ -5,4 +5,3 @@ class ExtendGraphicScene(QGraphicsScene):
5
5
 
6
6
  def __init__(self):
7
7
  super().__init__()
8
-
@@ -12,6 +12,7 @@ class ExtendGraphicView(QGraphicsView):
12
12
  Qt.WindowType.WindowType_Mask |
13
13
  Qt.WindowType.Tool
14
14
  )
15
+ self.setStyleSheet("background:transparent")
15
16
  self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
16
17
  self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
17
18
  self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
@@ -23,7 +24,7 @@ class ExtendGraphicView(QGraphicsView):
23
24
  pass
24
25
  else:
25
26
  current_position = event.position()
26
- scene_position = self.mapToScene(QPoint(current_position.x(), current_position.y()))
27
+ scene_position = self.mapToScene(QPoint(int(current_position.x()), int(current_position.y())))
27
28
  view_width = self.viewport().width()
28
29
  view_height = self.viewport().height()
29
30
  horizon_scale = current_position.x() / view_width
@@ -1,12 +1,11 @@
1
1
  from typing import List, Dict
2
2
 
3
- from PySide6.QtWidgets import QGraphicsProxyWidget, QWidget
3
+ from PySide6.QtWidgets import QGraphicsProxyWidget
4
+ from frontengine.show.scene.extend_graphic_view import ExtendGraphicView
4
5
 
5
6
  from frontengine.show.gif.paint_gif import GifWidget
6
7
  from frontengine.show.image.paint_image import ImageWidget
7
- from frontengine.show.load.load_someone_make_ui import load_ui_file, read_extend_ui
8
8
  from frontengine.show.scene.extend_graphic_scene import ExtendGraphicScene
9
- from frontengine.show.scene.extend_graphic_view import ExtendGraphicView
10
9
  from frontengine.show.sound_player.sound_player import SoundPlayer
11
10
  from frontengine.show.text.draw_text import TextWidget
12
11
  from frontengine.show.video.video_player import VideoWidget
@@ -20,25 +19,25 @@ class SceneManager(object):
20
19
  ):
21
20
  super().__init__()
22
21
  self.graphic_scene = ExtendGraphicScene()
23
- self.graphic_view = ExtendGraphicView(self.graphic_scene)
24
22
  self.widget_list: List[QGraphicsProxyWidget] = list()
23
+ self.view_list: List[ExtendGraphicView] = []
25
24
 
26
- def add_image(self, image_setting: Dict[str, str]) -> QGraphicsProxyWidget:
27
- image_path = image_setting.get("file_path")
25
+ def add_image(self, setting_dict: Dict) -> QGraphicsProxyWidget:
26
+ image_path = setting_dict.get("file_path")
28
27
  image_widget = ImageWidget(image_path)
29
- opacity = float(image_setting.get("opacity")) / 100
28
+ opacity = float(setting_dict.get("opacity")) / 100
30
29
  opacity = opacity if opacity is not None else 0.2
31
30
  image_widget.set_ui_variable(opacity)
32
31
  proxy_widget = self.graphic_scene.addWidget(image_widget)
33
32
  self.widget_list.append(proxy_widget)
34
33
  return proxy_widget
35
34
 
36
- def add_gif(self, gif_setting: Dict[str, str]) -> QGraphicsProxyWidget:
37
- gif_image_path = gif_setting.get("file_path")
35
+ def add_gif(self, setting_dict: Dict) -> QGraphicsProxyWidget:
36
+ gif_image_path = setting_dict.get("file_path")
38
37
  gif_widget = GifWidget(gif_image_path)
39
- speed = int(gif_setting.get("speed"))
38
+ speed = int(setting_dict.get("speed"))
40
39
  speed = speed if speed is not None else 100
41
- opacity = float(gif_setting.get("opacity")) / 100
40
+ opacity = float(setting_dict.get("opacity")) / 100
42
41
  opacity = opacity if opacity is not None else 0.2
43
42
  gif_widget.set_gif_variable(speed)
44
43
  gif_widget.set_ui_variable(opacity)
@@ -46,30 +45,32 @@ class SceneManager(object):
46
45
  self.widget_list.append(proxy_widget)
47
46
  return proxy_widget
48
47
 
49
- def add_sound(self, sound_setting: Dict[str, str]) -> QGraphicsProxyWidget:
50
- sound_path = sound_setting.get("file_path")
48
+ def add_sound(self, setting_dict: Dict) -> QGraphicsProxyWidget:
49
+ sound_path = setting_dict.get("file_path")
51
50
  sound_widget = SoundPlayer(sound_path)
52
- volume = float(sound_setting.get("volume")) / 100
51
+ volume = float(setting_dict.get("volume")) / 100
53
52
  volume = volume if volume is not None else 1
54
53
  sound_widget.set_player_variable(volume)
55
54
  proxy_widget = self.graphic_scene.addWidget(sound_widget)
56
55
  self.widget_list.append(proxy_widget)
57
56
  return proxy_widget
58
57
 
59
- def add_text(self, text_setting: Dict[str, str]) -> QGraphicsProxyWidget:
60
- text = text_setting.get("text")
58
+ def add_text(self, setting_dict: Dict) -> QGraphicsProxyWidget:
59
+ text = setting_dict.get("text")
61
60
  text_widget = TextWidget(text)
62
- font_size = int(text_setting.get("font_size"))
61
+ font_size = int(setting_dict.get("font_size"))
63
62
  font_size = font_size if font_size is not None else 100
64
- opacity = float(text_setting.get("opacity")) / 100
63
+ opacity = float(setting_dict.get("opacity")) / 100
65
64
  opacity = opacity if opacity is not None else 0.2
65
+ alignment = setting_dict.get("alignment", "Center")
66
66
  text_widget.set_ui_variable(opacity)
67
67
  text_widget.set_font_variable(font_size)
68
+ text_widget.set_alignment(alignment)
68
69
  proxy_widget = self.graphic_scene.addWidget(text_widget)
69
70
  self.widget_list.append(proxy_widget)
70
71
  return proxy_widget
71
72
 
72
- def add_video(self, video_setting: Dict[str, str]) -> QGraphicsProxyWidget:
73
+ def add_video(self, video_setting: Dict) -> QGraphicsProxyWidget:
73
74
  video_path = video_setting.get("file_path")
74
75
  video_widget = VideoWidget(video_path)
75
76
  opacity = float(video_setting.get("opacity")) / 100
@@ -84,31 +85,12 @@ class SceneManager(object):
84
85
  self.widget_list.append(proxy_widget)
85
86
  return proxy_widget
86
87
 
87
- def add_web(self, web_setting: Dict[str, str]) -> QGraphicsProxyWidget:
88
- url = web_setting.get("url")
88
+ def add_web(self, setting_dict: Dict) -> QGraphicsProxyWidget:
89
+ url = setting_dict.get("url")
89
90
  web_widget = WebWidget(url)
90
- opacity = float(web_setting.get("opacity")) / 100
91
+ opacity = float(setting_dict.get("opacity")) / 100
91
92
  opacity = opacity if opacity is not None else 0.2
92
- enable_input = web_setting.get("enable_input")
93
- enable_input = enable_input if enable_input is not None else False
94
93
  web_widget.set_ui_variable(opacity)
95
- web_widget.set_ui_window_flag(enable_input=enable_input)
96
94
  proxy_widget = self.graphic_scene.addWidget(web_widget)
97
95
  self.widget_list.append(proxy_widget)
98
96
  return proxy_widget
99
-
100
- def add_extend_ui_file(self, ui_setting_dict: Dict[str, str]) -> QGraphicsProxyWidget:
101
- ui_path = ui_setting_dict.get("file_path")
102
- extend_widget = load_ui_file(ui_path)
103
- proxy_widget = self.graphic_scene.addWidget(extend_widget)
104
- self.widget_list.append(proxy_widget)
105
- return proxy_widget
106
-
107
- def add_extend_ui(self, ui: QWidget) -> QGraphicsProxyWidget:
108
- extend_widget = read_extend_ui(ui)
109
- proxy_widget = self.graphic_scene.addWidget(extend_widget)
110
- self.widget_list.append(proxy_widget)
111
- return proxy_widget
112
-
113
- def show(self):
114
- self.graphic_view.showMaximized()
@@ -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,13 +8,26 @@ 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
+ alignment: str = "Center"):
12
13
  super().__init__()
14
+ self.draw_location_x = draw_location_x
15
+ self.draw_location_y = draw_location_y
13
16
  self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
14
17
  self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
15
18
  self.text = text
16
19
  self.font_size = 100
17
20
  self.opacity = 0.2
21
+ if alignment == "TopLeft":
22
+ self.alignment = (Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
23
+ elif alignment == "TopRight":
24
+ self.alignment = (Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight)
25
+ elif alignment == "BottomLeft":
26
+ self.alignment = (Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignLeft)
27
+ elif alignment == "BottomRight":
28
+ self.alignment = (Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignRight)
29
+ else:
30
+ self.alignment = Qt.AlignmentFlag.AlignCenter
18
31
  self.draw_font = QFontDatabase.font(self.font().family(), "", self.font_size)
19
32
  # Set Icon
20
33
  self.icon_path = Path(os.getcwd() + "/je_driver_icon.ico")
@@ -38,6 +51,21 @@ class TextWidget(QWidget):
38
51
  def set_ui_variable(self, opacity: float = 0.2) -> None:
39
52
  self.opacity = opacity
40
53
 
54
+ def set_font(self):
55
+ self.draw_font = QFontDatabase.font(self.font().family(), "", self.font_size)
56
+
57
+ def set_alignment(self, alignment: str = "Center") -> None:
58
+ if alignment == "TopLeft":
59
+ self.alignment = (Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
60
+ elif alignment == "TopRight":
61
+ self.alignment = (Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight)
62
+ elif alignment == "BottomLeft":
63
+ self.alignment = (Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignLeft)
64
+ elif alignment == "BottomRight":
65
+ self.alignment = (Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignRight)
66
+ else:
67
+ self.alignment = Qt.AlignmentFlag.AlignCenter
68
+
41
69
  def paintEvent(self, event) -> None:
42
70
  painter = QPainter(self)
43
71
  painter.setFont(
@@ -46,8 +74,8 @@ class TextWidget(QWidget):
46
74
  painter.setPen(Qt.GlobalColor.black)
47
75
  painter.setOpacity(self.opacity)
48
76
  painter.drawText(
49
- QRect(self.x(), self.y(), self.width(), self.height()),
50
- Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
77
+ QRect(self.draw_location_x, self.draw_location_y, self.width(), self.height()),
78
+ int(self.alignment),
51
79
  self.text
52
80
  )
53
81
  painter.restore()
@@ -60,4 +88,3 @@ class TextWidget(QWidget):
60
88
 
61
89
  def mouseGrabber(self) -> None:
62
90
  super().mouseGrabber()
63
-
@@ -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,56 @@ 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
-
86
-
87
- 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:
90
- front_engine_logger.info("choose_scene_json")
91
- extensions = extensions or [".json"]
92
- return choose_file(
93
- trigger_ui=trigger_ui, file_filter=file_filter, save_path=save_path, extensions=extensions,
94
- warning_message=language_wrapper.language_word_dict.get("scene_choose_message_box"))
@@ -3,23 +3,23 @@ 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.how_to_menu import build_how_to_menu
14
+ from frontengine.ui.menu.language_menu import build_language_menu
15
+ from frontengine.ui.page.control_center.control_center_ui import ControlCenterUI
16
+ from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
17
+ from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
18
+ from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
19
+ from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
20
+ from frontengine.ui.page.text.text_setting_ui import TextSettingUI
21
+ from frontengine.ui.page.video.video_setting_ui import VideoSettingUI
22
+ from frontengine.ui.page.web.web_setting_ui import WEBSettingUI
23
23
  from frontengine.user_setting.user_setting_file import write_user_setting, read_user_setting, user_setting_dict
24
24
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
25
25
 
@@ -32,6 +32,7 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
32
32
  super().__init__()
33
33
  # User setting
34
34
  self.id = "FrontEngine"
35
+ QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling)
35
36
  if sys.platform in ["win32", "cygwin", "msys"]:
36
37
  from ctypes import windll
37
38
  windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
@@ -51,8 +52,6 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
51
52
  self.gif_setting_ui = GIFSettingUI()
52
53
  self.sound_player_setting_ui = SoundPlayerSettingUI()
53
54
  self.text_setting_ui = TextSettingUI()
54
- self.image_generation_ui = ImageGenerationUI()
55
- self.chat_scene_ui = ChatSceneUI()
56
55
  self.scene_setting_ui = SceneSettingUI()
57
56
  self.control_center_ui = ControlCenterUI(
58
57
  self.video_setting_ui,
@@ -61,12 +60,10 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
61
60
  self.gif_setting_ui,
62
61
  self.sound_player_setting_ui,
63
62
  self.text_setting_ui,
64
- self.scene_setting_ui,
65
- self.chat_scene_ui
63
+ self.scene_setting_ui
66
64
  )
67
65
  # Style menu bar
68
66
  self.menu_bar = QMenuBar()
69
- build_language_menu(self)
70
67
  self.add_style_menu()
71
68
  self.setMenuBar(self.menu_bar)
72
69
  self.tab_widget.addTab(
@@ -91,20 +88,15 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
91
88
  self.scene_setting_ui,
92
89
  language_wrapper.language_word_dict.get("tab_scene_text")
93
90
  )
94
- self.tab_widget.addTab(
95
- self.chat_scene_ui,
96
- language_wrapper.language_word_dict.get("chat_ui_text")
97
- )
98
91
  self.tab_widget.addTab(
99
92
  self.control_center_ui,
100
93
  language_wrapper.language_word_dict.get("tab_control_center_text")
101
94
  )
102
- self.tab_widget.addTab(
103
- self.image_generation_ui,
104
- language_wrapper.language_word_dict.get("image_generation_tab")
105
- )
106
95
  for widget_name, widget in FrontEngine_EXTEND_TAB.items():
107
96
  self.tab_widget.addTab(widget(), widget_name)
97
+ build_language_menu(self)
98
+ build_help_menu(self)
99
+ build_how_to_menu(self)
108
100
  # Set Icon
109
101
  self.icon_path = Path(os.getcwd() + "/je_driver_icon.ico")
110
102
  self.icon = QIcon(str(self.icon_path))
@@ -123,7 +115,8 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
123
115
  self.debug_timer.start()
124
116
 
125
117
  def startup_setting(self) -> None:
126
- pass
118
+ apply_stylesheet(self, theme=user_setting_dict.get("theme"))
119
+ self.showMaximized()
127
120
 
128
121
  def add_style_menu(self) -> None:
129
122
  self.menu_bar.style_menu = self.menu_bar.addMenu(
@@ -141,22 +134,26 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
141
134
 
142
135
  def set_style(self) -> None:
143
136
  self.apply_stylesheet(self, self.sender().text())
137
+ user_setting_dict.update({"theme": self.sender().text()})
144
138
 
145
139
  def closeEvent(self, event) -> None:
146
- if self.show_system_tray_ray and self.system_tray.isVisible():
147
- self.hide()
148
- event.ignore()
140
+ if ExtendSystemTray.isSystemTrayAvailable() and self.show_system_tray_ray:
141
+ if self.system_tray.isVisible():
142
+ self.hide()
143
+ event.ignore()
149
144
  else:
150
145
  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()
146
+
147
+ def close(self):
148
+ write_user_setting()
149
+ self.video_setting_ui.video_widget_list.clear()
150
+ self.image_setting_ui.image_widget_list.clear()
151
+ self.web_setting_ui.web_widget_list.clear()
152
+ self.gif_setting_ui.gif_widget_list.clear()
153
+ self.sound_player_setting_ui.sound_widget_list.clear()
154
+ self.text_setting_ui.text_widget_list.clear()
155
+ super().close()
156
+ QCoreApplication.exit(0)
160
157
 
161
158
  @classmethod
162
159
  def debug_close(cls):
@@ -164,12 +161,10 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
164
161
 
165
162
 
166
163
  def start_front_engine(debug: bool = False) -> None:
167
- new_editor = QApplication(sys.argv)
164
+ main_app = QApplication(sys.argv)
168
165
  window = FrontEngineMainUI(debug=debug)
169
- apply_stylesheet(new_editor, theme='dark_amber.xml')
170
- window.showMaximized()
171
166
  try:
172
167
  window.startup_setting()
173
168
  except Exception as error:
174
169
  print(repr(error))
175
- sys.exit(new_editor.exec())
170
+ sys.exit(main_app.exec())