pyloid 0.12.2__py3-none-any.whl → 0.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pyloid/pyloid.py
CHANGED
@@ -262,17 +262,28 @@ class CustomWebEngineView(QWebEngineView):
|
|
262
262
|
self.parent = parent
|
263
263
|
self.drag_relative_position = None
|
264
264
|
self.is_dragging = False
|
265
|
+
self.is_resizing = False
|
266
|
+
self.resize_start_pos = None
|
267
|
+
self.resize_direction = None
|
265
268
|
self.screen_geometry = self.screen().availableGeometry()
|
269
|
+
self.is_resizing_enabled = True
|
266
270
|
|
267
271
|
def mouse_press_event(self, event):
|
268
272
|
if event.button() == Qt.LeftButton:
|
269
273
|
self.drag_relative_position = event.pos()
|
274
|
+
if not self.parent.frame and self.is_resizing_enabled:
|
275
|
+
self.resize_direction = self.get_resize_direction(event.pos())
|
276
|
+
if self.resize_direction:
|
277
|
+
self.is_resizing = True
|
278
|
+
self.resize_start_pos = event.globalPos()
|
270
279
|
|
271
280
|
def start_system_drag(self):
|
272
281
|
self.is_dragging = True
|
273
282
|
|
274
283
|
def mouse_move_event(self, event):
|
275
|
-
if
|
284
|
+
if self.is_resizing and self.is_resizing_enabled:
|
285
|
+
self.resize_window(event.globalPos())
|
286
|
+
elif not self.parent.frame and self.is_dragging:
|
276
287
|
# 현재 마우스 위치를 전역 좌표로 가져옵니다
|
277
288
|
current_global_pos = event.globalPos()
|
278
289
|
|
@@ -296,10 +307,20 @@ class CustomWebEngineView(QWebEngineView):
|
|
296
307
|
|
297
308
|
# 창을 새 위치로 이동합니다
|
298
309
|
self.parent._window.move(new_window_pos)
|
310
|
+
else:
|
311
|
+
# Change cursor based on resize direction
|
312
|
+
resize_direction = self.get_resize_direction(event.pos())
|
313
|
+
if resize_direction and self.is_resizing_enabled:
|
314
|
+
self.set_cursor_for_resize_direction(resize_direction)
|
315
|
+
else:
|
316
|
+
self.unsetCursor()
|
299
317
|
|
300
318
|
def mouse_release_event(self, event):
|
301
319
|
if event.button() == Qt.LeftButton:
|
302
320
|
self.is_dragging = False
|
321
|
+
self.is_resizing = False
|
322
|
+
self.resize_direction = None
|
323
|
+
self.unsetCursor()
|
303
324
|
|
304
325
|
def eventFilter(self, source, event):
|
305
326
|
if self.focusProxy() is source:
|
@@ -311,6 +332,53 @@ class CustomWebEngineView(QWebEngineView):
|
|
311
332
|
self.mouse_release_event(event)
|
312
333
|
return super().eventFilter(source, event)
|
313
334
|
|
335
|
+
def get_resize_direction(self, pos):
|
336
|
+
if not self.parent.frame and self.is_resizing_enabled: # Check if frame is not present and resizing is enabled
|
337
|
+
margin = 5 # Margin in pixels to detect edge
|
338
|
+
rect = self.rect()
|
339
|
+
direction = None
|
340
|
+
|
341
|
+
if pos.x() <= margin:
|
342
|
+
direction = 'left'
|
343
|
+
elif pos.x() >= rect.width() - margin:
|
344
|
+
direction = 'right'
|
345
|
+
|
346
|
+
if pos.y() <= margin:
|
347
|
+
direction = 'top' if direction is None else direction + '-top'
|
348
|
+
elif pos.y() >= rect.height() - margin:
|
349
|
+
direction = 'bottom' if direction is None else direction + '-bottom'
|
350
|
+
|
351
|
+
return direction
|
352
|
+
return None
|
353
|
+
|
354
|
+
def set_cursor_for_resize_direction(self, direction):
|
355
|
+
if not self.parent.frame and direction and self.is_resizing_enabled: # Check if frame is not present and resizing is enabled
|
356
|
+
if direction in ['left', 'right']:
|
357
|
+
self.setCursor(Qt.SizeHorCursor)
|
358
|
+
elif direction in ['top', 'bottom']:
|
359
|
+
self.setCursor(Qt.SizeVerCursor)
|
360
|
+
elif direction in ['left-top', 'right-bottom']:
|
361
|
+
self.setCursor(Qt.SizeFDiagCursor)
|
362
|
+
elif direction in ['right-top', 'left-bottom']:
|
363
|
+
self.setCursor(Qt.SizeBDiagCursor)
|
364
|
+
|
365
|
+
def resize_window(self, global_pos):
|
366
|
+
if not self.parent.frame and self.resize_start_pos and self.resize_direction and self.is_resizing_enabled: # Check if frame is not present and resizing is enabled
|
367
|
+
delta = global_pos - self.resize_start_pos
|
368
|
+
new_geometry = self.parent._window.geometry()
|
369
|
+
|
370
|
+
if 'left' in self.resize_direction:
|
371
|
+
new_geometry.setLeft(new_geometry.left() + delta.x())
|
372
|
+
if 'right' in self.resize_direction:
|
373
|
+
new_geometry.setRight(new_geometry.right() + delta.x())
|
374
|
+
if 'top' in self.resize_direction:
|
375
|
+
new_geometry.setTop(new_geometry.top() + delta.y())
|
376
|
+
if 'bottom' in self.resize_direction:
|
377
|
+
new_geometry.setBottom(new_geometry.bottom() + delta.y())
|
378
|
+
|
379
|
+
self.parent._window.setGeometry(new_geometry)
|
380
|
+
self.resize_start_pos = global_pos
|
381
|
+
|
314
382
|
|
315
383
|
class BrowserWindow:
|
316
384
|
def __init__(
|
@@ -758,20 +826,49 @@ class BrowserWindow:
|
|
758
826
|
def get_visible(self) -> bool:
|
759
827
|
"""Returns the visibility of the window."""
|
760
828
|
return self._window.isVisible()
|
761
|
-
|
829
|
+
|
830
|
+
def get_frame(self) -> bool:
|
831
|
+
"""Returns the frame enabled state of the window."""
|
832
|
+
return self.frame
|
833
|
+
|
834
|
+
###########################################################################################
|
835
|
+
# Resize
|
836
|
+
###########################################################################################
|
762
837
|
def set_resizable(self, resizable: bool):
|
763
838
|
"""Sets the resizability of the window."""
|
764
839
|
self.resizable = resizable
|
765
|
-
if
|
766
|
-
self._window.
|
767
|
-
|
768
|
-
|
840
|
+
if self.frame:
|
841
|
+
flags = self._window.windowFlags() | Qt.WindowCloseButtonHint
|
842
|
+
if resizable:
|
843
|
+
pass
|
844
|
+
else:
|
845
|
+
flags |= Qt.MSWindowsFixedSizeDialogHint
|
846
|
+
self._window.setWindowFlags(flags)
|
769
847
|
else:
|
770
|
-
|
771
|
-
|
772
|
-
|
848
|
+
# 프레임이 없는 경우 커스텀 리사이징 로직을 설정합니다.
|
849
|
+
self.web_view.is_resizing_enabled = resizable
|
850
|
+
|
773
851
|
self._window.show() # 변경사항을 적용하기 위해 창을 다시 표시합니다.
|
774
852
|
|
853
|
+
def set_minimum_size(self, min_width: int, min_height: int):
|
854
|
+
"""Sets the minimum size of the window."""
|
855
|
+
self._window.setMinimumSize(min_width, min_height)
|
856
|
+
|
857
|
+
def set_maximum_size(self, max_width: int, max_height: int):
|
858
|
+
"""Sets the maximum size of the window."""
|
859
|
+
self._window.setMaximumSize(max_width, max_height)
|
860
|
+
|
861
|
+
def get_minimum_size(self):
|
862
|
+
"""Returns the minimum size of the window."""
|
863
|
+
return {'width': self._window.minimumWidth(), 'height': self._window.minimumHeight()}
|
864
|
+
|
865
|
+
def get_maximum_size(self):
|
866
|
+
"""Returns the maximum size of the window."""
|
867
|
+
return {'width': self._window.maximumWidth(), 'height': self._window.maximumHeight()}
|
868
|
+
|
869
|
+
def get_resizable(self):
|
870
|
+
"""Returns the resizability of the window."""
|
871
|
+
return self.resizable
|
775
872
|
|
776
873
|
class _WindowController(QObject):
|
777
874
|
create_window_signal = Signal(
|
@@ -790,6 +887,9 @@ class Pyloid(QApplication):
|
|
790
887
|
self.windows = []
|
791
888
|
self.server = None
|
792
889
|
|
890
|
+
self.app_name = app_name
|
891
|
+
self.icon = None
|
892
|
+
|
793
893
|
self.clipboard_class = self.clipboard()
|
794
894
|
self.shortcuts = {}
|
795
895
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pyloid
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.13.0
|
4
4
|
Summary:
|
5
5
|
Author: aesthetics-of-record
|
6
6
|
Author-email: 111675679+aesthetics-of-record@users.noreply.github.com
|
@@ -65,114 +65,15 @@ Package URL: [https://pypi.org/project/pyloid/](https://pypi.org/project/pyloid/
|
|
65
65
|
```python
|
66
66
|
from pyloid import Pyloid
|
67
67
|
|
68
|
-
app = Pyloid(single_instance=True)
|
68
|
+
app = Pyloid(app_name="Pyloid-App", single_instance=True)
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
else:
|
74
|
-
app.set_icon("src-pyloid/icons/icon.png")
|
75
|
-
|
76
|
-
# create window
|
77
|
-
window = app.create_window(
|
78
|
-
title="Pyloid Browser",
|
79
|
-
js_apis=[CustomAPI()],
|
80
|
-
dev_tools=True
|
81
|
-
)
|
82
|
-
|
83
|
-
window.set_size(800, 600)
|
84
|
-
|
85
|
-
# load html
|
86
|
-
if (is_production()):
|
87
|
-
window.set_dev_tools(False)
|
88
|
-
window.load_file(os.path.join(get_production_path(), "src/index.html"))
|
89
|
-
else:
|
90
|
-
window.load_file("src/index.html")
|
91
|
-
|
92
|
-
# show window
|
93
|
-
window.show_and_focus()
|
70
|
+
win = app.create_window("pyloid-example")
|
71
|
+
win.load_url("https://www.example.com")
|
72
|
+
win.show_and_focus()
|
94
73
|
|
95
74
|
app.run()
|
96
75
|
```
|
97
76
|
|
98
|
-
### Setting Up System Tray
|
99
|
-
|
100
|
-
```python
|
101
|
-
from pyloid import TrayEvent
|
102
|
-
|
103
|
-
def on_double_click():
|
104
|
-
print("Tray icon was double-clicked.")
|
105
|
-
|
106
|
-
app.set_tray_actions({
|
107
|
-
TrayEvent.DoubleClick: on_double_click,
|
108
|
-
})
|
109
|
-
app.set_tray_menu_items([
|
110
|
-
{"label": "Show Window", "callback": app.show_main_window},
|
111
|
-
{"label": "Quit", "callback": app.quit},
|
112
|
-
])
|
113
|
-
app.setup_tray()
|
114
|
-
```
|
115
|
-
|
116
|
-
```javascript
|
117
|
-
// CustomAPI method usage example
|
118
|
-
document.addEventListener('pyloidReady', function () {
|
119
|
-
// Using the echo method
|
120
|
-
window.pyloid.CustomAPI.echo('Hello', 42).then((result) => {
|
121
|
-
console.log(result); // "Message received in Python: Hello, 42" output
|
122
|
-
});
|
123
|
-
|
124
|
-
// Using the getAppVersion method
|
125
|
-
window.pyloid.CustomAPI.getAppVersion().then((version) => {
|
126
|
-
console.log('App version:', version); // "App version: 1.0.0" output
|
127
|
-
});
|
128
|
-
|
129
|
-
// Example using async/await syntax
|
130
|
-
async function useCustomAPI() {
|
131
|
-
const echoResult = await window.pyloid.CustomAPI.echo('Test', 100);
|
132
|
-
console.log(echoResult);
|
133
|
-
|
134
|
-
const appVersion = await window.pyloid.CustomAPI.getAppVersion();
|
135
|
-
console.log('Current app version:', appVersion);
|
136
|
-
}
|
137
|
-
|
138
|
-
useCustomAPI();
|
139
|
-
|
140
|
-
// Button click event binding
|
141
|
-
document.getElementById('myButton').addEventListener('click', function () {
|
142
|
-
// Using the create_window method
|
143
|
-
window.pyloid.CustomAPI.create_window().then((windowId) => {
|
144
|
-
console.log('New window ID:', windowId); // "New window ID: [generated window ID]" output
|
145
|
-
});
|
146
|
-
});
|
147
|
-
});
|
148
|
-
```
|
149
|
-
|
150
|
-
### Using React
|
151
|
-
|
152
|
-
```javascript
|
153
|
-
import { StrictMode } from 'react';
|
154
|
-
import { createRoot } from 'react-dom/client';
|
155
|
-
import App from './App.jsx';
|
156
|
-
import './index.css';
|
157
|
-
|
158
|
-
document.addEventListener('pyloidReady', function () {
|
159
|
-
createRoot(document.getElementById('root')).render(
|
160
|
-
<StrictMode>
|
161
|
-
<App />
|
162
|
-
</StrictMode>
|
163
|
-
);
|
164
|
-
});
|
165
|
-
|
166
|
-
function App() {
|
167
|
-
console.log('Pyloid is ready');
|
168
|
-
|
169
|
-
window.pyloid.CustomAPI.getAppVersion().then((version) => {
|
170
|
-
console.log('App version:', version); // "App version: 1.0.0"
|
171
|
-
});
|
172
|
-
return <h1>Hello World</h1>;
|
173
|
-
}
|
174
|
-
```
|
175
|
-
|
176
77
|
## License 📄
|
177
78
|
|
178
79
|
This project is licensed under the terms of the Apache License 2.0. See the [LICENSE](./LICENSE) file for details.
|
@@ -4,11 +4,11 @@ pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
|
|
4
4
|
pyloid/custom/titlebar.py,sha256=itzK9pJbZMQ7BKca9kdbuHMffurrw15UijR6OU03Xsk,3894
|
5
5
|
pyloid/filewatcher.py,sha256=n8N56D65le5TpsgxXb7z-FO_0lqv4UYD4yGq_UuMrAs,1285
|
6
6
|
pyloid/monitor.py,sha256=fqDnZ_7dpxVZLVJ5gCluDRY2USrQ5YL_fw1AnYivhsk,12741
|
7
|
-
pyloid/pyloid.py,sha256=
|
7
|
+
pyloid/pyloid.py,sha256=Fj60bHP6x9_GPCxWSB97t21VwzdDjQmhf_RIWzc4_k0,53585
|
8
8
|
pyloid/timer.py,sha256=1bYhqte3rV77vaeMUkcTgmx2ux7FtCqLCx9lIC2-COg,4360
|
9
9
|
pyloid/tray.py,sha256=rXgdkvzGxtie_EIcTSA7fjuta4nJk5THhNkGFcfv5Ew,634
|
10
10
|
pyloid/utils.py,sha256=DQerZWU_0o8dHcJ5y3yXf9i5OXn7KQZqU-hVBq3uPUA,711
|
11
|
-
pyloid-0.
|
12
|
-
pyloid-0.
|
13
|
-
pyloid-0.
|
14
|
-
pyloid-0.
|
11
|
+
pyloid-0.13.0.dist-info/LICENSE,sha256=F96EzotgWhhpnQTW2TcdoqrMDir1jyEo6H915tGQ-QE,11524
|
12
|
+
pyloid-0.13.0.dist-info/METADATA,sha256=q61MnQEpscRzhp5cQDk33lKSBgTCLm5xJ5-nX5L2o7w,3634
|
13
|
+
pyloid-0.13.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
14
|
+
pyloid-0.13.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|