# Copyright (c) 2009 - 2016, UChicago Argonne, LLC.
# See LICENSE file for details.
'''
QtGui widget to edit one Proposal instance
.. rubric:: :class:`AGUP_ProposalDetails`
adds one row of widgets for possible Reviewer of Proposal
==================================================== ============================================================
Method Description
==================================================== ============================================================
:meth:`~AGUP_ProposalDetails.addReviewer` add a Reviewer to the panel
==================================================== ============================================================
'''
import os, sys
from PyQt4 import QtGui
import history
import prop_revu_grid
import resources
import signals
import topic_slider
import topics
UI_FILE = 'proposal_details.ui'
# self.reviewers_gb.layout().setReviewersValues(self.agup.reviewers)
[docs]class AGUP_ProposalDetails(QtGui.QWidget):
'''
QtGui widget to edit one Proposal instance
'''
def __init__(self, parent=None, settings=None, agup=None):
'''
'''
self.parent = parent
self.settings = settings
self.agup = agup
QtGui.QWidget.__init__(self, parent)
resources.loadUi(UI_FILE, self)
self.restoreSplitterDetails()
self.modified = False
self.topic_list = []
self.topic_widgets = {}
self.reviewer_list = []
# self.reviewer_widgets = {} # not used
layout = prop_revu_grid.ReviewerAssignmentGridLayout(None, self.agup)
self.reviewers_gb.setLayout(layout)
layout.custom_signals.checkBoxGridChanged.connect(self.onAssignmentsChanged)
self.custom_signals = signals.CustomSignals()
[docs] def addReviewers(self, reviewers):
'''
Add the list of Reviewers to the details panel
'''
self.reviewers_gb.layout().addReviewers(reviewers)
[docs] def onAssignmentsChanged(self):
'''
called when a reviewer assignment checkbox has been changed
'''
self.custom_signals.checkBoxGridChanged.emit()
[docs] def onTopicValueChanged(self, topic):
''' '''
value = self.topic_widgets[topic].getValue()
history.addLog("topic (" + topic + ") value changed: " + str(value))
self.modified = True
prop_id = str(self.getProposalId())
self.custom_signals.topicValueChanged.emit(prop_id, str(topic), value)
[docs] def addTopic(self, topic, value):
'''
'''
if topic not in self.topic_list:
self.topic_list.append(topic)
row = self.topic_list.index(topic)
topicslider = topic_slider.AGUP_TopicSlider(self.topic_layout, row, topic, value)
self.topic_widgets[topic] = topicslider
topicslider.slider.valueChanged.connect(lambda: self.onTopicValueChanged(topic))
[docs] def addTopics(self, topic_list):
'''
'''
for topic in topic_list:
self.addTopic(topic, topics.DEFAULT_TOPIC_VALUE)
[docs] def setTopic(self, key, value):
'''
'''
if key not in self.topic_list:
raise KeyError('unknown Topic: ' + key)
if value < 0 or value > 1:
raise ValueError('Topic value must be between 0 and 1, given' + str(value))
self.topic_widgets[key].setValue(value)
self.topic_widgets[key].onValueChange(value) # sets the slider
self.modified = True
[docs] def clear(self):
'''
'''
self.setProposalId('')
self.setProposalTitle('')
self.setReviewPeriod('')
self.setSpkName('')
self.setFirstChoiceBl('')
self.setSubjects('')
[docs] def setAll(self, prop_id, title, period, speaker, choice, subjects):
'''
'''
self.setProposalId(prop_id)
self.setProposalTitle(title)
self.setReviewPeriod(period)
self.setSpkName(speaker)
self.setFirstChoiceBl(choice)
self.setSubjects(subjects)
[docs] def setupProposal(self, proposal):
'''
install proposal data in the editor's widgets
'''
kv = dict(
proposal_id = self.setProposalId,
proposal_title = self.setProposalTitle,
review_period = self.setReviewPeriod,
spk_name = self.setSpkName,
first_choice_bl = self.setFirstChoiceBl,
subjects = self.setSubjects,
)
layout = self.reviewers_gb.layout()
layout.proposal = proposal
# set all the text entry widget fields
for k, v in kv.items():
v(proposal.getKey(str(k)))
# set all the topic values
for topic in proposal.getTopicList():
v = proposal.getTopic(topic)
self.topic_widgets[topic].setValue(v)
self.topic_widgets[topic].onValueChange(v)
layout.setProposal(proposal)
[docs] def getProposalId(self):
''' '''
return self.proposal_id.text()
[docs] def setProposalId(self, value):
''' '''
self.proposal_id.setText(value)
self.modified = True
[docs] def setProposalTitle(self, value):
''' '''
self.proposal_title.setPlainText(value)
self.modified = True
[docs] def setReviewPeriod(self, value):
''' '''
self.review_period.setText(value)
self.modified = True
[docs] def setSpkName(self, value):
''' '''
self.spk_name.setText(value)
self.modified = True
[docs] def setFirstChoiceBl(self, value):
''' '''
self.first_choice_bl.setText(value)
self.modified = True
[docs] def setSubjects(self, value):
''' '''
self.subjects.setPlainText(value)
self.modified = True
[docs] def saveSplitterDetails(self):
''' '''
if self.settings is not None:
self.settings.saveSplitterDetails(self)
[docs] def restoreSplitterDetails(self):
''' '''
if self.settings is not None:
self.settings.restoreSplitterDetails(self)
[docs] def update(self):
''' '''
history.addLog(self.__class__.__name__ + '.update()', False)
grid = self.reviewers_gb.layout()
# grid.update()
def project_main():
import sys
import os
import agup_data
app = QtGui.QApplication(sys.argv)
testfile = os.path.abspath('project/agup_project.xml')
test_gup_id = str(941*9*5)
agup = agup_data.AGUP_Data()
agup.openPrpFile(testfile)
proposal = agup.proposals.proposals[test_gup_id]
mw = AGUP_ProposalDetails(agup=agup)
mw.addTopics(agup.topics.getTopicList())
mw.addReviewers(agup.reviewers)
mw.setupProposal(proposal)
mw.show()
sys.exit(app.exec_())
if __name__ == '__main__':
# AGUP_main()
project_main()