frontengine-dev 0.0.56__py3-none-any.whl → 0.0.58__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_dev-0.0.56.dist-info → frontengine_dev-0.0.58.dist-info}/METADATA +4 -51
  40. frontengine_dev-0.0.58.dist-info/RECORD +91 -0
  41. {frontengine_dev-0.0.56.dist-info → frontengine_dev-0.0.58.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_dev-0.0.56.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_dev-0.0.56.dist-info → frontengine_dev-0.0.58.dist-info}/LICENSE +0 -0
  91. {frontengine_dev-0.0.56.dist-info → frontengine_dev-0.0.58.dist-info}/top_level.txt +0 -0
@@ -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,25 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING
3
+
4
+ from frontengine.utils.browser.browser import open_browser
5
+
6
+ if TYPE_CHECKING:
7
+ from frontengine.ui.main_ui import FrontEngineMainUI
8
+ from PySide6.QtGui import QAction
9
+
10
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
11
+
12
+
13
+ def build_how_to_menu(ui_we_want_to_set: FrontEngineMainUI) -> None:
14
+ ui_we_want_to_set.how_to_menu = ui_we_want_to_set.menu_bar.addMenu(
15
+ language_wrapper.language_word_dict.get("doc_menu_label")
16
+ )
17
+ ui_we_want_to_set.how_to_menu.open_doc_action = QAction(
18
+ language_wrapper.language_word_dict.get("doc_menu_open_doc")
19
+ )
20
+ ui_we_want_to_set.how_to_menu.open_doc_action.triggered.connect(
21
+ lambda: open_browser("https://frontengine.readthedocs.io/en/latest/")
22
+ )
23
+ ui_we_want_to_set.how_to_menu.addAction(
24
+ ui_we_want_to_set.how_to_menu.open_doc_action
25
+ )
@@ -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")
@@ -148,11 +145,7 @@ class ControlCenterUI(QWidget):
148
145
 
149
146
  def clear_scene(self) -> None:
150
147
  front_engine_logger.info("clear_scene")
151
- self.scene_setting_ui.scene_control_setting.close_scene()
152
-
153
- def clear_chat(self):
154
- front_engine_logger.info("clear_chat")
155
- self.chat_scene_ui.close_chat_ui()
148
+ self.scene_setting_ui.close_scene()
156
149
 
157
150
  def clear_all(self) -> None:
158
151
  front_engine_logger.info("clear_all")
@@ -162,7 +155,7 @@ class ControlCenterUI(QWidget):
162
155
  self.gif_setting_ui.gif_widget_list.clear()
163
156
  self.sound_player_setting_ui.sound_widget_list.clear()
164
157
  self.text_setting_ui.text_widget_list.clear()
165
- self.scene_setting_ui.scene_control_setting.close_scene()
158
+ self.scene_setting_ui.close_scene()
166
159
 
167
160
  def redirect(self) -> None:
168
161
  if not redirect_manager_instance.std_out_queue.empty():
@@ -1,10 +1,11 @@
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
- QCheckBox
4
+ QCheckBox, QDialog
5
5
 
6
6
  from frontengine.show.gif.paint_gif import GifWidget
7
7
  from frontengine.ui.dialog.choose_file_dialog import choose_gif
8
+ from frontengine.ui.page.utils import monitor_choose_dialog
8
9
  from frontengine.utils.logging.loggin_instance import front_engine_logger
9
10
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
10
11
 
@@ -19,7 +20,7 @@ class GIFSettingUI(QWidget):
19
20
  self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
20
21
  # Init variable
21
22
  self.gif_widget_list = list()
22
- self.show_all_screen = True
23
+ self.show_all_screen = False
23
24
  self.ready_to_play = False
24
25
  # Opacity setting
25
26
  self.opacity_slider = QSlider()
@@ -103,15 +104,26 @@ class GIFSettingUI(QWidget):
103
104
  message_box.show()
104
105
  else:
105
106
  front_engine_logger.info("start_play_gif")
