frontengine 0.0.64__tar.gz → 0.0.66__tar.gz

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 (111) hide show
  1. {frontengine-0.0.64 → frontengine-0.0.66}/PKG-INFO +6 -1
  2. {frontengine-0.0.64 → frontengine-0.0.66}/README.md +5 -0
  3. frontengine-0.0.66/frontengine/show/particle/paint_particle.py +39 -0
  4. frontengine-0.0.66/frontengine/show/particle/particle_scene.py +65 -0
  5. frontengine-0.0.66/frontengine/show/particle/particle_utils.py +75 -0
  6. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/main_ui.py +8 -1
  7. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/control_center/control_center_ui.py +5 -1
  8. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/image/image_setting_ui.py +4 -4
  9. frontengine-0.0.66/frontengine/ui/page/particle/particle_setting_ui.py +175 -0
  10. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/video/video_setting_ui.py +0 -1
  11. frontengine-0.0.66/frontengine/utils/multi_language/__init__.py +0 -0
  12. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/english.py +7 -0
  13. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/france.py +7 -0
  14. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/germany.py +7 -0
  15. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/italy.py +7 -0
  16. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/russian.py +7 -0
  17. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/simplified_chinese.py +7 -0
  18. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/traditional_chinese.py +7 -0
  19. frontengine-0.0.66/frontengine/utils/redirect_manager/__init__.py +0 -0
  20. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine.egg-info/PKG-INFO +6 -1
  21. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine.egg-info/SOURCES.txt +6 -0
  22. {frontengine-0.0.64 → frontengine-0.0.66}/pyproject.toml +1 -1
  23. {frontengine-0.0.64 → frontengine-0.0.66}/LICENSE +0 -0
  24. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/__init__.py +0 -0
  25. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/__init__.py +0 -0
  26. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/gif/__init__.py +0 -0
  27. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/gif/paint_gif.py +0 -0
  28. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/image/__init__.py +0 -0
  29. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/image/paint_image.py +0 -0
  30. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/load/__init__.py +0 -0
  31. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/load/load_someone_make_ui.py +0 -0
  32. {frontengine-0.0.64/frontengine/show/scene → frontengine-0.0.66/frontengine/show/particle}/__init__.py +0 -0
  33. {frontengine-0.0.64/frontengine/show/sound_player → frontengine-0.0.66/frontengine/show/scene}/__init__.py +0 -0
  34. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  35. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/scene/extend_graphic_view.py +0 -0
  36. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/scene/scene.py +0 -0
  37. {frontengine-0.0.64/frontengine/show/text → frontengine-0.0.66/frontengine/show/sound_player}/__init__.py +0 -0
  38. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/sound_player/sound_effect.py +0 -0
  39. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/sound_player/sound_player.py +0 -0
  40. {frontengine-0.0.64/frontengine/show/video → frontengine-0.0.66/frontengine/show/text}/__init__.py +0 -0
  41. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/text/draw_text.py +0 -0
  42. {frontengine-0.0.64/frontengine/show/web → frontengine-0.0.66/frontengine/show/video}/__init__.py +0 -0
  43. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/video/video_player.py +0 -0
  44. {frontengine-0.0.64/frontengine/system_tray → frontengine-0.0.66/frontengine/show/web}/__init__.py +0 -0
  45. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/show/web/webview.py +0 -0
  46. {frontengine-0.0.64/frontengine/ui → frontengine-0.0.66/frontengine/system_tray}/__init__.py +0 -0
  47. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/system_tray/extend_system_tray.py +0 -0
  48. {frontengine-0.0.64/frontengine/ui/color → frontengine-0.0.66/frontengine/ui}/__init__.py +0 -0
  49. {frontengine-0.0.64/frontengine/ui/dialog → frontengine-0.0.66/frontengine/ui/color}/__init__.py +0 -0
  50. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/color/global_color.py +0 -0
  51. {frontengine-0.0.64/frontengine/ui/menu → frontengine-0.0.66/frontengine/ui/dialog}/__init__.py +0 -0
  52. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  53. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/dialog/save_file_dialog.py +0 -0
  54. {frontengine-0.0.64/frontengine/ui/page → frontengine-0.0.66/frontengine/ui/menu}/__init__.py +0 -0
  55. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/menu/help_menu.py +0 -0
  56. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/menu/how_to_menu.py +0 -0
  57. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/menu/language_menu.py +0 -0
  58. {frontengine-0.0.64/frontengine/ui/page/control_center → frontengine-0.0.66/frontengine/ui/page}/__init__.py +0 -0
  59. {frontengine-0.0.64/frontengine/ui/page/gif → frontengine-0.0.66/frontengine/ui/page/control_center}/__init__.py +0 -0
  60. {frontengine-0.0.64/frontengine/ui/page/image → frontengine-0.0.66/frontengine/ui/page/gif}/__init__.py +0 -0
  61. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  62. {frontengine-0.0.64/frontengine/ui/page/scene_setting → frontengine-0.0.66/frontengine/ui/page/image}/__init__.py +0 -0
  63. {frontengine-0.0.64/frontengine/ui/page/scene_setting/scene_page → frontengine-0.0.66/frontengine/ui/page/particle}/__init__.py +0 -0
  64. {frontengine-0.0.64/frontengine/ui/page/sound_player → frontengine-0.0.66/frontengine/ui/page/scene_setting}/__init__.py +0 -0
  65. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  66. {frontengine-0.0.64/frontengine/ui/page/text → frontengine-0.0.66/frontengine/ui/page/scene_setting/scene_page}/__init__.py +0 -0
  67. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  68. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  69. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  70. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  71. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  72. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  73. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  74. {frontengine-0.0.64/frontengine/ui/page/video → frontengine-0.0.66/frontengine/ui/page/sound_player}/__init__.py +0 -0
  75. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  76. {frontengine-0.0.64/frontengine/ui/page/web → frontengine-0.0.66/frontengine/ui/page/text}/__init__.py +0 -0
  77. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  78. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/utils.py +0 -0
  79. {frontengine-0.0.64/frontengine/user_setting → frontengine-0.0.66/frontengine/ui/page/video}/__init__.py +0 -0
  80. {frontengine-0.0.64/frontengine/utils → frontengine-0.0.66/frontengine/ui/page/web}/__init__.py +0 -0
  81. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  82. {frontengine-0.0.64/frontengine/utils/browser → frontengine-0.0.66/frontengine/user_setting}/__init__.py +0 -0
  83. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/user_setting/scene_setting.py +0 -0
  84. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/user_setting/user_setting_file.py +0 -0
  85. {frontengine-0.0.64/frontengine/utils/critical_exit → frontengine-0.0.66/frontengine/utils}/__init__.py +0 -0
  86. {frontengine-0.0.64/frontengine/utils/file → frontengine-0.0.66/frontengine/utils/browser}/__init__.py +0 -0
  87. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/browser/browser.py +0 -0
  88. {frontengine-0.0.64/frontengine/utils/json → frontengine-0.0.66/frontengine/utils/critical_exit}/__init__.py +0 -0
  89. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  90. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  91. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  92. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/exception/__init__.py +0 -0
  93. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/exception/exception_tags.py +0 -0
  94. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/exception/exceptions.py +0 -0
  95. {frontengine-0.0.64/frontengine/utils/logging → frontengine-0.0.66/frontengine/utils/file}/__init__.py +0 -0
  96. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/file/open/__init__.py +0 -0
  97. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/file/open/open_file.py +0 -0
  98. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/file/save/__init__.py +0 -0
  99. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/file/save/save_file.py +0 -0
  100. {frontengine-0.0.64/frontengine/utils/multi_language → frontengine-0.0.66/frontengine/utils/json}/__init__.py +0 -0
  101. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/json/json_file.py +0 -0
  102. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/json_format/__init__.py +0 -0
  103. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/json_format/json_process.py +0 -0
  104. {frontengine-0.0.64/frontengine/utils/redirect_manager → frontengine-0.0.66/frontengine/utils/logging}/__init__.py +0 -0
  105. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/logging/loggin_instance.py +0 -0
  106. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  107. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  108. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine.egg-info/dependency_links.txt +0 -0
  109. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine.egg-info/requires.txt +0 -0
  110. {frontengine-0.0.64 → frontengine-0.0.66}/frontengine.egg-info/top_level.txt +0 -0
  111. {frontengine-0.0.64 → frontengine-0.0.66}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: frontengine
