pyloid 0.11.5__py3-none-any.whl → 0.12.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- pyloid/custom/titlebar.py +116 -0
- pyloid/pyloid.py +91 -124
- {pyloid-0.11.5.dist-info → pyloid-0.12.0.dist-info}/LICENSE +1 -1
- {pyloid-0.11.5.dist-info → pyloid-0.12.0.dist-info}/METADATA +1 -1
- {pyloid-0.11.5.dist-info → pyloid-0.12.0.dist-info}/RECORD +6 -5
- {pyloid-0.11.5.dist-info → pyloid-0.12.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,116 @@
|
|
1
|
+
from PySide6.QtWidgets import (
|
2
|
+
QWidget,
|
3
|
+
QHBoxLayout,
|
4
|
+
QLabel,
|
5
|
+
QPushButton,
|
6
|
+
QVBoxLayout,
|
7
|
+
QApplication,
|
8
|
+
)
|
9
|
+
from PySide6.QtGui import QColor, QPalette, QPixmap
|
10
|
+
from PySide6.QtCore import Qt
|
11
|
+
|
12
|
+
|
13
|
+
class CustomTitleBar(QWidget):
|
14
|
+
def __init__(self, parent=None):
|
15
|
+
super().__init__(parent)
|
16
|
+
self.layout = QHBoxLayout(self)
|
17
|
+
self.layout.setContentsMargins(5, 0, 5, 0)
|
18
|
+
self.layout.setSpacing(0)
|
19
|
+
|
20
|
+
self.icon_label = QLabel()
|
21
|
+
self.icon_label.setFixedSize(20, 20)
|
22
|
+
self.title = QLabel("Custom Title")
|
23
|
+
|
24
|
+
self.minimize_button = QPushButton("-")
|
25
|
+
self.maximize_button = QPushButton("❐")
|
26
|
+
self.close_button = QPushButton("×")
|
27
|
+
|
28
|
+
for button in (self.minimize_button, self.maximize_button, self.close_button):
|
29
|
+
button.setFixedSize(45, 30)
|
30
|
+
button.setFlat(True)
|
31
|
+
|
32
|
+
self.layout.addWidget(self.icon_label)
|
33
|
+
self.layout.addSpacing(5)
|
34
|
+
self.layout.addWidget(self.title)
|
35
|
+
self.layout.addStretch(1)
|
36
|
+
self.layout.addWidget(self.minimize_button)
|
37
|
+
self.layout.addWidget(self.maximize_button)
|
38
|
+
self.layout.addWidget(self.close_button)
|
39
|
+
|
40
|
+
self.minimize_button.clicked.connect(self.window().showMinimized)
|
41
|
+
self.maximize_button.clicked.connect(self.toggle_maximize)
|
42
|
+
self.close_button.clicked.connect(self.window().close)
|
43
|
+
|
44
|
+
self.setFixedHeight(30)
|
45
|
+
self.set_style("darkblue", "white")
|
46
|
+
|
47
|
+
def set_style(self, bg_color, text_color):
|
48
|
+
self.setAutoFillBackground(True)
|
49
|
+
palette = self.palette()
|
50
|
+
bg_qcolor = QColor(bg_color)
|
51
|
+
text_qcolor = QColor(text_color)
|
52
|
+
palette.setColor(QPalette.Window, bg_qcolor)
|
53
|
+
palette.setColor(QPalette.WindowText, text_qcolor)
|
54
|
+
self.setPalette(palette)
|
55
|
+
|
56
|
+
self.title.setStyleSheet(f"color: {text_color}; font-weight: bold;")
|
57
|
+
|
58
|
+
button_style = f"""
|
59
|
+
QPushButton {{
|
60
|
+
background-color: {bg_color};
|
61
|
+
color: {text_color};
|
62
|
+
border: none;
|
63
|
+
font-family: Arial;
|
64
|
+
font-size: 14px;
|
65
|
+
padding: 0px;
|
66
|
+
text-align: center;
|
67
|
+
}}
|
68
|
+
QPushButton:hover {{
|
69
|
+
background-color: {bg_qcolor.lighter(120).name()};
|
70
|
+
}}
|
71
|
+
QPushButton:pressed {{
|
72
|
+
background-color: {bg_qcolor.darker(110).name()};
|
73
|
+
}}
|
74
|
+
"""
|
75
|
+
for button in (self.minimize_button, self.maximize_button, self.close_button):
|
76
|
+
button.setStyleSheet(button_style)
|
77
|
+
|
78
|
+
self.close_button.setStyleSheet(
|
79
|
+
button_style
|
80
|
+
+ f"""
|
81
|
+
QPushButton:hover {{
|
82
|
+
background-color: #e81123;
|
83
|
+
color: white;
|
84
|
+
}}
|
85
|
+
"""
|
86
|
+
)
|
87
|
+
|
88
|
+
def mousePressEvent(self, event):
|
89
|
+
if event.button() == Qt.LeftButton:
|
90
|
+
self.window().moving = True
|
91
|
+
self.window().offset = event.pos()
|
92
|
+
|
93
|
+
def mouseMoveEvent(self, event):
|
94
|
+
if self.window().moving:
|
95
|
+
self.window().move(event.globalPos() - self.window().offset)
|
96
|
+
|
97
|
+
def mouseReleaseEvent(self, event):
|
98
|
+
if event.button() == Qt.LeftButton:
|
99
|
+
self.window().moving = False
|
100
|
+
|
101
|
+
def toggle_maximize(self):
|
102
|
+
if self.window().isMaximized():
|
103
|
+
self.window().showNormal()
|
104
|
+
self.maximize_button.setText("❐")
|
105
|
+
else:
|
106
|
+
self.window().showMaximized()
|
107
|
+
self.maximize_button.setText("❐")
|
108
|
+
|
109
|
+
def set_icon(self, icon_path):
|
110
|
+
pixmap = QPixmap(icon_path)
|
111
|
+
self.icon_label.setPixmap(
|
112
|
+
pixmap.scaled(20, 20, Qt.KeepAspectRatio, Qt.SmoothTransformation)
|
113
|
+
)
|
114
|
+
|
115
|
+
def set_title(self, title):
|
116
|
+
self.title.setText(title)
|
pyloid/pyloid.py
CHANGED
@@ -15,10 +15,8 @@ from PySide6.QtGui import (
|
|
15
15
|
QClipboard,
|
16
16
|
QImage,
|
17
17
|
QAction,
|
18
|
-
QPalette,
|
19
|
-
QColor,
|
20
18
|
)
|
21
|
-
from PySide6.QtCore import Qt, Signal, QPoint, QUrl, QObject, QTimer, QSize
|
19
|
+
from PySide6.QtCore import Qt, Signal, QPoint, QUrl, QObject, QTimer, QSize, QEvent
|
22
20
|
from PySide6.QtNetwork import QLocalServer, QLocalSocket
|
23
21
|
from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineSettings
|
24
22
|
from .api import PyloidAPI, Bridge
|
@@ -32,9 +30,11 @@ import json
|
|
32
30
|
from .autostart import AutoStart
|
33
31
|
from .filewatcher import FileWatcher
|
34
32
|
import logging
|
35
|
-
from PySide6.
|
36
|
-
|
37
|
-
|
33
|
+
from PySide6.QtWidgets import (
|
34
|
+
QWidget,
|
35
|
+
QVBoxLayout,
|
36
|
+
)
|
37
|
+
from .custom.titlebar import CustomTitleBar
|
38
38
|
|
39
39
|
# for linux debug
|
40
40
|
os.environ["QTWEBENGINE_DICTIONARIES_PATH"] = "/"
|
@@ -189,39 +189,48 @@ class WindowAPI(PyloidAPI):
|
|
189
189
|
"""Returns whether the window has a frame."""
|
190
190
|
window = self.app.get_window_by_id(self.window_id)
|
191
191
|
return window.frame if window else False
|
192
|
-
|
192
|
+
|
193
193
|
@Bridge(result=bool)
|
194
194
|
def getContextMenu(self):
|
195
195
|
"""Returns whether the window has a context menu."""
|
196
196
|
window = self.app.get_window_by_id(self.window_id)
|
197
197
|
return window.context_menu if window else False
|
198
|
-
|
198
|
+
|
199
199
|
@Bridge(result=bool)
|
200
200
|
def getDevTools(self):
|
201
201
|
"""Returns whether the window has developer tools."""
|
202
202
|
window = self.app.get_window_by_id(self.window_id)
|
203
203
|
return window.dev_tools if window else False
|
204
|
-
|
204
|
+
|
205
205
|
@Bridge(result=str)
|
206
206
|
def getTitle(self):
|
207
207
|
"""Returns the title of the window."""
|
208
208
|
window = self.app.get_window_by_id(self.window_id)
|
209
209
|
return window.title if window else ""
|
210
|
-
|
210
|
+
|
211
211
|
@Bridge(result=dict)
|
212
212
|
def getSize(self):
|
213
213
|
"""Returns the size of the window."""
|
214
214
|
window = self.app.get_window_by_id(self.window_id)
|
215
|
-
return
|
216
|
-
|
215
|
+
return (
|
216
|
+
{"width": window.width, "height": window.height}
|
217
|
+
if window
|
218
|
+
else {"width": 0, "height": 0}
|
219
|
+
)
|
220
|
+
|
217
221
|
@Bridge(result=dict)
|
218
222
|
def getPosition(self):
|
219
223
|
"""Returns the position of the window."""
|
220
224
|
window = self.app.get_window_by_id(self.window_id)
|
221
225
|
return {"x": window.x, "y": window.y} if window else {"x": 0, "y": 0}
|
222
|
-
|
223
|
-
|
224
|
-
|
226
|
+
|
227
|
+
@Bridge()
|
228
|
+
def startSystemDrag(self):
|
229
|
+
"""Starts the system drag."""
|
230
|
+
window = self.app.get_window_by_id(self.window_id)
|
231
|
+
if window:
|
232
|
+
window.web_view.start_system_drag()
|
233
|
+
|
225
234
|
|
226
235
|
# class EventAPI(PylonAPI):
|
227
236
|
# def __init__(self, window_id: str, app):
|
@@ -245,105 +254,43 @@ class WindowAPI(PyloidAPI):
|
|
245
254
|
# callback(*args, **kwargs)
|
246
255
|
|
247
256
|
|
248
|
-
|
257
|
+
# 어차피 load 부분에만 쓰이니까 나중에 분리해서 load 위에서 선언하자.
|
258
|
+
class CustomWebEngineView(QWebEngineView):
|
249
259
|
def __init__(self, parent=None):
|
250
|
-
super().__init__(parent)
|
251
|
-
self.
|
252
|
-
self.
|
253
|
-
self.
|
254
|
-
|
255
|
-
|
256
|
-
self.icon_label.setFixedSize(20, 20)
|
257
|
-
self.title = QLabel("Custom Title")
|
258
|
-
|
259
|
-
self.minimize_button = QPushButton("-")
|
260
|
-
self.maximize_button = QPushButton("❐")
|
261
|
-
self.close_button = QPushButton("×")
|
262
|
-
|
263
|
-
for button in (self.minimize_button, self.maximize_button, self.close_button):
|
264
|
-
button.setFixedSize(45, 30)
|
265
|
-
button.setFlat(True)
|
266
|
-
|
267
|
-
self.layout.addWidget(self.icon_label)
|
268
|
-
self.layout.addSpacing(5)
|
269
|
-
self.layout.addWidget(self.title)
|
270
|
-
self.layout.addStretch(1)
|
271
|
-
self.layout.addWidget(self.minimize_button)
|
272
|
-
self.layout.addWidget(self.maximize_button)
|
273
|
-
self.layout.addWidget(self.close_button)
|
274
|
-
|
275
|
-
self.minimize_button.clicked.connect(self.window().showMinimized)
|
276
|
-
self.maximize_button.clicked.connect(self.toggle_maximize)
|
277
|
-
self.close_button.clicked.connect(self.window().close)
|
278
|
-
|
279
|
-
self.setFixedHeight(30)
|
280
|
-
self.set_style("darkblue", "white")
|
281
|
-
|
282
|
-
def set_style(self, bg_color, text_color):
|
283
|
-
self.setAutoFillBackground(True)
|
284
|
-
palette = self.palette()
|
285
|
-
bg_qcolor = QColor(bg_color)
|
286
|
-
text_qcolor = QColor(text_color)
|
287
|
-
palette.setColor(QPalette.Window, bg_qcolor)
|
288
|
-
palette.setColor(QPalette.WindowText, text_qcolor)
|
289
|
-
self.setPalette(palette)
|
290
|
-
|
291
|
-
self.title.setStyleSheet(f"color: {text_color}; font-weight: bold;")
|
292
|
-
|
293
|
-
button_style = f"""
|
294
|
-
QPushButton {{
|
295
|
-
background-color: {bg_color};
|
296
|
-
color: {text_color};
|
297
|
-
border: none;
|
298
|
-
font-family: Arial;
|
299
|
-
font-size: 14px;
|
300
|
-
padding: 0px;
|
301
|
-
text-align: center;
|
302
|
-
}}
|
303
|
-
QPushButton:hover {{
|
304
|
-
background-color: {bg_qcolor.lighter(120).name()};
|
305
|
-
}}
|
306
|
-
QPushButton:pressed {{
|
307
|
-
background-color: {bg_qcolor.darker(110).name()};
|
308
|
-
}}
|
309
|
-
"""
|
310
|
-
for button in (self.minimize_button, self.maximize_button, self.close_button):
|
311
|
-
button.setStyleSheet(button_style)
|
312
|
-
|
313
|
-
self.close_button.setStyleSheet(button_style + f"""
|
314
|
-
QPushButton:hover {{
|
315
|
-
background-color: #e81123;
|
316
|
-
color: white;
|
317
|
-
}}
|
318
|
-
""")
|
319
|
-
|
320
|
-
def mousePressEvent(self, event):
|
260
|
+
super().__init__(parent._window)
|
261
|
+
self.parent = parent
|
262
|
+
self.drag_relative_position = None
|
263
|
+
self.is_dragging = False
|
264
|
+
|
265
|
+
def mouse_press_event(self, event):
|
321
266
|
if event.button() == Qt.LeftButton:
|
322
|
-
self.
|
323
|
-
self.window().offset = event.pos()
|
267
|
+
self.drag_relative_position = event.pos()
|
324
268
|
|
325
|
-
def
|
326
|
-
|
327
|
-
self.window().move(event.globalPos() - self.window().offset)
|
269
|
+
def start_system_drag(self):
|
270
|
+
self.is_dragging = True
|
328
271
|
|
329
|
-
def
|
330
|
-
if
|
331
|
-
|
272
|
+
def mouse_move_event(self, event):
|
273
|
+
if not self.parent.frame and self.is_dragging:
|
274
|
+
# 현재 마우스 위치를 전역 좌표로 가져옵니다
|
275
|
+
current_global_pos = event.globalPos()
|
276
|
+
# 새로운 창 위치를 계산합니다
|
277
|
+
new_window_pos = current_global_pos - self.drag_relative_position
|
278
|
+
# 창을 새 위치로 이동합니다
|
279
|
+
self.parent._window.move(new_window_pos)
|
332
280
|
|
333
|
-
def
|
334
|
-
if
|
335
|
-
self.
|
336
|
-
self.maximize_button.setText("❐")
|
337
|
-
else:
|
338
|
-
self.window().showMaximized()
|
339
|
-
self.maximize_button.setText("❐")
|
281
|
+
def mouse_release_event(self, event):
|
282
|
+
if event.button() == Qt.LeftButton:
|
283
|
+
self.is_dragging = False
|
340
284
|
|
341
|
-
def
|
342
|
-
|
343
|
-
|
285
|
+
def eventFilter(self, source, event):
|
286
|
+
if self.focusProxy() is source and event.type() == QEvent.MouseButtonPress:
|
287
|
+
self.mouse_press_event(event)
|
288
|
+
if self.focusProxy() is source and event.type() == QEvent.MouseMove:
|
289
|
+
self.mouse_move_event(event)
|
290
|
+
elif self.focusProxy() is source and event.type() == QEvent.MouseButtonRelease:
|
291
|
+
self.mouse_release_event(event)
|
292
|
+
return super().eventFilter(source, event)
|
344
293
|
|
345
|
-
def set_title(self, title):
|
346
|
-
self.title.setText(title)
|
347
294
|
|
348
295
|
class BrowserWindow:
|
349
296
|
def __init__(
|
@@ -361,9 +308,8 @@ class BrowserWindow:
|
|
361
308
|
):
|
362
309
|
###########################################################################################
|
363
310
|
self.id = str(uuid.uuid4()) # Generate unique ID
|
364
|
-
|
365
311
|
self._window = QMainWindow()
|
366
|
-
self.web_view =
|
312
|
+
self.web_view = CustomWebEngineView(self)
|
367
313
|
|
368
314
|
self._window.closeEvent = self.closeEvent # Override closeEvent method
|
369
315
|
###########################################################################################
|
@@ -382,28 +328,35 @@ class BrowserWindow:
|
|
382
328
|
self.shortcuts = {}
|
383
329
|
###########################################################################################
|
384
330
|
|
385
|
-
def
|
386
|
-
|
331
|
+
def _set_custom_frame(
|
332
|
+
self,
|
333
|
+
use_custom: bool,
|
334
|
+
title: str = "Custom Title",
|
335
|
+
bg_color: str = "darkblue",
|
336
|
+
text_color: str = "white",
|
337
|
+
icon_path: str = None,
|
338
|
+
):
|
339
|
+
"""Sets or removes the custom frame."""
|
387
340
|
if use_custom:
|
388
341
|
self._window.setWindowFlags(Qt.FramelessWindowHint)
|
389
342
|
self.custom_title_bar = CustomTitleBar(self._window)
|
390
343
|
self.custom_title_bar.set_style(bg_color, text_color)
|
391
344
|
self.custom_title_bar.set_title(title)
|
392
|
-
|
345
|
+
|
393
346
|
if icon_path:
|
394
347
|
self.custom_title_bar.set_icon(icon_path)
|
395
|
-
|
348
|
+
|
396
349
|
layout = QVBoxLayout()
|
397
350
|
layout.setContentsMargins(0, 0, 0, 0)
|
398
351
|
layout.setSpacing(0)
|
399
352
|
layout.addWidget(self.custom_title_bar)
|
400
353
|
layout.addWidget(self.web_view)
|
401
|
-
|
354
|
+
|
402
355
|
central_widget = QWidget()
|
403
356
|
central_widget.setLayout(layout)
|
404
357
|
self._window.setCentralWidget(central_widget)
|
405
358
|
|
406
|
-
#
|
359
|
+
# Add properties for window movement
|
407
360
|
self._window.moving = False
|
408
361
|
self._window.offset = QPoint()
|
409
362
|
else:
|
@@ -414,9 +367,10 @@ class BrowserWindow:
|
|
414
367
|
self._window.show()
|
415
368
|
|
416
369
|
def _load(self):
|
417
|
-
self.
|
370
|
+
self.set_title(self.title)
|
418
371
|
|
419
|
-
self.
|
372
|
+
self.set_size(self.width, self.height)
|
373
|
+
self.set_position(self.x, self.y)
|
420
374
|
|
421
375
|
# allow local file access to remote urls
|
422
376
|
self.web_view.settings().setAttribute(
|
@@ -490,6 +444,12 @@ class BrowserWindow:
|
|
490
444
|
console.log('pyloid.EventAPI object initialized:', window.pyloid.EventAPI);
|
491
445
|
|
492
446
|
%s
|
447
|
+
|
448
|
+
document.addEventListener('mousedown', function (e) {
|
449
|
+
if (e.target.hasAttribute('data-pyloid-drag-region')) {
|
450
|
+
window.pyloid.WindowAPI.startSystemDrag();
|
451
|
+
}
|
452
|
+
});
|
493
453
|
|
494
454
|
// Dispatch a custom event to signal that the initialization is ready
|
495
455
|
const event = new CustomEvent('pyloidReady');
|
@@ -518,11 +478,13 @@ class BrowserWindow:
|
|
518
478
|
self._load()
|
519
479
|
file_path = os.path.abspath(file_path) # absolute path
|
520
480
|
self.web_view.setUrl(QUrl.fromLocalFile(file_path))
|
481
|
+
self.web_view.focusProxy().installEventFilter(self.web_view)
|
521
482
|
|
522
483
|
def load_url(self, url):
|
523
484
|
"""Sets the URL of the window."""
|
524
485
|
self._load()
|
525
486
|
self.web_view.setUrl(QUrl(url))
|
487
|
+
self.web_view.focusProxy().installEventFilter(self.web_view)
|
526
488
|
|
527
489
|
###########################################################################################
|
528
490
|
# Set Parameters
|
@@ -735,6 +697,7 @@ class BrowserWindow:
|
|
735
697
|
}})();
|
736
698
|
"""
|
737
699
|
self.web_view.page().runJavaScript(script)
|
700
|
+
|
738
701
|
###########################################################################################
|
739
702
|
# Get Properties
|
740
703
|
###########################################################################################
|
@@ -755,7 +718,7 @@ class BrowserWindow:
|
|
755
718
|
def get_id(self):
|
756
719
|
"""Returns the ID of the window."""
|
757
720
|
return self.id
|
758
|
-
|
721
|
+
|
759
722
|
def get_size(self) -> Dict[str, int]:
|
760
723
|
"""Returns the size of the window."""
|
761
724
|
return {"width": self.width, "height": self.height}
|
@@ -763,7 +726,7 @@ class BrowserWindow:
|
|
763
726
|
def get_position(self) -> Dict[str, int]:
|
764
727
|
"""Returns the position of the window."""
|
765
728
|
return {"x": self.x, "y": self.y}
|
766
|
-
|
729
|
+
|
767
730
|
def get_title(self) -> str:
|
768
731
|
"""Returns the title of the window."""
|
769
732
|
return self.title
|
@@ -771,7 +734,7 @@ class BrowserWindow:
|
|
771
734
|
def get_url(self) -> str:
|
772
735
|
"""Returns the URL of the window."""
|
773
736
|
return self.web_view.url().toString()
|
774
|
-
|
737
|
+
|
775
738
|
def get_visible(self) -> bool:
|
776
739
|
"""Returns the visibility of the window."""
|
777
740
|
return self._window.isVisible()
|
@@ -780,11 +743,15 @@ class BrowserWindow:
|
|
780
743
|
"""창의 크기 조절 가능 여부를 설정합니다."""
|
781
744
|
self.resizable = resizable
|
782
745
|
if resizable:
|
783
|
-
self._window.setWindowFlags(
|
746
|
+
self._window.setWindowFlags(
|
747
|
+
self._window.windowFlags() & ~Qt.MSWindowsFixedSizeDialogHint
|
748
|
+
)
|
784
749
|
else:
|
785
|
-
self._window.setWindowFlags(
|
750
|
+
self._window.setWindowFlags(
|
751
|
+
self._window.windowFlags() | Qt.MSWindowsFixedSizeDialogHint
|
752
|
+
)
|
786
753
|
self._window.show() # 변경사항을 적용하기 위해 창을 다시 표시합니다.
|
787
|
-
|
754
|
+
|
788
755
|
|
789
756
|
class _WindowController(QObject):
|
790
757
|
create_window_signal = Signal(
|
@@ -822,7 +789,7 @@ class Pyloid(QApplication):
|
|
822
789
|
|
823
790
|
self.app_name = app_name
|
824
791
|
self.app_path = sys.executable
|
825
|
-
|
792
|
+
|
826
793
|
self.auto_start = AutoStart(self.app_name, self.app_path)
|
827
794
|
|
828
795
|
self.animation_timer = None
|
@@ -198,4 +198,4 @@ Apache License
|
|
198
198
|
distributed under the License is distributed on an "AS IS" BASIS,
|
199
199
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200
200
|
See the License for the specific language governing permissions and
|
201
|
-
limitations under the License.
|
201
|
+
limitations under the License.
|
@@ -1,13 +1,14 @@
|
|
1
1
|
pyloid/__init__.py,sha256=OOPhOKNQVmAM8hnfTeE7lHzxb8LsFNcgegBAvDrA-vY,293
|
2
2
|
pyloid/api.py,sha256=whgfvPr1A6iwZ1Ewo-0FnOUNnt1K58c-P7YjzuQHcUM,194
|
3
3
|
pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
|
4
|
+
pyloid/custom/titlebar.py,sha256=itzK9pJbZMQ7BKca9kdbuHMffurrw15UijR6OU03Xsk,3894
|
4
5
|
pyloid/filewatcher.py,sha256=n8N56D65le5TpsgxXb7z-FO_0lqv4UYD4yGq_UuMrAs,1285
|
5
6
|
pyloid/monitor.py,sha256=fqDnZ_7dpxVZLVJ5gCluDRY2USrQ5YL_fw1AnYivhsk,12741
|
6
|
-
pyloid/pyloid.py,sha256=
|
7
|
+
pyloid/pyloid.py,sha256=MGfBrB6uIrFpKWkoznu52i7sd4WDRTSorqak3zzzsus,48199
|
7
8
|
pyloid/timer.py,sha256=1bYhqte3rV77vaeMUkcTgmx2ux7FtCqLCx9lIC2-COg,4360
|
8
9
|
pyloid/tray.py,sha256=rXgdkvzGxtie_EIcTSA7fjuta4nJk5THhNkGFcfv5Ew,634
|
9
10
|
pyloid/utils.py,sha256=DQerZWU_0o8dHcJ5y3yXf9i5OXn7KQZqU-hVBq3uPUA,711
|
10
|
-
pyloid-0.
|
11
|
-
pyloid-0.
|
12
|
-
pyloid-0.
|
13
|
-
pyloid-0.
|
11
|
+
pyloid-0.12.0.dist-info/LICENSE,sha256=MTYF-6xpRekyTUglRweWtbfbwBL1I_3Bgfbm_SNOuI8,11525
|
12
|
+
pyloid-0.12.0.dist-info/METADATA,sha256=3nNffa8kFieZFpiJjE5nXHq9XA27JtvpSbBAWKBRndE,6069
|
13
|
+
pyloid-0.12.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
14
|
+
pyloid-0.12.0.dist-info/RECORD,,
|
File without changes
|