Skip to content

Commit

Permalink
added complete date/time fields
Browse files Browse the repository at this point in the history
  • Loading branch information
Theodore Therone authored and Theodore Therone committed Nov 30, 2014
1 parent 7fa8419 commit 3c35174
Show file tree
Hide file tree
Showing 41 changed files with 432 additions and 320 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ widgets:
pyuic4 ui/repositorySearch.ui -o SQBLWidgets/sqblUI/repositorySearch.py
pyuic4 ui/responseBoolean.ui -o SQBLWidgets/sqblUI/responseBoolean.py
pyuic4 ui/responseCodeList.ui -o SQBLWidgets/sqblUI/responseCodeList.py
pyuic4 ui/responseDate.ui -o SQBLWidgets/sqblUI/responseDate.py
pyuic4 ui/responseGeneric.ui -o SQBLWidgets/sqblUI/responseGeneric.py
pyuic4 ui/responseNumber.ui -o SQBLWidgets/sqblUI/responseNumber.py
pyuic4 ui/responseText.ui -o SQBLWidgets/sqblUI/responseText.py
pyuic4 ui/responseTime.ui -o SQBLWidgets/sqblUI/responseTime.py
pyuic4 ui/responseTab.ui -o SQBLWidgets/sqblUI/responseTab.py
pyuic4 ui/questionGroup.ui -o SQBLWidgets/sqblUI/questionGroup.py
pyuic4 ui/questionModule.ui -o SQBLWidgets/sqblUI/questionModule.py
Expand Down
120 changes: 119 additions & 1 deletion SQBLWidgets/ResponseObjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ def changed(value):
tag.set("value", str(value))
valueField.valueChanged.connect(changed)

def initialiseRestraintFields(self,tagname,defaultElement,checkbox,languageCombo,textField=None,valueField=None):
def initialiseRestraintFields(self,tagname,defaultElement,checkbox,languageCombo,
textField=None,valueField=None,dateField=None,timeField=None):

toggleMethod = self.connectToggle(checkbox,tagname,defaultElement)