3
- Version: 0.0.64
3
+ Version: 0.0.66
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
  ---
@@ -4,6 +4,10 @@
4
4
 
5
5
  [FrontEngine Doc Click Here!](https://frontengine.readthedocs.io/en/latest/)
6
6
 
7
+ ## Support this project on steam
8
+
9
+ [SteamStoreLink](https://store.steampowered.com/app/2793470/FrontEngine/)
10
+
7
11
  ## Contents
8
12
 
9
13
  > Project kanban https://github.com/orgs/Integration-Automation/projects/2/views/1
@@ -47,6 +51,7 @@
47
51
  - [Youtube](https://youtu.be/fewogcb3b8Y)
48
52
 
49
53
 
54
+
50
55
  ## Download
51
56
 
52
57
  ---
@@ -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)
@@ -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
- gif_widget = self._create_image_widget()
104
- gif_widget.setScreen(monitor)
105
- gif_widget.move(monitor.availableGeometry().topLeft())
106
- gif_widget.showFullScreen()
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()
@@ -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()))
@@ -13,7 +13,6 @@ class VideoSettingUI(QWidget):
13
13
 
14
14
  def __init__(self):
15
15
  super().__init__()
16
- self.grid_layout = QGridLayout()
17
16
  self.grid_layout = QGridLayout(self)
