From bfa4dba15485b4192f8bbe13345e9658c97ecf76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Picca=20Fr=C3=A9d=C3=A9ric-Emmanuel?= Date: Sat, 7 Oct 2017 07:59:01 +0200 Subject: New upstream version 0.6.0+dfsg --- silx/gui/hdf5/Hdf5TreeView.py | 85 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) (limited to 'silx/gui/hdf5/Hdf5TreeView.py') diff --git a/silx/gui/hdf5/Hdf5TreeView.py b/silx/gui/hdf5/Hdf5TreeView.py index 09f6fcf..0a4198e 100644 --- a/silx/gui/hdf5/Hdf5TreeView.py +++ b/silx/gui/hdf5/Hdf5TreeView.py @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "27/09/2016" +__date__ = "20/09/2017" import logging @@ -43,6 +43,8 @@ _logger = logging.getLogger(__name__) class Hdf5TreeView(qt.QTreeView): """TreeView which allow to browse HDF5 file structure. + .. image:: img/Hdf5TreeView.png + It provides columns width auto-resizing and additional signals. @@ -192,6 +194,87 @@ class Hdf5TreeView(qt.QTreeView): continue yield _utils.H5Node(item) + def setSelectedH5Node(self, h5Object): + """ + Select the specified node of the tree using an h5py node. + + - If the item is found, parent items are expended, and then the item + is selected. + - If the item is not found, the selection do not change. + - A none argument allow to deselect everything + + :param h5py.Npde h5Object: The node to select + """ + if h5Object is None: + self.setCurrentIndex(qt.QModelIndex()) + return + + filename = h5Object.file.filename + + # Seach for the right roots + rootIndices = [] + model = self.model() + for index in range(model.rowCount(qt.QModelIndex())): + index = model.index(index, 0, qt.QModelIndex()) + obj = model.data(index, Hdf5TreeModel.H5PY_OBJECT_ROLE) + if obj.file.filename == filename: + # We can have many roots with different subtree of the same + # root + rootIndices.append(index) + + if len(rootIndices) == 0: + # No root found + return + + path = h5Object.name + "/" + path = path.replace("//", "/") + + # Search for the right node + found = False + foundIndices = [] + for _ in range(1000 * len(rootIndices)): + # Avoid too much iterations, in case of recurssive links + if len(foundIndices) == 0: + if len(rootIndices) == 0: + # Nothing found + break + # Start fron a new root + foundIndices.append(rootIndices.pop(0)) + + obj = model.data(index, Hdf5TreeModel.H5PY_OBJECT_ROLE) + p = obj.name + "/" + p = p.replace("//", "/") + if path == p: + found = True + break + + parentIndex = foundIndices[-1] + for index in range(model.rowCount(parentIndex)): + index = model.index(index, 0, parentIndex) + obj = model.data(index, Hdf5TreeModel.H5PY_OBJECT_ROLE) + + p = obj.name + "/" + p = p.replace("//", "/") + if path == p: + foundIndices.append(index) + found = True + break + elif path.startswith(p): + foundIndices.append(index) + break + else: + # Nothing found, start again with another root + foundIndices = [] + + if found: + break + + if found: + # Update the GUI + for index in foundIndices[:-1]: + self.expand(index) + self.setCurrentIndex(foundIndices[-1]) + def mousePressEvent(self, event): """Override mousePressEvent to provide a consistante compatible API between Qt4 and Qt5 -- cgit v1.2.3