rbeesoft 2.0.0__py3-none-any.whl → 2.0.1__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.
File without changes
@@ -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})')
rbeesoft/app/main.py CHANGED
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rbeesoft
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary:
5
5
  Author: Brecheisen
6
6
  Author-email: r.brecheisen@maastrichtuniversity.nl
@@ -1,7 +1,11 @@
1
1
  rbeesoft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  rbeesoft/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  rbeesoft/app/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- rbeesoft/app/main.py,sha256=QX9UadHzBYmKzv0--ZhFW6BixMp4qzsfZsKMqqB53iY,2014
4
+ rbeesoft/app/core/processes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ rbeesoft/app/core/processes/dummyprocess.py,sha256=mnFrgDWDfG_acfdaKDbtXZgadnY6UmHf1PVoN04Rrl0,472
6
+ rbeesoft/app/core/processes/process.py,sha256=qMrXKvT06oRe1yRSe3DLO9ObhV2qzzZLI5R-PwryOYs,1694
7
+ rbeesoft/app/core/processes/processrunner.py,sha256=HqDQ3ZMlqCqQkyuEgV5sJCkzD35ENvp58z9D-TtnVdA,1170
8
+ rbeesoft/app/main.py,sha256=mZmeDzFurIIRAHRPI5ktPgmTHOcJPS1oyYULwTxlhho,2882
5
9
  rbeesoft/app/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
10
  rbeesoft/app/ui/rbeesoftmainwindow.py,sha256=o40iwX8KO7QuZNHB12m8yMFtw6D21T02g3qNO09_3R4,3023
7
11
  rbeesoft/app/ui/settings.py,sha256=9BV-nvq87xjp5JSyd0hvpj0E5duckFuWk0Mj3Fx0lnE,2062
@@ -16,6 +20,6 @@ rbeesoft/common/logmanager.py,sha256=K_qCbPjrzoV5le3KSvLOSSXYa-_MWLJ3FdFNTEGYSxg
16
20
  rbeesoft/common/logmanagerlistener.py,sha256=Gaig07yjBnyQq9I8sN85olTEeDCDyCFQnEJdwzvmgvc,99
17
21
  rbeesoft/common/singleton.py,sha256=FV0k_LlOCmFhlWN6gf1c2x7YXWyd8-7DsIMvOKrI6NY,224
18
22
  rbeesoft/webapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- rbeesoft-2.0.0.dist-info/METADATA,sha256=7fJP3T2ye7SlKHcoMdRHeIIQnyL1KZ-T7OABvK3zI_Q,378
20
- rbeesoft-2.0.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
21
- rbeesoft-2.0.0.dist-info/RECORD,,
23
+ rbeesoft-2.0.1.dist-info/METADATA,sha256=nx2mWDX7KhY-khtjGdPtGdyzp1I9_V6yZjhRZ4N-tTQ,378
24
+ rbeesoft-2.0.1.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
25
+ rbeesoft-2.0.1.dist-info/RECORD,,