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.
Files changed (39) hide show
  1. {processview-1.3.2 → processview-1.4.0}/PKG-INFO +1 -1
  2. {processview-1.3.2 → processview-1.4.0}/processview/core/manager/manager.py +9 -0
  3. processview-1.4.0/processview/gui/DropDownWidget.py +49 -0
  4. {processview-1.3.2 → processview-1.4.0}/processview/gui/processmanager.py +21 -34
  5. {processview-1.3.2 → processview-1.4.0}/processview/gui/test/test_process_manager.py +29 -1
  6. {processview-1.3.2 → processview-1.4.0}/processview/version.py +2 -2
  7. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/PKG-INFO +1 -1
  8. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/SOURCES.txt +1 -0
  9. {processview-1.3.2 → processview-1.4.0}/LICENSE +0 -0
  10. {processview-1.3.2 → processview-1.4.0}/README.md +0 -0
  11. {processview-1.3.2 → processview-1.4.0}/processview/__init__.py +0 -0
  12. {processview-1.3.2 → processview-1.4.0}/processview/core/__init__.py +0 -0
  13. {processview-1.3.2 → processview-1.4.0}/processview/core/dataset.py +0 -0
  14. {processview-1.3.2 → processview-1.4.0}/processview/core/helpers.py +0 -0
  15. {processview-1.3.2 → processview-1.4.0}/processview/core/manager/__init__.py +0 -0
  16. {processview-1.3.2 → processview-1.4.0}/processview/core/manager/test/__init__.py +0 -0
  17. {processview-1.3.2 → processview-1.4.0}/processview/core/manager/test/test_manager.py +0 -0
  18. {processview-1.3.2 → processview-1.4.0}/processview/core/setup.py +0 -0
  19. {processview-1.3.2 → processview-1.4.0}/processview/core/sorting.py +0 -0
  20. {processview-1.3.2 → processview-1.4.0}/processview/core/superviseprocess.py +0 -0
  21. {processview-1.3.2 → processview-1.4.0}/processview/core/test/__init__.py +0 -0
  22. {processview-1.3.2 → processview-1.4.0}/processview/gui/__init__.py +0 -0
  23. {processview-1.3.2 → processview-1.4.0}/processview/gui/icons.py +0 -0
  24. {processview-1.3.2 → processview-1.4.0}/processview/gui/messagebox.py +0 -0
  25. {processview-1.3.2 → processview-1.4.0}/processview/gui/test/__init__.py +0 -0
  26. {processview-1.3.2 → processview-1.4.0}/processview/resources/__init__.py +0 -0
  27. {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/advancement.png +0 -0
  28. {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/advancement.svg +0 -0
  29. {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.png +0 -0
  30. {processview-1.3.2 → processview-1.4.0}/processview/resources/gui/icons/magnifying_glass.svg +0 -0
  31. {processview-1.3.2 → processview-1.4.0}/processview/test/__init__.py +0 -0
  32. {processview-1.3.2 → processview-1.4.0}/processview/utils/__init__.py +0 -0
  33. {processview-1.3.2 → processview-1.4.0}/processview/utils/singleton.py +0 -0
  34. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/dependency_links.txt +0 -0
  35. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/requires.txt +0 -0
  36. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/top_level.txt +0 -0
  37. {processview-1.3.2 → processview-1.4.0}/processview.egg-info/zip-safe +0 -0
  38. {processview-1.3.2 → processview-1.4.0}/setup.cfg +0 -0
  39. {processview-1.3.2 → processview-1.4.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: processview
3
- Version: 1.3.2
3
+ Version: 1.4.0
4
4
  Summary: Simple helper to provide user feedback about dataset processing
5
5
  Author: data analysis unit
6
6
  Author-email: henri.payno@esrf.fr
@@ -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 dispaly dataset vs process metadata
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 = _ToggleableOptionsWidget(parent=self)
211
- self._optionsWidget.setSizePolicy(
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._optionsWidget)
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._optionsWidget.getProcessPatterns()
259
+ self._dropDownOptionsWidget.getProcessPatterns()
255
260
  )
256
261
  self._updateProcesses()
257
262
  self.observationTable.model().dataset_patterns = (
258
- self._optionsWidget.getDatasetPatterns()
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 _ToggleableOptionsWidget(qt.QWidget):
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
- def _setButtonIcon(self, show):
489
- style = qt.QApplication.instance().style()
490
- # return a QIcon
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 _toggleFilterWidget(self):
498
- visible = not self._filterWidget.isVisible()
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):
@@ -76,8 +76,8 @@ RELEASE_LEVEL_VALUE = {
76
76
  }
77
77
 
78
78
  MAJOR = 1
79
- MINOR = 3
80
- MICRO = 2
79
+ MINOR = 4
80
+ MICRO = 0
81
81
  RELEV = "final" # <16
82
82
  SERIAL = 0 # <16
83
83
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: processview
3
- Version: 1.3.2
3
+ Version: 1.4.0
4
4
  Summary: Simple helper to provide user feedback about dataset processing
5
5
  Author: data analysis unit
6
6
  Author-email: henri.payno@esrf.fr
@@ -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