1 from __future__ import absolute_import
4 import wx, os, sys, platform, types
6 from newui import validators
7 from newui import profile
14 class configWindowBase(wx.Frame):
15 "A base class for configuration dialogs. Handles creation of settings, and popups"
16 def __init__(self, title):
17 super(configWindowBase, self).__init__(None, title=title)
19 self.settingControlList = []
21 #Create the popup window
22 self.popup = wx.PopupWindow(self, flags=wx.BORDER_SIMPLE)
23 self.popup.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_INFOBK))
24 self.popup.setting = None
25 self.popup.text = wx.StaticText(self.popup, -1, '');
26 self.popup.sizer = wx.BoxSizer()
27 self.popup.sizer.Add(self.popup.text, flag=wx.EXPAND|wx.ALL, border=1)
28 self.popup.SetSizer(self.popup.sizer)
30 def CreateConfigTab(self, nb, name):
31 leftConfigPanel, rightConfigPanel, configPanel = self.CreateConfigPanel(nb)
32 nb.AddPage(configPanel, name)
33 return leftConfigPanel, rightConfigPanel
35 def CreateConfigPanel(self, parent):
36 configPanel = wx.Panel(parent);
37 leftConfigPanel = wx.Panel(configPanel)
38 rightConfigPanel = wx.Panel(configPanel)
39 sizer = wx.GridBagSizer(2, 2)
40 leftConfigPanel.SetSizer(sizer)
41 sizer = wx.GridBagSizer(2, 2)
42 rightConfigPanel.SetSizer(sizer)
43 sizer = wx.BoxSizer(wx.HORIZONTAL)
44 configPanel.SetSizer(sizer)
45 sizer.Add(leftConfigPanel)
46 sizer.Add(rightConfigPanel)
47 leftConfigPanel.main = self
48 rightConfigPanel.main = self
49 return leftConfigPanel, rightConfigPanel, configPanel
51 def OnPopupDisplay(self, setting):
52 self.popup.setting = setting
53 self.UpdatePopup(setting)
56 def OnPopupHide(self, e):
57 self.popup.Show(False)
59 def UpdatePopup(self, setting):
60 if self.popup.setting == setting:
61 if setting.validationMsg != '':
62 self.popup.text.SetLabel(setting.validationMsg + '\n\n' + setting.helpText)
64 self.popup.text.SetLabel(setting.helpText)
65 self.popup.text.Wrap(350)
67 if os.name == 'darwin':
68 x, y = self.ClientToScreenXY(0, 0)
69 sx, sy = self.GetClientSizeTuple()
71 x, y = setting.ctrl.ClientToScreenXY(0, 0)
72 sx, sy = setting.ctrl.GetSizeTuple()
73 #if platform.system() == "Windows":
74 # for some reason, under windows, the popup is relative to the main window... in some cases. (Wierd ass bug)
75 # wx, wy = self.ClientToScreenXY(0, 0)
78 self.popup.SetPosition((x, y+sy))
80 def updateProfileToControls(self):
81 "Update the configuration wx controls to show the new configuration settings"
82 for setting in self.settingControlList:
83 if setting.type == 'profile':
84 setting.SetValue(profile.getProfileSetting(setting.configName))
86 setting.SetValue(profile.getPreference(setting.configName))
89 def __init__(self, panel, name):
90 "Add a title row to the configuration panel"
91 sizer = panel.GetSizer()
93 self.title = wx.StaticText(panel, -1, name)
94 self.title.SetFont(wx.Font(wx.SystemSettings.GetFont(wx.SYS_ANSI_VAR_FONT).GetPointSize(), wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD))
95 sizer.Add(self.title, (x,0), (1,3), flag=wx.EXPAND)
96 sizer.Add(wx.StaticLine(panel), (x+1,0), (1,3), flag=wx.EXPAND)
100 def __init__(self, panel, label, configName, defaultValue = '', helpText = 'Help: TODO', type = 'profile'):
101 "Add a setting to the configuration panel"
102 sizer = panel.GetSizer()
107 self.validationMsg = ''
108 self.helpText = helpText
109 self.configName = configName
113 self.label = wx.StaticText(panel, -1, label)
114 getSettingFunc = profile.getPreference
115 if self.type == 'profile':
116 getSettingFunc = profile.getProfileSetting
117 if isinstance(defaultValue, types.StringTypes):
118 self.ctrl = wx.TextCtrl(panel, -1, getSettingFunc(configName))
119 self.ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
120 elif isinstance(defaultValue, types.BooleanType):
121 self.ctrl = wx.CheckBox(panel, -1, style=wx.ALIGN_RIGHT)
122 self.SetValue(getSettingFunc(configName))
123 self.ctrl.Bind(wx.EVT_CHECKBOX, self.OnSettingChange)
125 self.ctrl = wx.ComboBox(panel, -1, getSettingFunc(configName), choices=defaultValue, style=wx.CB_DROPDOWN|wx.CB_READONLY)
126 self.ctrl.Bind(wx.EVT_COMBOBOX, self.OnSettingChange)
128 sizer.Add(self.label, (x,y), flag=wx.ALIGN_CENTER_VERTICAL)
129 sizer.Add(self.ctrl, (x,y+1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
132 if os.name == 'darwin':
133 self.ctrl.Bind(wx.EVT_SET_FOCUS, self.OnMouseEnter)
134 self.ctrl.Bind(wx.EVT_KILL_FOCUS, self.OnMouseExit)
136 self.ctrl.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter)
137 self.ctrl.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseExit)
139 self.defaultBGColour = self.ctrl.GetBackgroundColour()
141 panel.main.settingControlList.append(self)
143 def OnMouseEnter(self, e):
144 self.panel.main.OnPopupDisplay(self)
146 def OnMouseExit(self, e):
147 self.panel.main.OnPopupHide(self)
149 def OnSettingChange(self, e):
150 if self.type == 'profile':
151 profile.putProfileSetting(self.configName, self.GetValue())
153 profile.putPreference(self.configName, self.GetValue())
154 result = validators.SUCCESS
156 for validator in self.validators:
157 res, err = validator.validate()
158 if res == validators.ERROR:
160 elif res == validators.WARNING and result != validators.ERROR:
162 if res != validators.SUCCESS:
164 if result == validators.ERROR:
165 self.ctrl.SetBackgroundColour('Red')
166 elif result == validators.WARNING:
167 self.ctrl.SetBackgroundColour('Yellow')
169 self.ctrl.SetBackgroundColour(self.defaultBGColour)
172 self.validationMsg = '\n'.join(msgs)
173 self.panel.main.UpdatePopup(self)
176 return str(self.ctrl.GetValue())
178 def SetValue(self, value):
179 if isinstance(self.ctrl, wx.CheckBox):
180 self.ctrl.SetValue(str(value) == "True")
182 self.ctrl.SetValue(value)
184 #Settings notify works as a validator, but instead of validating anything, it calls another function, which can use the value.
185 # A bit hacky, bit it works.
186 class settingNotify():
187 def __init__(self, setting, func):
188 self.setting = setting
189 self.setting.validators.append(self)
194 f = float(self.setting.GetValue())
196 return validators.SUCCESS, ''
199 return validators.SUCCESS, ''