frontengine-dev 0.0.97__tar.gz → 1.0.0__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 (113) hide show
  1. {frontengine_dev-0.0.97/frontengine_dev.egg-info → frontengine_dev-1.0.0}/PKG-INFO +1 -1
  2. frontengine_dev-1.0.0/frontengine/show/particle/particle_ui.py +175 -0
  3. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/main_ui.py +1 -1
  4. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/particle/particle_setting_ui.py +4 -5
  5. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0/frontengine_dev.egg-info}/PKG-INFO +1 -1
  6. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/pyproject.toml +1 -1
  7. frontengine_dev-0.0.97/frontengine/show/particle/particle_ui.py +0 -212
  8. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/LICENSE +0 -0
  9. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/README.md +0 -0
  10. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/__init__.py +0 -0
  11. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/__init__.py +0 -0
  12. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/base_widget.py +0 -0
  13. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/gif/__init__.py +0 -0
  14. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/gif/paint_gif.py +0 -0
  15. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/image/__init__.py +0 -0
  16. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/image/paint_image.py +0 -0
  17. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/load/__init__.py +0 -0
  18. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/load/load_someone_make_ui.py +0 -0
  19. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/particle/__init__.py +0 -0
  20. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/scene/__init__.py +0 -0
  21. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  22. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/scene/extend_graphic_view.py +0 -0
  23. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/scene/scene.py +0 -0
  24. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/sound_player/__init__.py +0 -0
  25. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/sound_player/sound_effect.py +0 -0
  26. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/sound_player/sound_player.py +0 -0
  27. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/text/__init__.py +0 -0
  28. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/text/draw_text.py +0 -0
  29. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/video/__init__.py +0 -0
  30. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/video/video_player.py +0 -0
  31. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/web/__init__.py +0 -0
  32. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/show/web/webview.py +0 -0
  33. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/system_tray/__init__.py +0 -0
  34. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/system_tray/extend_system_tray.py +0 -0
  35. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/__init__.py +0 -0
  36. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/color/__init__.py +0 -0
  37. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/color/global_color.py +0 -0
  38. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/dialog/__init__.py +0 -0
  39. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  40. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/dialog/save_file_dialog.py +0 -0
  41. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/menu/__init__.py +0 -0
  42. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/menu/help_menu.py +0 -0
  43. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/menu/how_to_menu.py +0 -0
  44. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/menu/language_menu.py +0 -0
  45. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/__init__.py +0 -0
  46. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/control_center/__init__.py +0 -0
  47. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
  48. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/gif/__init__.py +0 -0
  49. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  50. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/image/__init__.py +0 -0
  51. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  52. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/particle/__init__.py +0 -0
  53. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  54. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  55. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  56. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  57. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  58. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  59. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  60. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  61. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  62. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  63. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/sound_player/__init__.py +0 -0
  64. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  65. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/text/__init__.py +0 -0
  66. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  67. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/utils.py +0 -0
  68. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/video/__init__.py +0 -0
  69. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  70. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/web/__init__.py +0 -0
  71. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  72. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/user_setting/__init__.py +0 -0
  73. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/user_setting/scene_setting.py +0 -0
  74. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/user_setting/user_setting_file.py +0 -0
  75. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/__init__.py +0 -0
  76. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/browser/__init__.py +0 -0
  77. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/browser/browser.py +0 -0
  78. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/__init__.py +0 -0
  79. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  80. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  81. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  82. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/exception/__init__.py +0 -0
  83. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/exception/exception_tags.py +0 -0
  84. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/exception/exceptions.py +0 -0
  85. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/file/__init__.py +0 -0
  86. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/file/open/__init__.py +0 -0
  87. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/file/open/open_file.py +0 -0
  88. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/file/save/__init__.py +0 -0
  89. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/file/save/save_file.py +0 -0
  90. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/json/__init__.py +0 -0
  91. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/json/json_file.py +0 -0
  92. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/json_format/__init__.py +0 -0
  93. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/json_format/json_process.py +0 -0
  94. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/logging/__init__.py +0 -0
  95. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/logging/loggin_instance.py +0 -0
  96. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/__init__.py +0 -0
  97. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/english.py +0 -0
  98. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/france.py +0 -0
  99. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/germany.py +0 -0
  100. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/italy.py +0 -0
  101. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  102. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/russian.py +0 -0
  103. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
  104. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/traditional_chinese.py +0 -0
  105. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/redirect_manager/__init__.py +0 -0
  106. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  107. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/worker/__init__.py +0 -0
  108. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine/worker/qthread_worker.py +0 -0
  109. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/SOURCES.txt +0 -0
  110. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/dependency_links.txt +0 -0
  111. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/requires.txt +0 -0
  112. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/top_level.txt +0 -0
  113. {frontengine_dev-0.0.97 → frontengine_dev-1.0.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine_dev
3
- Version: 0.0.97
3
+ Version: 1.0.0
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -0,0 +1,175 @@
1
+ import random
2
+
3
+ from OpenGL.GL import *
4
+ from PySide6.QtCore import Qt, QTimer
5
+ from PySide6.QtGui import QSurfaceFormat, QPixmap
6
+ from PySide6.QtOpenGLWidgets import QOpenGLWidget
7
+
8
+
9
+ class ParticleOpenGLWidget(QOpenGLWidget):
10
+ def __init__(self,
11
+ pixmap: QPixmap,
12
+ particle_size: int,
13
+ particle_direction: str = "down",
14
+ particle_count: int = 50,
15
+ opacity: float = 0.2,
16
+ screen_height: int = 1080,
17
+ screen_width: int = 1920,
18
+ particle_speed: float = 0.003):
19
+
20
+ fmt = QSurfaceFormat()
21
+ fmt.setAlphaBufferSize(8)
22
+ fmt.setRenderableType(QSurfaceFormat.RenderableType.OpenGL)
23
+ fmt.setProfile(QSurfaceFormat.OpenGLContextProfile.CompatibilityProfile)
24
+ QSurfaceFormat.setDefaultFormat(fmt)
25
+ super().__init__()
26
+
27
+ self.setWindowFlag(
28
+ Qt.WindowType.WindowTransparentForInput |
29
+ Qt.WindowType.FramelessWindowHint |
30
+ Qt.WindowType.WindowStaysOnTopHint |
31
+ Qt.WindowType.Tool
32
+ )
33
+
34
+ # 視窗大小
35
+ self.resize(screen_width, screen_height)
36
+
37
+ # Qt 透明背景設定
38
+ self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
39
+ self.setAttribute(Qt.WidgetAttribute.WA_NoSystemBackground)
40
+ self.setAutoFillBackground(False)
41
+
42
+ self.setWindowFlags(
43
+ Qt.WindowType.FramelessWindowHint |
44
+ Qt.WindowType.WindowStaysOnTopHint |
45
+ Qt.WindowType.Tool
46
+ )
47
+
48
+ # 縮放 pixmap 成 particle_size(保持比例)
49
+ target_size = pixmap.size().scaled(
50
+ particle_size, particle_size,
51
+ Qt.AspectRatioMode.KeepAspectRatio
52
+ )
53
+ scaled_pixmap = pixmap.scaled(
54
+ target_size,
55
+ Qt.AspectRatioMode.KeepAspectRatio,
56
+ Qt.TransformationMode.SmoothTransformation
57
+ )
58
+ self.image = scaled_pixmap.toImage()
59
+
60
+ self.particle_count = particle_count
61
+ self.particle_direction = particle_direction
62
+ self.opacity = opacity
63
+ self.particle_speed = particle_speed
64
+
65
+ # 粒子狀態 [x, y]
66
+ self.particles = [
67
+ [random.uniform(-1, 1), random.uniform(-1, 1)]
68
+ for _ in range(particle_count)
69
+ ]
70
+
71
+ self.texture_id = None
72
+
73
+ self.timer = QTimer(self)
74
+ self.timer.timeout.connect(self.update_particles)
75
+ self.timer.start(16)
76
+
77
+ QTimer.singleShot(0, self.apply_winapi)
78
+
79
+ def apply_winapi(self):
80
+ hwnd = int(self.winId())
81
+ GWL_EXSTYLE = -20
82
+ WS_EX_LAYERED = 0x80000
83
+ style = ctypes.windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE)
84
+ ctypes.windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, style | WS_EX_LAYERED)
85
+
86
+ def initializeGL(self):
87
+ glDisable(GL_DEPTH_TEST)
88
+ glDisable(GL_CULL_FACE)
89
+ glEnable(GL_BLEND)
90
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
91
+ glEnable(GL_TEXTURE_2D)
92
+
93
+ w, h = self.image.width(), self.image.height()
94
+
95
+ self.texture_id = glGenTextures(1)
96
+ glBindTexture(GL_TEXTURE_2D, self.texture_id)
97
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, self.image.bits())
98
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
99
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
100
+
101
+ def update_particles(self):
102
+ for p in self.particles:
103
+ x, y = p
104
+ if self.particle_direction == "down":
105
+ y -= self.particle_speed
106
+ if y < -1:
107
+ y = 1
108
+ x = random.uniform(-1, 1)
109
+
110
+ elif self.particle_direction == "up":
111
+ y += self.particle_speed
112
+ if y > 1:
113
+ y = -1
114
+ x = random.uniform(-1, 1)
115
+
116
+ elif self.particle_direction == "left":
117
+ x -= self.particle_speed
118
+ if x < -1:
119
+ x = 1
120
+ y = random.uniform(-1, 1)
121
+
122
+ elif self.particle_direction == "right":
123
+ x += self.particle_speed
124
+ if x > 1:
125
+ x = -1
126
+ y = random.uniform(-1, 1)
127
+
128
+ # 你可以自行擴充其他方向
129
+
130
+ p[0] = x
131
+ p[1] = y
132
+
133
+ self.update()
134
+
135
+ def paintGL(self):
136
+ glClearColor(0, 0, 0, 0)
137
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
138
+
139
+ glBindTexture(GL_TEXTURE_2D, self.texture_id)
140
+ glColor4f(1, 1, 1, self.opacity)
141
+
142
+ size_x = self.image.width() / 2000 # 根據解析度調整大小
143
+ size_y = self.image.height() / 2000
144
+
145
+ for x, y in self.particles:
146
+ glLoadIdentity()
147
+ glTranslatef(x, y, 0)
148
+
149
+ glBegin(GL_QUADS)
150
+ glTexCoord2f(0, 1)
151
+ glVertex2f(-size_x, -size_y)
152
+ glTexCoord2f(1, 1)
153
+ glVertex2f(size_x, -size_y)
154
+ glTexCoord2f(1, 0)
155
+ glVertex2f(size_x, size_y)
156
+ glTexCoord2f(0, 0)
157
+ glVertex2f(-size_x, size_y)
158
+ glEnd()
159
+
160
+ def resizeGL(self, w, h):
161
+ glViewport(0, 0, w, h)
162
+ glMatrixMode(GL_PROJECTION)
163
+ glLoadIdentity()
164
+ glOrtho(-1, 1, -1, 1, -1, 1)
165
+ glMatrixMode(GL_MODELVIEW)
166
+ glLoadIdentity()
167
+
168
+ def set_ui_window_flag(self) -> None:
169
+ """ 設定視窗旗標 (保持最上層或最下層) Set window flags (stay on top or bottom) """
170
+ self.setWindowFlag(
171
+ Qt.WindowType.Window |
172
+ Qt.WindowType.WindowTransparentForInput |
173
+ Qt.WindowType.FramelessWindowHint |
174
+ Qt.WindowType.WindowStaysOnTopHint |
175
+ Qt.WindowType.Tool)
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
  from typing import Dict, Type
