summaryrefslogtreecommitdiff
path: root/silx/app/view/DataPanel.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/app/view/DataPanel.py')
-rw-r--r--silx/app/view/DataPanel.py171
1 files changed, 171 insertions, 0 deletions
diff --git a/silx/app/view/DataPanel.py b/silx/app/view/DataPanel.py
new file mode 100644
index 0000000..0653f74
--- /dev/null
+++ b/silx/app/view/DataPanel.py
@@ -0,0 +1,171 @@
+# coding: utf-8
+# /*##########################################################################
+# Copyright (C) 2018 European Synchrotron Radiation Facility
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# ############################################################################*/
+"""Browse a data file with a GUI"""
+
+__authors__ = ["V. Valls"]
+__license__ = "MIT"
+__date__ = "06/06/2018"
+
+import logging
+
+from silx.gui import qt
+from silx.gui.data.DataViewerFrame import DataViewerFrame
+
+
+_logger = logging.getLogger(__name__)
+
+
+class _HeaderLabel(qt.QLabel):
+
+ def __init__(self, parent=None):
+ qt.QLabel.__init__(self, parent=parent)
+ self.setFrameShape(qt.QFrame.StyledPanel)
+
+ def sizeHint(self):
+ return qt.QSize(10, 30)
+
+ def paintEvent(self, event):
+ painter = qt.QPainter(self)
+
+ opt = qt.QStyleOptionHeader()
+ opt.orientation = qt.Qt.Horizontal
+ opt.text = self.text()
+ opt.textAlignment = self.alignment()
+ opt.direction = self.layoutDirection()
+ opt.fontMetrics = self.fontMetrics()
+ opt.palette = self.palette()
+ opt.state = qt.QStyle.State_Active
+ opt.position = qt.QStyleOptionHeader.Beginning
+ style = self.style()
+
+ # Background
+ margin = -1
+ opt.rect = self.rect().adjusted(margin, margin, -margin, -margin)
+ style.drawControl(qt.QStyle.CE_HeaderSection, opt, painter, None)
+
+ # Frame border and text
+ super(_HeaderLabel, self).paintEvent(event)
+
+
+class DataPanel(qt.QWidget):
+
+ def __init__(self, parent=None, context=None):
+ qt.QWidget.__init__(self, parent=parent)
+
+ self.__customNxdataItem = None
+
+ self.__dataTitle = _HeaderLabel(self)
+ self.__dataTitle.setVisible(False)
+
+ self.__dataViewer = DataViewerFrame(self)
+ self.__dataViewer.setGlobalHooks(context)
+
+ layout = qt.QVBoxLayout(self)
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.addWidget(self.__dataTitle)
+ layout.addWidget(self.__dataViewer)
+
+ def getData(self):
+ return self.__dataViewer.data()
+
+ def getCustomNxdataItem(self):
+ return self.__customNxdataItem
+
+ def setData(self, data):
+ self.__customNxdataItem = None
+ self.__dataViewer.setData(data)
+ self.__dataTitle.setVisible(data is not None)
+ if data is not None:
+ self.__dataTitle.setVisible(True)
+ if hasattr(data, "name"):
+ if hasattr(data, "file"):
+ label = str(data.file.filename)
+ label += "::"
+ else:
+ label = ""
+ label += data.name
+ else:
+ label = ""
+ self.__dataTitle.setText(label)
+
+ def setCustomDataItem(self, item):
+ self.__customNxdataItem = item
+ if item is not None:
+ data = item.getVirtualGroup()
+ else:
+ data = None
+ self.__dataViewer.setData(data)
+ self.__dataTitle.setVisible(item is not None)
+ if item is not None:
+ text = item.text()
+ self.__dataTitle.setText(text)
+
+ def removeDatasetsFrom(self, root):
+ """
+ Remove all datasets provided by this root
+
+ .. note:: This function do not update data stored inside
+ customNxdataItem cause in the silx-view context this item is
+ already updated on his own.
+
+ :param root: The root file of datasets to remove
+ """
+ data = self.__dataViewer.data()
+ if data is not None:
+ if data.file is not None:
+ # That's an approximation, IS can't be used as h5py generates
+ # To objects for each requests to a node
+ if data.file.filename == root.file.filename:
+ self.__dataViewer.setData(None)
+
+ def replaceDatasetsFrom(self, removedH5, loadedH5):
+ """
+ Replace any dataset from any NXdata items using the same dataset name
+ from another root.
+
+ Usually used when a file was synchronized.
+
+ .. note:: This function do not update data stored inside
+ customNxdataItem cause in the silx-view context this item is
+ already updated on his own.
+
+ :param removedRoot: The h5py root file which is replaced
+ (which have to be removed)
+ :param loadedRoot: The new h5py root file which have to be used
+ instread.
+ """
+
+ data = self.__dataViewer.data()
+ if data is not None:
+ if data.file is not None:
+ if data.file.filename == removedH5.file.filename:
+ # Try to synchonize the viewed data
+ try:
+ # TODO: It have to update the data without changing the
+ # view which is not so easy
+ newData = loadedH5[data.name]
+ self.__dataViewer.setData(newData)
+ except Exception:
+ _logger.debug("Backtrace", exc_info=True)