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);