Source code for xrc_dialog
'''
XRCDialog
by Patrick Ruoff in 2012
'''
import wx
from wx import xrc
from copy import deepcopy
UPDATE_ON_CHANGE = 1
UPDATE_ON_DIALOG_END = 2
def _GetUpdateEvent(ctrl):
if issubclass(type(ctrl), wx.TextCtrl):
return wx.EVT_KILL_FOCUS;
elif issubclass(type(ctrl), wx.ComboBox):
return wx.EVT_COMBOBOX;
elif issubclass(type(ctrl), wx.Slider):
return wx.EVT_SLIDER;
elif issubclass(type(ctrl), wx.Choice):
return wx.EVT_CHOICE;
elif issubclass(type(ctrl), wx.ListBox):
return wx.EVT_LISTBOX;
elif issubclass(type(ctrl), wx.SpinCtrl):
return wx.EVT_SPINCTRL;
elif issubclass(type(ctrl), wx.RadioBox):
return wx.EVT_RADIOBOX;
elif issubclass(type(ctrl), wx.CheckBox):
return wx.EVT_CHECKBOX;
[docs]class CXrcDialog(object):
""" A dialog loaded from an XRC resource file """
dlg = None; # the dialog instance
update_callback = None; # callback function
update_policies = []; # list of update policies
active_update_policy = -1; # index of active update policy
def __init__(self, xrc_path, parent, dialog_data, shadow_data = True,
update_callback = None, update_callback_policy = UPDATE_ON_DIALOG_END,
validators = {}, event_handlers = {}, ):
""" Create an XRC dialog. """
# load resource
xrc_res = xrc.XmlResource(xrc_path)
# load dialog
self.dlg = xrc_res.LoadDialog(parent, 'Dialog')
self.dlg.Fit()
# override OnOK
self.dlg.Bind(wx.EVT_BUTTON, self.OnOK, self.GetControl('wxID_OK'))
# set update policies
self.update_callback = update_callback;
self.update_callback_policy = update_callback_policy;
# set dialog data
self.shadow_data = shadow_data;
if shadow_data:
self.original_dialog_data = dialog_data;
self.dialog_data = deepcopy(dialog_data);
else:
self.dialog_data = dialog_data;
# set validators
self.SetValidators(validators);
# add event handlers
self.AddEventHandlers(event_handlers);
[docs] def GetControl(self, name):
return xrc.XRCCTRL(self.dlg, name);
[docs] def GetValidator(self, name):
ctrl = self.GetControl(name);
return ctrl.GetValidator();
[docs] def SetValidators(self, validators):
for ctrl_name, validator in validators.items():
validator.SetData(self.dialog_data);
ctrl = self.GetControl(ctrl_name);
ctrl.SetValidator(validator);
evt = _GetUpdateEvent(ctrl);
self._BindUpdateEvent(ctrl, evt);
def _BindUpdateEvent(self, ctrl, evt):
ctrl.Bind(evt, lambda e : self.UpdateCtrl(ctrl) );
[docs] def AddEventHandlers(self, event_handlers):
for event_handler in event_handlers:
self.GetControl(event_handler[0]).Bind(event_handler[1], event_handler[2]);
[docs] def SetUpdateCallback(self, update_callback):
self.update_callback = update_callback;
[docs] def SetUpdateCallbackPolicy(self, update_freq):
self.update_callback_policy = update_freq;
[docs] def UpdateCtrl(self, ctrl):
""" cause the control *ctrl* to update the dialog data """
validator = ctrl.GetValidator();
validator.Validate(ctrl);
validator.TransferFromWindow();
self.dlg.TransferDataToWindow();
self.CallUpdate();
[docs] def CallUpdate(self):
if self.update_callback and self.update_callback_policy != UPDATE_ON_DIALOG_END:
self.update_callback(self.dialog_data);
[docs] def OnOK(self, event):
if self.dlg.IsModal():
self.dlg.EndModal(wx.ID_OK);
else:
self.dlg.SetReturnCode(wx.ID_OK);
self.dlg.Show(False);
[docs] def ShowModal(self):
if self.shadow_data:
self._LoadData()
ret = self.dlg.ShowModal();
if ret == wx.ID_OK: self._SaveData();
return ret;
else:
return self.dlg.ShowModal();
def _LoadData(self):
for key in self.original_dialog_data.keys():
self.dialog_data[key] = self.original_dialog_data[key];
def _SaveData(self):
for key in self.original_dialog_data.keys():
self.original_dialog_data[key] = self.dialog_data[key];
[docs] def Show(self):
return self.dlg.Show();
[docs] def Destroy(self):
return self.dlg.Destroy();
[docs]def RegisterPreviewCheckboxHandler(xrc_dlg):
def OnChangePreview(event):
if event.GetInt() == True:
xrc_dlg.SetUpdateCallbackPolicy(UPDATE_ON_CHANGE)
xrc_dlg.CallUpdate();
else:
xrc_dlg.SetUpdateCallbackPolicy(UPDATE_ON_DIALOG_END)
event_handlers = [('m_preview', wx.EVT_CHECKBOX, OnChangePreview)]
xrc_dlg.AddEventHandlers(event_handlers);