diff options
author | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-10-07 07:59:01 +0200 |
---|---|---|
committer | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-10-07 07:59:01 +0200 |
commit | bfa4dba15485b4192f8bbe13345e9658c97ecf76 (patch) | |
tree | fb9c6e5860881fbde902f7cbdbd41dc4a3a9fb5d /silx/gui/hdf5/Hdf5TreeModel.py | |
parent | f7bdc2acff3c13a6d632c28c4569690ab106eed7 (diff) |
New upstream version 0.6.0+dfsg
Diffstat (limited to 'silx/gui/hdf5/Hdf5TreeModel.py')
-rw-r--r-- | silx/gui/hdf5/Hdf5TreeModel.py | 78 |
1 files changed, 60 insertions, 18 deletions
diff --git a/silx/gui/hdf5/Hdf5TreeModel.py b/silx/gui/hdf5/Hdf5TreeModel.py index fb5de06..41fa91c 100644 --- a/silx/gui/hdf5/Hdf5TreeModel.py +++ b/silx/gui/hdf5/Hdf5TreeModel.py @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "19/12/2016" +__date__ = "22/09/2017" import os @@ -71,6 +71,25 @@ else: return x +def _createRootLabel(h5obj): + """ + Create label for the very first npde of the tree. + + :param h5obj: The h5py object to display in the GUI + :type h5obj: h5py-like object + :rtpye: str + """ + if silx_io.is_file(h5obj): + label = os.path.basename(h5obj.filename) + else: + filename = os.path.basename(h5obj.file.filename) + path = h5obj.name + if path.startswith("/"): + path = path[1:] + label = "%s::%s" % (filename, path) + return label + + class LoadingItemRunnable(qt.QRunnable): """Runner to process item loading from a file""" @@ -107,12 +126,7 @@ class LoadingItemRunnable(qt.QRunnable): :param h5py.File h5obj: The h5py object to display in the GUI :rtpye: Hdf5Node """ - if silx_io.is_file(h5obj): - text = os.path.basename(h5obj.filename) - else: - filename = os.path.basename(h5obj.file.filename) - path = h5obj.name - text = "%s::%s" % (filename, path) + text = _createRootLabel(h5obj) item = Hdf5Item(text=text, obj=h5obj, parent=oldItem.parent, populateAll=True) return item @@ -121,6 +135,7 @@ class LoadingItemRunnable(qt.QRunnable): """Process the file loading. The worker is used as holder of the data and the signal. The result is sent as a signal. """ + h5file = None try: h5file = silx_io.open(self.filename) newItem = self.__loadItemTree(self.oldItem, h5file) @@ -129,6 +144,8 @@ class LoadingItemRunnable(qt.QRunnable): # Should be logged error = e newItem = None + if h5file is not None: + h5file.close() # Take care of None value in case of PySide newItem = _wrapNone(newItem) @@ -174,6 +191,9 @@ class Hdf5TreeModel(qt.QAbstractItemModel): NODE_COLUMN = 5 """Column id containing HDF5 node type""" + LINK_COLUMN = 6 + """Column id containing HDF5 link type""" + COLUMN_IDS = [ NAME_COLUMN, TYPE_COLUMN, @@ -181,20 +201,21 @@ class Hdf5TreeModel(qt.QAbstractItemModel): VALUE_COLUMN, DESCRIPTION_COLUMN, NODE_COLUMN, + LINK_COLUMN, ] """List of logical columns available""" def __init__(self, parent=None): super(Hdf5TreeModel, self).__init__(parent) - self.treeView = parent - self.header_labels = [None] * 6 + self.header_labels = [None] * len(self.COLUMN_IDS) self.header_labels[self.NAME_COLUMN] = 'Name' self.header_labels[self.TYPE_COLUMN] = 'Type' self.header_labels[self.SHAPE_COLUMN] = 'Shape' self.header_labels[self.VALUE_COLUMN] = 'Value' self.header_labels[self.DESCRIPTION_COLUMN] = 'Description' self.header_labels[self.NODE_COLUMN] = 'Node' + self.header_labels[self.LINK_COLUMN] = 'Link' # Create items self.__root = Hdf5Node() @@ -205,14 +226,36 @@ class Hdf5TreeModel(qt.QAbstractItemModel): self.__animatedIcon.iconChanged.connect(self.__updateLoadingItems) self.__runnerSet = set([]) - # store used icons to avoid to avoid the cache to release it + # store used icons to avoid the cache to release it self.__icons = [] + self.__icons.append(icons.getQIcon("item-none")) self.__icons.append(icons.getQIcon("item-0dim")) self.__icons.append(icons.getQIcon("item-1dim")) self.__icons.append(icons.getQIcon("item-2dim")) self.__icons.append(icons.getQIcon("item-3dim")) self.__icons.append(icons.getQIcon("item-ndim")) - self.__icons.append(icons.getQIcon("item-object")) + + self.__openedFiles = [] + """Store the list of files opened by the model itself.""" + # FIXME: It should managed one by one by Hdf5Item itself + + def __del__(self): + self._closeOpened() + s = super(Hdf5TreeModel, self) + if hasattr(s, "__del__"): + # else it fail on Python 3 + s.__del__() + + def _closeOpened(self): + """Close files which was opened by this model. + + This function may be removed in the future. + + File are opened by the model when it was inserted using + `insertFileAsync`, `insertFile`, `appendFile`.""" + for h5file in self.__openedFiles: + h5file.close() + self.__openedFiles = [] def __updateLoadingItems(self, icon): for i in range(self.__root.childCount()): @@ -240,6 +283,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): self.__root.removeChildAtIndex(row) self.endRemoveRows() if newItem is not None: + self.__openedFiles.append(newItem.obj) self.beginInsertRows(rootIndex, row, row) self.__root.insertChild(row, newItem) self.endInsertRows() @@ -423,11 +467,13 @@ class Hdf5TreeModel(qt.QAbstractItemModel): return node.dataDescription(role) elif index.column() == self.NODE_COLUMN: return node.dataNode(role) + elif index.column() == self.LINK_COLUMN: + return node.dataLink(role) else: return None def columnCount(self, parent=qt.QModelIndex()): - return len(self.header_labels) + return len(self.COLUMN_IDS) def hasChildren(self, parent=qt.QModelIndex()): node = self.nodeFromIndex(parent) @@ -536,12 +582,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): or any other class of h5py file structure. """ if text is None: - if silx_io.is_file(h5pyObject): - text = os.path.basename(h5pyObject.filename) - else: - filename = os.path.basename(h5pyObject.file.filename) - path = h5pyObject.name - text = "%s::%s" % (filename, path) + text = _createRootLabel(h5pyObject) if row == -1: row = self.__root.childCount() self.insertNode(row, Hdf5Item(text=text, obj=h5pyObject, parent=self.__root)) @@ -572,6 +613,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): """ try: h5file = silx_io.open(filename) + self.__openedFiles.append(h5file) self.insertH5pyObject(h5file, row=row) except IOError: _logger.debug("File '%s' can't be read.", filename, exc_info=True) |