frontengine 0.0.63__py3-none-any.whl → 0.0.65__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.
- frontengine/show/particle/__init__.py +0 -0
- frontengine/show/particle/paint_particle.py +39 -0
- frontengine/show/particle/particle_scene.py +65 -0
- frontengine/show/particle/particle_utils.py +75 -0
- frontengine/ui/main_ui.py +8 -1
- frontengine/ui/page/control_center/control_center_ui.py +5 -1
- frontengine/ui/page/image/image_setting_ui.py +4 -4
- frontengine/ui/page/particle/__init__.py +0 -0
- frontengine/ui/page/particle/particle_setting_ui.py +175 -0
- frontengine/ui/page/video/video_setting_ui.py +0 -1
- frontengine/utils/critical_exit/critical_exit.py +3 -1
- frontengine/utils/multi_language/english.py +7 -0
- {frontengine-0.0.63.dist-info → frontengine-0.0.65.dist-info}/METADATA +6 -1
- {frontengine-0.0.63.dist-info → frontengine-0.0.65.dist-info}/RECORD +17 -11
- {frontengine-0.0.63.dist-info → frontengine-0.0.65.dist-info}/LICENSE +0 -0
- {frontengine-0.0.63.dist-info → frontengine-0.0.65.dist-info}/WHEEL +0 -0
- {frontengine-0.0.63.dist-info → frontengine-0.0.65.dist-info}/top_level.txt +0 -0
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
from PySide6.QtCore import QSize
|
2
|
+
from PySide6.QtGui import QPixmap, Qt
|
3
|
+
from PySide6.QtWidgets import QWidget, QGridLayout
|
4
|
+
|
5
|
+
from frontengine.show.particle.particle_scene import ParticleGraphicScene
|
6
|
+
from frontengine.show.scene.extend_graphic_view import ExtendGraphicView
|
7
|
+
|
8
|
+
|
9
|
+
class ParticleWidget(QWidget):
|
10
|
+
|
11
|
+
def __init__(self, pixmap: QPixmap, particle_size: int, particle_direction: str, particle_count: int = 50,
|
12
|
+
screen_height: int = 1080, screen_width: int = 1920, opacity: float = 0.2,
|
13
|
+
particle_speed: int = 1):
|
14
|
+
super().__init__()
|
15
|
+
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
16
|
+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
|
17
|
+
if particle_size:
|
18
|
+
self.pixmap = pixmap.scaled(QSize(particle_size, particle_size), Qt.AspectRatioMode.KeepAspectRatio)
|
19
|
+
else:
|
20
|
+
self.pixmap = pixmap.scaled(QSize(pixmap.width(), pixmap.height()), Qt.AspectRatioMode.KeepAspectRatio)
|
21
|
+
self.particle_view = ExtendGraphicView()
|
22
|
+
self.particle_scene = ParticleGraphicScene(
|
23
|
+
self.pixmap, particle_direction, particle_count,
|
24
|
+
screen_height, screen_width, opacity, particle_speed)
|
25
|
+
self.particle_view.setScene(self.particle_scene)
|
26
|
+
self.grid_layout = QGridLayout()
|
27
|
+
self.grid_layout.addWidget(self.particle_view, 0, 0, -1, -1)
|
28
|
+
self.setLayout(self.grid_layout)
|
29
|
+
|
30
|
+
def set_ui_window_flag(self, show_on_bottom: bool = False) -> None:
|
31
|
+
self.setWindowFlag(
|
32
|
+
Qt.WindowType.WindowTransparentForInput |
|
33
|
+
Qt.WindowType.FramelessWindowHint |
|
34
|
+
Qt.WindowType.Tool
|
35
|
+
)
|
36
|
+
if not show_on_bottom:
|
37
|
+
self.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint)
|
38
|
+
else:
|
39
|
+
self.setWindowFlag(Qt.WindowType.WindowStaysOnBottomHint)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
from typing import Callable
|
2
|
+
|
3
|
+
from PySide6.QtCore import QTimer, QPoint, QRect
|
4
|
+
from PySide6.QtGui import QPixmap
|
5
|
+
from PySide6.QtWidgets import QGraphicsScene
|
6
|
+
|
7
|
+
from frontengine.show.particle.particle_utils import particle_down, particle_up, particle_left, particle_right, \
|
8
|
+
particle_left_down, particle_left_up, particle_right_down, particle_right_up, particle_random_minus, Particle, \
|
9
|
+
particle_random_add, particle_random
|
10
|
+
|
11
|
+
|
12
|
+
class ParticleGraphicScene(QGraphicsScene):
|
13
|
+
|
14
|
+
def __init__(self, particle_pixmap: QPixmap, particle_direction: str,
|
15
|
+
particle_count: int = 500,
|
16
|
+
screen_height: int = 1920, screen_width: int = 1080, opacity: float = 0.2,
|
17
|
+
particle_speed: int = 1):
|
18
|
+
super().__init__()
|
19
|
+
self.particle_pixmap: QPixmap = particle_pixmap
|
20
|
+
self.particle_direction: str = particle_direction
|
21
|
+
self.particle_count: int = particle_count
|
22
|
+
self.opacity: float = opacity
|
23
|
+
self.particle_dict: dict = {}
|
24
|
+
self.particle_speed: int = particle_speed
|
25
|
+
self.screen_height: int = screen_height
|
26
|
+
self.screen_width: int = screen_width
|
27
|
+
self.create_particle()
|
28
|
+
self.update_function: Callable = {
|
29
|
+
"down": particle_down,
|
30
|
+
"up": particle_up,
|
31
|
+
"left": particle_left,
|
32
|
+
"right": particle_right,
|
33
|
+
"left_down": particle_left_down,
|
34
|
+
"left_up": particle_left_up,
|
35
|
+
"right_down": particle_right_down,
|
36
|
+
"right_up": particle_right_up,
|
37
|
+
"random_minus": particle_random_minus,
|
38
|
+
"random_add": particle_random_add,
|
39
|
+
"random": particle_random
|
40
|
+
}.get(self.particle_direction)
|
41
|
+
self.setSceneRect(QRect(0, 0, screen_width, screen_height))
|
42
|
+
self.update_timer: QTimer = QTimer()
|
43
|
+
self.update_timer.setInterval(10)
|
44
|
+
self.update_timer.timeout.connect(self.update_particle)
|
45
|
+
self.update_timer.start()
|
46
|
+
|
47
|
+
def create_particle(self):
|
48
|
+
self.particle_dict = {}
|
49
|
+
for count in range(self.particle_count):
|
50
|
+
self.particle_dict.update({
|
51
|
+
f"particle_{count}": Particle(self.screen_height, self.screen_width, self.particle_pixmap)
|
52
|
+
})
|
53
|
+
|
54
|
+
def update_particle(self):
|
55
|
+
self.clear()
|
56
|
+
self.update_function(self.particle_dict, self.particle_speed)
|
57
|
+
for particle_key, particle in self.particle_dict.items():
|
58
|
+
pixmap_item = self.addPixmap(particle.pixmap)
|
59
|
+
pixmap_item.setOpacity(self.opacity)
|
60
|
+
pixmap_item.setPos(particle.x, particle.y)
|
61
|
+
particle.pixmap_item = pixmap_item
|
62
|
+
if not self.sceneRect().contains(QPoint(particle.x, particle.y)):
|
63
|
+
self.removeItem(particle.pixmap_item)
|
64
|
+
if len(self.items()) == 0:
|
65
|
+
self.create_particle()
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import random
|
2
|
+
from typing import Dict, Callable
|
3
|
+
|
4
|
+
from PySide6.QtGui import QPixmap
|
5
|
+
from PySide6.QtWidgets import QGraphicsPixmapItem
|
6
|
+
|
7
|
+
|
8
|
+
class Particle(object):
|
9
|
+
|
10
|
+
def __init__(self, height: int, width: int, pixmap: QPixmap):
|
11
|
+
self.pixmap: QPixmap = pixmap
|
12
|
+
self.x: int = random.randint(0, width)
|
13
|
+
self.y: int = random.randint(0, height)
|
14
|
+
self.height = self.pixmap.height()
|
15
|
+
self.width = self.pixmap.width()
|
16
|
+
self.pixmap_item: [QGraphicsPixmapItem, None] = None
|
17
|
+
|
18
|
+
|
19
|
+
def particle_down(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
20
|
+
for particle in particle_dict.values():
|
21
|
+
particle.y += random.randint(0, particle_speed)
|
22
|
+
|
23
|
+
|
24
|
+
def particle_up(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
25
|
+
for particle in particle_dict.values():
|
26
|
+
particle.y -= random.randint(0, particle_speed)
|
27
|
+
|
28
|
+
|
29
|
+
def particle_left(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
30
|
+
for particle in particle_dict.values():
|
31
|
+
particle.x -= random.randint(0, particle_speed)
|
32
|
+
|
33
|
+
|
34
|
+
def particle_right(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
35
|
+
for particle in particle_dict.values():
|
36
|
+
particle.x += random.randint(0, particle_speed)
|
37
|
+
|
38
|
+
|
39
|
+
def particle_left_down(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
40
|
+
particle_left(particle_dict, particle_speed)
|
41
|
+
particle_down(particle_dict, particle_speed)
|
42
|
+
|
43
|
+
|
44
|
+
def particle_left_up(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
45
|
+
particle_left(particle_dict, particle_speed)
|
46
|
+
particle_up(particle_dict, particle_speed)
|
47
|
+
|
48
|
+
|
49
|
+
def particle_right_down(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
50
|
+
particle_right(particle_dict, particle_speed)
|
51
|
+
particle_down(particle_dict, particle_speed)
|
52
|
+
|
53
|
+
|
54
|
+
def particle_right_up(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
55
|
+
particle_right(particle_dict, particle_speed)
|
56
|
+
particle_up(particle_dict, particle_speed)
|
57
|
+
|
58
|
+
|
59
|
+
def particle_random_minus(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
60
|
+
for particle in particle_dict.values():
|
61
|
+
particle.y += random.randint(0, particle_speed)
|
62
|
+
particle.x -= random.randint(0, particle_speed)
|
63
|
+
|
64
|
+
|
65
|
+
def particle_random_add(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
66
|
+
for particle in particle_dict.values():
|
67
|
+
particle.y -= random.randint(0, particle_speed)
|
68
|
+
particle.x += random.randint(0, particle_speed)
|
69
|
+
|
70
|
+
|
71
|
+
def particle_random(particle_dict: Dict[str, Particle], particle_speed: int = 30) -> None:
|
72
|
+
function: Callable = random.choice(
|
73
|
+
[particle_down, particle_up, particle_left, particle_right, particle_right_up, particle_left_down,
|
74
|
+
particle_left_up, particle_right_down, particle_random_add, particle_random_minus])
|
75
|
+
function(particle_dict, particle_speed)
|
frontengine/ui/main_ui.py
CHANGED
@@ -15,6 +15,7 @@ from frontengine.ui.menu.language_menu import build_language_menu
|
|
15
15
|
from frontengine.ui.page.control_center.control_center_ui import ControlCenterUI
|
16
16
|
from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
|
17
17
|
from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
|
18
|
+
from frontengine.ui.page.particle.particle_setting_ui import ParticleSettingUI
|
18
19
|
from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
|
19
20
|
from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
|
20
21
|
from frontengine.ui.page.text.text_setting_ui import TextSettingUI
|
@@ -55,6 +56,7 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
|
|
55
56
|
self.sound_player_setting_ui = SoundPlayerSettingUI()
|
56
57
|
self.text_setting_ui = TextSettingUI()
|
57
58
|
self.scene_setting_ui = SceneSettingUI()
|
59
|
+
self.particle_setting_ui = ParticleSettingUI()
|
58
60
|
self.control_center_ui = ControlCenterUI(
|
59
61
|
self.video_setting_ui,
|
60
62
|
self.image_setting_ui,
|
@@ -62,7 +64,8 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
|
|
62
64
|
self.gif_setting_ui,
|
63
65
|
self.sound_player_setting_ui,
|
64
66
|
self.text_setting_ui,
|
65
|
-
self.scene_setting_ui
|
67
|
+
self.scene_setting_ui,
|
68
|
+
self.particle_setting_ui
|
66
69
|
)
|
67
70
|
# Style menu bar
|
68
71
|
self.menu_bar = QMenuBar()
|
@@ -90,6 +93,10 @@ class FrontEngineMainUI(QMainWindow, QtStyleTools):
|
|
90
93
|
self.scene_setting_ui,
|
91
94
|
language_wrapper.language_word_dict.get("tab_scene_text")
|
92
95
|
)
|
96
|
+
self.tab_widget.addTab(
|
97
|
+
self.particle_setting_ui,
|
98
|
+
language_wrapper.language_word_dict.get("tab_particle_text")
|
99
|
+
)
|
93
100
|
self.tab_widget.addTab(
|
94
101
|
self.control_center_ui,
|
95
102
|
language_wrapper.language_word_dict.get("tab_control_center_text")
|
@@ -4,6 +4,7 @@ from PySide6.QtWidgets import QGridLayout, QWidget, QPushButton, QTextEdit, QScr
|
|
4
4
|
from frontengine.ui.color.global_color import error_color, output_color
|
5
5
|
from frontengine.ui.page.gif.gif_setting_ui import GIFSettingUI
|
6
6
|
from frontengine.ui.page.image.image_setting_ui import ImageSettingUI
|
7
|
+
from frontengine.ui.page.particle.particle_setting_ui import ParticleSettingUI
|
7
8
|
from frontengine.ui.page.scene_setting.scene_setting_ui import SceneSettingUI
|
8
9
|
from frontengine.ui.page.sound_player.sound_player_setting_ui import SoundPlayerSettingUI
|
9
10
|
from frontengine.ui.page.text.text_setting_ui import TextSettingUI
|
@@ -24,7 +25,8 @@ class ControlCenterUI(QWidget):
|
|
24
25
|
gif_setting_ui: GIFSettingUI,
|
25
26
|
sound_player_setting_ui: SoundPlayerSettingUI,
|
26
27
|
text_setting_ui: TextSettingUI,
|
27
|
-
scene_setting_ui: SceneSettingUI
|
28
|
+
scene_setting_ui: SceneSettingUI,
|
29
|
+
particle_setting_ui: ParticleSettingUI
|
28
30
|
):
|
29
31
|
super().__init__()
|
30
32
|
# Layout
|
@@ -39,6 +41,7 @@ class ControlCenterUI(QWidget):
|
|
39
41
|
self.sound_player_setting_ui = sound_player_setting_ui
|
40
42
|
self.text_setting_ui = text_setting_ui
|
41
43
|
self.scene_setting_ui = scene_setting_ui
|
44
|
+
self.particle_setting_ui = particle_setting_ui
|
42
45
|
# Close video widget
|
43
46
|
self.clear_video_button = QPushButton(
|
44
47
|
language_wrapper.language_word_dict.get("control_center_close_all_video")
|
@@ -155,6 +158,7 @@ class ControlCenterUI(QWidget):
|
|
155
158
|
self.gif_setting_ui.gif_widget_list.clear()
|
156
159
|
self.sound_player_setting_ui.sound_widget_list.clear()
|
157
160
|
self.text_setting_ui.text_widget_list.clear()
|
161
|
+
self.particle_setting_ui.particle_list.clear()
|
158
162
|
self.scene_setting_ui.close_scene()
|
159
163
|
|
160
164
|
def redirect(self) -> None:
|
@@ -100,10 +100,10 @@ class ImageSettingUI(QWidget):
|
|
100
100
|
select_monitor_index = int(combobox.currentText())
|
101
101
|
if len(monitors) > select_monitor_index:
|
102
102
|
monitor = monitors[select_monitor_index]
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
image_widget = self._create_image_widget()
|
104
|
+
image_widget.setScreen(monitor)
|
105
|
+
image_widget.move(monitor.availableGeometry().topLeft())
|
106
|
+
image_widget.showFullScreen()
|
107
107
|
else:
|
108
108
|
for monitor in monitors:
|
109
109
|
image_widget = self._create_image_widget()
|
File without changes
|
@@ -0,0 +1,175 @@
|
|
1
|
+
from PySide6.QtCore import Qt
|
2
|
+
from PySide6.QtGui import QGuiApplication, QPixmap
|
3
|
+
from PySide6.QtWidgets import QWidget, QGridLayout, QSlider, QLabel, QPushButton, QMessageBox, \
|
4
|
+
QCheckBox, QDialog, QComboBox
|
5
|
+
|
6
|
+
from frontengine.show.particle.paint_particle import ParticleWidget
|
7
|
+
from frontengine.ui.dialog.choose_file_dialog import choose_image
|
8
|
+
from frontengine.ui.page.utils import monitor_choose_dialog
|
9
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
10
|
+
from frontengine.utils.multi_language.language_wrapper import language_wrapper
|
11
|
+
|
12
|
+
|
13
|
+
class ParticleSettingUI(QWidget):
|
14
|
+
|
15
|
+
def __init__(self):
|
16
|
+
super().__init__()
|
17
|
+
self.grid_layout = QGridLayout()
|
18
|
+
self.grid_layout = QGridLayout(self)
|
19
|
+
self.grid_layout.setContentsMargins(0, 0, 0, 0)
|
20
|
+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
|
21
|
+
# Init variable
|
22
|
+
self.particle_list = []
|
23
|
+
self.show_all_screen = False
|
24
|
+
self.ready_to_play = False
|
25
|
+
# Opacity setting
|
26
|
+
self.opacity_slider = QSlider()
|
27
|
+
self.opacity_slider.setOrientation(Qt.Orientation.Horizontal)
|
28
|
+
self.opacity_label = QLabel(
|
29
|
+
language_wrapper.language_word_dict.get("Opacity")
|
30
|
+
)
|
31
|
+
self.opacity_slider.setMinimum(1)
|
32
|
+
self.opacity_slider.setMaximum(100)
|
33
|
+
self.opacity_slider.setValue(20)
|
34
|
+
self.opacity_slider.setTickInterval(1)
|
35
|
+
self.opacity_slider_value_label = QLabel(str(self.opacity_slider.value()))
|
36
|
+
self.opacity_slider.actionTriggered.connect(self.opacity_trick)
|
37
|
+
self.setLayout(self.grid_layout)
|
38
|
+
# Choose file button
|
39
|
+
self.choose_file_button = QPushButton(
|
40
|
+
language_wrapper.language_word_dict.get("image_setting_choose_file")
|
41
|
+
)
|
42
|
+
self.choose_file_button.clicked.connect(self.choose_and_copy_file_to_cwd_image_dir_then_play)
|
43
|
+
# Ready label and variable
|
44
|
+
self.ready_label = QLabel(
|
45
|
+
language_wrapper.language_word_dict.get("Not Ready")
|
46
|
+
)
|
47
|
+
self.image_path: [str, None] = None
|
48
|
+
# Choose direction
|
49
|
+
self.choose_direction_label = QLabel(language_wrapper.language_word_dict.get("choose_particle_direction"))
|
50
|
+
self.choose_direction_combobox = QComboBox()
|
51
|
+
self.choose_direction_combobox.addItems(
|
52
|
+
["down", "up", "left", "right", "left_down", "left_up", "right_down", "right_up",
|
53
|
+
"random_minus", "random_add", "random"])
|
54
|
+
# Particle size
|
55
|
+
self.particle_size_label = QLabel(language_wrapper.language_word_dict.get("particle_size"))
|
56
|
+
self.particle_size_combobox = QComboBox()
|
57
|
+
for size in range(10, 310, 10):
|
58
|
+
self.particle_size_combobox.addItem(str(size))
|
59
|
+
self.particle_size_combobox.setCurrentText("50")
|
60
|
+
# Particle count
|
61
|
+
self.particle_count_label = QLabel(language_wrapper.language_word_dict.get("particle_count"))
|
62
|
+
self.particle_count_combobox = QComboBox()
|
63
|
+
for count in range(50, 1010, 10):
|
64
|
+
self.particle_count_combobox.addItem(str(count))
|
65
|
+
self.particle_count_combobox.setCurrentText("100")
|
66
|
+
# Particle count
|
67
|
+
self.particle_speed_label = QLabel(language_wrapper.language_word_dict.get("particle_speed"))
|
68
|
+
self.particle_speed_combobox = QComboBox()
|
69
|
+
for speed in range(1, 11, 1):
|
70
|
+
self.particle_speed_combobox.addItem(str(speed))
|
71
|
+
# Start button
|
72
|
+
self.start_button = QPushButton(
|
73
|
+
language_wrapper.language_word_dict.get("particle_setting_ui_play")
|
74
|
+
)
|
75
|
+
self.start_button.clicked.connect(self.start_play_particle)
|
76
|
+
# Show on all screen
|
77
|
+
self.show_on_all_screen_checkbox = QCheckBox(
|
78
|
+
language_wrapper.language_word_dict.get("Show on all screen")
|
79
|
+
)
|
80
|
+
self.show_on_all_screen_checkbox.clicked.connect(self.set_show_all_screen)
|
81
|
+
# Show on bottom
|
82
|
+
self.show_on_bottom_checkbox = QCheckBox(
|
83
|
+
language_wrapper.language_word_dict.get("Show on bottom")
|
84
|
+
)
|
85
|
+
# Add to layout
|
86
|
+
self.grid_layout.addWidget(self.opacity_label, 0, 0)
|
87
|
+
self.grid_layout.addWidget(self.opacity_slider_value_label, 0, 1)
|
88
|
+
self.grid_layout.addWidget(self.opacity_slider, 0, 2)
|
89
|
+
self.grid_layout.addWidget(self.choose_file_button, 1, 0)
|
90
|
+
self.grid_layout.addWidget(self.ready_label, 1, 1)
|
91
|
+
self.grid_layout.addWidget(self.choose_direction_label, 2, 0)
|
92
|
+
self.grid_layout.addWidget(self.choose_direction_combobox, 2, 1)
|
93
|
+
self.grid_layout.addWidget(self.particle_size_label, 3, 0)
|
94
|
+
self.grid_layout.addWidget(self.particle_size_combobox, 3, 1)
|
95
|
+
self.grid_layout.addWidget(self.particle_count_label, 4, 0)
|
96
|
+
self.grid_layout.addWidget(self.particle_count_combobox, 4, 1)
|
97
|
+
self.grid_layout.addWidget(self.particle_speed_label, 5, 0)
|
98
|
+
self.grid_layout.addWidget(self.particle_speed_combobox, 5, 1)
|
99
|
+
self.grid_layout.addWidget(self.start_button, 6, 0)
|
100
|
+
self.grid_layout.addWidget(self.show_on_all_screen_checkbox, 6, 1)
|
101
|
+
self.grid_layout.addWidget(self.show_on_bottom_checkbox, 6, 2)
|
102
|
+
self.setLayout(self.grid_layout)
|
103
|
+
|
104
|
+
def set_show_all_screen(self) -> None:
|
105
|
+
self.show_all_screen = self.show_on_all_screen_checkbox.isChecked()
|
106
|
+
|
107
|
+
def _create_particle_widget(self, screen_width: int = 1920, screen_height: int = 1080) -> ParticleWidget:
|
108
|
+
particle_widget = ParticleWidget(
|
109
|
+
pixmap=QPixmap(self.image_path),
|
110
|
+
particle_size=int(self.particle_size_combobox.currentText()),
|
111
|
+
particle_direction=self.choose_direction_combobox.currentText(),
|
112
|
+
particle_count=int(self.particle_count_combobox.currentText()),
|
113
|
+
opacity=float(self.opacity_slider.value()) / 100,
|
114
|
+
screen_width=screen_width,
|
115
|
+
screen_height=screen_height,
|
116
|
+
particle_speed=int(self.particle_speed_combobox.currentText())
|
117
|
+
)
|
118
|
+
particle_widget.set_ui_window_flag(self.show_on_bottom_checkbox.isChecked())
|
119
|
+
self.particle_list.append(particle_widget)
|
120
|
+
return particle_widget
|
121
|
+
|
122
|
+
def start_play_particle(self) -> None:
|
123
|
+
if self.image_path is None or self.ready_to_play is False:
|
124
|
+
message_box = QMessageBox(self)
|
125
|
+
message_box.setText(
|
126
|
+
language_wrapper.language_word_dict.get("not_prepare")
|
127
|
+
)
|
128
|
+
message_box.show()
|
129
|
+
else:
|
130
|
+
front_engine_logger.info("start play particle")
|
131
|
+
monitors = QGuiApplication.screens()
|
132
|
+
if self.show_all_screen is False and len(monitors) <= 1:
|
133
|
+
particle_widget = self._create_particle_widget(
|
134
|
+
monitors[0].availableGeometry().width(),
|
135
|
+
monitors[0].availableGeometry().height()
|
136
|
+
)
|
137
|
+
particle_widget.showFullScreen()
|
138
|
+
elif self.show_all_screen is False and len(monitors) >= 2:
|
139
|
+
input_dialog, combobox = monitor_choose_dialog(self, monitors)
|
140
|
+
result = input_dialog.exec_()
|
141
|
+
if result == QDialog.DialogCode.Accepted:
|
142
|
+
select_monitor_index = int(combobox.currentText())
|
143
|
+
if len(monitors) > select_monitor_index:
|
144
|
+
monitor = monitors[select_monitor_index]
|
145
|
+
particle_widget = self._create_particle_widget(
|
146
|
+
monitor.availableGeometry().width(),
|
147
|
+
monitor.availableGeometry().height()
|
148
|
+
)
|
149
|
+
particle_widget.setScreen(monitor)
|
150
|
+
particle_widget.move(monitor.availableGeometry().topLeft())
|
151
|
+
particle_widget.showFullScreen()
|
152
|
+
else:
|
153
|
+
for monitor in monitors:
|
154
|
+
particle_widget = self._create_particle_widget(
|
155
|
+
monitor.availableGeometry().width(),
|
156
|
+
monitor.availableGeometry().height()
|
157
|
+
)
|
158
|
+
particle_widget.setScreen(monitor)
|
159
|
+
particle_widget.move(monitor.availableGeometry().topLeft())
|
160
|
+
particle_widget.showFullScreen()
|
161
|
+
|
162
|
+
def choose_and_copy_file_to_cwd_image_dir_then_play(self) -> None:
|
163
|
+
self.ready_label.setText(
|
164
|
+
language_wrapper.language_word_dict.get("Not Ready")
|
165
|
+
)
|
166
|
+
self.ready_to_play = False
|
167
|
+
self.image_path = choose_image(self)
|
168
|
+
if self.image_path is not None:
|
169
|
+
self.ready_label.setText(
|
170
|
+
language_wrapper.language_word_dict.get("Ready")
|
171
|
+
)
|
172
|
+
self.ready_to_play = True
|
173
|
+
|
174
|
+
def opacity_trick(self) -> None:
|
175
|
+
self.opacity_slider_value_label.setText(str(self.opacity_slider.value()))
|
@@ -2,6 +2,8 @@ import _thread
|
|
2
2
|
import sys
|
3
3
|
from threading import Thread
|
4
4
|
|
5
|
+
from PySide6.QtWidgets import QApplication
|
6
|
+
|
5
7
|
from frontengine.utils.critical_exit.check_key_is_press import check_key_is_press
|
6
8
|
from frontengine.utils.critical_exit.win32_vk import keyboard_keys_table
|
7
9
|
|
@@ -37,7 +39,7 @@ class CriticalExit(Thread):
|
|
37
39
|
try:
|
38
40
|
while True:
|
39
41
|
if check_key_is_press(self._exit_check_key):
|
40
|
-
|
42
|
+
QApplication.exit(0)
|
41
43
|
except Exception as error:
|
42
44
|
print(repr(error), file=sys.stderr)
|
43
45
|
|
@@ -108,6 +108,13 @@ english_word_dict = {
|
|
108
108
|
"scene_input": "load scene file",
|
109
109
|
"scene_script_clear": "clear all script",
|
110
110
|
"scene_script": "Scene script",
|
111
|
+
# Particle ui
|
112
|
+
"tab_particle_text": "Particle",
|
113
|
+
"choose_particle_direction": "Choose particle direction",
|
114
|
+
"particle_setting_ui_play": "Start play particle",
|
115
|
+
"particle_size": "Particle size",
|
116
|
+
"particle_count": "Particle count",
|
117
|
+
"particle_speed": "Particle speed",
|
111
118
|
# Chat scene input
|
112
119
|
"chat_scene_input_title": "input chat content",
|
113
120
|
"chat_scene_send_chat": "send text",
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: frontengine
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.65
|
4
4
|
Summary: FrontEngine is BingGPT that can use-define front end or only use like screen saver
|
5
5
|
Author-email: JE-Chen <jechenmailman@gmail.com>
|
6
6
|
License: MIT
|
@@ -25,6 +25,10 @@ Requires-Dist: qt-material
|
|
25
25
|
|
26
26
|
[FrontEngine Doc Click Here!](https://frontengine.readthedocs.io/en/latest/)
|
27
27
|
|
28
|
+
## Support this project on steam
|
29
|
+
|
30
|
+
[SteamStoreLink](https://store.steampowered.com/app/2793470/FrontEngine/)
|
31
|
+
|
28
32
|
## Contents
|
29
33
|
|
30
34
|
> Project kanban https://github.com/orgs/Integration-Automation/projects/2/views/1
|
@@ -68,6 +72,7 @@ Requires-Dist: qt-material
|
|
68
72
|
- [Youtube](https://youtu.be/fewogcb3b8Y)
|
69
73
|
|
70
74
|
|
75
|
+
|
71
76
|
## Download
|
72
77
|
|
73
78
|
---
|
@@ -6,6 +6,10 @@ frontengine/show/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
6
6
|
frontengine/show/image/paint_image.py,sha256=BtKyFJP7UdOLMBsCoQ1fnT8ft-cUxDaufFzURgbwpJU,2467
|
7
7
|
frontengine/show/load/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
frontengine/show/load/load_someone_make_ui.py,sha256=yjMrkA76VEYkKXygwKmoKaADymjjDlebI-7PNa6DrEo,1010
|
9
|
+
frontengine/show/particle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
frontengine/show/particle/paint_particle.py,sha256=TacLlBOuWN_18GBYEd1Auqvu5vnM1QYBvY3rDmAeny8,1881
|
11
|
+
frontengine/show/particle/particle_scene.py,sha256=3W9iZDwZOQRa3J90qDdE3dk7dbg-omh3eD6CcEqzwHg,2897
|
12
|
+
frontengine/show/particle/particle_utils.py,sha256=AUHIHZpvvIJWF_iU6Urd9JXSeZdlwGJlTSWT5ywyg94,2999
|
9
13
|
frontengine/show/scene/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
14
|
frontengine/show/scene/extend_graphic_scene.py,sha256=7UiEr_kRbhheGOj_rYeq3fAUtRacq2WH8fQZV0Q-tA4,148
|
11
15
|
frontengine/show/scene/extend_graphic_view.py,sha256=b5yAA_PqMTCnn7-63Q8Fhm9HBiWfjo48_1xjh2nP67I,1999
|
@@ -22,7 +26,7 @@ frontengine/show/web/webview.py,sha256=2-7HW395Fp0SZnjUcrTGW-AWk_5OAAyzgjoXnnPpQ
|
|
22
26
|
frontengine/system_tray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
27
|
frontengine/system_tray/extend_system_tray.py,sha256=k4u2lEox-fCwmQKy1qnek9SGoqUkMFv8Av_DcNanwcE,1595
|
24
28
|
frontengine/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
-
frontengine/ui/main_ui.py,sha256=
|
29
|
+
frontengine/ui/main_ui.py,sha256=HZJRW4au1zcpb1pON2sKuOu84MsaABka9hUdtgzVx58,8259
|
26
30
|
frontengine/ui/color/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
31
|
frontengine/ui/color/global_color.py,sha256=Rh-R-X2BHVjcK5MTBZ1nEMVHgLj1rP4nk-wTQKbiwFA,125
|
28
32
|
frontengine/ui/dialog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -35,11 +39,13 @@ frontengine/ui/menu/language_menu.py,sha256=p0nA4bgxc7CIX8_WxUKlnjNLFyvmqCx-h6GX
|
|
35
39
|
frontengine/ui/page/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
40
|
frontengine/ui/page/utils.py,sha256=UxHVStfVg-6563T20pEjnVMYzMvy9JePAj1VOm8HX_g,1103
|
37
41
|
frontengine/ui/page/control_center/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
-
frontengine/ui/page/control_center/control_center_ui.py,sha256=
|
42
|
+
frontengine/ui/page/control_center/control_center_ui.py,sha256=BxXlWwW9uf48b1jfWgtTBCGZOShlW03m8kzI43YjpaM,8237
|
39
43
|
frontengine/ui/page/gif/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
44
|
frontengine/ui/page/gif/gif_setting_ui.py,sha256=HherbCmOJgO5TLXHt9sflTspmCQh1pv1IGyfKmp7kog,6908
|
41
45
|
frontengine/ui/page/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
-
frontengine/ui/page/image/image_setting_ui.py,sha256=
|
46
|
+
frontengine/ui/page/image/image_setting_ui.py,sha256=eyNbJqxJhbKzyGjTlrJgVmPmkcC4-6N7hjvyBQJBC4o,6046
|
47
|
+
frontengine/ui/page/particle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
+
frontengine/ui/page/particle/particle_setting_ui.py,sha256=xtzvAM7N-W_jq4MKFWBizb-LgMxyTDAImbl-mJYvs48,8949
|
43
49
|
frontengine/ui/page/scene_setting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
50
|
frontengine/ui/page/scene_setting/scene_manager.py,sha256=3s7UlMbQVTyDZd725wdzDvXqeiunE1Q5UQj5hxWGhIs,4978
|
45
51
|
frontengine/ui/page/scene_setting/scene_setting_ui.py,sha256=jc6BGKHJGmPbFxChyILW3BBU_EF1yT0l63OJNqJYWSM,2590
|
@@ -55,7 +61,7 @@ frontengine/ui/page/sound_player/sound_player_setting_ui.py,sha256=OFRxUyUXVj3-P
|
|
55
61
|
frontengine/ui/page/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
56
62
|
frontengine/ui/page/text/text_setting_ui.py,sha256=nSrXkezs7X9-7Kd16raaz3WZJFwyL4cuz3j74VQIS9U,6317
|
57
63
|
frontengine/ui/page/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
58
|
-
frontengine/ui/page/video/video_setting_ui.py,sha256=
|
64
|
+
frontengine/ui/page/video/video_setting_ui.py,sha256=crFydSKtBLDkdXyRENQupbXBX68OCBX_D97Fn3zowmk,8078
|
59
65
|
frontengine/ui/page/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
66
|
frontengine/ui/page/web/web_setting_ui.py,sha256=FgTCn68WTeFp197mhvilWKK25m0xF0gSZ9b7hfG2ELQ,5596
|
61
67
|
frontengine/user_setting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -66,7 +72,7 @@ frontengine/utils/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
66
72
|
frontengine/utils/browser/browser.py,sha256=BQBjJpbTubqruUvg75O21SUhawFdVhDmuYxtd_FN1Gs,85
|
67
73
|
frontengine/utils/critical_exit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
74
|
frontengine/utils/critical_exit/check_key_is_press.py,sha256=vqx_3-hWRT2_pjZ4NF_zlpYvzpXVKiBXePXWwjvJwO4,311
|
69
|
-
frontengine/utils/critical_exit/critical_exit.py,sha256=
|
75
|
+
frontengine/utils/critical_exit/critical_exit.py,sha256=kCAI662jg3bdVGHu9frENRPgTO0VpGcOzc28D6fe-Ps,1560
|
70
76
|
frontengine/utils/critical_exit/win32_vk.py,sha256=kczIp9le1TfN0rCWy_2-ecDRtCeRLSW0pEyOeCIcpCc,11132
|
71
77
|
frontengine/utils/exception/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
72
78
|
frontengine/utils/exception/exception_tags.py,sha256=V4R_RlNYX_zgAKU9I7NLimYic--oF-2qHDHCwpVYHcc,325
|
@@ -83,7 +89,7 @@ frontengine/utils/json_format/json_process.py,sha256=xJt_4Hm_o3sNDoeGtRW9Q7fsRj3
|
|
83
89
|
frontengine/utils/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
84
90
|
frontengine/utils/logging/loggin_instance.py,sha256=Zjr384o2q8x0QWv_hNoHIM_zCp5-HFgW14t-d30GUcQ,598
|
85
91
|
frontengine/utils/multi_language/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
|
-
frontengine/utils/multi_language/english.py,sha256=
|
92
|
+
frontengine/utils/multi_language/english.py,sha256=K_0LJzJSgsQN9EDZyvODf2VEPiED0GIv_NuAxTtmMAY,6146
|
87
93
|
frontengine/utils/multi_language/france.py,sha256=k_LCWiDB22k6PKvrhIrQq2Inm1BoaH5Gwgb6xyMy8o0,6797
|
88
94
|
frontengine/utils/multi_language/germany.py,sha256=jwg7KXtCahhES6ZPeeUugLoJgaUpnjgbRxN2ZTlJWXs,6534
|
89
95
|
frontengine/utils/multi_language/italy.py,sha256=UaxuEyet2TUyLBR9JI1Bb7-zCx9iZ9oERImXTtTOV18,6560
|
@@ -93,8 +99,8 @@ frontengine/utils/multi_language/simplified_chinese.py,sha256=wDnne4PiVA3eJ9Q4sx
|
|
93
99
|
frontengine/utils/multi_language/traditional_chinese.py,sha256=SSE338u2Y_-N0fumIVeBBRhnvjizT92tQdYcOJiMSFM,6083
|
94
100
|
frontengine/utils/redirect_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
95
101
|
frontengine/utils/redirect_manager/redirect_manager_class.py,sha256=zGJeVpjRU12MCnhVAdksAIhK_IhddI4cNKVb7DMgOZA,1888
|
96
|
-
frontengine-0.0.
|
97
|
-
frontengine-0.0.
|
98
|
-
frontengine-0.0.
|
99
|
-
frontengine-0.0.
|
100
|
-
frontengine-0.0.
|
102
|
+
frontengine-0.0.65.dist-info/LICENSE,sha256=b3VlPBXnrDylKGffOEOLWMgOX-yfd65XC7PA1_sox2o,1085
|
103
|
+
frontengine-0.0.65.dist-info/METADATA,sha256=6k5Lz3RsPaSzs2-Ok-jMBLE5t6tMv4OiLVfThp5mCEM,2166
|
104
|
+
frontengine-0.0.65.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
105
|
+
frontengine-0.0.65.dist-info/top_level.txt,sha256=btCybScN_ubeQ8phsSDBB0T-HyHjqt7b-WPy61uTox0,12
|
106
|
+
frontengine-0.0.65.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|