Package teamwork :: Package widgets :: Package PsychGUI :: Module ThemeSelector
[hide private]
[frames] | no frames]

Source Code for Module teamwork.widgets.PsychGUI.ThemeSelector

  1  import string 
  2  from Tkinter import * 
  3  import tkMessageBox 
  4  import Pmw 
  5  from teamwork.widgets.cookbook import MultiListbox 
  6   
7 -class ThemeSel:
8 commonFields = ['sequence','actor','action','recipient'] 9 msgFields = ['themes','messageSubj','message','force','overhear'] 10 cmdFields = ['comact','comrecipient'] 11 msgTypes = {'InevitableDefeat' : ['Powerful', 'PunishViolence', 12 'SupportCortinaGov', 'SupportRCNG', 13 'SupportRCNGandGov','Weak'], 14 'PoorSupportGovt': ['SupportCortinaGov', 15 'SupportRCNG', 16 'SupportRCNGandGov'], 17 'BombingHurtsInnocents':[], 18 'GovtPower': ['Powerful'], 19 'Integrity' : ['Professional']} 20 labels = {'sequence':'Time', 21 'actor':'Actor', 22 'action':'Action', 23 'recipient':'Target', 24 'themes':'Theme', 25 'messageSubj':'Msg Subj', 26 'message':'Msg Verb', 27 'force':'Force', 28 'overhear':'Overheard', 29 'comact':'Cmd Verb', 30 'comrecipient':'Cmd Obj'} 31 32
33 - def __init__(self, parent, entities=None,balloon=None):
34 # Create and pack the widget to be configured. 35 #self.target = Label(self, 36 # relief = 'sunken', 37 # padx = 2, 38 # pady = 1, 39 # ) 40 # self.target.pack(fill=X, padx = 2, pady = 0) 41 self.frame = parent 42 srcs = map(lambda e:e.name,entities.members()) 43 self.entities = entities 44 group = Pmw.Group(parent,tag_text='New campaign item:') 45 self.boxes = {} 46 for field in self.commonFields+self.msgFields+self.cmdFields: 47 box = Pmw.OptionMenu(group.interior(),labelpos='nw', 48 label_text=self.labels[field]+':', 49 menubutton_width=8, 50 command=lambda str,s=self,f=field:\ 51 s.change(f,str)) 52 box.pack(side = 'left', anchor = 'n',padx = 0, pady = 0) 53 if not field in self.commonFields: 54 box.pack_forget() 55 if field == 'sequence': 56 itemList = map(lambda i:entities.time['macro']+i,range(1,6)) 57 box.setitems(itemList) 58 box.configure(menubutton_width=1) 59 elif field == 'force': 60 box.configure(menubutton_width=5) 61 box.setitems(['none','accept','reject']) 62 elif field == 'actor': 63 box.setitems(['']+srcs) 64 elif field == 'overhear': 65 box.setitems(['']+srcs) 66 elif field == 'themes': 67 box.configure(menubutton_width = 12) 68 self.boxes[field] = box 69 group.pack(side=TOP,fill=X,expand=1) 70 # Display the first colour. 71 72 #def changeColour(self, colour): 73 # self.target.configure(background = colour) 74 box = Pmw.ButtonBox(parent) 75 label = 'Add' 76 box.add(label,command=self.addItem) 77 if balloon: 78 balloon.bind(box.button(label), 79 'Add the above action/message to the current '\ 80 +'campaign below') 81 label = 'Remove' 82 box.add(label,command=self.removeItems) 83 if balloon: 84 balloon.bind(box.button(label), 85 'Remove the action/message selected below from '\ 86 +'the current campaign') 87 box.pack(side=TOP,fill=X,expand=1) 88 lists = [] 89 for i in range(len(self.commonFields)): 90 l = self.labels[self.commonFields[i]] 91 if l == 'sequence': 92 lists.append((l,5)) 93 else: 94 lists.append((l,10)) 95 for i in range(len(self.msgFields)): 96 l = self.labels[self.msgFields[i]] 97 try: 98 l += '/'+self.labels[self.cmdFields[i]] 99 except IndexError: 100 pass 101 if string.lower(l) == 'force': 102 lists.append((l,2)) 103 else: 104 lists.append((l,10)) 105 self.list = MultiListbox(parent,lists) 106 self.list.pack(side=TOP,expand=1,fill=BOTH) 107 self.campaign = []
108
109 - def change(self,field,value):
110 if field == 'actor': 111 # Update menus based on selection of actor 112 if len(value) == 0: 113 actList = [''] 114 else: 115 try: 116 entity = self.entities[value] 117 except KeyError: 118 tkMessageBox.showerror('Unknown entity', 119 'I do not know any entity named "%s"'\ 120 % (value)) 121 entity = None 122 actList = [''] 123 if entity: 124 actList = ['','message'] 125 for act in entity.actions: 126 if not act['type'] in actList: 127 actList.append(act['type']) 128 field = 'action' 129 self.boxes[field].setitems(actList) 130 self.boxes[field].invoke(actList[0]) 131 elif field == 'action': 132 # Update menus based on selection of action type 133 name = self.boxes['actor'].getvalue() 134 try: 135 entity = self.entities[name] 136 except KeyError: 137 entity = None 138 if entity and value == 'message': 139 # Update possible target audiences 140 targetList = self.entities.members() 141 targetList.remove(entity) 142 targetList = ['']+map(lambda e:e.name,targetList) 143 # Update displayed fields 144 for field in self.cmdFields: 145 self.boxes[field].pack_forget() 146 for field in self.msgFields: 147 self.boxes[field].pack(side = 'left', anchor = 'n', 148 expand = 0, padx = 0, pady = 0) 149 elif entity: 150 # Update list of possible targets of this command/action 151 targetList = [] 152 for act in entity.actions: 153 if act['type'] == value and not act['object'] in targetList: 154 targetList.append(act['object']) 155 if len(targetList) > 1: 156 targetList = [''] + targetList 157 elif len(targetList) == 0: 158 targetList.append('') 159 # Update displayed fields 160 for field in self.msgFields: 161 self.boxes[field].pack_forget() 162 for field in self.cmdFields: 163 if value == 'command': 164 self.boxes[field].pack(side = 'left', anchor = 'n', 165 expand = 0, padx = 0, pady = 0) 166 else: 167 self.boxes[field].pack_forget() 168 else: 169 targetList = [''] 170 self.boxes['recipient'].setitems(targetList) 171 self.boxes['recipient'].invoke(targetList[0]) 172 elif field == 'recipient': 173 if self.boxes['action'].getvalue() == 'message': 174 # Update theme menu based on target 175 if len(value) == 0: 176 themeList = [''] 177 else: 178 try: 179 entity = self.entities[value] 180 except KeyError: 181 msg = 'I do not know an entity named "%s"'% (value) 182 tkMessageBox.showerror('Unknown entity',msg) 183 return 184 try: 185 entity.susceptibilities 186 except AttributeError: 187 entity.susceptibilities = [] 188 if len(entity.susceptibilities) == 0: 189 msg = 'I do not know the susceptibilities of PTA '+\ 190 value+'. I will use my default list of '+\ 191 'themes for now, but query susceptibility '+\ 192 'agent for more specific information.' 193 tkMessageBox.showwarning('Warning',msg) 194 themeList = self.entities.themes.keys() 195 else: 196 themeList = map(lambda i:i[0],entity.susceptibilities) 197 self.boxes['themes'].setitems(themeList) 198 self.boxes['themes'].invoke(themeList[0]) 199 elif self.boxes['action'].getvalue() == 'command': 200 # Update command menus based on commandee 201 actList = [] 202 name = self.boxes['actor'].getvalue() 203 try: 204 entity = self.entities[name] 205 except KeyError: 206 actList.append('') 207 entity = None 208 if entity: 209 for act in entity.actions: 210 if act['type'] == 'command' and act['object'] == value: 211 act = act['command'] 212 if not act['type'] in actList: 213 actList.append(act['type']) 214 if len(actList) > 1: 215 actList.insert(0,'') 216 self.boxes['comact'].setitems(actList) 217 self.boxes['comact'].invoke(actList[0]) 218 elif field == 'comact': 219 # Update object of commanded action in response to action type 220 objList = [] 221 name = self.boxes['actor'].getvalue() 222 try: 223 entity = self.entities[name] 224 except KeyError: 225 entity = None 226 name = self.boxes['recipient'].getvalue() 227 try: 228 commandee = self.entities[name] 229 except KeyError: 230 entity = None 231 if entity: 232 for act in entity.actions: 233 if act['type'] == 'command' and act['object'] == name \ 234 and act['command']['type'] == value: 235 if not act['command']['object'] in objList: 236 objList.append(act['command']['object']) 237 if len(objList) > 1: 238 objList.insert(0,'') 239 elif len(objList) == 0: 240 objList.append('') 241 else: 242 objList.append('') 243 self.boxes['comrecipient'].setitems(objList,0) 244 self.boxes['comrecipient'].invoke(objList[0]) 245 elif field == 'themes': 246 # Update message subject and verb fields based on theme 247 srcs = map(lambda e:e.name, self.entities.members()) 248 try: 249 self.boxes['message'].setitems(self.msgTypes[value]) 250 self.boxes['messageSubj'].setitems(['']+srcs) 251 except KeyError: 252 self.boxes['message'].setitems(['']) 253 self.boxes['messageSubj'].setitems(['']) 254 self.boxes['messageSubj'].invoke('') 255 else: 256 ## print field,value 257 pass
258
259 - def addItem(self):
260 """Takes the item currently indicated by the option menus and 261 adds it to the current campaign""" 262 label = '' 263 item = () 264 error = None 265 itemType = self.boxes['action'].getvalue() 266 fieldList = self.commonFields[:] 267 if itemType == 'message': 268 fieldList += self.msgFields 269 elif itemType == 'command': 270 fieldList += self.cmdFields 271 for field in fieldList: 272 value = self.boxes[field].getvalue() 273 item += (value,) 274 if len(value) > 0: 275 label += field+':'+value + '; ' 276 elif not field in ['force','overhear']: 277 if field == 'recipient': 278 if self.boxes['action'].getvalue() != 'wait': 279 error = 1 280 elif field == 'comrecipient': 281 if self.boxes['comact'].getvalue() != 'wait': 282 error = 1 283 else: 284 error = 1 285 if error: 286 break 287 if error: 288 tkMessageBox.showwarning('Warning', 289 'You have not specified the '+field) 290 else: 291 if label in self.campaign: 292 tkMessageBox.showwarning('Warning', 293 'You have already added that action') 294 else: 295 self.campaign.append(label) 296 while len(item) < len(self.commonFields)+len(self.msgFields): 297 item += ('',) 298 self.list.insert(END,item)
299 ## self.list.setlist(self.campaign) 300 # Should we reset the pulldown menus? 301
302 - def removeItems(self):
303 for index in self.list.curselection(): 304 if len(index) > 0: 305 index = int(index) 306 del(self.campaign[index]) 307 self.list.delete(index) 308 break
309 ## self.list.setlist(self.campaign) 310
311 - def getCampaign(self):
312 result = [] 313 for item in self.campaign: 314 action = {} 315 fields = string.split(item,'; ') 316 for pair in fields: 317 if len(pair) > 0: 318 entry = string.split(pair,':') 319 action[entry[0]] = entry[1] 320 result.append(action) 321 return result
322