]> git.saurik.com Git - wxWidgets.git/blob - wxPython/tools/XRCed/params.py
89513a1fbf9402701808001d9d47076904900dfe
[wxWidgets.git] / wxPython / tools / XRCed / params.py
1 # Name: params.py
2 # Purpose: Classes for parameter introduction
3 # Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
4 # Created: 22.08.2001
5 # RCS-ID: $Id$
6
7 from wxPython.wx import *
8 from wxPython.xrc import *
9 import string
10 import os.path
11
12 # Object which is currently processed
13 currentXXX = None
14 def SetCurrentXXX(xxx):
15 global currentXXX
16 currentXXX = xxx
17
18 genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER',
19 'wxSUNKEN_BORDER', 'wxRAISED_BORDER',
20 'wxSTATIC_BORDER', 'wxNO_BORDER',
21 'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
22 'wxNO_FULL_REPAINT_ON_RESIZE']
23
24 # Class that can properly disable children
25 class PPanel(wxPanel):
26 def __init__(self, parent, name):
27 wxPanel.__init__(self, parent, -1, name=name)
28 self.modified = self.freeze = false
29 def Enable(self, value):
30 # Something strange is going on with enable so we make sure...
31 for w in self.GetChildren():
32 w.Enable(value)
33 wxPanel.Enable(self, value)
34 def SetModified(self):
35 self.modified = true
36 panel.SetModified(true)
37
38 class ParamBinaryOr(PPanel):
39 def __init__(self, parent, name):
40 PPanel.__init__(self, parent, name)
41 self.ID_TEXT_CTRL = wxNewId()
42 self.ID_BUTTON_CHOICES = wxNewId()
43 self.SetBackgroundColour(panel.GetBackgroundColour())
44 sizer = wxBoxSizer()
45 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
46 sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
47 self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...')
48 sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
49 self.SetAutoLayout(true)
50 self.SetSizer(sizer)
51 sizer.Fit(self)
52 EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
53 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
54 def OnChange(self, evt):
55 if self.freeze: return
56 self.SetModified()
57 evt.Skip()
58 def GetValue(self):
59 return self.text.GetValue()
60 def SetValue(self, value):
61 self.freeze = true
62 self.text.SetValue(value)
63 self.freeze = false
64 def OnButtonChoices(self, evt):
65 dlg = wxDialog(self, -1, 'Choices')
66 topSizer = wxBoxSizer(wxVERTICAL)
67 listBox = wxCheckListBox(dlg, -1, choices=self.values, size=(250,200))
68 value = map(string.strip, string.split(self.text.GetValue(), '|'))
69 if value == ['']: value = []
70 ignored = []
71 for i in value:
72 try:
73 listBox.Check(self.values.index(i))
74 except ValueError:
75 # Try to find equal
76 if self.equal.has_key(i):
77 listBox.Check(self.values.index(self.equal[i]))
78 else:
79 print 'WARNING: unknown flag: %s: ignored.' % i
80 ignored.append(i)
81 topSizer.Add(listBox, 1, wxEXPAND)
82 sizer = wxBoxSizer()
83 buttonOk = wxButton(dlg, wxID_OK, 'OK')
84 buttonOk.SetDefault()
85 sizer.Add(buttonOk, 0, wxRIGHT, 10)
86 sizer.Add(0, 0, 1)
87 sizer.Add(wxButton(dlg, wxID_CANCEL, 'Cancel'))
88 topSizer.Add(sizer, 0, wxALL | wxEXPAND, 10)
89 dlg.SetAutoLayout(true)
90 dlg.SetSizer(topSizer)
91 topSizer.Fit(dlg)
92 dlg.Center()
93 if dlg.ShowModal() == wxID_OK:
94 value = []
95 for i in range(listBox.Number()):
96 if listBox.IsChecked(i):
97 value.append(self.values[i])
98 # Add ignored flags
99 value.extend(ignored)
100 if value:
101 self.SetValue(reduce(lambda a,b: a+'|'+b, value))
102 else:
103 self.SetValue('')
104 self.SetModified()
105 dlg.Destroy()
106
107 class ParamFlag(ParamBinaryOr):
108 values = ['wxTOP', 'wxBOTTOM', 'wxLEFT', 'wxRIGHT', 'wxALL',
109 'wxEXPAND', 'wxSHAPED', 'wxALIGN_CENTRE', 'wxALIGN_RIGHT',
110 'wxALIGN_BOTTOM', 'wxALIGN_CENTRE_VERTICAL',
111 'wxALIGN_CENTRE_HORIZONTAL']
112 equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE',
113 'wxALIGN_CENTER_VERTICAL': 'wxALIGN_CENTRE_VERTICAL',
114 'wxALIGN_CENTER_HORIZONTAL': 'wxALIGN_CENTRE_HORIZONTAL'}
115 def __init__(self, parent, name):
116 ParamBinaryOr.__init__(self, parent, name)
117
118 class ParamStyle(ParamBinaryOr):
119 equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
120 def __init__(self, parent, name):
121 self.values = currentXXX.winStyles + genericStyles
122 ParamBinaryOr.__init__(self, parent, name)
123
124 class ParamNonGenericStyle(ParamBinaryOr):
125 def __init__(self, parent, name):
126 self.values = currentXXX.winStyles
127 ParamBinaryOr.__init__(self, parent, name)
128
129 class ParamExStyle(ParamBinaryOr):
130 def __init__(self, parent, name):
131 if currentXXX:
132 self.values = currentXXX.exStyles # constant at the moment
133 else:
134 self.values = []
135 ParamBinaryOr.__init__(self, parent, name)
136
137 class ParamColour(PPanel):
138 def __init__(self, parent, name):
139 PPanel.__init__(self, parent, name)
140 self.ID_TEXT_CTRL = wxNewId()
141 self.ID_BUTTON = wxNewId()
142 self.SetBackgroundColour(panel.GetBackgroundColour())
143 sizer = wxBoxSizer()
144 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(60,-1))
145 sizer.Add(self.text, 0, wxRIGHT, 10)
146 self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(40, -1))
147 sizer.Add(self.button, 0, wxGROW)
148 self.SetAutoLayout(true)
149 self.SetSizer(sizer)
150 sizer.Fit(self)
151 self.textModified = false
152 EVT_PAINT(self.button, self.OnPaintButton)
153 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
154 EVT_LEFT_DOWN(self.button, self.OnLeftDown)
155 def GetValue(self):
156 return self.value
157 def SetValue(self, value):
158 self.freeze = true
159 if not value: value = '#FFFFFF'
160 self.value = value
161 self.text.SetValue(str(value)) # update text ctrl
162 colour = wxColour(int(value[1:3], 16), int(value[3:5], 16), int(value[5:7], 16))
163 self.button.SetBackgroundColour(colour)
164 self.button.Refresh()
165 self.freeze = false
166 def OnChange(self, evt):
167 if self.freeze: return
168 self.SetModified()
169 self.textModified = true
170 evt.Skip()
171 def OnPaintButton(self, evt):
172 dc = wxPaintDC(self.button)
173 dc.SetBrush(wxTRANSPARENT_BRUSH)
174 if self.IsEnabled(): dc.SetPen(wxBLACK_PEN)
175 else: dc.SetPen(wxGREY_PEN)
176 size = self.button.GetSize()
177 dc.DrawRectangle(0, 0, size.x, size.y)
178 def OnLeftDown(self, evt):
179 dlg = wxColourDialog(self)
180 if dlg.ShowModal() == wxID_OK:
181 self.SetValue('#%02X%02X%02X' % dlg.GetColourData().GetColour().Get())
182 self.SetModified()
183 self.textModified = false
184 dlg.Destroy()
185
186 ################################################################################
187
188 # Mapping from wx constants ro XML strings
189 fontFamiliesWx2Xml = {wxDEFAULT: 'default', wxDECORATIVE: 'decorative',
190 wxROMAN: 'roman', wxSCRIPT: 'script', wxSWISS: 'swiss',
191 wxMODERN: 'modern'}
192 fontStylesWx2Xml = {wxNORMAL: 'normal', wxSLANT: 'slant', wxITALIC: 'italic'}
193 fontWeightsWx2Xml = {wxNORMAL: 'normal', wxLIGHT: 'light', wxBOLD: 'bold'}
194 def ReverseMap(m):
195 rm = {}
196 for k,v in m.items(): rm[v] = k
197 return rm
198 fontFamiliesXml2wx = ReverseMap(fontFamiliesWx2Xml)
199 fontStylesXml2wx = ReverseMap(fontStylesWx2Xml)
200 fontWeightsXml2wx = ReverseMap(fontWeightsWx2Xml)
201
202 class ParamFont(PPanel):
203 def __init__(self, parent, name):
204 PPanel.__init__(self, parent, name)
205 self.ID_TEXT_CTRL = wxNewId()
206 self.ID_BUTTON_SELECT = wxNewId()
207 self.SetBackgroundColour(panel.GetBackgroundColour())
208 sizer = wxBoxSizer()
209 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
210 sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
211 self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...')
212 sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
213 self.SetAutoLayout(true)
214 self.SetSizer(sizer)
215 sizer.Fit(self)
216 self.textModified = false
217 EVT_BUTTON(self, self.ID_BUTTON_SELECT, self.OnButtonSelect)
218 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
219 def OnChange(self, evt):
220 if self.freeze: return
221 self.SetModified()
222 self.textModified = true
223 evt.Skip()
224 def _defaultValue(self):
225 return ['12', 'default', 'normal', 'normal', '0', '', '']
226 def GetValue(self):
227 if self.textModified: # text has newer value
228 try:
229 return eval(self.text.GetValue())
230 except SyntaxError:
231 wxLogError('Syntax error in parameter value: ' + self.GetName())
232 return self._defaultValue()
233 return self.value
234 def SetValue(self, value):
235 self.freeze = true # disable other handlers
236 if not value: value = self._defaultValue()
237 self.value = value
238 self.text.SetValue(str(value)) # update text ctrl
239 self.freeze = false
240 def OnButtonSelect(self, evt):
241 if self.textModified: # text has newer value
242 try:
243 self.value = eval(self.text.GetValue())
244 except SyntaxError:
245 wxLogError('Syntax error in parameter value: ' + self.GetName())
246 self.value = self._defaultValue()
247 # Make initial font
248 # Default values
249 size = 12
250 family = wxDEFAULT
251 style = weight = wxNORMAL
252 underlined = 0
253 face = ''
254 enc = wxFONTENCODING_DEFAULT
255 # Fall back to default if exceptions
256 error = false
257 try:
258 try: size = int(self.value[0])
259 except ValueError: error = true
260 try: family = fontFamiliesXml2wx[self.value[1]]
261 except KeyError: error = true
262 try: style = fontStylesXml2wx[self.value[2]]
263 except KeyError: error = true
264 try: weight = fontWeightsXml2wx[self.value[3]]
265 except KeyError: error = true
266 try: underlined = int(self.value[4])
267 except ValueError: error = true
268 face = self.value[5]
269 mapper = wxFontMapper()
270 if not self.value[6]: enc = mapper.CharsetToEncoding(self.value[6])
271 except IndexError:
272 error = true
273 if error: wxLogError('Invalid font specification')
274 if enc == wxFONTENCODING_DEFAULT: enc = wxFONTENCODING_SYSTEM
275 font = wxFont(size, family, style, weight, underlined, face, enc)
276 data = wxFontData()
277 data.SetInitialFont(font)
278 dlg = wxFontDialog(self, data)
279 if dlg.ShowModal() == wxID_OK:
280 font = dlg.GetFontData().GetChosenFont()
281 value = [str(font.GetPointSize()),
282 fontFamiliesWx2Xml.get(font.GetFamily(), "default"),
283 fontStylesWx2Xml.get(font.GetStyle(), "normal"),
284 fontWeightsWx2Xml.get(font.GetWeight(), "normal"),
285 str(font.GetUnderlined()),
286 font.GetFaceName(),
287 wxFontMapper_GetEncodingName(font.GetEncoding())
288 ]
289 # Add ignored flags
290 self.SetValue(value)
291 self.SetModified()
292 self.textModified = false
293 dlg.Destroy()
294
295 ################################################################################
296
297 class ParamInt(PPanel):
298 def __init__(self, parent, name):
299 PPanel.__init__(self, parent, name)
300 self.ID_SPIN_CTRL = wxNewId()
301 sizer = wxBoxSizer()
302 self.spin = wxSpinCtrl(self, self.ID_SPIN_CTRL, size=wxSize(50,-1))
303 self.SetBackgroundColour(panel.GetBackgroundColour())
304 sizer.Add(self.spin)
305 self.SetAutoLayout(true)
306 self.SetSizer(sizer)
307 sizer.Fit(self)
308 EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
309 def GetValue(self):
310 return str(self.spin.GetValue())
311 def SetValue(self, value):
312 self.freeze = true
313 if not value: value = 0
314 self.spin.SetValue(int(value))
315 self.freeze = false
316 def OnChange(self, evt):
317 if self.freeze: return
318 self.SetModified()
319 evt.Skip()
320
321 class ParamText(PPanel):
322 def __init__(self, parent, name, textWidth=200):
323 PPanel.__init__(self, parent, name)
324 self.ID_TEXT_CTRL = wxNewId()
325 # We use sizer even here to have the same size of text control
326 sizer = wxBoxSizer()
327 self.SetBackgroundColour(panel.GetBackgroundColour())
328 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(textWidth,-1))
329 sizer.Add(self.text, 0, wxALIGN_CENTER_VERTICAL)
330 self.SetAutoLayout(true)
331 self.SetSizer(sizer)
332 sizer.Fit(self)
333 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
334 def GetValue(self):
335 return self.text.GetValue()
336 def SetValue(self, value):
337 self.freeze = true # disable other handlers
338 self.text.SetValue(value)
339 self.freeze = false # disable other handlers
340 def OnChange(self, evt):
341 if self.freeze: return
342 self.SetModified()
343 evt.Skip()
344
345 class ParamAccel(ParamText):
346 def __init__(self, parent, name):
347 ParamText.__init__(self, parent, name, 50)
348
349 class ParamPosSize(ParamText):
350 def __init__(self, parent, name):
351 ParamText.__init__(self, parent, name, 80)
352
353 class ContentDialog(wxDialogPtr):
354 def __init__(self, parent, value):
355 # Is this normal???
356 w = frame.res.LoadDialog(parent, 'ID_DIALOG_CONTENT')
357 wxDialogPtr.__init__(self, w.this)
358 self.thisown = 1
359 self.Center()
360 self.list = self.FindWindowByName('ID_LIST')
361 # Set list items
362 for v in value:
363 self.list.Append(v)
364 self.SetAutoLayout(true)
365 self.GetSizer().Fit(self)
366 # Callbacks
367 self.ID_BUTTON_APPEND = XMLID('ID_BUTTON_APPEND')
368 self.ID_BUTTON_REMOVE = XMLID('ID_BUTTON_REMOVE')
369 self.ID_BUTTON_UP = XMLID('ID_BUTTON_UP')
370 self.ID_BUTTON_DOWN = XMLID('ID_BUTTON_DOWN')
371 EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
372 EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
373 EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
374 EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
375 EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
376 EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
377 EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
378 def OnButtonUp(self, evt):
379 i = self.list.GetSelection()
380 str = self.list.GetString(i)
381 self.list.Delete(i)
382 self.list.InsertItems([str], i-1)
383 self.list.SetSelection(i-1)
384 def OnButtonDown(self, evt):
385 i = self.list.GetSelection()
386 str = self.list.GetString(i)
387 self.list.Delete(i)
388 self.list.InsertItems([str], i+1)
389 self.list.SetSelection(i+1)
390 def OnButtonAppend(self, evt):
391 str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
392 self.list.Append(str)
393 def OnButtonRemove(self, evt):
394 self.list.Delete(self.list.GetSelection())
395 def OnUpdateUI(self, evt):
396 if evt.GetId() == self.ID_BUTTON_REMOVE:
397 evt.Enable(self.list.GetSelection() != -1)
398 elif evt.GetId() == self.ID_BUTTON_UP:
399 evt.Enable(self.list.GetSelection() > 0)
400 elif evt.GetId() == self.ID_BUTTON_DOWN:
401 evt.Enable(self.list.GetSelection() != -1 and \
402 self.list.GetSelection() < self.list.Number() - 1)
403
404 class ContentCheckListDialog(wxDialogPtr):
405 def __init__(self, parent, value):
406 # Is this normal???
407 w = frame.res.LoadDialog(parent, 'ID_DIALOG_CONTENT_CHECK_LIST')
408 wxDialogPtr.__init__(self, w.this)
409 self.thisown = 1
410 self.Center()
411 self.list = self.FindWindowByName('ID_CHECK_LIST')
412 # Set list items
413 i = 0
414 for v,ch in value:
415 self.list.Append(v)
416 self.list.Check(i, ch)
417 i += 1
418 self.SetAutoLayout(true)
419 self.GetSizer().Fit(self)
420 # Callbacks
421 self.ID_BUTTON_APPEND = XMLID('ID_BUTTON_APPEND')
422 self.ID_BUTTON_REMOVE = XMLID('ID_BUTTON_REMOVE')
423 self.ID_BUTTON_UP = XMLID('ID_BUTTON_UP')
424 self.ID_BUTTON_DOWN = XMLID('ID_BUTTON_DOWN')
425 EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
426 EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
427 EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
428 EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
429 EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
430 EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
431 EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
432 EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
433 def OnCheck(self, evt):
434 # !!! Wrong wxGTK (wxMSW?) behavior: toggling selection if checking
435 self.list.Deselect(evt.GetSelection())
436 def OnButtonUp(self, evt):
437 i = self.list.GetSelection()
438 str, ch = self.list.GetString(i), self.list.IsChecked(i)
439 self.list.Delete(i)
440 self.list.InsertItems([str], i-1)
441 self.list.Check(i-1, ch)
442 self.list.SetSelection(i-1)
443 def OnButtonDown(self, evt):
444 i = self.list.GetSelection()
445 str, ch = self.list.GetString(i), self.list.IsChecked(i)
446 self.list.Delete(i)
447 self.list.InsertItems([str], i+1)
448 self.list.Check(i+1, ch)
449 self.list.SetSelection(i+1)
450 def OnButtonAppend(self, evt):
451 str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
452 self.list.Append(str)
453 def OnButtonRemove(self, evt):
454 self.list.Delete(self.list.GetSelection())
455 def OnUpdateUI(self, evt):
456 if evt.GetId() == self.ID_BUTTON_REMOVE:
457 evt.Enable(self.list.GetSelection() != -1)
458 elif evt.GetId() == self.ID_BUTTON_UP:
459 evt.Enable(self.list.GetSelection() > 0)
460 elif evt.GetId() == self.ID_BUTTON_DOWN:
461 evt.Enable(self.list.GetSelection() != -1 and \
462 self.list.GetSelection() < self.list.Number() - 1)
463
464 class ParamContent(PPanel):
465 def __init__(self, parent, name):
466 PPanel.__init__(self, parent, name)
467 self.ID_TEXT_CTRL = wxNewId()
468 self.ID_BUTTON_EDIT = wxNewId()
469 self.SetBackgroundColour(panel.GetBackgroundColour())
470 sizer = wxBoxSizer()
471 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
472 sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
473 self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
474 sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
475 self.SetAutoLayout(true)
476 self.SetSizer(sizer)
477 sizer.Fit(self)
478 self.textModified = false
479 EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
480 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
481 def OnChange(self, evt):
482 if self.freeze: return
483 self.SetModified()
484 self.textModified = true
485 evt.Skip()
486 def GetValue(self):
487 if self.textModified: # text has newer value
488 try:
489 return eval(self.text.GetValue())
490 except SyntaxError:
491 wxLogError('Syntax error in parameter value: ' + self.GetName())
492 return []
493 return self.value
494 def SetValue(self, value):
495 self.freeze = true
496 self.value = value
497 self.text.SetValue(str(value)) # update text ctrl
498 self.freeze = false
499 def OnButtonEdit(self, evt):
500 if self.textModified: # text has newer value
501 try:
502 self.value = eval(self.text.GetValue())
503 except SyntaxError:
504 wxLogError('Syntax error in parameter value: ' + self.GetName())
505 self.value = []
506 dlg = ContentDialog(self, self.value)
507 if dlg.ShowModal() == wxID_OK:
508 value = []
509 for i in range(dlg.list.Number()):
510 value.append(dlg.list.GetString(i))
511 # Add ignored flags
512 self.SetValue(value)
513 self.SetModified()
514 self.textModified = false
515 dlg.Destroy()
516
517 # CheckList content
518 class ParamContentCheckList(PPanel):
519 def __init__(self, parent, name):
520 PPanel.__init__(self, parent, name)
521 self.ID_TEXT_CTRL = wxNewId()
522 self.ID_BUTTON_EDIT = wxNewId()
523 self.SetBackgroundColour(panel.GetBackgroundColour())
524 sizer = wxBoxSizer()
525 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
526 sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
527 self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
528 sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
529 self.SetAutoLayout(true)
530 self.SetSizer(sizer)
531 sizer.Fit(self)
532 self.textModified = false
533 EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
534 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
535 def OnChange(self, evt):
536 if self.freeze: return
537 self.SetModified()
538 self.textModified = true
539 evt.Skip()
540 def GetValue(self):
541 if self.textModified: # text has newer value
542 try:
543 return eval(self.text.GetValue())
544 except SyntaxError:
545 wxLogError('Syntax error in parameter value: ' + self.GetName())
546 return []
547 return self.value
548 def SetValue(self, value):
549 self.freeze = true
550 self.value = value
551 self.text.SetValue(str(value)) # update text ctrl
552 self.freeze = false
553 def OnButtonEdit(self, evt):
554 if self.textModified: # text has newer value
555 try:
556 self.value = eval(self.text.GetValue())
557 except SyntaxError:
558 wxLogError('Syntax error in parameter value: ' + self.GetName())
559 self.value = []
560 dlg = ContentCheckListDialog(self, self.value)
561 if dlg.ShowModal() == wxID_OK:
562 value = []
563 for i in range(dlg.list.Number()):
564 value.append((dlg.list.GetString(i), dlg.list.IsChecked(i)))
565 # Add ignored flags
566 self.SetValue(value)
567 self.SetModified()
568 self.textModified = false
569 dlg.Destroy()
570
571 # Boxless radiobox
572 class RadioBox(PPanel):
573 def __init__(self, parent, id, choices,
574 pos=wxDefaultPosition, name='radiobox'):
575 PPanel.__init__(self, parent, name)
576 self.SetBackgroundColour(panel.GetBackgroundColour())
577 self.choices = choices
578 topSizer = wxBoxSizer()
579 for i in choices:
580 button = wxRadioButton(self, -1, i, name=i)
581 topSizer.Add(button)
582 EVT_RADIOBUTTON(self, button.GetId(), self.OnRadioChoice)
583 self.SetAutoLayout(true)
584 self.SetSizer(topSizer)
585 topSizer.Fit(self)
586 def SetStringSelection(self, value):
587 self.freeze = true
588 for i in self.choices:
589 self.FindWindowByName(i).SetValue(i == value)
590 self.value = value
591 self.freeze = false
592 def OnRadioChoice(self, evt):
593 if self.freeze: return
594 if evt.GetSelection():
595 self.value = evt.GetEventObject().GetName()
596 self.SetModified()
597 def GetStringSelection(self):
598 return self.value
599
600 class ParamBool(RadioBox):
601 values = {'yes': '1', 'no': '0'}
602 seulav = {'1': 'yes', '0': 'no'}
603 def __init__(self, parent, name):
604 RadioBox.__init__(self, parent, -1, choices = self.values.keys(), name=name)
605 def GetValue(self):
606 return self.values[self.GetStringSelection()]
607 def SetValue(self, value):
608 if not value: value = '1'
609 self.SetStringSelection(self.seulav[value])
610
611 class ParamOrient(RadioBox):
612 values = {'horizontal': 'wxHORIZONTAL', 'vertical': 'wxVERTICAL'}
613 seulav = {'wxHORIZONTAL': 'horizontal', 'wxVERTICAL': 'vertical'}
614 def __init__(self, parent, name):
615 RadioBox.__init__(self, parent, -1, choices = self.values.keys(), name=name)
616 def GetValue(self):
617 return self.values[self.GetStringSelection()]
618 def SetValue(self, value):
619 if not value: value = 'wxHORIZONTAL'
620 self.SetStringSelection(self.seulav[value])
621
622 class ParamFile(PPanel):
623 def __init__(self, parent, name):
624 PPanel.__init__(self, parent, name)
625 self.ID_TEXT_CTRL = wxNewId()
626 self.ID_BUTTON_BROWSE = wxNewId()
627 self.SetBackgroundColour(panel.GetBackgroundColour())
628 sizer = wxBoxSizer()
629 self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
630 sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
631 self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...')
632 sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
633 self.SetAutoLayout(true)
634 self.SetSizer(sizer)
635 sizer.Fit(self)
636 self.textModified = false
637 EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
638 EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
639 def OnChange(self, evt):
640 if self.freeze: return
641 self.SetModified()
642 self.textModified = true
643 evt.Skip()
644 def GetValue(self):
645 if self.textModified: # text has newer value
646 return self.text.GetValue()
647 return self.value
648 def SetValue(self, value):
649 self.freeze = true
650 self.value = value
651 self.text.SetValue(value) # update text ctrl
652 self.freeze = false
653 def OnButtonBrowse(self, evt):
654 if self.textModified: # text has newer value
655 self.value = self.text.GetValue()
656 dlg = wxFileDialog(self,
657 defaultDir = os.path.dirname(self.value),
658 defaultFile = os.path.basename(self.value))
659 if dlg.ShowModal() == wxID_OK:
660 # Make relative
661 common = os.path.commonprefix([os.path.abspath(frame.dataFile),
662 dlg.GetPath()])
663 self.SetValue(dlg.GetPath()[len(common):])
664 self.SetModified()
665 self.textModified = false
666 dlg.Destroy()
667
668 paramDict = {
669 'flag': ParamFlag,
670 'style': ParamStyle, 'exstyle': ParamExStyle,
671 'pos': ParamPosSize, 'size': ParamPosSize,
672 'border': ParamInt, 'cols': ParamInt, 'rows': ParamInt,
673 'vgap': ParamInt, 'hgap': ParamInt,
674 'checkable': ParamBool, 'accel': ParamAccel,
675 'label': ParamText, 'title': ParamText, 'value': ParamText,
676 'content': ParamContent, 'selection': ParamInt,
677 'min': ParamInt, 'max': ParamInt,
678 'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
679 'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
680 'tooltip': ParamText, 'bitmap': ParamFile, 'icon': ParamFile,
681 }
682