+class ParamFile(PPanel):
+ def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
+ PPanel.__init__(self, parent, id, name)
+ self.ID_TEXT_CTRL = wxNewId()
+ self.ID_BUTTON_BROWSE = wxNewId()
+ self.SetBackgroundColour(panel.GetBackgroundColour())
+ sizer = wxBoxSizer()
+ self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
+ sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
+ self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...')
+ sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
+ self.SetAutoLayout(true)
+ self.SetSizer(sizer)
+ sizer.Fit(self)
+ self.textModified = false
+ EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
+ EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
+ def OnChange(self, evt):
+ if self.freeze: return
+ self.SetModified()
+ self.textModified = true
+ evt.Skip()
+ def GetValue(self):
+ if self.textModified: # text has newer value
+ return eval(self.text.GetValue())
+ return self.value
+ def SetValue(self, value):
+ self.freeze = true
+ self.value = value
+ self.text.SetValue(value) # update text ctrl
+ self.freeze = false
+ def OnButtonBrowse(self, evt):
+ if self.textModified: # text has newer value
+ self.value = self.text.GetValue()
+ dlg = wxFileDialog(self,
+ defaultDir = os.path.abspath(os.path.dirname(self.value)),
+ defaultFile = os.path.basename(self.value))
+ if dlg.ShowModal() == wxID_OK:
+ # Make relative
+ common = os.path.commonprefix([frame.dataFile, dlg.GetPath()])
+ self.SetValue(dlg.GetPath()[len(common):])
+ self.SetModified()
+ self.textModified = false
+ dlg.Destroy()
+