[88] | 1 | import json
|
---|
| 2 | import traceback
|
---|
| 3 |
|
---|
| 4 | from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel, QComboBox, QSpinBox, \
|
---|
| 5 | QFrame, QSplitter, QLineEdit, QPushButton, QTableView, QScrollArea, QVBoxLayout, \
|
---|
| 6 | QTextEdit, QMessageBox
|
---|
| 7 | from pyson.ObjectMapper import ObjectMapper
|
---|
| 8 | from uri.uri import URI
|
---|
| 9 |
|
---|
| 10 | from geniusweb.deadline.Deadline import Deadline
|
---|
| 11 | from geniusweb.deadline.DeadlineRounds import DeadlineRounds
|
---|
| 12 | from geniusweb.deadline.DeadlineTime import DeadlineTime
|
---|
| 13 | from geniusweb.protocol.NegoSettings import NegoSettings
|
---|
| 14 | from geniusweb.protocol.session.TeamInfo import TeamInfo
|
---|
| 15 | from geniusweb.protocol.session.saop.SAOPSettings import SAOPSettings
|
---|
| 16 | from geniusweb.references.Parameters import Parameters
|
---|
| 17 | from geniusweb.references.PartyRef import PartyRef
|
---|
| 18 | from geniusweb.references.PartyWithParameters import PartyWithParameters
|
---|
| 19 | from geniusweb.references.PartyWithProfile import PartyWithProfile
|
---|
| 20 | from geniusweb.references.ProfileRef import ProfileRef
|
---|
| 21 | from geniusweb.simplerunner.gui.MyFileChooser import MyFileChooser
|
---|
| 22 | from geniusweb.simplerunner.gui.SelectionModel import SelectionModel
|
---|
| 23 |
|
---|
| 24 |
|
---|
| 25 | class SettingsPanel(QWidget):
|
---|
| 26 |
|
---|
| 27 | def __init__(self):
|
---|
| 28 | super().__init__()
|
---|
| 29 | self.jackson = ObjectMapper()
|
---|
| 30 | self.protocolcombo = QComboBox()
|
---|
| 31 | self.protocolcombo.addItems([ "SAOP" ])
|
---|
| 32 | self.timepanel = TimePanel()
|
---|
| 33 | self.nextparty = QLineEdit()
|
---|
| 34 | self.nextparameters = QLineEdit()
|
---|
| 35 |
|
---|
| 36 | self.nextprofile = MyFileChooser()
|
---|
| 37 | self.addButton = QPushButton()
|
---|
| 38 | self.addButton.setText("add")
|
---|
| 39 | self.selectedparties = SelectionModel()
|
---|
| 40 |
|
---|
| 41 | layout = QGridLayout()
|
---|
| 42 | self.setLayout(layout)
|
---|
| 43 |
|
---|
| 44 | layout.addWidget(WithLabel("protocol", self.protocolcombo))
|
---|
| 45 | layout.addWidget(WithLabel("deadline", self.timepanel))
|
---|
| 46 | layout.addWidget(Separator())
|
---|
| 47 |
|
---|
| 48 | partic = QLabel()
|
---|
| 49 | partic.setText("participants")
|
---|
| 50 | layout.addWidget(partic)
|
---|
| 51 |
|
---|
| 52 | layout.addWidget(WithLabel("party:", self.nextparty))
|
---|
| 53 | layout.addWidget(WithLabel("parameters:", self.nextparameters))
|
---|
| 54 | layout.addWidget(WithLabel("profile:", self.nextprofile))
|
---|
| 55 |
|
---|
| 56 | layout.addWidget(Separator())
|
---|
| 57 |
|
---|
| 58 | layout.addWidget(self.addButton)
|
---|
| 59 |
|
---|
| 60 | label = QLabel()
|
---|
| 61 | label.setText("Selected Profiles, parties for the session")
|
---|
| 62 | layout.addWidget(label)
|
---|
| 63 |
|
---|
| 64 | table = QTableView()
|
---|
| 65 | table.setModel(self.selectedparties)
|
---|
| 66 | layout.addWidget(table)
|
---|
| 67 | self.addButton.clicked.connect(self.addparty);
|
---|
| 68 |
|
---|
| 69 | def addparty(self):
|
---|
| 70 | try:
|
---|
| 71 | self.addparty1()
|
---|
| 72 | except ValueError as e:
|
---|
| 73 | traceback.print_exc()
|
---|
| 74 | mbox = QMessageBox()
|
---|
| 75 | mbox.setText(str(e))
|
---|
| 76 | mbox.setWindowTitle("Failed to add party")
|
---|
| 77 | mbox.setIcon(QMessageBox.Icon.Warning)
|
---|
| 78 | mbox.exec_()
|
---|
| 79 |
|
---|
| 80 | def addparty1(self):
|
---|
| 81 | try:
|
---|
| 82 | partyref = PartyRef(URI("pythonpath:" + self.nextparty.text()))
|
---|
| 83 | except Exception as e:
|
---|
| 84 | raise ValueError("Party not set correctly:" + str(e))
|
---|
| 85 |
|
---|
| 86 | try:
|
---|
| 87 | parameters = self.jackson.parse(json.loads("{" + self.nextparameters.text() + "}"),
|
---|
| 88 | Parameters)
|
---|
| 89 | except Exception as e:
|
---|
| 90 | raise ValueError("Parameters not set correctly:" + str(e))
|
---|
| 91 |
|
---|
| 92 | try:
|
---|
| 93 | profile = ProfileRef(URI("file:" + self.nextprofile.getFile()))
|
---|
| 94 | except Exception as e:
|
---|
| 95 | raise ValueError("Profile not set correctly:" + str(e))
|
---|
| 96 |
|
---|
| 97 | partywithparams = PartyWithParameters(partyref, parameters);
|
---|
| 98 | partywithprofile = PartyWithProfile(partywithparams, profile);
|
---|
| 99 | teaminfo = TeamInfo([partywithprofile])
|
---|
| 100 | self.selectedparties.addTeam(teaminfo)
|
---|
| 101 |
|
---|
| 102 | def getSettings(self) -> NegoSettings:
|
---|
| 103 | return SAOPSettings(self.selectedparties.getTeams(),
|
---|
| 104 | self.timepanel.getDeadline())
|
---|
| 105 |
|
---|
| 106 |
|
---|
| 107 | class WithLabel (QWidget):
|
---|
| 108 | '''
|
---|
| 109 | adds label to left of component
|
---|
| 110 | '''
|
---|
| 111 |
|
---|
| 112 | def __init__(self, label:str, component:QWidget):
|
---|
| 113 | super().__init__()
|
---|
| 114 | layout = QGridLayout()
|
---|
| 115 | self.setLayout(layout)
|
---|
| 116 |
|
---|
| 117 | qlabel = QLabel()
|
---|
| 118 | qlabel.setText(label)
|
---|
| 119 |
|
---|
| 120 | layout.addWidget(qlabel, 0, 0)
|
---|
| 121 | layout.addWidget(component, 0, 1)
|
---|
| 122 |
|
---|
| 123 |
|
---|
| 124 | class TimePanel(QWidget):
|
---|
| 125 | DEFAULTDEADLINE = 10000 # millisecs
|
---|
| 126 |
|
---|
| 127 | def __init__(self):
|
---|
| 128 | super().__init__()
|
---|
| 129 | self.unitcombo = QComboBox()
|
---|
| 130 | self.unitcombo.addItems(["seconds", "rounds"])
|
---|
| 131 | self.time = QSpinBox()
|
---|
| 132 | self.time.setMinimum(1)
|
---|
| 133 | self.time.setMaximum(1000)
|
---|
| 134 | self.time.setValue(10)
|
---|
| 135 |
|
---|
| 136 | layout = QGridLayout()
|
---|
| 137 | self.setLayout(layout)
|
---|
| 138 |
|
---|
| 139 | layout.addWidget(self.time, 0, 0)
|
---|
| 140 | layout.addWidget(self.unitcombo, 0, 1)
|
---|
| 141 |
|
---|
| 142 | def getDeadline(self) -> Deadline:
|
---|
| 143 | if self.unitcombo.currentIndex() == 0: # time
|
---|
| 144 | return DeadlineTime(self.time.value() * 1000);
|
---|
| 145 | return DeadlineRounds(self.time.value(), self.DEFAULTDEADLINE)
|
---|
| 146 |
|
---|
| 147 |
|
---|
| 148 | class Separator(QFrame):
|
---|
| 149 | '''
|
---|
| 150 | Equivalent of java's JSeparator: just a horizontal line for layout
|
---|
| 151 | '''
|
---|
| 152 |
|
---|
| 153 | def __init__(self):
|
---|
| 154 | super().__init__()
|
---|
| 155 | self.setFrameShape(QFrame.Shape.HLine)
|
---|
| 156 | self.setFrameShadow(QFrame.Shadow.Sunken)
|
---|
| 157 |
|
---|