#/*##########################################################################
# 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
from PyMca5.PyMcaGui import PyMcaQt as qt
QTVERSION = qt.qVersion()
from . import CheckField
from . import EntryField
from . import TextField
#import RadioField
from . import TabSheets
TupleType=type(())
[docs]def uic_load_pixmap_RadioField(name):
pix = qt.QPixmap()
m = qt.QMimeSourceFactory.defaultFactory().data(name)
if m:
qt.QImageDrag.decode(m,pix)
return pix
[docs]class QScriptOption(TabSheets.TabSheets):
def __init__(self,parent = None,name=None,modal=1,fl = 0,
sheets=(),default=None,nohelp=1,nodefaults=1):
TabSheets.TabSheets.__init__(self,parent,name,modal,fl,
nohelp,nodefaults)
if QTVERSION < '4.0.0':
if name is not None:self.setCaption(str(name))
else:
if name is not None:self.setWindowTitle(str(name))
self.sheets={}
self.sheetslist=[]
self.default=default
self.output={}
self.output.update(self.default)
ntabs=self.tabWidget.count()
#remove anything not having to do with my sheets
for i in range(ntabs):
if QTVERSION < '4.0.0':
page = self.tabWidget.page(0)
self.tabWidget.removePage(page)
else:
self.tabWidget.setCurrentIndex(0)
self.tabWidget.removeTab(self.tabWidget.currentIndex())
for sheet in sheets:
name=sheet['notetitle']
a=FieldSheet(fields=sheet['fields'])
self.sheets[name]=a
a.setdefaults(self.default)
self.sheetslist.append(name)
self.tabWidget.addTab(self.sheets[name],str(name))
if QTVERSION < '4.2.0':
i = self.tabWidget.indexOf(self.sheets[name])
self.tabWidget.setCurrentIndex(i)
else:
self.tabWidget.setCurrentWidget(self.sheets[name])
#perform the binding to the buttons
self.buttonOk.clicked.connect(self.myaccept)
self.buttonCancel.clicked.connect(self.myreject)
if not nodefaults:
self.buttonDefaults.clicked.connect(self.defaults)
if not nohelp:
self.buttonHelp.clicked.connect(self.myhelp)
[docs] def myaccept(self):
self.output.update(self.default)
for name,sheet in self.sheets.items():
self.output.update(sheet.get())
#avoid pathologicval None cases
for key in list(self.output.keys()):
if self.output[key] is None:
if key in self.default:
self.output[key]=self.default[key]
self.accept()
return
[docs] def myreject(self):
self.output={}
self.output.update(self.default)
self.reject()
return
[docs] def defaults(self):
self.output={}
self.output.update(self.default)
[docs] def myhelp(self):
print("Default - Sets back to the initial parameters")
print("Cancel - Sets back to the initial parameters and quits")
print("OK - Updates the parameters and quits")
[docs]class FieldSheet(qt.QWidget):
def __init__(self,parent = None,name=None,fl = 0,fields=()):
qt.QWidget.__init__(self,parent)
layout= qt.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
#self.fields = ([,,,])
self.fields=[]
self.nbfield= 1
for field in fields:
fieldtype=field[0]
if len(field) == 3:
key = field[1]
else:
key = None
parameters=field[-1]
if fieldtype == "TextField":
myTextField = MyTextField(self,keys=key,params=parameters)
self.fields.append(myTextField)
layout.addWidget(myTextField)
if fieldtype == "CheckField":
myCheckField = MyCheckField(self,keys=key,params=parameters)
self.fields.append(myCheckField)
layout.addWidget(myCheckField)
if fieldtype == "EntryField":
myEntryField = MyEntryField(self,keys=key,params=parameters)
self.fields.append(myEntryField)
layout.addWidget(myEntryField)
if fieldtype == "RadioField":
radioField = RadioField(self,keys=key,params=parameters)
self.fields.append(radioField)
layout.addWidget(radioField)
[docs] def get(self):
result={}
for field in self.fields:
result.update(field.getvalue())
return result
[docs] def setdefaults(self,dict):
for field in self.fields:
field.setdefaults(dict)
return
[docs]class MyTextField(TextField.TextField):
def __init__(self,parent = None,name = None,fl = 0,
keys=(), params = ()):
TextField.TextField.__init__(self,parent,name,fl)
self.TextLabel.setText(str(params))
[docs] def getvalue(self):
pass
return
[docs] def setvalue(self):
pass
return
[docs] def setdefaults(self,dict):
pass
return
[docs]class MyEntryField(EntryField.EntryField):
def __init__(self,parent = None,name = None,fl = 0,
keys=(), params = ()):
EntryField.EntryField.__init__(self,parent,name,fl)
self.dict={}
if type(keys) == TupleType:
for key in keys:
self.dict[key]=None
else:
self.dict[keys]=None
self.TextLabel.setText(str(params))
self.Entry.textChanged[str].connect(self.setvalue)
[docs] def getvalue(self):
return self.dict
[docs] def setvalue(self,value):
for key in self.dict.keys():
self.dict[key]=str(value)
return
[docs] def setdefaults(self, ddict):
for key in list(self.dict.keys()):
if key in ddict:
self.dict[key] = ddict[key]
self.Entry.setText(str(ddict[key]))
return
[docs]class MyCheckField(CheckField.CheckField):
def __init__(self,parent = None,name = None,fl = 0,
keys=(), params = ()):
CheckField.CheckField.__init__(self,parent,name,fl)
self.dict={}
if type(keys) == TupleType:
for key in keys:
self.dict[key]=None
else:
self.dict[keys]=None
self.CheckBox.setText(str(params))
self.CheckBox.stateChanged[int].connect(self.setvalue)
[docs] def getvalue(self):
return self.dict
[docs] def setvalue(self,value):
if value:
val=1
else:
val=0
for key in self.dict.keys():
self.dict[key]=val
return
[docs] def setdefaults(self, ddict):
for key in self.dict.keys():
if key in ddict:
if int(ddict[key]):
self.CheckBox.setChecked(1)
self.dict[key]=1
else:
self.CheckBox.setChecked(0)
self.dict[key]=0
return
[docs]class RadioField(qt.QWidget):
def __init__(self,parent = None,name = None,fl = 0,
keys=(), params = ()):
if QTVERSION < '4.0.0':
qt.QWidget.__init__(self,parent,name,fl)
if name == None:
self.setName("RadioField")
#self.resize(166,607)
self.setSizePolicy(qt.QSizePolicy(1,1,0,0,self.sizePolicy().hasHeightForWidth()))
self.setCaption(str("RadioField"))
RadioFieldLayout = qt.QHBoxLayout(self,11,6,"RadioFieldLayout")
else:
qt.QWidget.__init__(self,parent)
RadioFieldLayout = qt.QHBoxLayout(self)
RadioFieldLayout.setContentsMargins(11, 11, 11, 11)
RadioFieldLayout.setSpacing(6)
self.RadioFieldBox = qt.QButtonGroup(self)
if QTVERSION < '4.0.0':
self.RadioFieldBox.setSizePolicy(qt.QSizePolicy(1,1,0,0,self.RadioFieldBox.sizePolicy().hasHeightForWidth()))
self.RadioFieldBox.setTitle(str(""))
self.RadioFieldBox.setColumnLayout(0,qt.Qt.Vertical)
self.RadioFieldBox.layout().setSpacing(6)
self.RadioFieldBox.layout().setContentsMargins(11, 11, 11, 11)
RadioFieldBoxLayout = qt.QVBoxLayout(self.RadioFieldBox.layout())
RadioFieldBoxLayout.setAlignment(qt.Qt.AlignTop)
Layout1 = qt.QVBoxLayout(None,0,6,"Layout1")
self.dict={}
if type(keys) == TupleType:
for key in keys:
self.dict[key]=1
else:
self.dict[keys]=1
self.RadioButton=[]
i=0
for text in params:
self.RadioButton.append(qt.QRadioButton(self.RadioFieldBox,
"RadioButton"+"%d" % i))
self.RadioButton[-1].setSizePolicy(qt.QSizePolicy(1,1,0,0,
self.RadioButton[-1].sizePolicy().hasHeightForWidth()))
self.RadioButton[-1].setText(str(text))
Layout1.addWidget(self.RadioButton[-1])
i=i+1
RadioFieldBoxLayout.addLayout(Layout1)
RadioFieldLayout.addWidget(self.RadioFieldBox)
self.RadioButton[0].setChecked(1)
self.RadioFieldBox.clicked[int].connect(self.setvalue)
[docs] def getvalue(self):
return self.dict
[docs] def setvalue(self,value):
if value:
val=1
else:
val=0
for key in self.dict.keys():
self.dict[key]=val
return
[docs] def setdefaults(self, ddict):
for key in list(self.dict.keys()):
if key in ddict:
self.dict[key]=ddict[key]
i=int(ddict[key])
self.RadioButton[i].setChecked(1)
return
[docs]def test():
a = qt.QApplication(sys.argv)
app.lastWindowClosed.connect(app.quit)
#w = FieldSheet(fields=(["TextField",'Simple Entry'],
# ["EntryField",'entry','MyLabel'],
# ["CheckField",'label','Check Label'],
# ["RadioField",'radio',('Button1','hmmm','3')]))
sheet1={'notetitle':"First Sheet",
'fields':(["TextField",'Simple Entry'],
["EntryField",'entry','MyLabel'],
["CheckField",'label','Check Label'])}
sheet2={'notetitle':"Second Sheet",
'fields':(["TextField",'Simple Radio Buttons'],
["RadioField",'radio',('Button1','hmmm','3')])}
w=QScriptOption(name='QScriptOptions',sheets=(sheet1,sheet2),
default={'radio':1,'entry':'type here','label':1})
if QTVERSION < '4.0.0':
a.setMainWidget(w)
w.show()
a.exec_loop()
else:
w.show()
a.exec_()
print(w.output)
if __name__ == "__main__":
test()