Source code for PyMca5.PyMcaGui.io.QSourceSelector

#/*##########################################################################
# 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 sys
import os
from PyMca5.PyMcaGui import PyMcaQt as qt
QTVERSION = qt.qVersion()
from PyMca5.PyMcaGui import PyMca_Icons as icons
from PyMca5.PyMcaIO import spswrap as sps
from PyMca5 import PyMcaDirs

DEBUG = 0

[docs]class QSourceSelector(qt.QWidget): sigSourceSelectorSignal = qt.pyqtSignal(object) def __init__(self, parent=None, filetypelist=None, pluginsIcon=False): qt.QWidget.__init__(self, parent) self.mainLayout= qt.QVBoxLayout(self) self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) if filetypelist is None: self.fileTypeList = ["Spec Files (*mca)", "Spec Files (*dat)", "Spec Files (*spec)", "SPE Files (*SPE)", "EDF Files (*edf)", "EDF Files (*ccd)", "CSV Files (*csv)", "All Files (*)"] else: self.fileTypeList = filetypelist self.lastFileFilter = self.fileTypeList[0] # --- file combo/open/close self.lastInputDir = PyMcaDirs.inputDir self.fileWidget= qt.QWidget(self) fileWidgetLayout= qt.QHBoxLayout(self.fileWidget) fileWidgetLayout.setContentsMargins(0, 0, 0, 0) fileWidgetLayout.setSpacing(0) self.fileCombo = qt.QComboBox(self.fileWidget) self.fileCombo.setEditable(0) self.mapCombo= {} openButton= qt.QToolButton(self.fileWidget) self.openIcon = qt.QIcon(qt.QPixmap(icons.fileopen)) self.closeIcon = qt.QIcon(qt.QPixmap(icons.fileclose)) self.reloadIcon = qt.QIcon(qt.QPixmap(icons.reload_)) self.specIcon = qt.QIcon(qt.QPixmap(icons.spec)) openButton.setIcon(self.openIcon) openButton.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Minimum)) openButton.setToolTip("Open new file data source") closeButton= qt.QToolButton(self.fileWidget) closeButton.setIcon(self.closeIcon) closeButton.setToolTip("Close current data source") refreshButton= qt.QToolButton(self.fileWidget) refreshButton.setIcon(self.reloadIcon) refreshButton.setToolTip("Refresh data source") specButton= qt.QToolButton(self.fileWidget) specButton.setIcon(self.specIcon) specButton.setToolTip("Open new shared memory source") closeButton.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Minimum)) specButton.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Minimum)) refreshButton.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Minimum)) openButton.clicked.connect(self._openFileSlot) closeButton.clicked.connect(self.closeFile) refreshButton.clicked.connect(self._reload) specButton.clicked.connect(self.openSpec) self.fileCombo.activated[str].connect(self._fileSelection) fileWidgetLayout.addWidget(self.fileCombo) fileWidgetLayout.addWidget(openButton) fileWidgetLayout.addWidget(closeButton) fileWidgetLayout.addWidget(specButton) if sys.platform == "win32":specButton.hide() fileWidgetLayout.addWidget(refreshButton) self.specButton = specButton if pluginsIcon: self.pluginsButton = qt.QToolButton(self.fileWidget) self.pluginsButton.setIcon(qt.QIcon(qt.QPixmap(icons.plugin))) self.pluginsButton.setToolTip("Plugin handling") fileWidgetLayout.addWidget(self.pluginsButton) self.mainLayout.addWidget(self.fileWidget) def _reload(self): if DEBUG: print("_reload called") qstring = self.fileCombo.currentText() if not len(qstring): return key = qt.safe_str(qstring) ddict = {} ddict["event"] = "SourceReloaded" ddict["combokey"] = key ddict["sourcelist"] = self.mapCombo[key] * 1 self.sigSourceSelectorSignal.emit(ddict) def _openFileSlot(self): self.openFile(None, None)
[docs] def openSource(self, sourcename, specsession=None): if specsession is None: if sourcename in sps.getspeclist(): specsession=True else: specsession=False self.openFile(sourcename, specsession=specsession)
[docs] def openFile(self, filename=None,justloaded=None, specsession = False): if DEBUG: print("openfile = ",filename) staticDialog = False if not specsession: if justloaded is None: justloaded = True if filename is None: if self.lastInputDir is not None: if not os.path.exists(self.lastInputDir): self.lastInputDir = None wdir = self.lastInputDir if wdir is None: wdir = os.getcwd() if (sys.version < '3.0') and PyMcaDirs.nativeFileDialogs: filetypes = "" for filetype in self.fileTypeList: filetypes += filetype+"\n" try: # API 1 filelist = qt.QFileDialog.getOpenFileNames(self, "Open a new source file", wdir, filetypes, self.lastFileFilter) except: # API 2 filelist, self.lastFileFilter =\ qt.QFileDialog.getOpenFileNamesAndFilter(\ self, "Open a new source file", wdir, filetypes, self.lastFileFilter) staticDialog = True else: fdialog = qt.QFileDialog(self) fdialog.setModal(True) fdialog.setWindowTitle("Open a new source file") if hasattr(qt, "QStringList"): strlist = qt.QStringList() else: strlist = [] for filetype in self.fileTypeList: strlist.append(filetype) if QTVERSION < '5.0.0': fdialog.setFilters(strlist) fdialog.selectFilter(self.lastFileFilter) else: fdialog.setNameFilters(strlist) fdialog.selectNameFilter(self.lastFileFilter) fdialog.setFileMode(fdialog.ExistingFiles) fdialog.setDirectory(wdir) ret = fdialog.exec_() if ret == qt.QDialog.Accepted: filelist = fdialog.selectedFiles() if QTVERSION < '5.0.0': self.lastFileFilter = qt.safe_str(\ fdialog.selectedFilter()) else: self.lastFileFilter = qt.safe_str(\ fdialog.selectedNameFilter()) fdialog.close() del fdialog else: fdialog.close() del fdialog return #filelist.sort() filename=[] for f in filelist: filename.append(qt.safe_str(f)) if not len(filename): return if len(filename): self.lastInputDir = os.path.dirname(filename[0]) PyMcaDirs.inputDir = os.path.dirname(filename[0]) if staticDialog: if len(filename[0]) > 3: #figure out the selected filter extension = filename[0][-3:] self.lastFileFilter = self.fileTypeList[-1] for fileFilter in self.fileTypeList: if extension == fileFilter[-4:-1]: self.lastFileFilter = fileFilter break justloaded = True if justloaded: if type(filename) != type([]): filename = [filename] if not os.path.exists(filename[0]): if '%' not in filename[0]: raise IOError("File %s does not exist" % filename[0]) #check if it is a stack if len(filename) > 1: key = "STACK from %s to %s" % (filename[0], filename[-1]) else: key = os.path.basename(filename[0]) else: key = filename if key not in sps.getspeclist(): qt.QMessageBox.critical(self, "SPS Error", "No shared memory source named %s" % key) return ddict = {} ddict["event"] = "NewSourceSelected" if key in self.mapCombo.keys(): if self.mapCombo[key] == filename: #Reloaded event ddict["event"] = "SourceReloaded" else: i = 0 while key in self.mapCombo.keys(): key += "_%d" % i ddict["combokey"] = key ddict["sourcelist"] = filename self.mapCombo[key] = filename if ddict["event"] =="NewSourceSelected": nitems = self.fileCombo.count() self.fileCombo.insertItem(nitems, key) self.fileCombo.setCurrentIndex(nitems) else: if hasattr(qt, "QString"): nitem = self.fileCombo.findText(qt.QString(key)) else: nitem = self.fileCombo.findText(key) self.fileCombo.setCurrentIndex(nitem) self.sigSourceSelectorSignal.emit(ddict)
[docs] def closeFile(self): if DEBUG: print("closeFile called") #get current combobox key qstring = self.fileCombo.currentText() if not len(qstring): return key = qt.safe_str(qstring) ddict = {} ddict["event"] = "SourceClosed" ddict["combokey"] = key ddict["sourcelist"] = self.mapCombo[key] * 1 if hasattr(qt, "QString"): nitem = self.fileCombo.findText(qt.QString(key)) else: nitem = self.fileCombo.findText(key) self.fileCombo.removeItem(nitem) del self.mapCombo[key] self.sigSourceSelectorSignal.emit(ddict)
[docs] def openSpec(self): speclist = sps.getspeclist() if not len(speclist): qt.QMessageBox.information(self, "No SPEC Shared Memory Found", "No shared memory source available") return if QTVERSION < '4.0.0': print("should I keep Qt3 version?") return menu = qt.QMenu() for spec in speclist: if hasattr(qt, "QString"): menu.addAction(qt.QString(spec), lambda i=spec:self.openFile(i, specsession=True)) else: menu.addAction(spec, lambda i=spec:self.openFile(i, specsession=True)) menu.exec_(self.cursor().pos())
def _fileSelection(self, qstring): if DEBUG: print("file selected ", qstring) key = str(qstring) ddict = {} ddict["event"] = "SourceSelected" ddict["combokey"] = key ddict["sourcelist"] = self.mapCombo[key] self.sigSourceSelectorSignal.emit(ddict)
[docs]def test(): a = qt.QApplication(sys.argv) #new access from PyMca5.PyMcaGui.pymca import QDataSource w= QSourceSelector() def mySlot(ddict): print(ddict) if ddict["event"] == "NewSourceSelected": d = QDataSource.QDataSource(ddict["sourcelist"][0]) w.specfileWidget.setDataSource(d) w.sigSourceSelectorSignal.connect(mySlot) a.lastWindowClosed.connect(a.quit) w.show() a.exec_()
if __name__=="__main__": test()