processview 1.3.2__tar.gz → 1.4.0__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.
- {processview-1.3.2 → processview-1.4.0}/PKG-INFO +1 -1
- {processview-1.3.2 → processview-1.4.0}/processview/core/manager/manager.py +9 -0
- processview-1.4.0/processview/gui/DropDownWidget.py +49 -0
- {processview-1.3.2 → processview-1.4.0}/processview/gui/processmanager.py +21 -34
- {processview-1.3.2 → processview-1.4.0}/processview/gui/test/test_process_manager.py +29 -1
- {processview-1.3.2 → processview-1.4.0}/processview/version.py +2 -2
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/PKG-INFO +1 -1
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/SOURCES.txt +1 -0
- {processview-1.3.2 → processview-1.4.0}/LICENSE +0 -0
- {processview-1.3.2 → processview-1.4.0}/README.md +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/dataset.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/helpers.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/manager/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/manager/test/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/manager/test/test_manager.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/setup.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/sorting.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/superviseprocess.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/core/test/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/gui/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/gui/icons.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/gui/messagebox.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/gui/test/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/resources/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/advancement.png +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/advancement.svg +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.png +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.svg +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/test/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/utils/__init__.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview/utils/singleton.py +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/dependency_links.txt +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/requires.txt +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/top_level.txt +0 -0
- {processview-1.3.2 → processview-1.4.0}/processview.egg-info/zip-safe +0 -0
- {processview-1.3.2 → processview-1.4.0}/setup.cfg +0 -0
- {processview-1.3.2 → processview-1.4.0}/setup.py +0 -0
|
@@ -176,6 +176,15 @@ class ProcessManager:
|
|
|
176
176
|
[res.add(dataset) for dataset in dataset_states]
|
|
177
177
|
return tuple(res)
|
|
178
178
|
|
|
179
|
+
def remove_dataset(self, dataset: Dataset):
|
|
180
|
+
"""
|
|
181
|
+
Remove a dataset from the list of registered dataset
|
|
182
|
+
"""
|
|
183
|
+
dataset_id = self._find_dataset_id(dataset)
|
|
184
|
+
for process_id in self._dataset_process_states:
|
|
185
|
+
if dataset_id in self._dataset_process_states[process_id]:
|
|
186
|
+
self._dataset_process_states[process_id].pop(dataset_id)
|
|
187
|
+
|
|
179
188
|
def notify_dataset_state(self, dataset, process, state, details=None) -> None:
|
|
180
189
|
"""
|
|
181
190
|
Update dataset state
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from silx.gui import qt
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DropDownWidget(qt.QWidget):
|
|
5
|
+
"""Simple 'dropdown' widget"""
|
|
6
|
+
|
|
7
|
+
_BUTTON_ICON = qt.QStyle.SP_ToolBarVerticalExtensionButton # noqa
|
|
8
|
+
|
|
9
|
+
def __init__(self, parent):
|
|
10
|
+
super().__init__(parent)
|
|
11
|
+
|
|
12
|
+
self.setLayout(qt.QVBoxLayout())
|
|
13
|
+
# toggable button
|
|
14
|
+
self._toggleButton = qt.QPushButton("", self)
|
|
15
|
+
self._toggleButton.setCheckable(True)
|
|
16
|
+
self._toggleButton.setSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed)
|
|
17
|
+
self.layout().addWidget(self._toggleButton)
|
|
18
|
+
|
|
19
|
+
self._mainWidget = None
|
|
20
|
+
|
|
21
|
+
# set up interface
|
|
22
|
+
self.layout().setContentsMargins(2, 2, 2, 2)
|
|
23
|
+
self.layout().setSpacing(0)
|
|
24
|
+
|
|
25
|
+
self._setButtonIcon(show=True)
|
|
26
|
+
self._toggleButton.setChecked(True)
|
|
27
|
+
|
|
28
|
+
# connect signal / slot
|
|
29
|
+
self._toggleButton.toggled.connect(self._toggleVisibility)
|
|
30
|
+
|
|
31
|
+
def setWidget(self, widget: qt.QWidget):
|
|
32
|
+
if self._mainWidget is not None:
|
|
33
|
+
self.layout().removeWidget(self._mainWidget)
|
|
34
|
+
|
|
35
|
+
self._mainWidget = widget
|
|
36
|
+
self.layout().addWidget(self._mainWidget)
|
|
37
|
+
|
|
38
|
+
def _setButtonIcon(self, show):
|
|
39
|
+
style = qt.QApplication.instance().style()
|
|
40
|
+
# return a QIcon
|
|
41
|
+
icon = style.standardIcon(self._BUTTON_ICON)
|
|
42
|
+
if show is True:
|
|
43
|
+
pixmap = icon.pixmap(32, 32).transformed(qt.QTransform().scale(1, -1))
|
|
44
|
+
icon = qt.QIcon(pixmap)
|
|
45
|
+
self._toggleButton.setIcon(icon)
|
|
46
|
+
|
|
47
|
+
def _toggleVisibility(self, visible):
|
|
48
|
+
self._setButtonIcon(show=visible)
|
|
49
|
+
self._mainWidget.setVisible(visible)
|
|
@@ -41,6 +41,7 @@ from processview.core.manager import DatasetState
|
|
|
41
41
|
from processview.core.manager import ProcessManager as _ProcessManager
|
|
42
42
|
from processview.core.sorting import SortType, tooltips
|
|
43
43
|
from processview.core.superviseprocess import SuperviseProcess
|
|
44
|
+
from processview.gui.DropDownWidget import DropDownWidget
|
|
44
45
|
from processview.gui import icons as icons
|
|
45
46
|
from processview.gui.messagebox import MessageBox
|
|
46
47
|
from processview.utils import docstring
|
|
@@ -171,6 +172,7 @@ class ObservationTable(qt.QTableView):
|
|
|
171
172
|
)
|
|
172
173
|
|
|
173
174
|
datasets = [get_dataset_at(index.row()) for index in self.selectedIndexes()]
|
|
175
|
+
[ProcessManager().remove_dataset(dataset) for dataset in datasets]
|
|
174
176
|
self.model().remove_datasets(datasets)
|
|
175
177
|
|
|
176
178
|
def _requestInfo(self, *args, **kwargs):
|
|
@@ -198,7 +200,7 @@ class ObservationTable(qt.QTableView):
|
|
|
198
200
|
|
|
199
201
|
class ProcessManagerWidget(qt.QWidget):
|
|
200
202
|
"""
|
|
201
|
-
Main widget to
|
|
203
|
+
Main widget to display dataset vs process metadata
|
|
202
204
|
"""
|
|
203
205
|
|
|
204
206
|
def __init__(self, parent):
|
|
@@ -207,14 +209,17 @@ class ProcessManagerWidget(qt.QWidget):
|
|
|
207
209
|
|
|
208
210
|
self._manager = ProcessManager()
|
|
209
211
|
|
|
210
|
-
self._optionsWidget =
|
|
211
|
-
self.
|
|
212
|
+
self._optionsWidget = OptionsWidget(parent=self)
|
|
213
|
+
self._dropDownOptionsWidget = DropDownWidget(parent=self)
|
|
214
|
+
self._dropDownOptionsWidget.setWidget(self._optionsWidget)
|
|
215
|
+
|
|
216
|
+
self._dropDownOptionsWidget.setSizePolicy(
|
|
212
217
|
qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum
|
|
213
218
|
)
|
|
214
219
|
self.setContentsMargins(0, 0, 0, 0)
|
|
215
220
|
self.layout().setContentsMargins(0, 0, 0, 0)
|
|
216
221
|
self.layout().setSpacing(2)
|
|
217
|
-
self.layout().addWidget(self.
|
|
222
|
+
self.layout().addWidget(self._dropDownOptionsWidget)
|
|
218
223
|
|
|
219
224
|
self.observationTable = ObservationTable(self)
|
|
220
225
|
|
|
@@ -251,11 +256,11 @@ class ProcessManagerWidget(qt.QWidget):
|
|
|
251
256
|
|
|
252
257
|
def _filterUpdated(self):
|
|
253
258
|
self.observationTable.model().process_patterns = (
|
|
254
|
-
self.
|
|
259
|
+
self._dropDownOptionsWidget.getProcessPatterns()
|
|
255
260
|
)
|
|
256
261
|
self._updateProcesses()
|
|
257
262
|
self.observationTable.model().dataset_patterns = (
|
|
258
|
-
self.
|
|
263
|
+
self._dropDownOptionsWidget.getDatasetPatterns()
|
|
259
264
|
)
|
|
260
265
|
self._updateDatasetStates()
|
|
261
266
|
|
|
@@ -381,6 +386,7 @@ class _DatasetProcessModel(qt.QAbstractTableModel):
|
|
|
381
386
|
# sort datasets
|
|
382
387
|
datasets = self.sort_datasets(datasets=datasets, sort_type=self._sort_type)
|
|
383
388
|
|
|
389
|
+
self._sorted_datasets.clear()
|
|
384
390
|
for i_dataset, dataset in enumerate(datasets):
|
|
385
391
|
self._sorted_datasets[i_dataset] = dataset
|
|
386
392
|
self.endResetModel()
|
|
@@ -449,15 +455,11 @@ class _DatasetProcessModel(qt.QAbstractTableModel):
|
|
|
449
455
|
self.layoutChanged.emit()
|
|
450
456
|
|
|
451
457
|
|
|
452
|
-
class
|
|
453
|
-
_BUTTON_ICON = qt.QStyle.SP_ToolBarVerticalExtensionButton # noqa
|
|
458
|
+
class OptionsWidget(qt.QWidget):
|
|
454
459
|
|
|
455
460
|
def __init__(self, parent):
|
|
456
461
|
super().__init__(parent)
|
|
457
462
|
self.setLayout(qt.QGridLayout())
|
|
458
|
-
# toggable button
|
|
459
|
-
self._toggleButton = qt.QPushButton("", self)
|
|
460
|
-
self.layout().addWidget(self._toggleButton, 0, 0, 1, 1)
|
|
461
463
|
|
|
462
464
|
# dataset ordering
|
|
463
465
|
self._orderingWidget = _OrderingWidget(parent=self)
|
|
@@ -471,34 +473,16 @@ class _ToggleableOptionsWidget(qt.QWidget):
|
|
|
471
473
|
self.layout().setSpacing(0)
|
|
472
474
|
self.layout().addWidget(self._filterWidget, 4, 1, 3, 3)
|
|
473
475
|
|
|
474
|
-
self._toggleButton.setSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed)
|
|
475
|
-
self._setButtonIcon(show=True)
|
|
476
|
-
|
|
477
|
-
# connect signal / slot
|
|
478
|
-
self._toggleButton.clicked.connect(self._toggleFilterWidget)
|
|
479
|
-
|
|
480
|
-
# expose API
|
|
481
|
-
self.getProcessPatterns = self._filterWidget.getProcessPatterns
|
|
482
|
-
self.getDatasetPatterns = self._filterWidget.getDatasetPatterns
|
|
483
|
-
|
|
484
476
|
@property
|
|
485
477
|
def filterWidget(self):
|
|
486
478
|
return self._filterWidget
|
|
487
479
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
icon = style.standardIcon(self._BUTTON_ICON)
|
|
492
|
-
if show is True:
|
|
493
|
-
pixmap = icon.pixmap(32, 32).transformed(qt.QTransform().scale(1, -1))
|
|
494
|
-
icon = qt.QIcon(pixmap)
|
|
495
|
-
self._toggleButton.setIcon(icon)
|
|
480
|
+
# expose API
|
|
481
|
+
def getProcessPatterns(self):
|
|
482
|
+
return self._filterWidget.getProcessPatterns()
|
|
496
483
|
|
|
497
|
-
def
|
|
498
|
-
|
|
499
|
-
self._setButtonIcon(show=visible)
|
|
500
|
-
self._filterWidget.setVisible(visible)
|
|
501
|
-
self._orderingWidget.setVisible(visible)
|
|
484
|
+
def getDatasetPatterns(self):
|
|
485
|
+
return self._filterWidget.getDatasetPatterns()
|
|
502
486
|
|
|
503
487
|
|
|
504
488
|
class _FilterWidget(qt.QWidget):
|
|
@@ -700,3 +684,6 @@ class ProcessManager(qt.QObject):
|
|
|
700
684
|
@docstring(_ProcessManager)
|
|
701
685
|
def get_datasets(self):
|
|
702
686
|
return self.manager.get_datasets()
|
|
687
|
+
|
|
688
|
+
def remove_dataset(self, *args, **kwargs):
|
|
689
|
+
return self.manager.remove_dataset(*args, **kwargs)
|
|
@@ -32,7 +32,7 @@ import unittest
|
|
|
32
32
|
from processview.core.superviseprocess import SuperviseProcess
|
|
33
33
|
from processview.core.dataset import Dataset
|
|
34
34
|
from processview.core.dataset import DatasetIdentifier
|
|
35
|
-
from processview.gui.processmanager import ProcessManager
|
|
35
|
+
from processview.gui.processmanager import ProcessManager, ProcessManagerWindow
|
|
36
36
|
from processview.core.manager import DatasetState
|
|
37
37
|
from silx.gui.utils.testutils import SignalListener
|
|
38
38
|
from silx.gui.utils.testutils import TestCaseQt
|
|
@@ -73,6 +73,34 @@ class TestProcessManager(TestCaseQt):
|
|
|
73
73
|
)
|
|
74
74
|
self.assertEqual(self.signalListener.callCount(), 3)
|
|
75
75
|
|
|
76
|
+
def testClearItems(self):
|
|
77
|
+
window = ProcessManagerWindow(parent=None)
|
|
78
|
+
p1 = SuperviseProcess(name="process1")
|
|
79
|
+
p2 = SuperviseProcess(name="process2")
|
|
80
|
+
scan_1 = _DummyScan("scan1")
|
|
81
|
+
scan_2 = _DummyScan("scan2 with a very long name ... really long")
|
|
82
|
+
|
|
83
|
+
manager = ProcessManager()
|
|
84
|
+
manager.notify_dataset_state(
|
|
85
|
+
dataset=scan_1, state=DatasetState.PENDING, process=p1
|
|
86
|
+
)
|
|
87
|
+
manager.notify_dataset_state(
|
|
88
|
+
dataset=scan_2, state=DatasetState.SUCCEED, process=p1
|
|
89
|
+
)
|
|
90
|
+
manager.notify_dataset_state(
|
|
91
|
+
dataset=scan_2, state=DatasetState.FAILED, process=p2
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
window._centralWidget.observationTable.selectAll()
|
|
95
|
+
window._centralWidget.observationTable._requestClearDataset()
|
|
96
|
+
self.qapp.processEvents()
|
|
97
|
+
assert len(manager.manager._dataset_process_states[p1.process_id]) == 0
|
|
98
|
+
manager.notify_dataset_state(
|
|
99
|
+
dataset=scan_2, state=DatasetState.FAILED, process=p2
|
|
100
|
+
)
|
|
101
|
+
assert len(manager.manager._dataset_process_states[p1.process_id]) == 0
|
|
102
|
+
assert len(manager.manager._dataset_process_states[p2.process_id]) == 1
|
|
103
|
+
|
|
76
104
|
|
|
77
105
|
class _DummyScan(Dataset):
|
|
78
106
|
def __init__(self, name):
|
|
@@ -21,6 +21,7 @@ processview/core/manager/manager.py
|
|
|
21
21
|
processview/core/manager/test/__init__.py
|
|
22
22
|
processview/core/manager/test/test_manager.py
|
|
23
23
|
processview/core/test/__init__.py
|
|
24
|
+
processview/gui/DropDownWidget.py
|
|
24
25
|
processview/gui/__init__.py
|
|
25
26
|
processview/gui/icons.py
|
|
26
27
|
processview/gui/messagebox.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.png
RENAMED
|
File without changes
|
{processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|