5
5
 
6
6
  from PySide6.QtCore import QTimer, QCoreApplication
7
- from PySide6.QtGui import QIcon, Qt
7
+ from PySide6.QtGui import QIcon, Qt, QSurfaceFormat
8
8
  from PySide6.QtWidgets import QMainWindow, QApplication, QGridLayout, QTabWidget, QMenuBar, QWidget
9
9
  from qt_material import apply_stylesheet
10
10
 
@@ -45,8 +45,7 @@ class ParticleSettingUI(QWidget):
45
45
  self.choose_direction_label = QLabel(language_wrapper.language_word_dict.get("choose_particle_direction"))
46
46
  self.choose_direction_combobox = QComboBox()
47
47
  self.choose_direction_combobox.addItems(
48
- ["down", "up", "left", "right", "left_down", "left_up", "right_down", "right_up",
49
- "random_minus", "random_add", "random"]
48
+ ["down", "up", "left", "right"]
50
49
  )
51
50
 
52
51
  # Particle size
@@ -130,7 +129,7 @@ class ParticleSettingUI(QWidget):
130
129
  monitors[0].availableGeometry().width(),
131
130
  monitors[0].availableGeometry().height()
132
131
  )
133
- particle_widget.showFullScreen()
132
+ particle_widget.showMaximized()
134
133
 
