pyloid 0.16.3__py3-none-any.whl → 0.16.5__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/browser_window.py +191 -2
- pyloid/js_api/window_api.py +36 -0
- pyloid/pyloid.py +78 -4
- {pyloid-0.16.3.dist-info → pyloid-0.16.5.dist-info}/METADATA +1 -1
- {pyloid-0.16.3.dist-info → pyloid-0.16.5.dist-info}/RECORD +7 -7
- {pyloid-0.16.3.dist-info → pyloid-0.16.5.dist-info}/LICENSE +0 -0
- {pyloid-0.16.3.dist-info → pyloid-0.16.5.dist-info}/WHEEL +0 -0
pyloid/browser_window.py
CHANGED
@@ -26,16 +26,46 @@ from PySide6.QtGui import QPixmap, QMovie
|
|
26
26
|
from PySide6.QtWidgets import QSplashScreen, QLabel
|
27
27
|
from PySide6.QtCore import QSize
|
28
28
|
from typing import TYPE_CHECKING
|
29
|
+
from PySide6.QtWebEngineCore import QWebEngineSettings
|
29
30
|
|
30
31
|
if TYPE_CHECKING:
|
31
32
|
from ..pyloid import Pyloid
|
32
33
|
|
33
34
|
|
34
35
|
# 어차피 load 부분에만 쓰이니까 나중에 분리해서 load 위에서 선언하자.
|
36
|
+
class CustomWebPage(QWebEnginePage):
|
37
|
+
def __init__(self, profile=None):
|
38
|
+
super().__init__(profile)
|
39
|
+
# 권한 요청 시그널 연결
|
40
|
+
self.featurePermissionRequested.connect(self._handlePermissionRequest)
|
41
|
+
self._permission_handlers = {}
|
42
|
+
|
43
|
+
def _handlePermissionRequest(self, origin: QUrl, feature: QWebEnginePage.Feature):
|
44
|
+
"""기본 권한 요청 핸들러"""
|
45
|
+
if feature in self._permission_handlers:
|
46
|
+
# 등록된 핸들러가 있으면 실행
|
47
|
+
handler = self._permission_handlers[feature]
|
48
|
+
handler(origin, feature)
|
49
|
+
else:
|
50
|
+
# 기본적으로 모든 권한 허용
|
51
|
+
self.setFeaturePermission(
|
52
|
+
origin, feature, QWebEnginePage.PermissionPolicy.PermissionGrantedByUser
|
53
|
+
)
|
54
|
+
|
55
|
+
def setPermissionHandler(self, feature: QWebEnginePage.Feature, handler):
|
56
|
+
"""특정 권한에 대한 핸들러 등록"""
|
57
|
+
self._permission_handlers[feature] = handler
|
58
|
+
|
59
|
+
|
35
60
|
class CustomWebEngineView(QWebEngineView):
|
36
61
|
def __init__(self, parent=None):
|
37
62
|
super().__init__(parent._window)
|
38
63
|
self.parent = parent
|
64
|
+
|
65
|
+
# 커스텀 웹 페이지 설정
|
66
|
+
self.custom_page = CustomWebPage()
|
67
|
+
self.setPage(self.custom_page)
|
68
|
+
|
39
69
|
self.drag_relative_position = None
|
40
70
|
self.is_dragging = False
|
41
71
|
self.is_resizing = False
|
@@ -199,6 +229,8 @@ class BrowserWindow:
|
|
199
229
|
for js_api in js_apis:
|
200
230
|
self.js_apis.append(js_api)
|
201
231
|
self.shortcuts = {}
|
232
|
+
self.close_on_load = True
|
233
|
+
self.splash_screen = None
|
202
234
|
###########################################################################################
|
203
235
|
|
204
236
|
def _set_custom_frame(
|
@@ -293,13 +325,13 @@ class BrowserWindow:
|
|
293
325
|
def _on_load_finished(self, ok):
|
294
326
|
"""Handles the event when the web page finishes loading."""
|
295
327
|
if ok and self.js_apis:
|
296
|
-
|
297
328
|
# Load qwebchannel.js
|
298
329
|
qwebchannel_js = QFile("://qtwebchannel/qwebchannel.js")
|
299
330
|
if qwebchannel_js.open(QFile.ReadOnly):
|
300
331
|
source = bytes(qwebchannel_js.readAll()).decode("utf-8")
|
301
332
|
self.web_view.page().runJavaScript(source)
|
302
333
|
qwebchannel_js.close()
|
334
|
+
|
303
335
|
|
304
336
|
js_code = """
|
305
337
|
if (typeof QWebChannel !== 'undefined') {
|
@@ -331,6 +363,22 @@ class BrowserWindow:
|
|
331
363
|
window.pyloid.WindowAPI.startSystemDrag();
|
332
364
|
}
|
333
365
|
});
|
366
|
+
|
367
|
+
function updateTheme(theme) {
|
368
|
+
document.documentElement.setAttribute(
|
369
|
+
'data-pyloid-theme',
|
370
|
+
theme
|
371
|
+
);
|
372
|
+
}
|
373
|
+
|
374
|
+
// 테마 변경 이벤트 리스너
|
375
|
+
document.addEventListener('themeChange', (e) => {
|
376
|
+
console.log('themeChange event received:', e);
|
377
|
+
updateTheme(e.detail.theme);
|
378
|
+
});
|
379
|
+
|
380
|
+
updateTheme('%s');
|
381
|
+
|
334
382
|
|
335
383
|
// Dispatch a custom event to signal that the initialization is ready
|
336
384
|
const event = new CustomEvent('pyloidReady');
|
@@ -347,7 +395,7 @@ class BrowserWindow:
|
|
347
395
|
for js_api in self.js_apis
|
348
396
|
]
|
349
397
|
)
|
350
|
-
self.web_view.page().runJavaScript(js_code % js_api_init)
|
398
|
+
self.web_view.page().runJavaScript(js_code % (js_api_init, self.app.theme))
|
351
399
|
|
352
400
|
# if splash screen is set, close it when the page is loaded
|
353
401
|
if self.close_on_load and self.splash_screen:
|
@@ -1377,6 +1425,26 @@ class BrowserWindow:
|
|
1377
1425
|
"""
|
1378
1426
|
return self._window
|
1379
1427
|
|
1428
|
+
def get_QWebEngineView(self) -> CustomWebEngineView:
|
1429
|
+
"""
|
1430
|
+
Returns the CustomWebEngineView object which inherits from QWebEngineView.
|
1431
|
+
|
1432
|
+
Returns
|
1433
|
+
-------
|
1434
|
+
CustomWebEngineView
|
1435
|
+
CustomWebEngineView object of the window
|
1436
|
+
|
1437
|
+
Examples
|
1438
|
+
--------
|
1439
|
+
```python
|
1440
|
+
window = app.create_window("pyloid-window")
|
1441
|
+
web_view = window.get_QWebEngineView()
|
1442
|
+
|
1443
|
+
web_view.page().runJavaScript("console.log('Hello, Pyloid!')")
|
1444
|
+
```
|
1445
|
+
"""
|
1446
|
+
return self.web_view
|
1447
|
+
|
1380
1448
|
###########################################################################################
|
1381
1449
|
# QMainWindow flags
|
1382
1450
|
###########################################################################################
|
@@ -1607,3 +1675,124 @@ class BrowserWindow:
|
|
1607
1675
|
self.splash_screen.close()
|
1608
1676
|
self.close_on_load = None
|
1609
1677
|
self.splash_screen = None
|
1678
|
+
|
1679
|
+
###########################################################################################
|
1680
|
+
# WebEngineView Attribute setting
|
1681
|
+
###########################################################################################
|
1682
|
+
def set_web_engine_view_attribute(self, attribute: QWebEngineSettings, on: bool):
|
1683
|
+
"""
|
1684
|
+
Sets the attribute of the WebEngineView.
|
1685
|
+
|
1686
|
+
Parameters
|
1687
|
+
----------
|
1688
|
+
attribute : QWebEngineSettings
|
1689
|
+
Attribute to set
|
1690
|
+
on : bool
|
1691
|
+
True to enable the attribute, False to disable it
|
1692
|
+
|
1693
|
+
Examples
|
1694
|
+
--------
|
1695
|
+
```python
|
1696
|
+
window.set_web_engine_view_attribute(QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard, False)
|
1697
|
+
```
|
1698
|
+
"""
|
1699
|
+
settings = self.web_view.settings()
|
1700
|
+
settings.setAttribute(attribute, on)
|
1701
|
+
|
1702
|
+
def is_web_engine_view_attribute(self, attribute: QWebEngineSettings) -> bool:
|
1703
|
+
"""
|
1704
|
+
Returns the attribute of the WebEngineView.
|
1705
|
+
|
1706
|
+
Parameters
|
1707
|
+
----------
|
1708
|
+
attribute : QWebEngineSettings
|
1709
|
+
Attribute to get
|
1710
|
+
|
1711
|
+
Returns
|
1712
|
+
-------
|
1713
|
+
bool
|
1714
|
+
True if the attribute is enabled, False otherwise
|
1715
|
+
|
1716
|
+
Examples
|
1717
|
+
--------
|
1718
|
+
```python
|
1719
|
+
window.is_web_engine_view_attribute(QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard)
|
1720
|
+
```
|
1721
|
+
"""
|
1722
|
+
settings = self.web_view.settings()
|
1723
|
+
return settings.testAttribute(attribute)
|
1724
|
+
|
1725
|
+
def set_permission_handler(self, feature: QWebEnginePage.Feature, handler):
|
1726
|
+
"""
|
1727
|
+
특정 권한에 대한 핸들러를 설정합니다.
|
1728
|
+
|
1729
|
+
Parameters
|
1730
|
+
----------
|
1731
|
+
feature : QWebEnginePage.Feature
|
1732
|
+
설정할 권한 타입
|
1733
|
+
handler : callable
|
1734
|
+
권한 요청을 처리할 핸들러 함수
|
1735
|
+
|
1736
|
+
Examples
|
1737
|
+
--------
|
1738
|
+
```python
|
1739
|
+
def handle_camera(origin, feature):
|
1740
|
+
window.web_view.page().setFeaturePermission(
|
1741
|
+
origin,
|
1742
|
+
feature,
|
1743
|
+
QWebEnginePage.PermissionPolicy.PermissionGrantedByUser
|
1744
|
+
)
|
1745
|
+
|
1746
|
+
window.set_permission_handler(
|
1747
|
+
QWebEnginePage.Feature.MediaVideoCapture,
|
1748
|
+
handle_camera
|
1749
|
+
)
|
1750
|
+
```
|
1751
|
+
"""
|
1752
|
+
self.web_view.custom_page.setPermissionHandler(feature, handler)
|
1753
|
+
|
1754
|
+
def grant_permission(self, feature: QWebEnginePage.Feature):
|
1755
|
+
"""
|
1756
|
+
권한 요청이 왔을 때, 특정 권한을 자동으로 허용하도록 설정합니다.
|
1757
|
+
|
1758
|
+
Parameters
|
1759
|
+
----------
|
1760
|
+
feature : QWebEnginePage.Feature
|
1761
|
+
자동 허용할 권한 타입
|
1762
|
+
|
1763
|
+
Examples
|
1764
|
+
--------
|
1765
|
+
```python
|
1766
|
+
window.grant_permission(QWebEnginePage.Feature.MediaVideoCapture)
|
1767
|
+
```
|
1768
|
+
"""
|
1769
|
+
|
1770
|
+
def auto_grant(origin, feat):
|
1771
|
+
self.web_view.page().setFeaturePermission(
|
1772
|
+
origin, feat, QWebEnginePage.PermissionPolicy.PermissionGrantedByUser
|
1773
|
+
)
|
1774
|
+
|
1775
|
+
self.set_permission_handler(feature, auto_grant)
|
1776
|
+
|
1777
|
+
def deny_permission(self, feature: QWebEnginePage.Feature):
|
1778
|
+
"""
|
1779
|
+
권한 요청이 왔을 때, 특정 권한을 자동으로 거부하도록 설정합니다.
|
1780
|
+
|
1781
|
+
Parameters
|
1782
|
+
----------
|
1783
|
+
feature : QWebEnginePage.Feature
|
1784
|
+
자동 거부할 권한 타입
|
1785
|
+
|
1786
|
+
Examples
|
1787
|
+
--------
|
1788
|
+
```python
|
1789
|
+
window.deny_permission(QWebEnginePage.Feature.Notifications)
|
1790
|
+
```
|
1791
|
+
"""
|
1792
|
+
|
1793
|
+
def auto_deny(origin, feat):
|
1794
|
+
self.web_view.page().setFeaturePermission(
|
1795
|
+
origin, feat, QWebEnginePage.PermissionPolicy.PermissionDeniedByUser
|
1796
|
+
)
|
1797
|
+
|
1798
|
+
self.set_permission_handler(feature, auto_deny)
|
pyloid/js_api/window_api.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from typing import TYPE_CHECKING, Optional
|
2
2
|
|
3
3
|
from ..api import PyloidAPI, Bridge
|
4
|
+
from PySide6.QtCore import QByteArray, QBuffer, QIODeviceBase
|
4
5
|
|
5
6
|
if TYPE_CHECKING:
|
6
7
|
from ..pyloid import Pyloid
|
@@ -208,3 +209,38 @@ class WindowAPI(PyloidAPI):
|
|
208
209
|
window = self.app.get_window_by_id(self.window_id)
|
209
210
|
if window:
|
210
211
|
window.web_view.start_system_drag()
|
212
|
+
|
213
|
+
###############################################################
|
214
|
+
# Clipboard
|
215
|
+
###############################################################
|
216
|
+
|
217
|
+
@Bridge(str)
|
218
|
+
def setClipboardText(self, text: str):
|
219
|
+
"""Sets the text to the clipboard."""
|
220
|
+
self.app.set_clipboard_text(text)
|
221
|
+
|
222
|
+
@Bridge(result=str)
|
223
|
+
def getClipboardText(self):
|
224
|
+
"""Gets the text from the clipboard."""
|
225
|
+
return self.app.get_clipboard_text()
|
226
|
+
|
227
|
+
@Bridge(str, str)
|
228
|
+
def setClipboardImage(self, image_path: str, format: str):
|
229
|
+
"""Sets the image to the clipboard."""
|
230
|
+
self.app.set_clipboard_image(image_path, format)
|
231
|
+
|
232
|
+
@Bridge(result=str)
|
233
|
+
def getClipboardImage(self):
|
234
|
+
"""클립보드의 이미지를 Base64 인코딩된 데이터 URL로 반환합니다."""
|
235
|
+
image = self.app.get_clipboard_image() # QImage 반환 가정
|
236
|
+
if image and not image.isNull():
|
237
|
+
# QImage를 바이트 배열로 변환
|
238
|
+
byte_array = QByteArray()
|
239
|
+
buffer = QBuffer(byte_array)
|
240
|
+
buffer.open(QIODeviceBase.WriteOnly)
|
241
|
+
image.save(buffer, "PNG") # PNG 형식으로 저장
|
242
|
+
|
243
|
+
# Base64로 인코딩
|
244
|
+
base64_data = byte_array.toBase64().data().decode()
|
245
|
+
return f"data:image/png;base64,{base64_data}"
|
246
|
+
return ""
|
pyloid/pyloid.py
CHANGED
@@ -15,7 +15,7 @@ from PySide6.QtGui import (
|
|
15
15
|
from PySide6.QtCore import Qt, Signal, QObject, QTimer
|
16
16
|
from PySide6.QtNetwork import QLocalServer, QLocalSocket
|
17
17
|
from .api import PyloidAPI
|
18
|
-
from typing import List, Optional, Dict, Callable, Union
|
18
|
+
from typing import List, Optional, Dict, Callable, Union, Literal
|
19
19
|
from PySide6.QtCore import qInstallMessageHandler
|
20
20
|
import signal
|
21
21
|
from .utils import is_production
|
@@ -25,6 +25,7 @@ from .filewatcher import FileWatcher
|
|
25
25
|
import logging
|
26
26
|
from .browser_window import BrowserWindow
|
27
27
|
from .tray import TrayEvent
|
28
|
+
from PySide6.QtCore import QCoreApplication
|
28
29
|
|
29
30
|
# for linux debug
|
30
31
|
os.environ["QTWEBENGINE_DICTIONARIES_PATH"] = "/"
|
@@ -32,6 +33,11 @@ os.environ["QTWEBENGINE_DICTIONARIES_PATH"] = "/"
|
|
32
33
|
# for macos debug
|
33
34
|
logging.getLogger("Qt").setLevel(logging.ERROR)
|
34
35
|
|
36
|
+
QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling)
|
37
|
+
os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = (
|
38
|
+
"--enable-features=WebRTCPipeWireCapturer --ignore-certificate-errors --allow-insecure-localhost"
|
39
|
+
)
|
40
|
+
|
35
41
|
|
36
42
|
def custom_message_handler(mode, context, message):
|
37
43
|
if not hasattr(custom_message_handler, "vulkan_warning_shown") and (
|
@@ -56,6 +62,7 @@ def custom_message_handler(mode, context, message):
|
|
56
62
|
|
57
63
|
qInstallMessageHandler(custom_message_handler)
|
58
64
|
|
65
|
+
|
59
66
|
class _WindowController(QObject):
|
60
67
|
create_window_signal = Signal(
|
61
68
|
QApplication, str, int, int, int, int, bool, bool, bool, list
|
@@ -123,6 +130,51 @@ class Pyloid(QApplication):
|
|
123
130
|
self.icon_frames = []
|
124
131
|
self.current_frame = 0
|
125
132
|
|
133
|
+
self.theme = (
|
134
|
+
"dark"
|
135
|
+
if self.styleHints().colorScheme() == Qt.ColorScheme.Dark
|
136
|
+
else "light"
|
137
|
+
)
|
138
|
+
|
139
|
+
# Add color scheme tracking
|
140
|
+
self.styleHints().colorSchemeChanged.connect(self._handle_color_scheme_change)
|
141
|
+
|
142
|
+
# def set_theme(self, theme: Literal["system", "dark", "light"]):
|
143
|
+
# """
|
144
|
+
# 시스템의 테마를 설정합니다.
|
145
|
+
|
146
|
+
# Parameters
|
147
|
+
# ----------
|
148
|
+
# theme : Literal["system", "dark", "light"]
|
149
|
+
# 설정할 테마 ("system", "dark", "light" 중 하나)
|
150
|
+
|
151
|
+
# Examples
|
152
|
+
# --------
|
153
|
+
# >>> app = Pyloid(app_name="Pyloid-App")
|
154
|
+
# >>> app.set_theme("dark") # 다크 테마로 설정
|
155
|
+
# >>> app.set_theme("light") # 라이트 테마로 설정
|
156
|
+
# >>> app.set_theme("system") # 시스템 테마를 따름
|
157
|
+
# """
|
158
|
+
# self.theme = theme
|
159
|
+
|
160
|
+
# if theme == "system":
|
161
|
+
# # 시스템 테마를 light/dark 문자열로 변환
|
162
|
+
# system_theme = (
|
163
|
+
# "dark"
|
164
|
+
# if self.styleHints().colorScheme() == Qt.ColorScheme.Dark
|
165
|
+
# else "light"
|
166
|
+
# )
|
167
|
+
# self._handle_color_scheme_change(system_theme)
|
168
|
+
# self.styleHints().colorSchemeChanged.connect(
|
169
|
+
# lambda: self._handle_color_scheme_change(system_theme)
|
170
|
+
# )
|
171
|
+
# else:
|
172
|
+
# # 기존 이벤트 연결 해제
|
173
|
+
# self.styleHints().colorSchemeChanged.disconnect(
|
174
|
+
# lambda: self._handle_color_scheme_change(self.theme)
|
175
|
+
# )
|
176
|
+
# self._handle_color_scheme_change(self.theme)
|
177
|
+
|
126
178
|
def set_icon(self, icon_path: str):
|
127
179
|
"""
|
128
180
|
Dynamically sets the application's icon.
|
@@ -407,7 +459,7 @@ class Pyloid(QApplication):
|
|
407
459
|
app = Pyloid(app_name="Pyloid-App")
|
408
460
|
|
409
461
|
window = app.get_window_by_id("123e4567-e89b-12d3-a456-426614174000")
|
410
|
-
|
462
|
+
|
411
463
|
if window:
|
412
464
|
print("Window found:", window)
|
413
465
|
```
|
@@ -1244,7 +1296,9 @@ class Pyloid(QApplication):
|
|
1244
1296
|
###########################################################################################
|
1245
1297
|
# File dialog
|
1246
1298
|
###########################################################################################
|
1247
|
-
def open_file_dialog(
|
1299
|
+
def open_file_dialog(
|
1300
|
+
self, dir: Optional[str] = None, filter: Optional[str] = None
|
1301
|
+
) -> Optional[str]:
|
1248
1302
|
"""
|
1249
1303
|
Opens a file dialog to select a file to open.
|
1250
1304
|
|
@@ -1270,7 +1324,9 @@ class Pyloid(QApplication):
|
|
1270
1324
|
file_path, _ = QFileDialog.getOpenFileName(None, dir=dir, filter=filter)
|
1271
1325
|
return file_path if file_path else None
|
1272
1326
|
|
1273
|
-
def save_file_dialog(
|
1327
|
+
def save_file_dialog(
|
1328
|
+
self, dir: Optional[str] = None, filter: Optional[str] = None
|
1329
|
+
) -> Optional[str]:
|
1274
1330
|
"""
|
1275
1331
|
Opens a file dialog to select a file to save.
|
1276
1332
|
|
@@ -1320,4 +1376,22 @@ class Pyloid(QApplication):
|
|
1320
1376
|
directory_path = QFileDialog.getExistingDirectory(None, dir=dir)
|
1321
1377
|
return directory_path if directory_path else None
|
1322
1378
|
|
1379
|
+
def _handle_color_scheme_change(self):
|
1380
|
+
self.theme = (
|
1381
|
+
"dark"
|
1382
|
+
if self.styleHints().colorScheme() == Qt.ColorScheme.Dark
|
1383
|
+
else "light"
|
1384
|
+
)
|
1385
|
+
|
1386
|
+
js_code = f"""
|
1387
|
+
document.dispatchEvent(new CustomEvent('themeChange', {{
|
1388
|
+
detail: {{ theme: "{self.theme}" }}
|
1389
|
+
}}));
|
1390
|
+
"""
|
1323
1391
|
|
1392
|
+
# 모든 윈도우에 변경사항 적용
|
1393
|
+
for window in self.windows:
|
1394
|
+
window.web_view.page().runJavaScript(js_code)
|
1395
|
+
window.web_view.page().setBackgroundColor(
|
1396
|
+
Qt.GlobalColor.black if self.theme == "dark" else Qt.GlobalColor.white
|
1397
|
+
)
|
@@ -1,17 +1,17 @@
|
|
1
1
|
pyloid/__init__.py,sha256=OOPhOKNQVmAM8hnfTeE7lHzxb8LsFNcgegBAvDrA-vY,293
|
2
2
|
pyloid/api.py,sha256=np0pFVUlen_GpN0svY0A3awY_ZjVFk-RpHQZZKFUMuo,2157
|
3
3
|
pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
|
4
|
-
pyloid/browser_window.py,sha256=
|
4
|
+
pyloid/browser_window.py,sha256=aISmYtmf-suKPiN42wGskeNRVlkmkSV4CIKKfB-W8Cw,58251
|
5
5
|
pyloid/custom/titlebar.py,sha256=itzK9pJbZMQ7BKca9kdbuHMffurrw15UijR6OU03Xsk,3894
|
6
6
|
pyloid/filewatcher.py,sha256=3M5zWVUf1OhlkWJcDFC8ZA9agO4Q-U8WdgGpy6kaVz0,4601
|
7
7
|
pyloid/js_api/event_api.py,sha256=_52yyBonqecmMvJpFW7OMNi_jX8Nrteqw_kI6r-DGG0,951
|
8
|
-
pyloid/js_api/window_api.py,sha256=
|
8
|
+
pyloid/js_api/window_api.py,sha256=_EAZ0GG0oa0EeIIyWnys03InLQuQfv4ZPezMouOJEGc,8155
|
9
9
|
pyloid/monitor.py,sha256=nmcoOmlHeTysrZVT5mmL92ASbqMg8aH-hQg35qKWi0M,27540
|
10
|
-
pyloid/pyloid.py,sha256=
|
10
|
+
pyloid/pyloid.py,sha256=2YcI0vn5VvCf4oXwsS3Y_7itlzjGlHQEQIbpwR_rkZ4,43874
|
11
11
|
pyloid/timer.py,sha256=RqMsChFUd93cxMVgkHWiIKrci0QDTBgJSTULnAtYT8M,8712
|
12
12
|
pyloid/tray.py,sha256=D12opVEc2wc2T4tK9epaN1oOdeziScsIVNM2uCN7C-A,1710
|
13
13
|
pyloid/utils.py,sha256=VGZE2liY8_AElEqxVe1YLbk3fWlcAevpRc6oOTTgi-U,1927
|
14
|
-
pyloid-0.16.
|
15
|
-
pyloid-0.16.
|
16
|
-
pyloid-0.16.
|
17
|
-
pyloid-0.16.
|
14
|
+
pyloid-0.16.5.dist-info/LICENSE,sha256=MTYF-6xpRekyTUglRweWtbfbwBL1I_3Bgfbm_SNOuI8,11525
|
15
|
+
pyloid-0.16.5.dist-info/METADATA,sha256=P8jz2kA5mL5UU9U-LqjGhwfpKLCHg8x6o2nzFOyn7Fs,3050
|
16
|
+
pyloid-0.16.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
17
|
+
pyloid-0.16.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|