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/app/view.py | 184 +++++++++++++++++++++++-------------------------------- 1 file changed, 77 insertions(+), 107 deletions(-) (limited to 'silx/app/view.py') diff --git a/silx/app/view.py b/silx/app/view.py index 8fdabde..e8507f4 100644 --- a/silx/app/view.py +++ b/silx/app/view.py @@ -1,6 +1,6 @@ # coding: utf-8 # /*########################################################################## -# Copyright (C) 2016 European Synchrotron Radiation Facility +# Copyright (C) 2016-2017 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 @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "12/04/2017" +__date__ = "02/10/2017" import sys import os @@ -33,30 +33,10 @@ import argparse import logging import collections - -logging.basicConfig() _logger = logging.getLogger(__name__) """Module logger""" -try: - # it should be loaded before h5py - import hdf5plugin # noqa -except ImportError: - hdf5plugin = None - -try: - import h5py - import silx.gui.hdf5 -except ImportError: - h5py = None - -try: - import fabio -except ImportError: - fabio = None - from silx.gui import qt -from silx.gui.data.DataViewerFrame import DataViewerFrame class Viewer(qt.QMainWindow): @@ -71,6 +51,10 @@ class Viewer(qt.QMainWindow): :class:`silx.io.spech5.SpecH5` or :class:`h5py.File` instances) """ + # Import it here to be sure to use the right logging level + import silx.gui.hdf5 + from silx.gui.data.DataViewerFrame import DataViewerFrame + qt.QMainWindow.__init__(self) self.setWindowTitle("Silx viewer") @@ -97,14 +81,15 @@ class Viewer(qt.QMainWindow): self.setCentralWidget(main_panel) - self.__treeview.selectionModel().selectionChanged.connect(self.displayData) + model = self.__treeview.selectionModel() + model.selectionChanged.connect(self.displayData) + self.__treeview.addContextMenuCallback(self.closeAndSyncCustomContextMenu) - self.__treeview.addContextMenuCallback(self.customContextMenu) - # lambda function will never be called cause we store it as weakref - self.__treeview.addContextMenuCallback(lambda event: None) - # you have to store it first - self.__store_lambda = lambda event: self.closeAndSyncCustomContextMenu(event) - self.__treeview.addContextMenuCallback(self.__store_lambda) + treeModel = self.__treeview.findHdf5TreeModel() + columns = list(treeModel.COLUMN_IDS) + columns.remove(treeModel.DESCRIPTION_COLUMN) + columns.remove(treeModel.NODE_COLUMN) + self.__treeview.header().setSections(columns) self.createActions() self.createMenus() @@ -159,15 +144,17 @@ class Viewer(qt.QMainWindow): extensions = collections.OrderedDict() # expect h5py - extensions["HDF5 files"] = "*.h5" + extensions["HDF5 files"] = "*.h5 *.hdf" + extensions["NeXus files"] = "*.nx *.nxs *.h5 *.hdf" # no dependancy - extensions["Spec files"] = "*.dat *.spec *.mca" + extensions["NeXus layout from spec files"] = "*.dat *.spec *.mca" + extensions["Numpy binary files"] = "*.npz *.npy" # expect fabio - extensions["EDF files"] = "*.edf" - extensions["TIFF image files"] = "*.tif *.tiff" - extensions["NumPy binary files"] = "*.npy" - extensions["CBF files"] = "*.cbf" - extensions["MarCCD image files"] = "*.mccd" + extensions["NeXus layout from raster images"] = "*.edf *.tif *.tiff *.cbf *.mccd" + extensions["NeXus layout from EDF files"] = "*.edf" + extensions["NeXus layout from TIFF image files"] = "*.tif *.tiff" + extensions["NeXus layout from CBF files"] = "*.cbf" + extensions["NeXus layout from MarCCD image files"] = "*.mccd" filters = [] filters.append("All supported files (%s)" % " ".join(extensions.values())) @@ -180,48 +167,8 @@ class Viewer(qt.QMainWindow): return dialog def about(self): - import silx._version - message = """

Silx viewer -
-
{silx_version} -
-
Upstream project on GitHub -

-

-

-
Silx version
{silx_version}
-
Qt version
{qt_version}
-
Qt binding
{qt_binding}
-
Python version
{python_version}
-
Optional libraries
{optional_lib}
-
-

-

- Copyright (C) European Synchrotron Radiation Facility -

