frontengine-dev 0.0.96__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.96/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.96 → frontengine_dev-1.0.0}/frontengine/ui/main_ui.py +3 -4
  4. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/particle/particle_setting_ui.py +4 -5
  5. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0/frontengine_dev.egg-info}/PKG-INFO +1 -1
  6. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/pyproject.toml +1 -1
  7. frontengine_dev-0.0.96/frontengine/show/particle/particle_ui.py +0 -213
  8. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/LICENSE +0 -0
  9. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/README.md +0 -0
  10. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/__init__.py +0 -0
  11. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/__init__.py +0 -0
  12. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/base_widget.py +0 -0
  13. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/gif/__init__.py +0 -0
  14. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/gif/paint_gif.py +0 -0
  15. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/image/__init__.py +0 -0
  16. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/image/paint_image.py +0 -0
  17. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/load/__init__.py +0 -0
  18. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/load/load_someone_make_ui.py +0 -0
  19. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/particle/__init__.py +0 -0
  20. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/scene/__init__.py +0 -0
  21. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  22. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/scene/extend_graphic_view.py +0 -0
  23. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/scene/scene.py +0 -0
  24. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/sound_player/__init__.py +0 -0
  25. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/sound_player/sound_effect.py +0 -0
  26. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/sound_player/sound_player.py +0 -0
  27. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/text/__init__.py +0 -0
  28. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/text/draw_text.py +0 -0
  29. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/video/__init__.py +0 -0
  30. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/video/video_player.py +0 -0
  31. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/web/__init__.py +0 -0
  32. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/show/web/webview.py +0 -0
  33. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/system_tray/__init__.py +0 -0
  34. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/system_tray/extend_system_tray.py +0 -0
  35. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/__init__.py +0 -0
  36. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/color/__init__.py +0 -0
  37. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/color/global_color.py +0 -0
  38. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/dialog/__init__.py +0 -0
  39. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  40. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/dialog/save_file_dialog.py +0 -0
  41. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/menu/__init__.py +0 -0
  42. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/menu/help_menu.py +0 -0
  43. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/menu/how_to_menu.py +0 -0
  44. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/menu/language_menu.py +0 -0
  45. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/__init__.py +0 -0
  46. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/control_center/__init__.py +0 -0
  47. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
  48. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/gif/__init__.py +0 -0
  49. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  50. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/image/__init__.py +0 -0
  51. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  52. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/particle/__init__.py +0 -0
  53. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  54. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  55. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  56. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  57. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  58. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  59. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  60. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  61. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  62. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  63. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/sound_player/__init__.py +0 -0
  64. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  65. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/text/__init__.py +0 -0
  66. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  67. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/utils.py +0 -0
  68. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/video/__init__.py +0 -0
  69. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  70. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/web/__init__.py +0 -0
  71. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  72. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/user_setting/__init__.py +0 -0
  73. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/user_setting/scene_setting.py +0 -0
  74. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/user_setting/user_setting_file.py +0 -0
  75. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/__init__.py +0 -0
  76. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/browser/__init__.py +0 -0
  77. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/browser/browser.py +0 -0
  78. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/__init__.py +0 -0
  79. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  80. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  81. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  82. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/exception/__init__.py +0 -0
  83. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/exception/exception_tags.py +0 -0
  84. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/exception/exceptions.py +0 -0
  85. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/file/__init__.py +0 -0
  86. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/file/open/__init__.py +0 -0
  87. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/file/open/open_file.py +0 -0
  88. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/file/save/__init__.py +0 -0
  89. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/file/save/save_file.py +0 -0
  90. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/json/__init__.py +0 -0
  91. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/json/json_file.py +0 -0
  92. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/json_format/__init__.py +0 -0
  93. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/json_format/json_process.py +0 -0
  94. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/logging/__init__.py +0 -0
  95. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/logging/loggin_instance.py +0 -0
  96. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/__init__.py +0 -0
  97. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/english.py +0 -0
  98. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/france.py +0 -0
  99. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/germany.py +0 -0
  100. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/italy.py +0 -0
  101. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  102. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/russian.py +0 -0
  103. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
  104. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/multi_language/traditional_chinese.py +0 -0
  105. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/redirect_manager/__init__.py +0 -0
  106. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  107. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/worker/__init__.py +0 -0
  108. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine/worker/qthread_worker.py +0 -0
  109. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/SOURCES.txt +0 -0
  110. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/dependency_links.txt +0 -0
  111. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/requires.txt +0 -0
  112. {frontengine_dev-0.0.96 → frontengine_dev-1.0.0}/frontengine_dev.egg-info/top_level.txt +0 -0
  113. {frontengine_dev-0.0.96 → 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.96
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
 
@@ -52,9 +52,8 @@ class FrontEngineMainUI(QMainWindow):
52
52
 
53
53
  # Windows 平台設定 AppUserModelID
54
54
  # Set AppUserModelID for Windows platform
55
- if sys.platform in ["win32", "cygwin", "msys"]:
56
- from ctypes import windll
57
- windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
55
+ from ctypes import windll
56
+ windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
58
57
 
59
58
  # 讀取使用者設定
60
59
  # Load user settings
@@ -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.96
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.96"
9
+ version = "1.0.0"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
@@ -1,213 +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
- if sys.platform in ["win32", "cygwin", "msys"]:
41
- hwnd = int(self.winId())
42
- extended_style = ctypes.windll.user32.GetWindowLongW(hwnd, -20)
43
- ctypes.windll.user32.SetWindowLongW(hwnd, -20,
44
- extended_style | 0x80000 | 0x20) # WS_EX_LAYERED | WS_EX_TRANSPARENT
45
-
46
- # ---- Particle image ----
47
- target_size = pixmap.size().scaled(
48
- particle_size, particle_size,
49
- Qt.AspectRatioMode.KeepAspectRatio
50
- )
51
- self.image = pixmap.toImage().scaled(target_size)
52
-
53
- # ---- Particle parameters ----
54
- self.particle_count = particle_count
55
- self.particle_speed = particle_speed
56
- self.opacity = opacity
57
- self.direction = particle_direction
58
-
59
- # ---- Particle state (Scene replacement) ----
60
- self.particles = [
61
- [random.uniform(-1, 1), random.uniform(-1, 1)]
62
- for _ in range(particle_count)
63
- ]
64
-
65
- self.texture_id = None
66
-
67
- # ---- Animation timer ----
68
- self.timer = QTimer(self)
69
- self.timer.timeout.connect(self.update)
70
- self.timer.start(16)
71
-
72
- # ================= OpenGL lifecycle =================
73
-
74
- def initializeGL(self):
75
- glEnable(GL_BLEND)
76
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
77
- glEnable(GL_TEXTURE_2D)
78
-
79
- image = self.image.convertToFormat(QImage.Format.Format_RGBA8888)
80
- width, height = image.width(), image.height()
81
-
82
- self.texture_id = glGenTextures(1)
83
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
84
-
85
- glTexImage2D(
86
- GL_TEXTURE_2D, 0, GL_RGBA,
87
- width, height, 0,
88
- GL_RGBA, GL_UNSIGNED_BYTE,
89
- image.bits()
90
- )
91
-
92
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
93
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
94
-
95
- def paintGL(self):
96
- glClearColor(0, 0, 0, 0)
97
- glClear(GL_COLOR_BUFFER_BIT)
98
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
99
- glColor4f(1.0, 1.0, 1.0, self.opacity)
100
-
101
- size = 0.04
102
-
103
- glBegin(GL_QUADS)
104
- for x, y in self.particles:
105
- glTexCoord2f(0, 0)
106
- glVertex2f(x - size, y - size)
107
- glTexCoord2f(1, 0)
108
- glVertex2f(x + size, y - size)
109
- glTexCoord2f(1, 1)
110
- glVertex2f(x + size, y + size)
111
- glTexCoord2f(0, 1)
112
- glVertex2f(x - size, y + size)
113
- glEnd()
114
-
115
- self._update_particles()
116
-
117
- def resizeGL(self, w, h):
118
- glViewport(0, 0, w, h)
119
- glMatrixMode(GL_PROJECTION)
120
- glLoadIdentity()
121
- glOrtho(-1, 1, -1, 1, -1, 1)
122
- glMatrixMode(GL_MODELVIEW)
123
- glLoadIdentity()
124
-
125
- # ================= Logic (Scene replacement) =================
126
-
127
- def _update_particles(self):
128
-
129
- for p in self.particles:
130
- if self.direction == "down":
131
- p[1] -= self.particle_speed
132
- if p[1] < -1:
133
- p[1] = 1
134
- p[0] = random.uniform(-1, 1)
135
-
136
- elif self.direction == "up":
137
- p[1] += self.particle_speed
138
- if p[1] > 1:
139
- p[1] = -1
140
- p[0] = random.uniform(-1, 1)
141
-
142
- elif self.direction == "left":
143
- p[0] -= self.particle_speed
144
- if p[0] < -1:
145
- p[0] = 1
146
- p[1] = random.uniform(-1, 1)
147
-
148
- elif self.direction == "right":
149
- p[0] += self.particle_speed
150
- if p[0] > 1:
151
- p[0] = -1
152
- p[1] = random.uniform(-1, 1)
153
-
154
- # Diagonal directions
155
- elif self.direction == "left_down":
156
- p[0] -= self.particle_speed
157
- p[1] -= self.particle_speed
158
- if p[0] < -1 or p[1] < -1:
159
- p[0] = random.uniform(-1, 1)
160
- p[1] = 1
161
-
162
- elif self.direction == "left_up":
163
- p[0] -= self.particle_speed
164
- p[1] += self.particle_speed
165
- if p[0] < -1 or p[1] > 1:
166
- p[0] = random.uniform(-1, 1)
167
- p[1] = -1
168
-
169
- elif self.direction == "right_down":
170
- p[0] += self.particle_speed
171
- p[1] -= self.particle_speed
172
- if p[0] > 1 or p[1] < -1:
173
- p[0] = random.uniform(-1, 1)
174
- p[1] = 1
175
-
176
- elif self.direction == "right_up":
177
- p[0] += self.particle_speed
178
- p[1] += self.particle_speed
179
- if p[0] > 1 or p[1] > 1:
180
- p[0] = random.uniform(-1, 1)
181
- p[1] = -1
182
-
183
- # Randomized modes
184
- elif self.direction == "random_minus":
185
- p[0] -= random.uniform(0, self.particle_speed)
186
- p[1] -= random.uniform(0, self.particle_speed)
187
- if p[0] < -1 or p[1] < -1:
188
- p[0] = random.uniform(-1, 1)
189
- p[1] = random.uniform(-1, 1)
190
-
191
- elif self.direction == "random_add":
192
- p[0] += random.uniform(0, self.particle_speed)
193
- p[1] += random.uniform(0, self.particle_speed)
194
- if p[0] > 1 or p[1] > 1:
195
- p[0] = random.uniform(-1, 1)
196
- p[1] = random.uniform(-1, 1)
197
-
198
- elif self.direction == "random":
199
- p[0] += random.uniform(-self.particle_speed, self.particle_speed)
200
- p[1] += random.uniform(-self.particle_speed, self.particle_speed)
201
- # Wrap-around if out of bounds
202
- if p[0] < -1 or p[0] > 1 or p[1] < -1 or p[1] > 1:
203
- p[0] = random.uniform(-1, 1)
204
- p[1] = random.uniform(-1, 1)
205
-
206
- def set_ui_window_flag(self) -> None:
207
- """ 設定視窗旗標 (保持最上層或最下層) Set window flags (stay on top or bottom) """
208
- front_engine_logger.info(f"[ParticleWidget] set_ui_window_flag")
209
- self.setWindowFlag(
210
- Qt.WindowType.WindowTransparentForInput |
211
- Qt.WindowType.FramelessWindowHint |
212
- Qt.WindowType.WindowStaysOnTopHint |
213
- Qt.WindowType.Tool)