106
- if self.show_all_screen:
107
+ monitors = QGuiApplication.screens()
108
+ if self.show_all_screen is False and len(monitors) <= 1:
107
109
  gif_widget = self._create_gif_widget()
108
110
  gif_widget.showFullScreen()
111
+ elif self.show_all_screen is False and len(monitors) >= 2:
112
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
113
+ result = input_dialog.exec_()
114
+ if result == QDialog.DialogCode.Accepted:
115
+ select_monitor_index = int(combobox.currentText())
116
+ if len(monitors) > select_monitor_index:
117
+ monitor = monitors[select_monitor_index]
118
+ gif_widget = self._create_gif_widget()
119
+ gif_widget.setScreen(monitor)
120
+ gif_widget.move(monitor.availableGeometry().topLeft())
121
+ gif_widget.showFullScreen()
109
122
  else:
110
- monitors = QScreen.virtualSiblings(self.screen())
111
- for screen in monitors:
112
- monitor = screen.availableGeometry()
123
+ for monitor in monitors:
113
124
  gif_widget = self._create_gif_widget()
114
- gif_widget.move(monitor.left(), monitor.top())
125
+ gif_widget.setScreen(monitor)
126
+ gif_widget.move(monitor.availableGeometry().topLeft())
115
127
  gif_widget.showFullScreen()
116
128
 
117
129
  def choose_and_copy_file_to_cwd_gif_dir_then_play(self) -> None:
@@ -1,10 +1,11 @@
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
- QCheckBox
4
+ QCheckBox, QDialog
5
5
 
6
6
  from frontengine.show.image.paint_image import ImageWidget
7
7
  from frontengine.ui.dialog.choose_file_dialog import choose_image
8
+ from frontengine.ui.page.utils import monitor_choose_dialog
8
9
  from frontengine.utils.logging.loggin_instance import front_engine_logger
9
10
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
10
11
 
@@ -88,15 +89,26 @@ class ImageSettingUI(QWidget):
88
89
  message_box.show()
89
90
  else:
90
91
  front_engine_logger.info("start_play_image")
91
- if self.show_all_screen:
92
+ monitors = QGuiApplication.screens()
93
+ if self.show_all_screen is False and len(monitors) <= 1:
92
94
  image_widget = self._create_image_widget()
93
95
  image_widget.showFullScreen()
96
+ elif self.show_all_screen is False and len(monitors) >= 2:
97
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
98
+ result = input_dialog.exec_()
99
+ if result == QDialog.DialogCode.Accepted:
100
+ select_monitor_index = int(combobox.currentText())
101
+ if len(monitors) > select_monitor_index:
102
+ monitor = monitors[select_monitor_index]
103
+ gif_widget = self._create_image_widget()
104
+ gif_widget.setScreen(monitor)
105
+ gif_widget.move(monitor.availableGeometry().topLeft())
106
+ gif_widget.showFullScreen()
94
107
  else:
95
- monitors = QScreen.virtualSiblings(self.screen())
96
- for screen in monitors:
97
- monitor = screen.availableGeometry()
108
+ for monitor in monitors:
98
109
  image_widget = self._create_image_widget()
99
- image_widget.move(monitor.left(), monitor.top())
110
+ image_widget.setScreen(monitor)
111
+ image_widget.move(monitor.availableGeometry().topLeft())
100
112
  image_widget.showFullScreen()
101
113
 
102
114
  def choose_and_copy_file_to_cwd_image_dir_then_play(self) -> None:
