diff options
author | Picca Frédéric-Emmanuel <picca@debian.org> | 2018-03-04 10:20:27 +0100 |
---|---|---|
committer | Picca Frédéric-Emmanuel <picca@debian.org> | 2018-03-04 10:20:27 +0100 |
commit | 270d5ddc31c26b62379e3caa9044dd75ccc71847 (patch) | |
tree | 55c5bfc851dfce7172d335cd2405b214323e3caf /examples/fileDialog.py | |
parent | e19c96eff0c310c06c4f268c8b80cb33bd08996f (diff) |
New upstream version 0.7.0+dfsg
Diffstat (limited to 'examples/fileDialog.py')
-rw-r--r-- | examples/fileDialog.py | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/examples/fileDialog.py b/examples/fileDialog.py new file mode 100644 index 0000000..9730b9a --- /dev/null +++ b/examples/fileDialog.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python +# coding: utf-8 +# /*########################################################################## +# +# Copyright (c) 2016 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. +# +# ###########################################################################*/ +""" +Example for the use of the ImageFileDialog. +""" + +from __future__ import absolute_import + +__authors__ = ["V. Valls"] +__license__ = "MIT" +__date__ = "14/02/2018" + +import logging +from silx.gui import qt +from silx.gui.dialog.ImageFileDialog import ImageFileDialog +from silx.gui.dialog.DataFileDialog import DataFileDialog +import silx.io +from silx.third_party import enum + + +logging.basicConfig(level=logging.DEBUG) + + +class Mode(enum.Enum): + DEFAULT_FILEDIALOG = 0 + IMAGEFILEDIALOG = 1 + DATAFILEDIALOG = 2 + DATAFILEDIALOG_DATASET = 3 + DATAFILEDIALOG_GROUP = 4 + DATAFILEDIALOG_NXENTRY = 5 + + +class DialogExample(qt.QMainWindow): + + def __init__(self, parent=None): + super(DialogExample, self).__init__(parent) + + self.__state = {} + + centralWidget = qt.QWidget(self) + layout = qt.QHBoxLayout() + centralWidget.setLayout(layout) + + options = self.createOptions() + layout.addWidget(options) + + buttonGroup = qt.QGroupBox() + buttonGroup.setTitle("Create dialog") + layout.addWidget(buttonGroup) + buttonLayout = qt.QVBoxLayout() + buttonGroup.setLayout(buttonLayout) + + # ImageFileDialog + + b1 = qt.QPushButton(self) + b1.setMinimumHeight(50) + b1.setText("Open a dialog") + b1.clicked.connect(self.openDialog) + buttonLayout.addWidget(b1) + + b2 = qt.QPushButton(self) + b2.setMinimumHeight(50) + b2.setText("Open a dialog with state stored") + b2.clicked.connect(self.openDialogStoredState) + buttonLayout.addWidget(b2) + + b3 = qt.QPushButton(self) + b3.setMinimumHeight(50) + b3.setText("Open a dialog at home") + b3.clicked.connect(self.openDialogAtHome) + buttonLayout.addWidget(b3) + + b4 = qt.QPushButton(self) + b4.setMinimumHeight(50) + b4.setText("Open a dialog at computer root") + b4.clicked.connect(self.openDialogAtComputer) + buttonLayout.addWidget(b4) + + self.setCentralWidget(centralWidget) + + def createOptions(self): + panel = qt.QGroupBox() + panel.setTitle("Options") + layout = qt.QVBoxLayout() + panel.setLayout(layout) + group = qt.QButtonGroup(panel) + + radio = qt.QRadioButton(panel) + radio.setText("Qt QFileDialog") + radio.setProperty("Mode", Mode.DEFAULT_FILEDIALOG) + group.addButton(radio) + layout.addWidget(radio) + + radio = qt.QRadioButton(panel) + radio.setText("silx ImageFileDialog") + radio.setProperty("Mode", Mode.IMAGEFILEDIALOG) + group.addButton(radio) + layout.addWidget(radio) + + radio = qt.QRadioButton(panel) + radio.setChecked(True) + radio.setText("silx DataFileDialog") + radio.setProperty("Mode", Mode.DATAFILEDIALOG) + group.addButton(radio) + layout.addWidget(radio) + + radio = qt.QRadioButton(panel) + radio.setText("silx DataFileDialog (filter=dataset)") + radio.setProperty("Mode", Mode.DATAFILEDIALOG_DATASET) + group.addButton(radio) + layout.addWidget(radio) + + radio = qt.QRadioButton(panel) + radio.setText("silx DataFileDialog (filter=group)") + radio.setProperty("Mode", Mode.DATAFILEDIALOG_GROUP) + group.addButton(radio) + layout.addWidget(radio) + + radio = qt.QRadioButton(panel) + radio.setText("silx DataFileDialog (filter=NXentry)") + radio.setProperty("Mode", Mode.DATAFILEDIALOG_NXENTRY) + group.addButton(radio) + layout.addWidget(radio) + + self.__options = group + return panel + + def printResult(self, dialog, result): + if not result: + print("Nothing selected") + return + + print("Selection:") + if isinstance(dialog, qt.QFileDialog): + print("- Files: %s" % dialog.selectedFiles()) + elif isinstance(dialog, ImageFileDialog): + print("- File: %s" % dialog.selectedFile()) + print("- URL: %s" % dialog.selectedUrl()) + print("- Data URL: %s" % dialog.selectedDataUrl()) + image = dialog.selectedImage() + print("- Image: <dtype: %s, shape: %s>" % (image.dtype, image.shape)) + elif isinstance(dialog, DataFileDialog): + print("- File: %s" % dialog.selectedFile()) + print("- URL: %s" % dialog.selectedUrl()) + print("- Data URL: %s" % dialog.selectedDataUrl()) + try: + data = dialog.selectedData() + print("- Data: <dtype: %s, shape: %s>" % (data.dtype, data.shape)) + except Exception as e: + print("- Data: %s" % e) + + url = dialog.selectedDataUrl() + with silx.io.open(url.file_path()) as h5: + node = h5[url.data_path()] + print("- Node: %s" % node) + else: + assert(False) + + def createDialog(self): + print("") + print("-------------------------") + print("----- Create dialog -----") + print("-------------------------") + button = self.__options.checkedButton() + mode = button.property("Mode") + if mode == Mode.DEFAULT_FILEDIALOG: + dialog = qt.QFileDialog(self) + dialog.setAcceptMode(qt.QFileDialog.AcceptOpen) + elif mode == Mode.IMAGEFILEDIALOG: + dialog = ImageFileDialog(self) + elif mode == Mode.DATAFILEDIALOG: + dialog = DataFileDialog(self) + elif mode == Mode.DATAFILEDIALOG_DATASET: + dialog = DataFileDialog(self) + dialog.setFilterMode(DataFileDialog.FilterMode.ExistingDataset) + elif mode == Mode.DATAFILEDIALOG_GROUP: + dialog = DataFileDialog(self) + dialog.setFilterMode(DataFileDialog.FilterMode.ExistingGroup) + elif mode == Mode.DATAFILEDIALOG_NXENTRY: + def customFilter(obj): + if "NX_class" in obj.attrs: + return obj.attrs["NX_class"] in [b"NXentry", u"NXentry"] + return False + dialog = DataFileDialog(self) + dialog.setFilterMode(DataFileDialog.FilterMode.ExistingGroup) + dialog.setFilterCallback(customFilter) + else: + assert(False) + return dialog + + def openDialog(self): + # Clear the dialog + dialog = self.createDialog() + + # Execute the dialog as modal + result = dialog.exec_() + self.printResult(dialog, result) + + def openDialogStoredState(self): + # Clear the dialog + dialog = self.createDialog() + if dialog.__class__ in self.__state: + dialog.restoreState(self.__state[dialog.__class__]) + + # Execute the dialog as modal + result = dialog.exec_() + self.__state[dialog.__class__] = dialog.saveState() + self.printResult(dialog, result) + + def openDialogAtHome(self): + # Clear the dialog + path = qt.QDir.homePath() + dialog = self.createDialog() + dialog.setDirectory(path) + + # Execute the dialog as modal + result = dialog.exec_() + self.printResult(dialog, result) + + def openDialogAtComputer(self): + # Clear the dialog + path = "" + dialog = self.createDialog() + dialog.setDirectory(path) + + # Execute the dialog as modal + result = dialog.exec_() + self.printResult(dialog, result) + + +def main(): + app = qt.QApplication([]) + example = DialogExample() + example.show() + app.exec_() + + +if __name__ == "__main__": + main() |