Source code for PyMca5.PyMcaGui.io.SpecFileCntTable

#/*##########################################################################
# Copyright (C) 2004-2014 E. Papillon, 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__ = "E. Papillon, V.A. Sole - ESRF Software Group"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import sys
from PyMca5.PyMcaGui import PyMcaQt as qt
QTVERSION = qt.qVersion()
DEBUG = 0

try:
    import PyMca5.Object3D
    OBJECT3D = True
except:
    OBJECT3D = False

[docs]class SpecFileCntTable(qt.QTableWidget): sigSpecFileCntTableSignal = qt.pyqtSignal(object) def __init__(self, parent=None): qt.QTableWidget.__init__(self, parent) self.cntList = [] self.mcaList = [] self.xSelection = [] self.ySelection = [] self.monSelection = [] self.__is3DEnabled = False self.__is2DEnabled = False labels = ['Counter', 'X ', 'Y ', 'Mon'] self.setColumnCount(len(labels)) for i in range(len(labels)): item = self.horizontalHeaderItem(i) if item is None: item = qt.QTableWidgetItem(labels[i], qt.QTableWidgetItem.Type) item.setText(labels[i]) self.setHorizontalHeaderItem(i,item) """ #the cell is not the same as the check box #but I wonder about the checkboxes being destroyed self.cellClicked[int, int].connect(self._mySlot) """
[docs] def build(self, cntlist, nmca=None): if not OBJECT3D: nmca = 0 nmca = 0 if nmca is None: nmca = 0 self.cntList = cntlist self.mcaList = [] n = len(cntlist) self.setRowCount(n) if n > 0: self.setRowCount(n + nmca) rheight = self.horizontalHeader().sizeHint().height() for i in range(n): self.setRowHeight(i, rheight) self.__addLine(i, cntlist[i]) for j in range(1, 4, 1): widget = self.cellWidget(i, j) widget.setEnabled(True) for j in range(nmca): row = n+j self.setRowHeight(n+j, rheight) mca = "Mca %d" % (j+1) self.mcaList.append(mca) self.__addLine(n+j, self.mcaList[j]) #the x checkbox widget = self.cellWidget(row, 1) widget.setChecked(False) widget.setEnabled(False) #the y checkbox widget = self.cellWidget(row, 2) widget.setChecked(False) widget.setEnabled(True) #the Monitor checkbox widget = self.cellWidget(row, 3) widget.setChecked(False) widget.setEnabled(False) else: self.setRowCount(0) self.resizeColumnToContents(1) self.resizeColumnToContents(2) self.resizeColumnToContents(3)
def __addLine(self, i, cntlabel): #the counter name item = self.item(i, 0) if item is None: item = qt.QTableWidgetItem(cntlabel, qt.QTableWidgetItem.Type) item.setTextAlignment(qt.Qt.AlignHCenter | qt.Qt.AlignVCenter) self.setItem(i, 0, item) else: item.setText(cntlabel) #item is just enabled (not selectable) item.setFlags(qt.Qt.ItemIsEnabled) #the checkboxes for j in range(1, 4, 1): widget = self.cellWidget(i, j) if widget is None: widget = CheckBoxItem(self, i, j) self.setCellWidget(i, j, widget) widget.sigCheckBoxItemSignal.connect(self._mySlot) else: pass
[docs] def set3DEnabled(self, value): self.__is2DEnabled = False if value: self.__is3DEnabled = True if len(self.xSelection) > 3: self.xSelection = self.xSelection[-3:] else: self.__is3DEnabled = False if len(self.xSelection) > 1: self.xSelection = [1 * self.xSelection[0]] self._update()
[docs] def set2DEnabled(self, value): self.__is3DEnabled = False if value: self.__is2DEnabled = True if len(self.xSelection) > 2: self.xSelection = self.xSelection[-2:] else: self.__is2DEnabled = False if len(self.xSelection) > 1: self.xSelection = [1 * self.xSelection[0]] self._update()
def _mySlot(self, ddict): row = ddict["row"] col = ddict["col"] if col == 1: if ddict["state"]: if row not in self.xSelection: self.xSelection.append(row) else: if row in self.xSelection: del self.xSelection[self.xSelection.index(row)] if (not OBJECT3D) or (not self.__is3DEnabled): if len(self.xSelection) > 2: #that is to support mesh plots self.xSelection = self.xSelection[-2:] if not self.__is2DEnabled: if len(self.xSelection) > 1: self.xSelection = self.xSelection[-1:] elif len(self.xSelection) > 3: self.xSelection = self.xSelection[-3:] if col == 2: if ddict["state"]: if row not in self.ySelection: self.ySelection.append(row) else: if row in self.ySelection: del self.ySelection[self.ySelection.index(row)] if col == 3: if ddict["state"]: if row not in self.monSelection: self.monSelection.append(row) else: if row in self.monSelection: del self.monSelection[self.monSelection.index(row)] if len(self.monSelection) > 1: self.monSelection = self.monSelection[-1:] self._update() def _update(self): for i in range(self.rowCount()): j = 1 widget = self.cellWidget(i, j) if i in self.xSelection: if not widget.isChecked(): widget.setChecked(True) else: if widget.isChecked(): widget.setChecked(False) j = 2 widget = self.cellWidget(i, j) if i in self.ySelection: if not widget.isChecked(): widget.setChecked(True) else: if widget.isChecked(): widget.setChecked(False) j = 3 widget = self.cellWidget(i, j) if i in self.monSelection: if not widget.isChecked(): widget.setChecked(True) else: if widget.isChecked(): widget.setChecked(False) ddict = {} ddict["event"] = "updated" self.sigSpecFileCntTableSignal.emit(ddict)
[docs] def getCounterSelection(self): ddict = {} ddict['cntlist'] = self.cntList * 1 ddict['mcalist'] = self.mcaList * 1 ddict['x'] = self.xSelection * 1 ddict['y'] = self.ySelection * 1 ddict['m'] = self.monSelection * 1 return ddict
[docs] def setCounterSelection(self, ddict): keys = ddict.keys() if 'cntlist' in keys: cntlist = ddict['cntlist'] else: cntlist = self.cntList * 1 if 'x' in keys: x = ddict['x'] else: x = [] if 'y' in keys: y = ddict['y'] else: y = [] if 'm' in keys: monitor = ddict['m'] else: monitor = [] self.xSelection = [] for item in x: if item < len(cntlist): counter = cntlist[item] if 0: if counter in self.cntList: self.xSelection.append(self.cntList.index(counter)) else: self.xSelection.append(item) self.ySelection = [] for item in y: if item < len(cntlist): counter = cntlist[item] if counter in self.cntList: self.ySelection.append(self.cntList.index(counter)) self.monSelection = [] for item in monitor: if item < len(cntlist): counter = cntlist[item] if counter in self.cntList: self.monSelection.append(self.cntList.index(counter)) self._update()
[docs]class CheckBoxItem(qt.QCheckBox): sigCheckBoxItemSignal = qt.pyqtSignal(object) def __init__(self, parent, row, col): qt.QCheckBox.__init__(self, parent) self.__row = row self.__col = col self.clicked[bool].connect(self._mySignal) def _mySignal(self, value): ddict = {} ddict["event"] = "clicked" ddict["state"] = value ddict["row"] = self.__row * 1 ddict["col"] = self.__col * 1 self.sigCheckBoxItemSignal.emit(ddict)
[docs]def main(): app = qt.QApplication([]) tab = SpecFileCntTable() tab.build(["Cnt1", "Cnt2", "Cnt3"]) tab.setCounterSelection({'x':[1, 2], 'y':[4], 'cntlist':["dummy", "Cnt0", "Cnt1", "Cnt2", "Cnt3"]}) tab.show() app.exec_()
if __name__ == "__main__": main()