Expand All @@ -67,12 +68,24 @@ def initialiseRestraintFields(self,tagname,defaultElement,checkbox,languageCombo
state = QtCore.Qt.Checked
if valueField is not None:
valueField.setValue(float(elem[0].get('value')))
if dateField is not None:
date = QtCore.QDate().fromString(elem[0].get('value'),format=QtCore.Qt.ISODate)
dateField.setDate(date)
if timeField is not None:
time = QtCore.QTime().fromString(elem[0].get('value'))
timeField.setTime(time)
#if timeField is not None:
# timeField.setTime(QtCore.QDate(elem[0].get('value'),format=QtCore.Qt.ISODate))
checkbox.setCheckState(state)

if textField is not None:
self.connectMLFields(textField,tagname,languageCombo)
if valueField is not None:
self.connectValueFields(tagname,valueField)
if dateField is not None:
self.connectDateFields(tagname,dateField)
if timeField is not None:
self.connectTimeFields(tagname,timeField)
checkbox.stateChanged.connect(toggleMethod)

# Connect the minimum and maximum fields so they bound each others values correctly.
Expand Down Expand Up @@ -246,6 +259,73 @@ def prepCodeListBox(self,lang="en"):
item.setCheckState(QtCore.Qt.Unchecked)
self.codeListTable.setItem(row,1,item)

class Date(SQBLResponseObject, sqblUI.responseDate.Ui_Form):
def __init__(self,element,model):
SQBLResponseObject.__init__(self,element,model)

self.initialiseRestraintFields( tagname = "Minimum",
defaultElement = etree.fromstring("<Minimum xmlns='%s' value='0' />"% _namespaces['s']),
checkbox = self.hasMinValue,
languageCombo = self.languages,
textField = self.minValueHint,
dateField = self.minValue
)

self.initialiseRestraintFields( tagname = "Maximum",
defaultElement = etree.fromstring("<Maximum xmlns='%s' value='0' />"% _namespaces['s']),
checkbox = self.hasMaxValue,
languageCombo = self.languages,
textField = self.maxValueHint,
dateField = self.maxValue
)

self.initialiseRestraintFields( tagname = "Hint",
defaultElement = etree.fromstring("<Hint xmlns='%s' />"% _namespaces['s']),
checkbox = self.hasDisplayHint,
languageCombo = self.languages,
textField = self.displayHint,
)

self.connectUseTodayField("Minimum",self.minUseToday,self.minValue)
self.connectUseTodayField("Maximum",self.maxUseToday,self.maxValue)
self.connectToggleField(self.hasMaxValue,self.maxUseToday,self.maxValue)
self.connectToggleField(self.hasMinValue,self.minUseToday,self.minValue)

# Do this as a last step, to select a display language
self.connectAddRemoveLanguages(self.addLanguage,self.removeLanguage,self.languages)
self.configureLanguages(self.languages)

def connectToggleField(self,toggler,todayField,dateField):
def toggleDateField(value):
dateField.setEnabled(value and not todayField.isChecked() )
toggler.toggled.connect(toggleDateField)

def connectUseTodayField(self,tagname,todayField,dateField):

def useTodayToggled(value):
#todayField.setEnabled(not value)
tag = self.element.xpath("./s:%s" % (tagname),namespaces=_namespaces)[0]
#tag = self.element.xpath("./s:Maximum",namespaces=_namespaces)[0]
if value:
tag.set("value", "#today")
else:
tag.set("value", "")
todayField.toggled.connect(useTodayToggled)

tags = self.element.xpath("./s:%s" % (tagname),namespaces=_namespaces)
if len(tags) > 0:
useToday = tags[0].get("value",None)
if useToday == "#today":
dateField.setEnabled(False)
todayField.setChecked(True)

def connectDateFields(self,tagname,valueField):
def changed(value):
if valueField.isEnabled():
tag = self.element.xpath("./s:%s" % (tagname),namespaces=_namespaces)[0]
val = str(valueField.date().toString(format=QtCore.Qt.ISODate))
tag.set("value", val)
valueField.dateChanged.connect(changed)

class Number(SQBLResponseObject, sqblUI.responseNumber.Ui_Form):
def __init__(self,element,model):
Expand Down Expand Up @@ -341,7 +421,45 @@ def __init__(self,element,model):

self.connectAddRemoveLanguages(self.addLanguage,self.removeLanguage,self.languages)
self.configureLanguages(self.languages)

class Time(SQBLResponseObject, sqblUI.responseTime.Ui_Form):
def __init__(self,element,model):
SQBLResponseObject.__init__(self,element,model)

self.initialiseRestraintFields( tagname = "Minimum",
defaultElement = etree.fromstring("<Minimum xmlns='%s' value='0' />"% _namespaces['s']),
checkbox = self.hasMinValue,
languageCombo = self.languages,
textField = self.minValueHint,
timeField = self.minValue
)

self.initialiseRestraintFields( tagname = "Maximum",
defaultElement = etree.fromstring("<Maximum xmlns='%s' value='0' />"% _namespaces['s']),
checkbox = self.hasMaxValue,
languageCombo = self.languages,
textField = self.maxValueHint,
timeField = self.maxValue
)

self.initialiseRestraintFields( tagname = "Hint",
defaultElement = etree.fromstring("<Hint xmlns='%s' />"% _namespaces['s']),
checkbox = self.hasDisplayHint,
languageCombo = self.languages,
textField = self.displayHint,
)

# Do this as a last step, to select a display language
self.connectAddRemoveLanguages(self.addLanguage,self.removeLanguage,self.languages)
self.configureLanguages(self.languages)

def connectTimeFields(self,tagname,valueField):
def changed(value):
if valueField.isEnabled():
tag = self.element.xpath("./s:%s" % (tagname),namespaces=_namespaces)[0]
val = str(valueField.time().toString())
tag.set("value", val)
valueField.timeChanged.connect(changed)

class Boolean(SQBLResponseObject, sqblUI.responseBoolean.Ui_Form):
def __init__(self,element,model):
Expand Down
34 changes: 29 additions & 5 deletions SQBLWidgets/SQBLWidgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,12 @@ def addBooleanResponse(self):
responseField = Responses.Boolean(element,self.model)
self.responseTabs.addTab(responseField,"Boolean")

def addDateResponse(self):
element = etree.Element("{%s}Date"%(_namespaces['s']))
self.responses.append(element)
responseField = Responses.Date(element,self.model)
self.responseTabs.addTab(responseField,"Date")

def addNumericResponse(self):
element = etree.Element("{%s}Number"%(_namespaces['s']))
self.responses.append(element)
Expand All @@ -301,6 +307,12 @@ def addTextResponse(self):
responseField = Responses.Text(element,self.model)
self.responseTabs.addTab(responseField,"Text")

def addTimeResponse(self):
element = etree.Element("{%s}Time"%(_namespaces['s']))
self.responses.append(element)
responseField = Responses.Time(element,self.model)
self.responseTabs.addTab(responseField,"Time")

def addCodeListResponse(self):
element = etree.fromstring("""
<CodeList xmlns="%s">
Expand All @@ -319,15 +331,19 @@ def setupResponseTabs(self):
arb.setPopupMode(QtGui.QToolButton.InstantPopup)

arbMenu = QtGui.QMenu("Add Response", arb)
addNum = arbMenu.addAction("Numeric Response")
addText = arbMenu.addAction("Text Response")
addCode = arbMenu.addAction("CodeList Response")
addBool = arbMenu.addAction("Boolean Response")
addDate = arbMenu.addAction("Date Response")
addCode = arbMenu.addAction("CodeList Response")
addNum = arbMenu.addAction("Numeric Response")
addText = arbMenu.addAction("Text Response")
addTime = arbMenu.addAction("Time Response")

addBool.triggered.connect(self.addBooleanResponse)
addCode.triggered.connect(self.addCodeListResponse)
addDate.triggered.connect(self.addDateResponse)
addNum.triggered.connect(self.addNumericResponse)
addText.triggered.connect(self.addTextResponse)
addCode.triggered.connect(self.addCodeListResponse)
addBool.triggered.connect(self.addBooleanResponse)
addTime.triggered.connect(self.addTimeResponse)
arb.setMenu(arbMenu)

self.responseTabs.setCornerWidget(arb)
Expand All @@ -337,6 +353,10 @@ def setupResponseTabs(self):
responseField = Responses.CodeList(response,self.model)
#self.responseType.setCurrentIndex(2)
tabName = "Codelist"
elif response.tag == _ns("s","Date"):
responseField = Responses.Date(response,self.model)
#self.responseType.setCurrentIndex(1)
tabName = "Date"
elif response.tag == _ns("s","Number"):
responseField = Responses.Number(response,self.model)
#self.responseType.setCurrentIndex(1)
Expand All @@ -345,6 +365,10 @@ def setupResponseTabs(self):
responseField = Responses.Text(response,self.model)
#self.responseType.setCurrentIndex(0)
tabName = "Text"
elif response.tag == _ns("s","Time"):
responseField = Responses.Time(response,self.model)
#self.responseType.setCurrentIndex(1)
tabName = "Time"
elif response.tag == _ns("s","Boolean"):
responseField = Responses.Boolean(response,self.model)
#self.responseType.setCurrentIndex(0)
Expand Down
Loading

0 comments on commit 3c35174

Please sign in to comment.