- """ - def format_optional_lib(name, isAvailable): - if isAvailable: - template = '%s is installed' - else: - template = '%s is not installed' - return template % name - - optional_lib = [] - optional_lib.append(format_optional_lib("FabIO", fabio is not None)) - optional_lib.append(format_optional_lib("H5py", h5py is not None)) - optional_lib.append(format_optional_lib("hdf5plugin", hdf5plugin is not None)) - - info = dict( - esrf_url="http://www.esrf.eu", - project_url="https://github.com/silx-kit/silx", - silx_version=silx._version.version, - qt_binding=qt.BINDING, - qt_version=qt.qVersion(), - python_version=sys.version.replace("\n", "
"), - optional_lib="
".join(optional_lib) - ) - qt.QMessageBox.about(self, "About Menu", message.format(**info)) + from . import qtutils + qtutils.About.about(self, "Silx viewer") def appendFile(self, filename): self.__treeview.findHdf5TreeModel().appendFile(filename) @@ -229,7 +176,7 @@ class Viewer(qt.QMainWindow): def displayData(self): """Called to update the dataviewer with the selected data. """ - selected = list(self.__treeview.selectedH5Nodes()) + selected = list(self.__treeview.selectedH5Nodes(ignoreBrokenLinks=False)) if len(selected) == 1: # Update the viewer for a single selection data = selected[0] @@ -238,40 +185,20 @@ class Viewer(qt.QMainWindow): def useAsyncLoad(self, useAsync): self.__asyncload = useAsync - def customContextMenu(self, event): - """Called to populate the context menu - - :param silx.gui.hdf5.Hdf5ContextMenuEvent event: Event - containing expected information to populate the context menu - """ - selectedObjects = event.source().selectedH5Nodes() - menu = event.menu() - - hasDataset = False - for obj in selectedObjects: - if obj.ntype is h5py.Dataset: - hasDataset = True - break - - if len(menu.children()): - menu.addSeparator() - - if hasDataset: - action = qt.QAction("Do something on the datasets", event.source()) - menu.addAction(action) - def closeAndSyncCustomContextMenu(self, event): """Called to populate the context menu :param silx.gui.hdf5.Hdf5ContextMenuEvent event: Event containing expected information to populate the context menu """ - selectedObjects = event.source().selectedH5Nodes() + selectedObjects = event.source().selectedH5Nodes(ignoreBrokenLinks=False) menu = event.menu() if len(menu.children()): menu.addSeparator() + # Import it here to be sure to use the right logging level + import h5py for obj in selectedObjects: if obj.ntype is h5py.File: action = qt.QAction("Remove %s" % obj.local_filename, event.source()) @@ -292,12 +219,43 @@ def main(argv): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( 'files', - type=argparse.FileType('rb'), nargs=argparse.ZERO_OR_MORE, help='Data file to show (h5 file, edf files, spec files)') + parser.add_argument( + '--debug', + dest="debug", + action="store_true", + default=False, + help='Set logging system in debug mode') + parser.add_argument( + '--use-opengl-plot', + dest="use_opengl_plot", + action="store_true", + default=False, + help='Use OpenGL for plots (instead of matplotlib)') options = parser.parse_args(argv[1:]) + if options.debug: + logging.root.setLevel(logging.DEBUG) + + # + # Import most of the things here to be sure to use the right logging level + # + + try: + # it should be loaded before h5py + import hdf5plugin # noqa + except ImportError: + _logger.debug("Backtrace", exc_info=True) + hdf5plugin = None + + try: + import h5py + except ImportError: + _logger.debug("Backtrace", exc_info=True) + h5py = None + if h5py is None: message = "Module 'h5py' is not installed but is mandatory."\ + " You can install it using \"pip install h5py\"." @@ -309,15 +267,27 @@ def main(argv): + " compressions. You can install it using \"pip install hdf5plugin\"." _logger.warning(message) + # + # Run the application + # + + if options.use_opengl_plot: + from silx.gui.plot import PlotWidget + PlotWidget.setDefaultBackend("opengl") + app = qt.QApplication([]) + qt.QLocale.setDefault(qt.QLocale.c()) + sys.excepthook = qt.exceptionHandler window = Viewer() window.resize(qt.QSize(640, 480)) - for f in options.files: - filename = f.name - f.close() - window.appendFile(filename) + for filename in options.files: + try: + window.appendFile(filename) + except IOError as e: + _logger.error(e.args[0]) + _logger.debug("Backtrace", exc_info=True) window.show() result = app.exec_() -- cgit v1.2.3