Source code for PyMca5.PyMcaGui.pymca.PyMcaFileDialogs

#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# 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.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import os
from PyMca5.PyMcaGui import PyMcaQt as qt
from PyMca5 import PyMcaDirs
QTVERSION = qt.qVersion()

[docs]def getExistingDirectory(parent=None, message=None, mode=None): if message is None: message = "Please select a directory" if mode is None: mode = "OPEN" else: mode = mode.upper() if mode == "OPEN": wdir = PyMcaDirs.inputDir else: wdir = PyMcaDirs.outputDir if PyMcaDirs.nativeFileDialogs: outdir = qt.safe_str(qt.QFileDialog.getExistingDirectory(parent, message, wdir)) else: outfile = qt.QFileDialog(parent) outfile.setWindowTitle("Output Directory Selection") outfile.setModal(1) outfile.setDirectory(wdir) outfile.setFileMode(outfile.DirectoryOnly) ret = outfile.exec_() if ret: outdir = qt.safe_str(outfile.selectedFiles()[0]) else: outdir = "" outfile.close() del outfile if len(outdir): if mode == "OPEN": PyMcaDirs.inputDir = os.path.dirname(outdir) if PyMcaDirs.outputDir is None: PyMcaDirs.outputDir = os.path.dirname(outdir) else: PyMcaDirs.outputDir = os.path.dirname(outdir) if PyMcaDirs.inputDir is None: PyMcaDirs.inputDir = os.path.dirname(outdir) return outdir
[docs]def getFileList(parent=None, filetypelist=None, message=None, currentdir=None, mode=None, getfilter=None, single=False, currentfilter=None, native=None): if filetypelist is None: fileTypeList = ['All Files (*)'] else: fileTypeList = filetypelist if currentfilter is None: currentfilter = filetypelist[0] if message is None: if single: message = "Please select one file" else: message = "Please select one or more files" if mode is None: mode = "OPEN" else: mode = mode.upper() if currentdir is None: if mode == "OPEN": wdir = PyMcaDirs.inputDir else: wdir = PyMcaDirs.outputDir else: wdir = currentdir if native is None: nativeFileDialogs = PyMcaDirs.nativeFileDialogs else: nativeFileDialogs = native if getfilter is None: getfilter = False if getfilter: if QTVERSION < '4.5.1': native_possible = False else: native_possible = True else: native_possible = True filterused = None if native_possible and nativeFileDialogs: filetypes = currentfilter+"\n" for filetype in fileTypeList: if filetype != currentfilter: filetypes += filetype+"\n" if getfilter: if mode == "OPEN": if single and hasattr(qt.QFileDialog, "getOpenFileNameAndFilter"): filelist, filterused = qt.QFileDialog.getOpenFileNameAndFilter(parent, message, wdir, filetypes, currentfilter) filelist =[filelist] elif single: # PyQt5 filelist, filterused = qt.QFileDialog.getOpenFileName(parent, message, wdir, filetypes, currentfilter) filelist =[filelist] elif hasattr(qt.QFileDialog, "getOpenFileNamesAndFilter"): filelist, filterused = qt.QFileDialog.getOpenFileNamesAndFilter(parent, message, wdir, filetypes, currentfilter) else: # PyQt5 filelist, filterused = qt.QFileDialog.getOpenFileNames(parent, message, wdir, filetypes, currentfilter) filterused = qt.safe_str(filterused) else: if QTVERSION < '5.0.0': filelist = qt.QFileDialog.getSaveFileNameAndFilter(parent, message, wdir, filetypes) else: filelist = qt.QFileDialog.getSaveFileName(parent, message, wdir, filetypes) if len(filelist[0]): filterused = qt.safe_str(filelist[1]) filelist=[filelist[0]] else: filelist = [] else: if mode == "OPEN": if single: filelist = [qt.QFileDialog.getOpenFileName(parent, message, wdir, filetypes)] else: filelist = qt.QFileDialog.getOpenFileNames(parent, message, wdir, filetypes) else: filelist = qt.QFileDialog.getSaveFileName(parent, message, wdir, filetypes) filelist = qt.safe_str(filelist) if len(filelist): filelist = [filelist] else: filelist = [] if not len(filelist): if getfilter: return [], filterused else: return [] elif filterused is None: sample = qt.safe_str(filelist[0]) for filetype in fileTypeList: ftype = filetype.replace("(", "") ftype = ftype.replace(")", "") extensions = ftype.split()[2:] for extension in extensions: if sample.endswith(extension[-3:]): filterused = filetype break else: fdialog = qt.QFileDialog(parent) fdialog.setModal(True) fdialog.setWindowTitle(message) if hasattr(qt, "QStringList"): strlist = qt.QStringList() else: strlist = [] strlist.append(currentfilter) for filetype in fileTypeList: if filetype != currentfilter: strlist.append(filetype) if hasattr(fdialog, "setFilters"): fdialog.setFilters(strlist) else: fdialog.setNameFilters(strlist) if mode == "OPEN": fdialog.setFileMode(fdialog.ExistingFiles) else: fdialog.setAcceptMode(fdialog.AcceptSave) fdialog.setFileMode(fdialog.AnyFile) fdialog.setDirectory(wdir) if QTVERSION > '4.3.0': history = fdialog.history() if len(history) > 6: fdialog.setHistory(history[-6:]) ret = fdialog.exec_() if ret != qt.QDialog.Accepted: fdialog.close() del fdialog if getfilter: return [], filterused else: return [] else: filelist = fdialog.selectedFiles() if single: filelist = [filelist[0]] if QTVERSION < "5.0.0": filterused = qt.safe_str(fdialog.selectedFilter()) else: filterused = qt.safe_str(fdialog.selectedNameFilter()) if mode != "OPEN": if "." in filterused: extension = filterused.replace(")", "") if "(" in extension: extension = extension.split("(")[-1] extensionList = extension.split() txt = qt.safe_str(filelist[0]) for extension in extensionList: extension = extension.split(".")[-1] if extension != "*": txt = qt.safe_str(filelist[0]) if txt.endswith(extension): break else: txt = txt+"."+extension filelist[0] = txt fdialog.close() del fdialog filelist = [qt.safe_str(x) for x in filelist] if not(len(filelist)): return [] if mode == "OPEN": PyMcaDirs.inputDir = os.path.dirname(filelist[0]) if PyMcaDirs.outputDir is None: PyMcaDirs.outputDir = os.path.dirname(filelist[0]) else: PyMcaDirs.outputDir = os.path.dirname(filelist[0]) if PyMcaDirs.inputDir is None: PyMcaDirs.inputDir = os.path.dirname(filelist[0]) #do not sort file list in order to allow the user other choices #filelist.sort() if getfilter: return filelist, filterused else: return filelist
if __name__ == "__main__": app = qt.QApplication([]) fileTypeList = ['PNG Files (*.png *.jpg)', 'TIFF Files (*.tif *.tiff)'] print(getExistingDirectory()) PyMcaDirs.nativeFileDialogs = False print(getExistingDirectory()) PyMcaDirs.nativeFileDialogs = True print(getFileList(parent=None, filetypelist=fileTypeList, message="Please select a file", mode="SAVE", getfilter=True, single=True)) PyMcaDirs.nativeFileDialogs = False print(getFileList(parent=None, filetypelist=fileTypeList, message="Please select input files", mode="OPEN", getfilter=True, currentfilter='TIFF Files (*.tif *.tiff)', single=False)) #app.exec_()