@@ -0,0 +1,96 @@
1
+ import json
2
+
3
+ from PySide6.QtCore import Qt
4
+ from PySide6.QtGui import QGuiApplication
5
+ from PySide6.QtWidgets import QWidget, QGridLayout, QPlainTextEdit, QPushButton, QCheckBox, QDialog
6
+
7
+ from frontengine.show.scene.extend_graphic_view import ExtendGraphicView
8
+ from frontengine.ui.page.utils import monitor_choose_dialog
9
+ from frontengine.user_setting.scene_setting import choose_scene_json, write_scene_file, scene_json
10
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
11
+
12
+
13
+ class SceneManagerUI(QWidget):
14
+
15
+ def __init__(self, scene_manager):
16
+ super().__init__()
17
+ self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
18
+ self.grid_layout = QGridLayout()
19
+ self.grid_layout.setContentsMargins(0, 0, 0, 0)
20
+ self.scene = scene_manager
21
+ self.show_all_screen = False
22
+ # Read and write scene json button
23
+ self.read_scene_json_button = QPushButton(language_wrapper.language_word_dict.get("scene_input"))
24
+ self.read_scene_json_button.clicked.connect(self.update_scene_json)
25
+ self.write_scene_json_button = QPushButton(language_wrapper.language_word_dict.get("scene_output"))
26
+ self.write_scene_json_button.clicked.connect(lambda: write_scene_file(self))
27
+ # Json plaintext
28
+ self.json_plaintext = QPlainTextEdit()
29
+ self.json_plaintext.setReadOnly(True)
30
+ self.json_plaintext.appendPlainText("{}")
31
+ # Start button
32
+ self.start_button = QPushButton(
33
+ language_wrapper.language_word_dict.get("scene_start")
34
+ )
35
+ self.start_button.clicked.connect(self.start_scene)
36
+ # Show on all screen
37
+ self.show_on_all_screen_checkbox = QCheckBox(
38
+ language_wrapper.language_word_dict.get("Show on all screen")
39
+ )
40
+ self.show_on_all_screen_checkbox.clicked.connect(self.set_show_all_screen)
41
+ # Add to layout
42
+ self.grid_layout.addWidget(self.json_plaintext, 0, 0, -1, -1)
43
+ self.grid_layout.addWidget(self.read_scene_json_button, 1, 0)
44
+ self.grid_layout.addWidget(self.write_scene_json_button, 1, 1)
45
+ self.grid_layout.addWidget(self.show_on_all_screen_checkbox, 2, 0)
46
+ self.grid_layout.addWidget(self.start_button, 3, 0, 1, 0)
47
+ self.setLayout(self.grid_layout)
48
+
49
+ def set_show_all_screen(self) -> None:
50
+ self.show_all_screen = self.show_on_all_screen_checkbox.isChecked()
51
+
52
+ def start_scene(self):
53
+ scene: dict = json.loads(self.json_plaintext.toPlainText())
54
+ scene_add_function = {
55
+ "TEXT": self.scene.add_text,
56
+ "IMAGE": self.scene.add_image,
57
+ "GIF": self.scene.add_gif,
58
+ "SOUND": self.scene.add_sound,
59
+ "VIDEO": self.scene.add_video,
60
+ "WEB": self.scene.add_web
61
+ }
62
+ for scene_dict in scene.values():
63
+ scene_widget_type = scene_dict.get("type")
64
+ function = scene_add_function.get(scene_widget_type)
65
+ function(setting_dict=scene_dict)
66
+ monitors = QGuiApplication.screens()
67
+ if self.show_all_screen is False and len(monitors) <= 1:
68
+ graphic_view = ExtendGraphicView(self.scene.graphic_scene)
69
+ self.scene.view_list.append(graphic_view)
70
+ graphic_view.showMaximized()
71
+ elif self.show_all_screen is False and len(monitors) >= 2:
72
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
73
+ result = input_dialog.exec_()
74
+ if result == QDialog.DialogCode.Accepted:
75
+ select_monitor_index = int(combobox.currentText())
76
+ if len(monitors) > select_monitor_index:
77
+ monitor = monitors[select_monitor_index]
78
+ graphic_view = ExtendGraphicView(self.scene.graphic_scene)
79
+ graphic_view.setScreen(monitor)
80
+ graphic_view.move(monitor.availableGeometry().topLeft())
81
+ self.scene.view_list.append(graphic_view)
82
+ graphic_view.showMaximized()
83
+ else:
84
+ for monitor in monitors:
85
+ graphic_view = ExtendGraphicView(self.scene.graphic_scene)
86
+ graphic_view.setScreen(monitor)
87
+ graphic_view.move(monitor.availableGeometry().topLeft())
88
+ self.scene.view_list.append(graphic_view)
89
+ graphic_view.showMaximized()
90
+
91
+ def update_scene_json(self):
92
+ choose_scene_json(self)
93
+ self.renew_json_plain_text()
94
+
95
+ def renew_json_plain_text(self):
96
+ self.json_plaintext.setPlainText(json.dumps(scene_json, indent=4))
@@ -0,0 +1,102 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QPushButton, QMessageBox
3
+
4
+ from frontengine.ui.dialog.choose_file_dialog import choose_gif
5
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
6
+ from frontengine.user_setting.scene_setting import scene_json
7
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
+
9
+
10
+ class GIFSceneSettingUI(QWidget):
11
+
12
+ def __init__(self, script_ui: SceneManagerUI):
13
+ super().__init__()
14
+ self.script_ui = script_ui
15
+ # UI components
16
+ self.opacity_slider = QSlider()
17
+ self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
18
+ self.opacity_label = QLabel(
19
+ language_wrapper.language_word_dict.get("Opacity")
20
+ )
21
+ self.opacity_slider.setMinimum(1)
22
+ self.opacity_slider.setMaximum(100)
23
+ self.opacity_slider.setValue(20)
24
+ self.opacity_slider.setTickInterval(1)
25
+ self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
26
+ self.opacity_slider.actionTriggered.connect(self.opacity_trick)
27
+ # Speed setting
28
+ self.speed_label = QLabel(
29
+ language_wrapper.language_word_dict.get("Speed")
30
+ )
31
+ self.speed_slider = QSlider()
32
+ self.speed_slider.setMinimum(1)
33
+ self.speed_slider.setMaximum(200)
34
+ self.speed_slider.setTickInterval(1)
35
+ self.speed_slider.setValue(100)
36
+ self.speed_slider_value_label = QLabel(str(self.speed_slider.value()))
37
+ self.speed_slider.setOrientation(Qt.Orientation.Horizontal)
38
+ self.speed_slider.actionTriggered.connect(self.speed_trick)
39
+ # Choose file button
40
+ self.choose_file_button = QPushButton(
41
+ language_wrapper.language_word_dict.get("gif_setting_ui_choose_file")
42
+ )
43
+ self.choose_file_button.clicked.connect(self.get_gif)
44
+ self.ready_to_play = False
45
+ self.ready_label = QLabel(
46
+ language_wrapper.language_word_dict.get("Not Ready")
47
+ )
48
+ self.gif_image_path: [str, None] = None
49
+ self.update_scene_button = QPushButton(
50
+ language_wrapper.language_word_dict.get("scene_add_gif")
51
+ )
52
+ self.update_scene_button.clicked.connect(self.update_scene_json)
53
+ # Add to layout
54
+ self.grid_layout = QGridLayout()
55
+ self.grid_layout.addWidget(self.opacity_label, 0, 0)
56
+ self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
57
+ self.grid_layout.addWidget(self.opacity_slider, 0, 2)
58
+ self.grid_layout.addWidget(self.speed_label, 1, 0)
59
+ self.grid_layout.addWidget(self.speed_slider_value_label, 1, 1)
60
+ self.grid_layout.addWidget(self.speed_slider, 1, 2)
61
+ self.grid_layout.addWidget(self.choose_file_button, 2, 0)
62
+ self.grid_layout.addWidget(self.ready_label, 2, 1)
63
+ self.grid_layout.addWidget(self.update_scene_button, 3, 0)
64
+ self.setLayout(self.grid_layout)
65
+
66
+ def opacity_trick(self) -> None:
67
+ self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
68
+
69
+ def speed_trick(self) -> None:
70
+ self.speed_slider_value_label.setText(str(self.speed_slider.value()))
71
+
72
+ def get_gif(self):
73
+ self.ready_label.setText(
74
+ language_wrapper.language_word_dict.get("Not Ready")
75
+ )
76
+ self.ready_to_play = False
77
+ self.gif_image_path = choose_gif(self)
78
+ if self.gif_image_path is not None:
79
+ self.ready_label.setText(
80
+ language_wrapper.language_word_dict.get("Ready")
81
+ )
82
+ self.ready_to_play = True
83
+
84
+ def update_scene_json(self):
85
+ if self.gif_image_path is None:
86
+ message_box = QMessageBox(self)
87
+ message_box.setText(
88
+ language_wrapper.language_word_dict.get('not_prepare')
89
+ )
90
+ message_box.show()
91
+ else:
92
+ scene_json.update(
93
+ {
94
+ f"{len(scene_json)}": {
95
+ "type": "GIF",
96
+ "file_path": self.gif_image_path,
97
+ "opacity": self.opacity_slider.value(),
98
+ "speed": self.speed_slider.value()
99
+ }
100
+ }
101
+ )
102
+ self.script_ui.renew_json_plain_text()
@@ -0,0 +1,83 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QPushButton, QLabel, QSlider, QMessageBox
3
+
4
+ from frontengine.ui.dialog.choose_file_dialog import choose_image
5
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
6
+ from frontengine.user_setting.scene_setting import scene_json
7
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
+
9
+
10
+ class ImageSceneSettingUI(QWidget):
11
+
12
+ def __init__(self, script_ui: SceneManagerUI):
13
+ super().__init__()
14
+ self.script_ui = script_ui
15
+ self.image_path: [str, None] = None
16
+ self.ready_to_play = False
17
+ # UI components
18
+ self.opacity_slider = QSlider()
19
+ self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
20
+ self.opacity_label = QLabel(
21
+ language_wrapper.language_word_dict.get("Opacity")
22
+ )
23
+ self.opacity_slider.setMinimum(1)
24
+ self.opacity_slider.setMaximum(100)
25
+ self.opacity_slider.setValue(20)
26
+ self.opacity_slider.setTickInterval(1)
27
+ self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
28
+ self.opacity_slider.actionTriggered.connect(self.opacity_trick)
29
+ # Choose file button
30
+ self.choose_file_button = QPushButton(
31
+ language_wrapper.language_word_dict.get("image_setting_choose_file")
32
+ )
33
+ self.choose_file_button.clicked.connect(self.get_image)
34
+ self.ready_label = QLabel(
35
+ language_wrapper.language_word_dict.get("Not Ready")
36
+ )
37
+ self.update_scene_button = QPushButton(
38
+ language_wrapper.language_word_dict.get("scene_add_image")
39
+ )
40
+ self.update_scene_button.clicked.connect(self.update_scene_json)
41
+ # Add to layout
42
+ self.grid_layout = QGridLayout()
43
+ self.grid_layout.addWidget(self.opacity_label, 0, 0)
44
+ self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
45
+ self.grid_layout.addWidget(self.opacity_slider, 0, 2)
46
+ self.grid_layout.addWidget(self.choose_file_button, 1, 0)
47
+ self.grid_layout.addWidget(self.ready_label, 1, 1)
48
+ self.grid_layout.addWidget(self.update_scene_button, 2, 0)
49
+ self.setLayout(self.grid_layout)
50
+
51
+ def opacity_trick(self) -> None:
52
+ self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
53
+
54
+ def get_image(self):
55
+ self.ready_label.setText(
56
+ language_wrapper.language_word_dict.get("Not Ready")
57
+ )
58
+ self.ready_to_play = False
59
+ self.image_path = choose_image(self)
60
+ if self.image_path is not None:
61
+ self.ready_label.setText(
62
+ language_wrapper.language_word_dict.get("Ready")
63
+ )
64
+ self.ready_to_play = True
65
+
66
+ def update_scene_json(self):
67
+ if self.image_path is None:
68
+ message_box = QMessageBox(self)
69
+ message_box.setText(
70
+ language_wrapper.language_word_dict.get('not_prepare')
71
+ )
72
+ message_box.show()
73
+ else:
74
+ scene_json.update(
75
+ {
76
+ f"{len(scene_json)}": {
77
+ "type": "IMAGE",
78
+ "file_path": self.image_path,
79
+ "opacity": self.opacity_slider.value()
80
+ }
81
+ }
82
+ )
83
+ self.script_ui.renew_json_plain_text()
@@ -0,0 +1,84 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QPushButton, QSlider, QMessageBox
3
+
4
+ from frontengine.ui.dialog.choose_file_dialog import choose_player_sound
5
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
6
+ from frontengine.user_setting.scene_setting import scene_json
7
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
+
9
+
10
+ class SoundSceneSettingUI(QWidget):
11
+
12
+ def __init__(self, script_ui: SceneManagerUI):
13
+ super().__init__()
14
+ self.script_ui = script_ui
15
+ self.ready_to_play = False
16
+ # Volume setting
17
+ self.volume_label = QLabel(
18
+ language_wrapper.language_word_dict.get("Volume")
19
+ )
20
+ self.volume_slider = QSlider()
21
+ self.volume_slider.setMinimum(1)
22
+ self.volume_slider.setMaximum(100)
23
+ self.volume_slider.setTickInterval(1)
24
+ self.volume_slider.setValue(100)
25
+ self.volume_slider_value_label = QLabel(str(self.volume_slider.value()))
26
+ self.volume_slider.setOrientation(Qt.Orientation.Horizontal)
27
+ self.volume_slider.actionTriggered.connect(self.volume_trick)
28
+ # Choose file button
29
+ self.player_sound_path: [str, None] = None
30
+ # Choose file button
31
+ self.choose_player_file_button = QPushButton(
32
+ language_wrapper.language_word_dict.get("sound_player_setting_choose_sound_file")
33
+ )
34
+ self.choose_player_file_button.clicked.connect(self.get_sound)
35
+ # Ready label and variable
36
+ self.player_ready_label = QLabel(
37
+ language_wrapper.language_word_dict.get("Not Ready")
38
+ )
39
+ self.update_scene_button = QPushButton(
40
+ language_wrapper.language_word_dict.get("scene_add_sound")
41
+ )
42
+ self.update_scene_button.clicked.connect(self.update_scene_json)
43
+ self.grid_layout = QGridLayout()
44
+ self.grid_layout.addWidget(self.volume_label, 0, 0)
45
+ self.grid_layout.addWidget(self.volume_slider_value_label, 0, 1)
46
+ self.grid_layout.addWidget(self.volume_slider, 0, 2)
47
+ self.grid_layout.addWidget(self.choose_player_file_button, 1, 0)
48
+ self.grid_layout.addWidget(self.player_ready_label, 1, 1)
49
+ self.grid_layout.addWidget(self.update_scene_button, 2, 0)
50
+ self.setLayout(self.grid_layout)
51
+
52
+ def volume_trick(self) -> None:
53
+ self.volume_slider_value_label.setText(str(self.volume_slider.value()))
54
+
55
+ def get_sound(self) -> None:
56
+ self.player_ready_label.setText(
57
+ language_wrapper.language_word_dict.get("Not Ready")
58
+ )
59
+ self.ready_to_play = False
60
+ self.player_sound_path = choose_player_sound(self)
61
+ if self.player_sound_path is not None:
62
+ self.player_ready_label.setText(
63
+ language_wrapper.language_word_dict.get("Ready")
64
+ )
65
+ self.ready_to_play = True
66
+
67
+ def update_scene_json(self):
68
+ if self.player_sound_path is None:
69
+ message_box = QMessageBox(self)
70
+ message_box.setText(
71
+ language_wrapper.language_word_dict.get('not_prepare')
72
+ )
73
+ message_box.show()
74
+ else:
75
+ scene_json.update(
76
+ {
77
+ f"{len(scene_json)}": {
78
+ "type": "SOUND",
79
+ "file_path": self.player_sound_path,
80
+ "volume": self.volume_slider.value()
81
+ }
82
+ }
83
+ )
84
+ self.script_ui.renew_json_plain_text()