rbeesoft 2.0.0__tar.gz → 2.0.1__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.
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/PKG-INFO +1 -1
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/pyproject.toml +1 -1
- rbeesoft-2.0.1/src/rbeesoft/app/core/processes/dummyprocess.py +18 -0
- rbeesoft-2.0.1/src/rbeesoft/app/core/processes/process.py +64 -0
- rbeesoft-2.0.1/src/rbeesoft/app/core/processes/processrunner.py +34 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/main.py +26 -0
- rbeesoft-2.0.1/src/rbeesoft/webapp/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/README.md +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/core/__init__.py +0 -0
- {rbeesoft-2.0.0/src/rbeesoft/app/ui → rbeesoft-2.0.1/src/rbeesoft/app/core/processes}/__init__.py +0 -0
- {rbeesoft-2.0.0/src/rbeesoft/app/ui/widgets → rbeesoft-2.0.1/src/rbeesoft/app/ui}/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/rbeesoftmainwindow.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/settings.py +0 -0
- {rbeesoft-2.0.0/src/rbeesoft/app/ui/widgets/pages → rbeesoft-2.0.1/src/rbeesoft/app/ui/widgets}/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/widgets/centraldockwidget.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/widgets/logdockwidget.py +0 -0
- {rbeesoft-2.0.0/src/rbeesoft/common → rbeesoft-2.0.1/src/rbeesoft/app/ui/widgets/pages}/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/widgets/pages/page.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/app/ui/widgets/pages/pagerouter.py +0 -0
- {rbeesoft-2.0.0/src/rbeesoft/webapp → rbeesoft-2.0.1/src/rbeesoft/common}/__init__.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/common/logmanager.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/common/logmanagerlistener.py +0 -0
- {rbeesoft-2.0.0 → rbeesoft-2.0.1}/src/rbeesoft/common/singleton.py +0 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from rbeesoft.app.core.processes.process import Process
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class DummyProcess(Process):
|
|
6
|
+
def __init__(self):
|
|
7
|
+
super(DummyProcess, self).__init__()
|
|
8
|
+
self._n = 10
|
|
9
|
+
|
|
10
|
+
def execute(self):
|
|
11
|
+
out = []
|
|
12
|
+
for i in range(self._n):
|
|
13
|
+
if self.is_canceled():
|
|
14
|
+
return out
|
|
15
|
+
time.sleep(0.25)
|
|
16
|
+
out.append(i)
|
|
17
|
+
self.progress.emit(int((i+1)/self._n*100))
|
|
18
|
+
return out
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from PySide6.QtCore import (
|
|
2
|
+
QObject,
|
|
3
|
+
QThread,
|
|
4
|
+
Signal,
|
|
5
|
+
Slot,
|
|
6
|
+
QCoreApplication,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Process(QObject):
|
|
11
|
+
progress = Signal(int)
|
|
12
|
+
finished = Signal(object)
|
|
13
|
+
failed = Signal(Exception)
|
|
14
|
+
started = Signal()
|
|
15
|
+
canceled = Signal()
|
|
16
|
+
|
|
17
|
+
def __init__(self, parent=None):
|
|
18
|
+
super().__init__(parent)
|
|
19
|
+
self._cancel = False
|
|
20
|
+
self._thread = None
|
|
21
|
+
self._main_thread = None
|
|
22
|
+
|
|
23
|
+
def name(self):
|
|
24
|
+
return self._name
|
|
25
|
+
|
|
26
|
+
def cancel(self):
|
|
27
|
+
self._cancel = True
|
|
28
|
+
|
|
29
|
+
def is_canceled(self) -> bool:
|
|
30
|
+
return self._cancel
|
|
31
|
+
|
|
32
|
+
def execute(self):
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
|
|
35
|
+
def start(self):
|
|
36
|
+
if self._thread is not None:
|
|
37
|
+
raise RuntimeError("Process already started")
|
|
38
|
+
self._main_thread = QCoreApplication.instance().thread()
|
|
39
|
+
self._thread = QThread()
|
|
40
|
+
self.moveToThread(self._thread)
|
|
41
|
+
self._thread.started.connect(self._run_internal)
|
|
42
|
+
self.finished.connect(self._thread.quit)
|
|
43
|
+
self.failed.connect(self._thread.quit)
|
|
44
|
+
self._thread.finished.connect(self._cleanup)
|
|
45
|
+
self._thread.start()
|
|
46
|
+
|
|
47
|
+
@Slot()
|
|
48
|
+
def _run_internal(self):
|
|
49
|
+
self.started.emit()
|
|
50
|
+
try:
|
|
51
|
+
if self._cancel:
|
|
52
|
+
self.canceled.emit()
|
|
53
|
+
self.finished.emit(None)
|
|
54
|
+
return
|
|
55
|
+
result = self.execute()
|
|
56
|
+
self.finished.emit(result)
|
|
57
|
+
except Exception as e:
|
|
58
|
+
self.failed.emit(e)
|
|
59
|
+
|
|
60
|
+
@Slot()
|
|
61
|
+
def _cleanup(self):
|
|
62
|
+
self.moveToThread(self._main_thread)
|
|
63
|
+
self._thread.deleteLater()
|
|
64
|
+
self._thread = None
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from rbeesoft.common.singleton import singleton
|
|
2
|
+
from rbeesoft.common.logmanager import LogManager
|
|
3
|
+
|
|
4
|
+
LOG = LogManager()
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@singleton
|
|
8
|
+
class ProcessRunner:
|
|
9
|
+
current_process = {}
|
|
10
|
+
|
|
11
|
+
def start(self, process, callback_progress=None, callback_finished=None, callback_failed=None):
|
|
12
|
+
if callback_progress:
|
|
13
|
+
process.progress.connect(callback_progress)
|
|
14
|
+
else:
|
|
15
|
+
process.progress.connect(self.handle_process_progress)
|
|
16
|
+
if callback_finished:
|
|
17
|
+
process.finished.connect(callback_finished)
|
|
18
|
+
else:
|
|
19
|
+
process.finished.connect(self.handle_process_finished)
|
|
20
|
+
if callback_failed:
|
|
21
|
+
process.failed.connect(callback_failed)
|
|
22
|
+
else:
|
|
23
|
+
process.failed.connect(self.handle_process_failed)
|
|
24
|
+
self.current_process = process
|
|
25
|
+
self.current_process.start()
|
|
26
|
+
|
|
27
|
+
def handle_process_progress(self, progress):
|
|
28
|
+
LOG.info(f'Progress: {progress}')
|
|
29
|
+
|
|
30
|
+
def handle_process_finished(self, result):
|
|
31
|
+
LOG.info(f'Process finished successfully: {result}')
|
|
32
|
+
|
|
33
|
+
def handle_process_failed(self, error):
|
|
34
|
+
LOG.error(f'Process failed ({error})')
|
|
@@ -2,6 +2,8 @@ import sys
|
|
|
2
2
|
from PySide6 import QtWidgets, QtCore
|
|
3
3
|
from rbeesoft.app.ui.rbeesoftmainwindow import RbeesoftMainWindow
|
|
4
4
|
from rbeesoft.app.ui.widgets.pages.page import Page
|
|
5
|
+
from rbeesoft.app.core.processes.process import Process
|
|
6
|
+
from rbeesoft.app.core.processes.processrunner import ProcessRunner
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
class MainWindow(RbeesoftMainWindow):
|
|
@@ -23,15 +25,22 @@ class HomePage(Page):
|
|
|
23
25
|
super(HomePage, self).__init__('home', 'HomePage', settings)
|
|
24
26
|
button = QtWidgets.QPushButton('Go to next page')
|
|
25
27
|
button.clicked.connect(self.handle_button)
|
|
28
|
+
process_button = QtWidgets.QPushButton('Run process')
|
|
29
|
+
process_button.clicked.connect(self.handle_process_button)
|
|
30
|
+
self._process_runner = ProcessRunner()
|
|
26
31
|
layout = QtWidgets.QVBoxLayout()
|
|
27
32
|
layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
|
|
28
33
|
layout.addWidget(QtWidgets.QLabel(self.title()))
|
|
29
34
|
layout.addWidget(button)
|
|
35
|
+
layout.addWidget(process_button)
|
|
30
36
|
self.setLayout(layout)
|
|
31
37
|
|
|
32
38
|
def handle_button(self):
|
|
33
39
|
self.switch_to_page('next')
|
|
34
40
|
|
|
41
|
+
def handle_process_button(self):
|
|
42
|
+
self._process_runner.start(ExampleProcess())
|
|
43
|
+
|
|
35
44
|
|
|
36
45
|
class NextPage(Page):
|
|
37
46
|
def __init__(self, settings):
|
|
@@ -48,6 +57,23 @@ class NextPage(Page):
|
|
|
48
57
|
self.switch_to_page('home')
|
|
49
58
|
|
|
50
59
|
|
|
60
|
+
class ExampleProcess(Process):
|
|
61
|
+
def __init__(self):
|
|
62
|
+
super(ExampleProcess, self).__init__()
|
|
63
|
+
self._n = 10
|
|
64
|
+
|
|
65
|
+
def execute(self):
|
|
66
|
+
import time
|
|
67
|
+
out = []
|
|
68
|
+
for i in range(self._n):
|
|
69
|
+
if self.is_canceled():
|
|
70
|
+
return out
|
|
71
|
+
time.sleep(0.25)
|
|
72
|
+
out.append(i)
|
|
73
|
+
self.progress.emit(int((i+1)/self._n*100))
|
|
74
|
+
return out
|
|
75
|
+
|
|
76
|
+
|
|
51
77
|
def main():
|
|
52
78
|
QtWidgets.QApplication.setApplicationName('example')
|
|
53
79
|
app = QtWidgets.QApplication(sys.argv)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rbeesoft-2.0.0/src/rbeesoft/app/ui → rbeesoft-2.0.1/src/rbeesoft/app/core/processes}/__init__.py
RENAMED
|
File without changes
|
{rbeesoft-2.0.0/src/rbeesoft/app/ui/widgets → rbeesoft-2.0.1/src/rbeesoft/app/ui}/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rbeesoft-2.0.0/src/rbeesoft/common → rbeesoft-2.0.1/src/rbeesoft/app/ui/widgets/pages}/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|