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
@@ -0,0 +1,93 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QMessageBox, QSlider, QLabel, QLineEdit, QPushButton, QComboBox
3
+
4
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
5
+ from frontengine.user_setting.scene_setting import scene_json
6
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
7
+
8
+
9
+ class TextSceneSettingUI(QWidget):
10
+
11
+ def __init__(self, script_ui: SceneManagerUI):
12
+ super().__init__()
13
+ self.script_ui = script_ui
14
+ # Opacity setting
15
+ self.opacity_slider = QSlider()
16
+ self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
17
+ self.opacity_label = QLabel(
18
+ language_wrapper.language_word_dict.get("Opacity")
19
+ )
20
+ self.opacity_slider.setMinimum(1)
21
+ self.opacity_slider.setMaximum(100)
22
+ self.opacity_slider.setValue(20)
23
+ self.opacity_slider.setTickInterval(1)
24
+ self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
25
+ self.opacity_slider.actionTriggered.connect(self.opacity_trick)
26
+ # Font size setting
27
+ self.font_size_slider = QSlider()
28
+ self.font_size_slider.setOrientation(Qt.Orientation.Horizontal)
29
+ self.font_size_label = QLabel(
30
+ language_wrapper.language_word_dict.get("Font size")
31
+ )
32
+ self.font_size_slider.setMinimum(1)
33
+ self.font_size_slider.setMaximum(600)
34
+ self.font_size_slider.setValue(100)
35
+ self.font_size_slider.setTickInterval(1)
36
+ self.font_size_slider_value_label = QLabel(str(self.font_size_slider.value()))
37
+ self.font_size_slider.actionTriggered.connect(self.font_size_trick)
38
+ # Font input button
39
+ self.line_edit = QLineEdit()
40
+ self.update_scene_button = QPushButton(
41
+ language_wrapper.language_word_dict.get("scene_add_text")
42
+ )
43
+ self.update_scene_button.clicked.connect(self.update_scene_json)
44
+ # Text position
45
+ self.text_position_label = QLabel(
46
+ language_wrapper.language_word_dict.get("text_setting_choose_alignment")
47
+ )
48
+ self.text_position_combobox = QComboBox()
49
+ self.text_position_combobox.addItem("TopLeft")
50
+ self.text_position_combobox.addItem("TopRight")
51
+ self.text_position_combobox.addItem("BottomLeft")
52
+ self.text_position_combobox.addItem("BottomRight")
53
+ self.text_position_combobox.addItem("Center")
54
+
55
+ self.grid_layout = QGridLayout()
56
+ self.grid_layout.addWidget(self.opacity_label, 0, 0)
57
+ self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
58
+ self.grid_layout.addWidget(self.opacity_slider, 0, 2)
59
+ self.grid_layout.addWidget(self.font_size_label, 1, 0)
60
+ self.grid_layout.addWidget(self.font_size_slider_value_label, 1, 1)
61
+ self.grid_layout.addWidget(self.font_size_slider, 1, 2)
62
+ self.grid_layout.addWidget(self.text_position_label, 2, 0)
63
+ self.grid_layout.addWidget(self.text_position_combobox, 2, 1)
64
+ self.grid_layout.addWidget(self.update_scene_button, 3, 0)
65
+ self.grid_layout.addWidget(self.line_edit, 3, 1)
66
+ self.setLayout(self.grid_layout)
67
+
68
+ def opacity_trick(self) -> None:
69
+ self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
70
+
71
+ def font_size_trick(self) -> None:
72
+ self.font_size_slider_value_label.setText(str(self.font_size_slider.value()))
73
+
74
+ def update_scene_json(self):
75
+ if self.line_edit.text() == "" or self.line_edit.text().strip() == "":
76
+ message_box = QMessageBox(self)
77
+ message_box.setText(
78
+ language_wrapper.language_word_dict.get('not_prepare')
79
+ )
80
+ message_box.show()
81
+ else:
82
+ scene_json.update(
83
+ {
84
+ f"{len(scene_json)}": {
85
+ "type": "TEXT",
86
+ "text": self.line_edit.text(),
87
+ "font_size": self.font_size_slider.value(),
88
+ "opacity": self.opacity_slider.value(),
89
+ "alignment": self.text_position_combobox.currentText()
90
+ }
91
+ }
92
+ )
93
+ self.script_ui.renew_json_plain_text()
@@ -0,0 +1,122 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSlider, QPushButton, QMessageBox
3
+
4
+ from frontengine.ui.dialog.choose_file_dialog import choose_video
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 VideoSceneSettingUI(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
+ # Opacity setting
17
+ self.opacity_slider = QSlider()
18
+ self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
19
+ self.opacity_label = QLabel(
20
+ language_wrapper.language_word_dict.get("Opacity")
21
+ )
22
+ self.opacity_slider.setMinimum(1)
23
+ self.opacity_slider.setMaximum(100)
24
+ self.opacity_slider.setValue(20)
25
+ self.opacity_slider.setTickInterval(1)
26
+ self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
27
+ self.opacity_slider.actionTriggered.connect(self.opacity_trick)
28
+ # Play rate setting
29
+ self.play_rate_label = QLabel(
30
+ language_wrapper.language_word_dict.get("Play rate")
31
+ )
32
+ self.play_rate_slider = QSlider()
33
+ self.play_rate_slider.setMinimum(1)
34
+ self.play_rate_slider.setMaximum(200)
35
+ self.play_rate_slider.setTickInterval(1)
36
+ self.play_rate_slider.setValue(100)
37
+ self.play_rate_slider_value_label = QLabel(str(self.play_rate_slider.value()))
38
+ self.play_rate_slider.setOrientation(Qt.Orientation.Horizontal)
39
+ self.play_rate_slider.actionTriggered.connect(self.play_rate_trick)
40
+ # Volume setting
41
+ self.volume_label = QLabel(
42
+ language_wrapper.language_word_dict.get("Volume")
43
+ )
44
+ self.volume_slider = QSlider()
45
+ self.volume_slider.setMinimum(1)
46
+ self.volume_slider.setMaximum(100)
47
+ self.volume_slider.setTickInterval(1)
48
+ self.volume_slider.setValue(100)
49
+ self.volume_slider_value_label = QLabel(str(self.volume_slider.value()))
50
+ self.volume_slider.setOrientation(Qt.Orientation.Horizontal)
51
+ self.volume_slider.actionTriggered.connect(self.volume_trick)
52
+ # Ready label and variable
53
+ self.ready_label = QLabel(
54
+ language_wrapper.language_word_dict.get("Not Ready")
55
+ )
56
+ # Choose video file
57
+ self.choose_file_button = QPushButton(
58
+ language_wrapper.language_word_dict.get("video_setting_choose_file")
59
+ )
60
+ self.choose_file_button.clicked.connect(self.get_video)
61
+ # Update scene json
62
+ self.update_scene_button = QPushButton(
63
+ language_wrapper.language_word_dict.get("scene_add_video")
64
+ )
65
+ self.update_scene_button.clicked.connect(self.update_scene_json)
66
+ self.video_path: [str, None] = None
67
+ self.grid_layout = QGridLayout()
68
+ self.grid_layout.addWidget(self.opacity_label, 0, 0)
69
+ self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
70
+ self.grid_layout.addWidget(self.opacity_slider, 0, 2)
71
+ self.grid_layout.addWidget(self.play_rate_label, 1, 0)
72
+ self.grid_layout.addWidget(self.play_rate_slider_value_label, 1, 1)
73
+ self.grid_layout.addWidget(self.play_rate_slider, 1, 2)
74
+ self.grid_layout.addWidget(self.volume_label, 2, 0)
75
+ self.grid_layout.addWidget(self.volume_slider_value_label, 2, 1)
76
+ self.grid_layout.addWidget(self.volume_slider, 2, 2)
77
+ self.grid_layout.addWidget(self.choose_file_button, 3, 0)
78
+ self.grid_layout.addWidget(self.ready_label, 3, 1)
79
+ self.grid_layout.addWidget(self.update_scene_button, 4, 0)
80
+ self.setLayout(self.grid_layout)
81
+
82
+ def get_video(self) -> None:
83
+ self.ready_label.setText(
84
+ language_wrapper.language_word_dict.get("Not Ready")
85
+ )
86
+ self.ready_to_play = False
87
+ self.video_path = choose_video(self)
88
+ if self.video_path is not None:
89
+ self.ready_label.setText(
90
+ language_wrapper.language_word_dict.get("Ready")
91
+ )
92
+ self.ready_to_play = True
93
+
94
+ def opacity_trick(self) -> None:
95
+ self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
96
+
97
+ def play_rate_trick(self) -> None:
98
+ self.play_rate_slider_value_label.setText(str(self.play_rate_slider.value()))
99
+
100
+ def volume_trick(self) -> None:
101
+ self.volume_slider_value_label.setText(str(self.volume_slider.value()))
102
+
103
+ def update_scene_json(self):
104
+ if self.video_path is None:
105
+ message_box = QMessageBox(self)
106
+ message_box.setText(
107
+ language_wrapper.language_word_dict.get('not_prepare')
108
+ )
109
+ message_box.show()
110
+ else:
111
+ scene_json.update(
112
+ {
113
+ f"{len(scene_json)}": {
114
+ "type": "VIDEO",
115
+ "file_path": self.video_path,
116
+ "opacity": self.opacity_slider.value(),
117
+ "volume": self.volume_slider.value(),
118
+ "play_rate": self.play_rate_slider.value()
119
+ }
120
+ }
121
+ )
122
+ self.script_ui.renew_json_plain_text()
@@ -0,0 +1,66 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QLineEdit, QMessageBox, QPushButton
3
+
4
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
5
+ from frontengine.user_setting.scene_setting import scene_json
6
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
7
+
8
+
9
+ class WebSceneSettingUI(QWidget):
10
+
11
+ def __init__(self, script_ui: SceneManagerUI):
12
+ super().__init__()
13
+ self.script_ui = script_ui
14
+ # Opacity setting
15
+ self.opacity_slider = QSlider()
16
+ self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
17
+ self.opacity_label = QLabel(
18
+ language_wrapper.language_word_dict.get("Opacity")
19
+ )
20
+ self.opacity_slider.setMinimum(1)
21
+ self.opacity_slider.setMaximum(100)
22
+ self.opacity_slider.setValue(20)
23
+ self.opacity_slider.setTickInterval(1)
24
+ self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
25
+ self.opacity_slider.actionTriggered.connect(self.opacity_trick)
26
+ # WEB URL input
27
+ self.web_url_input = QLineEdit()
28
+ self.url_label = QLabel(
29
+ language_wrapper.language_word_dict.get("scene_url_label")
30
+ )
31
+ self.grid_layout = QGridLayout()
32
+ # Update scene json
33
+ self.update_scene_button = QPushButton(
34
+ language_wrapper.language_word_dict.get("scene_add_web")
35
+ )
36
+ self.update_scene_button.clicked.connect(self.update_scene_json)
37
+ # Add to layout
38
+ self.grid_layout.addWidget(self.opacity_label, 0, 0)
39
+ self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
40
+ self.grid_layout.addWidget(self.opacity_slider, 0, 2)
41
+ self.grid_layout.addWidget(self.url_label, 1, 0)
42
+ self.grid_layout.addWidget(self.web_url_input, 1, 1)
43
+ self.grid_layout.addWidget(self.update_scene_button, 2, 0)
44
+ self.setLayout(self.grid_layout)
45
+
46
+ def opacity_trick(self) -> None:
47
+ self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
48
+
49
+ def update_scene_json(self):
50
+ if self.web_url_input.text() == "" or self.web_url_input.text().strip() == "":
51
+ message_box = QMessageBox(self)
52
+ message_box.setText(
53
+ language_wrapper.language_word_dict.get('not_prepare')
54
+ )
55
+ message_box.show()
56
+ else:
57
+ scene_json.update(
58
+ {
59
+ f"{len(scene_json)}": {
60
+ "type": "WEB",
61
+ "url": self.web_url_input.text(),
62
+ "opacity": self.opacity_slider.value(),
63
+ }
64
+ }
65
+ )
66
+ self.script_ui.renew_json_plain_text()
@@ -0,0 +1,55 @@
1
+ from PySide6.QtCore import Qt
2
+ from PySide6.QtWidgets import QWidget, QGridLayout, QTabWidget
3
+ from frontengine.ui.page.scene_setting.scene_page.gif import GIFSceneSettingUI
4
+
5
+ from frontengine.show.scene.scene import SceneManager
6
+ from frontengine.ui.page.scene_setting.scene_manager import SceneManagerUI
7
+ from frontengine.ui.page.scene_setting.scene_page.image import ImageSceneSettingUI
8
+ from frontengine.ui.page.scene_setting.scene_page.sound import SoundSceneSettingUI
9
+ from frontengine.ui.page.scene_setting.scene_page.text import TextSceneSettingUI
10
+ from frontengine.ui.page.scene_setting.scene_page.video import VideoSceneSettingUI
11
+ from frontengine.ui.page.scene_setting.scene_page.web import WebSceneSettingUI
12
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
13
+
14
+
15
+ class SceneSettingUI(QWidget):
16
+
17
+ def __init__(self):
18
+ super().__init__()
19
+ self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
20
+ self.grid_layout = QGridLayout()
21
+ self.grid_layout.setContentsMargins(0, 0, 0, 0)
22
+ # scene
23
+ self.scene = SceneManager()
24
+ # Tab
25
+ self.tab_widget = QTabWidget(self)
26
+ self.scene_manager_ui = SceneManagerUI(self.scene)
27
+ self.tab_widget.addTab(
28
+ self.scene_manager_ui, language_wrapper.language_word_dict.get("scene_script")
29
+ )
30
+ self.tab_widget.addTab(
31
+ GIFSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_gif_text")
32
+ )
33
+ self.tab_widget.addTab(
34
+ ImageSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_image_text")
35
+ )
36
+ self.tab_widget.addTab(
37
+ SoundSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_sound_text")
38
+ )
39
+ self.tab_widget.addTab(
40
+ TextSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_text_text")
41
+ )
42
+ self.tab_widget.addTab(
43
+ VideoSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_video_text")
44
+ )
45
+ self.tab_widget.addTab(
46
+ WebSceneSettingUI(self.scene_manager_ui), language_wrapper.language_word_dict.get("tab_web_text")
47
+ )
48
+ # Add to layout
49
+ self.grid_layout.addWidget(self.tab_widget, 0, 0, -1, -1)
50
+ self.setLayout(self.grid_layout)
51
+
52
+ def close_scene(self) -> None:
53
+ self.scene.widget_list.clear()
54
+ for view in self.scene.view_list:
55
+ view.close()
@@ -17,7 +17,6 @@ class SoundPlayerSettingUI(QWidget):
17
17
  self.grid_layout.setContentsMargins(0, 0, 0, 0)
18
18
  # Init variable
19
19
  self.sound_widget_list = list()
20
- self.show_all_screen = False
21
20
  self.ready_to_play = False
22
21
  # Volume setting
23
22
  self.volume_label = QLabel(
@@ -1,8 +1,10 @@
1
1
  from PySide6.QtCore import Qt
2
- from PySide6.QtGui import QScreen
3
- from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QLineEdit, QPushButton, QCheckBox
2
+ from PySide6.QtGui import QScreen, QGuiApplication
3
+ from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QLineEdit, QPushButton, QCheckBox, QComboBox, \
4
+ QDialog
4
5
 
5
6
  from frontengine.show.text.draw_text import TextWidget
7
+ from frontengine.ui.page.utils import monitor_choose_dialog
6
8
  from frontengine.utils.logging.loggin_instance import front_engine_logger
7
9
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
10
 
@@ -36,7 +38,7 @@ class TextSettingUI(QWidget):
36
38
  language_wrapper.language_word_dict.get("Font size")
37
39
  )
38
40
  self.font_size_slider.setMinimum(1)
39
- self.font_size_slider.setMaximum(300)
41
+ self.font_size_slider.setMaximum(600)
40
42
  self.font_size_slider.setValue(100)
41
43
  self.font_size_slider.setTickInterval(1)
42
44
  self.font_size_slider_value_label = QLabel(str(self.font_size_slider.value()))
@@ -57,6 +59,16 @@ class TextSettingUI(QWidget):
57
59
  self.show_on_bottom_checkbox = QCheckBox(
58
60
  language_wrapper.language_word_dict.get("Show on bottom")
59
61
  )
62
+ # Text position
63
+ self.text_position_label = QLabel(
64
+ language_wrapper.language_word_dict.get("text_setting_choose_alignment")
65
+ )
66
+ self.text_position_combobox = QComboBox()
67
+ self.text_position_combobox.addItem("TopLeft")
68
+ self.text_position_combobox.addItem("TopRight")
69
+ self.text_position_combobox.addItem("BottomLeft")
70
+ self.text_position_combobox.addItem("BottomRight")
71
+ self.text_position_combobox.addItem("Center")
60
72
  # Add to layout
61
73
  self.grid_layout.addWidget(self.opacity_label, 0, 0)
62
74
  self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
@@ -66,18 +78,23 @@ class TextSettingUI(QWidget):
66
78
  self.grid_layout.addWidget(self.font_size_slider, 1, 2)
67
79
  self.grid_layout.addWidget(self.show_on_all_screen_checkbox, 2, 0)
68
80
  self.grid_layout.addWidget(self.show_on_bottom_checkbox, 2, 1)
69
- self.grid_layout.addWidget(self.start_button, 3, 0)
70
- self.grid_layout.addWidget(self.line_edit, 3, 2)
81
+ self.grid_layout.addWidget(self.text_position_label, 3, 0)
82
+ self.grid_layout.addWidget(self.text_position_combobox, 3, 1)
83
+ self.grid_layout.addWidget(self.start_button, 4, 0)
84
+ self.grid_layout.addWidget(self.line_edit, 4, 1)
71
85
  self.setLayout(self.grid_layout)
72
86
 
73
87
  def set_show_all_screen(self) -> None:
74
88
  self.show_all_screen = self.show_on_all_screen_checkbox.isChecked()
75
89
 
76
90
  def _create_text_widget(self) -> TextWidget:
77
- text_widget = TextWidget(self.line_edit.text())
91
+ text_widget = TextWidget(
92
+ text=self.line_edit.text(),
93
+ alignment=self.text_position_combobox.currentText())
78
94
  text_widget.set_font_variable(self.font_size_slider.value())
79
95
  text_widget.set_ui_variable(float(self.opacity_slider.value()) / 100)
80
96
  text_widget.set_ui_window_flag(self.show_on_bottom_checkbox.isChecked())
97
+ text_widget.set_font()
81
98
  self.text_widget_list.append(text_widget)
82
99
  return text_widget
83
100
 
@@ -89,13 +106,24 @@ class TextSettingUI(QWidget):
89
106
 
90
107
  def start_draw_text_on_screen(self) -> None:
91
108
  front_engine_logger.info("start_draw_text_on_screen")
92
- if self.show_all_screen:
109
+ monitors = QGuiApplication.screens()
110
+ if self.show_all_screen is False and len(monitors) <= 1:
93
111
  text_widget = self._create_text_widget()
94
112
  text_widget.showFullScreen()
113
+ elif self.show_all_screen is False and len(monitors) >= 2:
114
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
115
+ result = input_dialog.exec_()
116
+ if result == QDialog.DialogCode.Accepted:
117
+ select_monitor_index = int(combobox.currentText())
118
+ if len(monitors) > select_monitor_index:
119
+ monitor = monitors[select_monitor_index]
120
+ gif_widget = self._create_text_widget()
121
+ gif_widget.setScreen(monitor)
122
+ gif_widget.move(monitor.availableGeometry().topLeft())
123
+ gif_widget.showFullScreen()
95
124
  else:
96
- monitors = QScreen.virtualSiblings(self.screen())
97
- for screen in monitors:
98
- monitor = screen.availableGeometry()
125
+ for monitor in monitors:
99
126
  text_widget = self._create_text_widget()
100
- text_widget.move(monitor.left(), monitor.top())
127
+ text_widget.setScreen(monitor)
128
+ text_widget.move(monitor.availableGeometry().topLeft())
101
129
  text_widget.showFullScreen()
@@ -0,0 +1,23 @@
1
+ from PySide6.QtWidgets import QWidget, QDialog, QGridLayout, QLabel, QComboBox, QPushButton
2
+
3
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
4
+
5
+
6
+ def monitor_choose_dialog(parent: QWidget, monitors: list):
7
+ input_dialog = QDialog(parent)
8
+ input_dialog.setWindowTitle(language_wrapper.language_word_dict.get("show_on_which_monitor"))
9
+ grid_layout = QGridLayout()
10
+ label = QLabel(language_wrapper.language_word_dict.get("show_on_which_monitor"))
11
+ combobox = QComboBox()
12
+ ok_button = QPushButton(language_wrapper.language_word_dict.get("ok"))
13
+ ok_button.clicked.connect(input_dialog.accept)
14
+ no_button = QPushButton(language_wrapper.language_word_dict.get("no"))
15
+ no_button.clicked.connect(input_dialog.reject)
16
+ for index in range(len(monitors)):
17
+ combobox.addItem(str(index))
18
+ grid_layout.addWidget(label, 0, 0)
19
+ grid_layout.addWidget(combobox, 1, 0)
20
+ grid_layout.addWidget(ok_button, 2, 0)
21
+ grid_layout.addWidget(no_button, 2, 1)
22
+ input_dialog.setLayout(grid_layout)
23
+ return input_dialog, combobox
@@ -1,9 +1,10 @@
1
1
  from PySide6.QtCore import Qt
2
- from PySide6.QtGui import QScreen
3
- from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QPushButton, QMessageBox, QCheckBox
2
+ from PySide6.QtGui import QScreen, QGuiApplication
3
+ from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QPushButton, QMessageBox, QCheckBox, QDialog
4
4
 
5
5
  from frontengine.show.video.video_player import VideoWidget
6
6
  from frontengine.ui.dialog.choose_file_dialog import choose_video
7
+ from frontengine.ui.page.utils import monitor_choose_dialog
7
8
  from frontengine.utils.logging.loggin_instance import front_engine_logger
8
9
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
9
10
 
@@ -119,17 +120,32 @@ class VideoSettingUI(QWidget):
119
120
  message_box.show()
120
121
  else:
121
122
  front_engine_logger.info("start_play_gif")
122
- if self.show_all_screen:
123
+ monitors = QGuiApplication.screens()
124
+ if self.show_all_screen is False and len(monitors) <= 1:
123
125
  video_widget = self._create_video_widget()
124
126
  video_widget.set_ui_window_flag(self.show_on_bottom_checkbox.isChecked())
125
127
  video_widget.showMaximized()
128
+ elif self.show_all_screen is False and len(monitors) >= 2:
129
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
130
+ result = input_dialog.exec_()
131
+ if result == QDialog.DialogCode.Accepted:
132
+ select_monitor_index = int(combobox.currentText())
133
+ if len(monitors) > select_monitor_index:
134
+ monitor = monitors[select_monitor_index]
135
+ gif_widget = self._create_video_widget()
136
+ gif_widget.setScreen(monitor)
137
+ gif_widget.move(monitor.availableGeometry().topLeft())
138
+ gif_widget.showFullScreen()
126
139
  else:
127
- monitors = QScreen.virtualSiblings(self.screen())
128
- for screen in monitors:
129
- monitor = screen.availableGeometry()
140
+ count = 0
141
+ for monitor in monitors:
130
142
  video_widget = self._create_video_widget()
131
- video_widget.move(monitor.left(), monitor.top())
143
+ if count >= 1:
144
+ video_widget.media_player.audioOutput().setVolume(0)
145
+ video_widget.setScreen(monitor)
146
+ video_widget.move(monitor.availableGeometry().topLeft())
132
147
  video_widget.showMaximized()
148
+ count = count + 1
133
149
 
134
150
  def choose_and_copy_file_to_cwd_gif_dir_then_play(self) -> None:
135
151
  self.ready_label.setText(
@@ -1,8 +1,9 @@
1
1
  from PySide6.QtCore import Qt
2
2
  from PySide6.QtGui import QScreen
3
- from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSlider, QLineEdit, QPushButton, QCheckBox
3
+ from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSlider, QLineEdit, QPushButton, QCheckBox, QDialog
4
4
 
5
5
  from frontengine.show.web.webview import WebWidget
6
+ from frontengine.ui.page.utils import monitor_choose_dialog
6
7
  from frontengine.utils.logging.loggin_instance import front_engine_logger
7
8
  from frontengine.utils.multi_language.language_wrapper import language_wrapper
8
9
 
@@ -93,14 +94,25 @@ class WEBSettingUI(QWidget):
93
94
  self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
94
95
 
95
96
  def start_open_web_with_url(self) -> None:
96
- if self.show_all_screen:
97
+ monitors = QScreen.virtualSiblings(self.screen())
98
+ if self.show_all_screen is False and len(monitors) <= 1:
97
99
  web_widget = self._create_web_widget()
98
100
  web_widget.showMaximized()
101
+ elif self.show_all_screen is False and len(monitors) >= 2:
102
+ input_dialog, combobox = monitor_choose_dialog(self, monitors)
103
+ result = input_dialog.exec_()
104
+ if result == QDialog.DialogCode.Accepted:
105
+ select_monitor_index = int(combobox.currentText())
106
+ if len(monitors) > select_monitor_index:
107
+ monitor = monitors[select_monitor_index]
108
+ gif_widget = self._create_web_widget()
109
+ gif_widget.setScreen(monitor)
110
+ gif_widget.move(monitor.availableGeometry().topLeft())
111
+ gif_widget.showFullScreen()
99
112
  else:
100
113
  front_engine_logger.info("start_open_web_with_url")
101
- monitors = QScreen.virtualSiblings(self.screen())
102
- for screen in monitors:
103
- monitor = screen.availableGeometry()
114
+ for monitor in monitors:
104
115
  web_widget = self._create_web_widget()
105
- web_widget.move(monitor.left(), monitor.top())
106
- web_widget.showMaximized()
116
+ web_widget.setScreen(monitor)
117
+ web_widget.move(monitor.availableGeometry().topLeft())
118
+ web_widget.showFullScreen()
@@ -0,0 +1,34 @@
1
+ import os
2
+
3
+ from PySide6.QtWidgets import QWidget, QFileDialog
4
+
5
+ from frontengine.ui.dialog.choose_file_dialog import choose_file
6
+ from frontengine.utils.json.json_file import write_json, read_json
7
+ from frontengine.utils.logging.loggin_instance import front_engine_logger
8
+ from frontengine.utils.multi_language.language_wrapper import language_wrapper
9
+
10
+ scene_json = {
11
+
12
+ }
13
+
14
+
15
+ def choose_scene_json(
16
+ trigger_ui: QWidget, file_filter: str = "Json (*.json;)", extensions: list = None) -> str:
17
+ front_engine_logger.info("choose_scene_json")
18
+ extensions = extensions or [".json"]
19
+ file_path = choose_file(
20
+ trigger_ui=trigger_ui, file_filter=file_filter, extensions=extensions,
21
+ warning_message=language_wrapper.language_word_dict.get("scene_choose_message_box"))
22
+ if file_path:
23
+ scene_json.update(read_json(file_path))
24
+
25
+
26
+ def write_scene_file(parent_qt_instance: QWidget, file_filter: str = "Json (*.json;)"):
27
+ file_path = QFileDialog().getSaveFileName(
28
+ parent=parent_qt_instance,
29
+ dir=os.getcwd(),
30
+ filter=file_filter
31
+ )
32
+ if file_path:
33
+ file_path = file_path[0]
34
+ write_json(str(file_path), scene_json)
@@ -5,7 +5,8 @@ from frontengine.utils.json.json_file import read_json
5
5
  from frontengine.utils.json.json_file import write_json
6
6
 
7
7
  user_setting_dict = {
8
- "language": "English"
8
+ "language": "English",
9
+ "theme": "dark_amber.xml",
9
10
  }
10
11
 
11
12
 
@@ -0,0 +1,5 @@
1
+ import webbrowser
2
+
3
+
4
+ def open_browser(url: str):
5
+ webbrowser.open(url, new=0)
@@ -54,6 +54,9 @@ english_word_dict = {
54
54
  "seconds": "sec",
55
55
  "close_delay": "Message disappear time sec",
56
56
  "country_code": "locale code",
57
+ "show_on_which_monitor": "Show on which monitor",
58
+ "ok": "ok",
59
+ "no": "no",
57
60
  # GIF setting ui
58
61
  "gif_setting_ui_choose_file": "Choose GIF or WEBP file",
59
62
  "gif_setting_ui_play": "Start Play GIF or WEBP",
@@ -71,6 +74,7 @@ english_word_dict = {
71
74
  "sound_player_setting_message_box_sound": "Please choose a sound file",
72
75
  # Text setting ui
73
76
  "text_setting_start_draw": "Start draw text on screen",
77
+ "text_setting_choose_position": "Choose text alignment",
74
78
  # Video setting ui
75
79
  "video_setting_choose_file": "Choose video file",
76
80
  "video_setting_start_play": "Start Play Video",
@@ -81,6 +85,7 @@ english_word_dict = {
81
85
  "web_setting_open_enable_input": "Enable input",
82
86
  # Scene UI
83
87
  "tab_scene_text": "Scene",
88
+ "scene_start": "Start scene",
84
89
  "scene_table_view_type": "Type",
85
90
  "scene_file_path": "File path",
86
91
  "scene_setting_start_scene_button": "Start Scene",
@@ -90,13 +95,14 @@ english_word_dict = {
90
95
  "scene_add_text": "Add text to scene",
91
96
  "scene_add_video": "Add video to scene",
92
97
  "scene_add_web": "Add web to scene",
98
+ "scene_url_label": "URL",
93
99
  "scene_add_UI": "Add ui to scene",
94
100
  "scene_choose_message_box": "Please choose a scene file",
95
101
  "scene_choose_output_path_message_box": "Please choose a scene file output path",
96
102
  "scene_output": "output scene file",
97
103
  "scene_input": "load scene file",
98
- "tableview_clear": "clear all setting",
99
- "scene_control_panel": "Scene control panel",
104
+ "scene_script_clear": "clear all script",
105
+ "scene_script": "Scene script",
100
106
  # Chat scene input
101
107
  "chat_scene_input_title": "input chat content",
102
108
  "chat_scene_send_chat": "send text",
@@ -116,4 +122,10 @@ english_word_dict = {
116
122
  "start_generate_image": "Star generate",
117
123
  "input_error": "Please input something",
118
124
  "save_generation_image": "Save Image",
125
+ # Help Menu
126
+ "help_menu_label": "Help menu",
127
+ "help_menu_open_issue": "Open issue tracker",
128
+ # HowTo Menu
129
+ "doc_menu_label": "Doc menu",
130
+ "doc_menu_open_doc": "Open doc",
119
131
  }