135
134
  elif not self.show_all_screen and len(monitors) >= 2:
136
135
  input_dialog, combobox = create_monitor_selection_dialog(self, monitors)
@@ -145,7 +144,7 @@ class ParticleSettingUI(QWidget):
145
144
  )
146
145
  particle_widget.setScreen(monitor)
147
146
  particle_widget.move(monitor.availableGeometry().topLeft())
148
- particle_widget.showFullScreen()
147
+ particle_widget.showMaximized()
149
148
 
150
149
  else:
151
150
  for monitor in monitors:
@@ -155,7 +154,7 @@ class ParticleSettingUI(QWidget):
155
154
  )
156
155
  particle_widget.setScreen(monitor)
157
156
  particle_widget.move(monitor.availableGeometry().topLeft())
158
- particle_widget.showFullScreen()
157
+ particle_widget.showMaximized()
159
158
 
160
159
  def choose_and_copy_file_to_cwd_image_dir_then_play(self) -> None:
161
160
  front_engine_logger.info("[ParticleSettingUI] choose_and_copy_file_to_cwd_image_dir_then_play")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine_dev
3
- Version: 0.0.97
3
+ Version: 1.0.0
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "frontengine_dev"
9
- version = "0.0.97"
9
+ version = "1.0.0"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
@@ -1,212 +0,0 @@
1
- import random
2
- import ctypes
3
- import sys
4
-
5
- from OpenGL.GL import *
6
- from PySide6.QtCore import QTimer
7
- from PySide6.QtGui import QImage, QPixmap, Qt
8
- from PySide6.QtOpenGLWidgets import QOpenGLWidget
9
-
10
- from frontengine.utils.logging.loggin_instance import front_engine_logger
11
-
12
-
13
- class ParticleOpenGLWidget(QOpenGLWidget):
14
- """
15
- OpenGL-based particle widget
16
- (Replacement for QGraphicsView + QGraphicsScene)
17
- """
18
-
19
- def __init__(self,
20
- pixmap: QPixmap,
21
- particle_size: int,
22
- particle_direction: str = "down",
23
- particle_count: int = 50,
24
- opacity: float = 0.2,
25
- screen_height: int = 1080,
26
- screen_width: int = 1920,
27
- particle_speed: float = 0.003):
28
- super().__init__()
29
-
30
- # Window size
31
- self.width = screen_width
32
- self.height = screen_height
33
-
34
- # ---- QWidget attributes (對齊原本 ParticleWidget) ----
35
- self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
36
- self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
37
- self.setAttribute(Qt.WidgetAttribute.WA_NoSystemBackground)
38
- self.setAutoFillBackground(False)
39
-
40
- hwnd = int(self.winId())
41
- extended_style = ctypes.windll.user32.GetWindowLongW(hwnd, -20)
42
- ctypes.windll.user32.SetWindowLongW(hwnd, -20,
43
- extended_style | 0x80000 | 0x20) # WS_EX_LAYERED | WS_EX_TRANSPARENT
44
-
45
- # ---- Particle image ----
46
- target_size = pixmap.size().scaled(
47
- particle_size, particle_size,
48
- Qt.AspectRatioMode.KeepAspectRatio
49
- )
50
- self.image = pixmap.toImage().scaled(target_size)
51
-
52
- # ---- Particle parameters ----
53
- self.particle_count = particle_count
54
- self.particle_speed = particle_speed
55
- self.opacity = opacity
56
- self.direction = particle_direction
57
-
58
- # ---- Particle state (Scene replacement) ----
59
- self.particles = [
60
- [random.uniform(-1, 1), random.uniform(-1, 1)]
61
- for _ in range(particle_count)
62
- ]
63
-
64
- self.texture_id = None
65
-
66
- # ---- Animation timer ----
67
- self.timer = QTimer(self)
68
- self.timer.timeout.connect(self.update)
69
- self.timer.start(16)
70
-
71
- # ================= OpenGL lifecycle =================
72
-
73
- def initializeGL(self):
74
- glEnable(GL_BLEND)
75
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
76
- glEnable(GL_TEXTURE_2D)
77
-
78
- image = self.image.convertToFormat(QImage.Format.Format_RGBA8888)
79
- width, height = image.width(), image.height()
80
-
81
- self.texture_id = glGenTextures(1)
82
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
83
-
84
- glTexImage2D(
85
- GL_TEXTURE_2D, 0, GL_RGBA,
86
- width, height, 0,
87
- GL_RGBA, GL_UNSIGNED_BYTE,
88
- image.bits()
89
- )
90
-
91
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
92
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
93
-
94
- def paintGL(self):
95
- glClearColor(0, 0, 0, 0)
96
- glClear(GL_COLOR_BUFFER_BIT)
97
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
98
- glColor4f(1.0, 1.0, 1.0, self.opacity)
99
-
100
- size = 0.04
101
-
102
- glBegin(GL_QUADS)
103
- for x, y in self.particles:
104
- glTexCoord2f(0, 0)
105
- glVertex2f(x - size, y - size)
106
- glTexCoord2f(1, 0)
107
- glVertex2f(x + size, y - size)
108
- glTexCoord2f(1, 1)
109
- glVertex2f(x + size, y + size)
110
- glTexCoord2f(0, 1)
111
- glVertex2f(x - size, y + size)
112
- glEnd()
113
-
114
- self._update_particles()
115
-
116
- def resizeGL(self, w, h):
117
- glViewport(0, 0, w, h)
118
- glMatrixMode(GL_PROJECTION)
119
- glLoadIdentity()
120
- glOrtho(-1, 1, -1, 1, -1, 1)
121
- glMatrixMode(GL_MODELVIEW)
122
- glLoadIdentity()
123
-
124
- # ================= Logic (Scene replacement) =================
125
-
126
- def _update_particles(self):
127
-
128
- for p in self.particles:
129
- if self.direction == "down":
130
- p[1] -= self.particle_speed
131
- if p[1] < -1:
132
- p[1] = 1
133
- p[0] = random.uniform(-1, 1)
134
-
135
- elif self.direction == "up":
136
- p[1] += self.particle_speed
137
- if p[1] > 1:
138
- p[1] = -1
139
- p[0] = random.uniform(-1, 1)
140
-
141
- elif self.direction == "left":
142
- p[0] -= self.particle_speed
143
- if p[0] < -1:
144
- p[0] = 1
145
- p[1] = random.uniform(-1, 1)
146
-
147
- elif self.direction == "right":
148
- p[0] += self.particle_speed
149
- if p[0] > 1:
150
- p[0] = -1
151
- p[1] = random.uniform(-1, 1)
152
-
153
- # Diagonal directions
154
- elif self.direction == "left_down":
155
- p[0] -= self.particle_speed
156
- p[1] -= self.particle_speed
157
- if p[0] < -1 or p[1] < -1:
158
- p[0] = random.uniform(-1, 1)
159
- p[1] = 1
160
-
161
- elif self.direction == "left_up":
162
- p[0] -= self.particle_speed
163
- p[1] += self.particle_speed
164
- if p[0] < -1 or p[1] > 1:
165
- p[0] = random.uniform(-1, 1)
166
- p[1] = -1
167
-
168
- elif self.direction == "right_down":
169
- p[0] += self.particle_speed
170
- p[1] -= self.particle_speed
171
- if p[0] > 1 or p[1] < -1:
172
- p[0] = random.uniform(-1, 1)
173
- p[1] = 1
174
-
175
- elif self.direction == "right_up":
176
- p[0] += self.particle_speed
177
- p[1] += self.particle_speed
178
- if p[0] > 1 or p[1] > 1:
179
- p[0] = random.uniform(-1, 1)
180
- p[1] = -1
181
-
182
- # Randomized modes
183
- elif self.direction == "random_minus":
184
- p[0] -= random.uniform(0, self.particle_speed)
185
- p[1] -= random.uniform(0, self.particle_speed)
186
- if p[0] < -1 or p[1] < -1:
187
- p[0] = random.uniform(-1, 1)
188
- p[1] = random.uniform(-1, 1)
189
-
190
- elif self.direction == "random_add":
191
- p[0] += random.uniform(0, self.particle_speed)
192
- p[1] += random.uniform(0, self.particle_speed)
193
- if p[0] > 1 or p[1] > 1:
194
- p[0] = random.uniform(-1, 1)
195
- p[1] = random.uniform(-1, 1)
196
-
197
- elif self.direction == "random":
198
- p[0] += random.uniform(-self.particle_speed, self.particle_speed)
199
- p[1] += random.uniform(-self.particle_speed, self.particle_speed)
200
- # Wrap-around if out of bounds
201
- if p[0] < -1 or p[0] > 1 or p[1] < -1 or p[1] > 1:
202
- p[0] = random.uniform(-1, 1)
203
- p[1] = random.uniform(-1, 1)
204
-
205
- def set_ui_window_flag(self) -> None:
206
- """ 設定視窗旗標 (保持最上層或最下層) Set window flags (stay on top or bottom) """
207
- front_engine_logger.info(f"[ParticleWidget] set_ui_window_flag")
208
- self.setWindowFlag(
209
- Qt.WindowType.WindowTransparentForInput |
210
- Qt.WindowType.FramelessWindowHint |
211
- Qt.WindowType.WindowStaysOnTopHint |
212
- Qt.WindowType.Tool)