2 # Purpose: Classes for parameter introduction
3 # Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
7 from wxPython
.wx
import *
8 from wxPython
.xrc
import *
12 # Object which is currently processed
14 def SetCurrentXXX(xxx
):
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']
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():
33 wxPanel
.Enable(self
, value
)
34 def SetModified(self
):
36 panel
.SetModified(true
)
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())
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
)
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
59 return self
.text
.GetValue()
60 def SetValue(self
, value
):
62 self
.text
.SetValue(value
)
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
= []
73 listBox
.Check(self
.values
.index(i
))
76 if self
.equal
.has_key(i
):
77 listBox
.Check(self
.values
.index(self
.equal
[i
]))
79 print 'WARNING: unknown flag: %s: ignored.' % i
81 topSizer
.Add(listBox
, 1, wxEXPAND
)
83 buttonOk
= wxButton(dlg
, wxID_OK
, 'OK')
85 sizer
.Add(buttonOk
, 0, wxRIGHT
, 10)
87 sizer
.Add(wxButton(dlg
, wxID_CANCEL
, 'Cancel'))
88 topSizer
.Add(sizer
, 0, wxALL | wxEXPAND
, 10)
89 dlg
.SetAutoLayout(true
)
90 dlg
.SetSizer(topSizer
)
93 if dlg
.ShowModal() == wxID_OK
:
95 for i
in range(listBox
.Number()):
96 if listBox
.IsChecked(i
):
97 value
.append(self
.values
[i
])
101 self
.SetValue(reduce(lambda a
,b
: a
+'|'+b
, value
))
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
)
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
)
124 class ParamNonGenericStyle(ParamBinaryOr
):
125 def __init__(self
, parent
, name
):
126 self
.values
= currentXXX
.winStyles
127 ParamBinaryOr
.__init
__(self
, parent
, name
)
129 class ParamExStyle(ParamBinaryOr
):
130 def __init__(self
, parent
, name
):
132 self
.values
= currentXXX
.exStyles
# constant at the moment
135 ParamBinaryOr
.__init
__(self
, parent
, name
)
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())
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
)
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
)
157 def SetValue(self
, value
):
159 if not value
: value
= '#FFFFFF'
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()
166 def OnChange(self
, evt
):
167 if self
.freeze
: return
169 self
.textModified
= true
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())
183 self
.textModified
= false
186 ################################################################################
188 # Mapping from wx constants ro XML strings
189 fontFamiliesWx2Xml
= {wxDEFAULT
: 'default', wxDECORATIVE
: 'decorative',
190 wxROMAN
: 'roman', wxSCRIPT
: 'script', wxSWISS
: 'swiss',
192 fontStylesWx2Xml
= {wxNORMAL: 'normal', wxSLANT: 'slant', wxITALIC: 'italic'}
193 fontWeightsWx2Xml
= {wxNORMAL: 'normal', wxLIGHT: 'light', wxBOLD: 'bold'}
196 for k
,v
in m
.items(): rm
[v
] = k
198 fontFamiliesXml2wx
= ReverseMap(fontFamiliesWx2Xml
)
199 fontStylesXml2wx
= ReverseMap(fontStylesWx2Xml
)
200 fontWeightsXml2wx
= ReverseMap(fontWeightsWx2Xml
)
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())
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
)
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
222 self
.textModified
= true
224 def _defaultValue(self
):
225 return ['12', 'default', 'normal', 'normal', '0', '', '']
227 if self
.textModified
: # text has newer value
229 return eval(self
.text
.GetValue())
231 wxLogError('Syntax error in parameter value: ' + self
.GetName())
232 return self
._defaultValue
()
234 def SetValue(self
, value
):
235 self
.freeze
= true
# disable other handlers
236 if not value
: value
= self
._defaultValue
()
238 self
.text
.SetValue(str(value
)) # update text ctrl
240 def OnButtonSelect(self
, evt
):
241 if self
.textModified
: # text has newer value
243 self
.value
= eval(self
.text
.GetValue())
245 wxLogError('Syntax error in parameter value: ' + self
.GetName())
246 self
.value
= self
._defaultValue
()
251 style
= weight
= wxNORMAL
254 enc
= wxFONTENCODING_DEFAULT
255 # Fall back to default if exceptions
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
269 mapper
= wxFontMapper()
270 if not self
.value
[6]: enc
= mapper
.CharsetToEncoding(self
.value
[6])
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
)
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()),
287 wxFontMapper_GetEncodingName(font
.GetEncoding())
292 self
.textModified
= false
295 ################################################################################
297 class ParamInt(PPanel
):
298 def __init__(self
, parent
, name
):
299 PPanel
.__init
__(self
, parent
, name
)
300 self
.ID_SPIN_CTRL
= wxNewId()
302 self
.spin
= wxSpinCtrl(self
, self
.ID_SPIN_CTRL
, size
=wxSize(50,-1))
303 self
.SetBackgroundColour(panel
.GetBackgroundColour())
305 self
.SetAutoLayout(true
)
308 EVT_SPINCTRL(self
, self
.ID_SPIN_CTRL
, self
.OnChange
)
310 return str(self
.spin
.GetValue())
311 def SetValue(self
, value
):
313 if not value
: value
= 0
314 self
.spin
.SetValue(int(value
))
316 def OnChange(self
, evt
):
317 if self
.freeze
: return
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
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
)
333 EVT_TEXT(self
, self
.ID_TEXT_CTRL
, self
.OnChange
)
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
345 class ParamAccel(ParamText
):
346 def __init__(self
, parent
, name
):
347 ParamText
.__init
__(self
, parent
, name
, 50)
349 class ParamPosSize(ParamText
):
350 def __init__(self
, parent
, name
):
351 ParamText
.__init
__(self
, parent
, name
, 80)
353 class ContentDialog(wxDialogPtr
):
354 def __init__(self
, parent
, value
):
356 w
= frame
.res
.LoadDialog(parent
, 'ID_DIALOG_CONTENT')
357 wxDialogPtr
.__init
__(self
, w
.this
)
360 self
.list = self
.FindWindowByName('ID_LIST')
364 self
.SetAutoLayout(true
)
365 self
.GetSizer().Fit(self
)
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
)
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
)
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)
404 class ContentCheckListDialog(wxDialogPtr
):
405 def __init__(self
, parent
, value
):
407 w
= frame
.res
.LoadDialog(parent
, 'ID_DIALOG_CONTENT_CHECK_LIST')
408 wxDialogPtr
.__init
__(self
, w
.this
)
411 self
.list = self
.FindWindowByName('ID_CHECK_LIST')
416 self
.list.Check(i
, ch
)
418 self
.SetAutoLayout(true
)
419 self
.GetSizer().Fit(self
)
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
)
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
)
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)
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())
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
)
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
484 self
.textModified
= true
487 if self
.textModified
: # text has newer value
489 return eval(self
.text
.GetValue())
491 wxLogError('Syntax error in parameter value: ' + self
.GetName())
494 def SetValue(self
, value
):
497 self
.text
.SetValue(str(value
)) # update text ctrl
499 def OnButtonEdit(self
, evt
):
500 if self
.textModified
: # text has newer value
502 self
.value
= eval(self
.text
.GetValue())
504 wxLogError('Syntax error in parameter value: ' + self
.GetName())
506 dlg
= ContentDialog(self
, self
.value
)
507 if dlg
.ShowModal() == wxID_OK
:
509 for i
in range(dlg
.list.Number()):
510 value
.append(dlg
.list.GetString(i
))
514 self
.textModified
= false
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())
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
)
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
538 self
.textModified
= true
541 if self
.textModified
: # text has newer value
543 return eval(self
.text
.GetValue())
545 wxLogError('Syntax error in parameter value: ' + self
.GetName())
548 def SetValue(self
, value
):
551 self
.text
.SetValue(str(value
)) # update text ctrl
553 def OnButtonEdit(self
, evt
):
554 if self
.textModified
: # text has newer value
556 self
.value
= eval(self
.text
.GetValue())
558 wxLogError('Syntax error in parameter value: ' + self
.GetName())
560 dlg
= ContentCheckListDialog(self
, self
.value
)
561 if dlg
.ShowModal() == wxID_OK
:
563 for i
in range(dlg
.list.Number()):
564 value
.append((dlg
.list.GetString(i
), dlg
.list.IsChecked(i
)))
568 self
.textModified
= false
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()
580 button
= wxRadioButton(self
, -1, i
, name
=i
)
582 EVT_RADIOBUTTON(self
, button
.GetId(), self
.OnRadioChoice
)
583 self
.SetAutoLayout(true
)
584 self
.SetSizer(topSizer
)
586 def SetStringSelection(self
, value
):
588 for i
in self
.choices
:
589 self
.FindWindowByName(i
).SetValue(i
== value
)
592 def OnRadioChoice(self
, evt
):
593 if self
.freeze
: return
594 if evt
.GetSelection():
595 self
.value
= evt
.GetEventObject().GetName()
597 def GetStringSelection(self
):
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
)
606 return self
.values
[self
.GetStringSelection()]
607 def SetValue(self
, value
):
608 if not value
: value
= '1'
609 self
.SetStringSelection(self
.seulav
[value
])
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
)
617 return self
.values
[self
.GetStringSelection()]
618 def SetValue(self
, value
):
619 if not value
: value
= 'wxHORIZONTAL'
620 self
.SetStringSelection(self
.seulav
[value
])
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())
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
)
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
642 self
.textModified
= true
645 if self
.textModified
: # text has newer value
646 return self
.text
.GetValue()
648 def SetValue(self
, value
):
651 self
.text
.SetValue(value
) # update text ctrl
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
:
661 common
= os
.path
.commonprefix([os
.path
.abspath(frame
.dataFile
),
663 self
.SetValue(dlg
.GetPath()[len(common
):])
665 self
.textModified
= false
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
,