18
17
  self.grid_layout.setContentsMargins(0, 0, 0, 0)
19
18
  # Init variable
@@ -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",
@@ -109,6 +109,13 @@ french_word_dict = {
109
109
  "scene_input": "Charger le fichier de scène",
110
110
  "scene_script_clear": "Effacer tous les scripts",
111
111
  "scene_script": "Script de scène",
112
+ # Particle ui
113
+ "tab_particle_text": "Particule",
114
+ "choose_particle_direction": "Choisissez la direction des particules",
115
+ "particle_setting_ui_play": "Démarrer la lecture des particules",
116
+ "particle_size": "Taille des particules",
117
+ "particle_count": "Nombre de particules",
118
+ "particle_speed": "Vitesse des particules",
112
119
  # Chat scene input
113
120
  "chat_scene_input_title": "Entrer le contenu de la discussion",
114
121
  "chat_scene_send_chat": "Envoyer le texte",
@@ -109,6 +109,13 @@ germany_word_dict = {
109
109
  "scene_input": "Szenendatei laden",
110
110
  "scene_script_clear": "Alle Skripte löschen",
111
111
  "scene_script": "Szenen-Skript",
112
+ # Particle ui
113
+ "tab_particle_text": "Partikel",
114
+ "choose_particle_direction": "Partikelrichtung auswählen",
115
+ "particle_setting_ui_play": "Partikelwiedergabe starten",
116
+ "particle_size": "Partikelgröße",
117
+ "particle_count": "Partikelanzahl",
118
+ "particle_speed": "Partikelgeschwindigkeit",
112
119
  # Chat-Szenen-Eingabe
113
120
  "chat_scene_input_title": "Chat-Inhalt eingeben",
114
121
  "chat_scene_send_chat": "Text senden",
@@ -109,6 +109,13 @@ italian_word_dict = {
109
109
  "scene_input": "Carica il file di scena",
110
110
  "scene_script_clear": "Cancella tutti gli script",
111
111
  "scene_script": "Script della scena",
112
+ # Particle ui
113
+ "tab_particle_text": "Particella",
114
+ "choose_particle_direction": "Scegli la direzione delle particelle",
115
+ "particle_setting_ui_play": "Avvia la riproduzione delle particelle",
116
+ "particle_size": "Dimensione delle particelle",
117
+ "particle_count": "Numero di particelle",
118
+ "particle_speed": "Velocità delle particelle",
112
119
  # Chat scene input
113
120
  "chat_scene_input_title": "Inserisci il contenuto della chat",
114
121
  "chat_scene_send_chat": "Invia il testo",
@@ -109,6 +109,13 @@ russian_word_dict = {
109
109
  "scene_input": "Входной файл сцены",
110
110
  "scene_script_clear": "Очистить все скрипты",
111
111
  "scene_script": "Сценарий сцены",
112
+ # Particle ui
113
+ "tab_particle_text": "Частица",
114
+ "choose_particle_direction": "Выберите направление частицы",
115
+ "particle_setting_ui_play": "Начать воспроизведение частиц",
116
+ "particle_size": "Размер частицы",
117
+ "particle_count": "Количество частиц",
118
+ "particle_speed": "Скорость частицы",
112
119
  # Chat scene input
113
120
  "chat_scene_input_title": "Введите содержание чата",
114
121
  "chat_scene_send_chat": "Отправить текст",
@@ -109,6 +109,13 @@ simplified_chinese_word_dict = {
109
109
  "scene_input": "读取场景文件",
110
110
  "scene_script_clear": "清除所有脚本",
111
111
  "scene_script": "场景脚本",
112
+ # Particle ui
113
+ "tab_particle_text": "粒子",
114
+ "choose_particle_direction": "选择粒子方向",
115
+ "particle_setting_ui_play": "开始播放粒子",
116
+ "particle_size": "粒子大小",
117
+ "particle_count": "粒子数量",
118
+ "particle_speed": "粒子速度",
112
119
  # Chat scene input
113
120
  "chat_scene_input_title": "输入聊天内容",
114
121
  "chat_scene_send_chat": "送出文字",
@@ -109,6 +109,13 @@ traditional_chinese_word_dict = {
109
109
  "scene_input": "讀取場景檔案",
110
110
  "scene_script_clear": "清除所有腳本",
111
111
  "scene_script": "場景腳本",
112
+ # Particle ui
113
+ "tab_particle_text": "粒子",
114
+ "choose_particle_direction": "選擇粒子方向",
115
+ "particle_setting_ui_play": "開始播放粒子",
116
+ "particle_size": "粒子大小",
117
+ "particle_count": "粒子數量",
118
+ "particle_speed": "粒子速度",
112
119
  # Chat scene input
113
120
  "chat_scene_input_title": "輸入聊天內容",
114
121
  "chat_scene_send_chat": "送出文字",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: frontengine
3
- Version: 0.0.64
3
+ Version: 0.0.66
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
  ---
@@ -14,6 +14,10 @@ frontengine/show/image/__init__.py
14
14
  frontengine/show/image/paint_image.py
15
15
  frontengine/show/load/__init__.py
16
16
  frontengine/show/load/load_someone_make_ui.py
17
+ frontengine/show/particle/__init__.py
18
+ frontengine/show/particle/paint_particle.py
19
+ frontengine/show/particle/particle_scene.py
20
+ frontengine/show/particle/particle_utils.py
17
21
  frontengine/show/scene/__init__.py
18
22
  frontengine/show/scene/extend_graphic_scene.py
19
23
  frontengine/show/scene/extend_graphic_view.py
@@ -48,6 +52,8 @@ frontengine/ui/page/gif/__init__.py
48
52
  frontengine/ui/page/gif/gif_setting_ui.py
49
53
  frontengine/ui/page/image/__init__.py
50
54
  frontengine/ui/page/image/image_setting_ui.py
55
+ frontengine/ui/page/particle/__init__.py
56
+ frontengine/ui/page/particle/particle_setting_ui.py
51
57
  frontengine/ui/page/scene_setting/__init__.py
52
58
  frontengine/ui/page/scene_setting/scene_manager.py
53
59
  frontengine/ui/page/scene_setting/scene_setting_ui.py
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "frontengine"
9
- version = "0.0.64"
9
+ version = "0.0.66"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
File without changes
File without changes