blob: 677567f0a1d67ea9bec6d835540d6c973c13dc0d [file] [log] [blame]
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001##---------------------------------------------------------------------------##
2##
3## idle - configuration dialog
4## elguavas
5##
6##---------------------------------------------------------------------------##
7"""
8configuration dialog
9"""
10from Tkinter import *
11import tkMessageBox
12
Steven M. Gava60fc7072001-08-04 13:58:22 +000013import IdleConf
14
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000015class ConfigDialog(Toplevel):
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000016 """
Steven M. Gavad721c482001-07-31 10:46:53 +000017 configuration dialog for idle
18 """
19 def __init__(self,parent,title,configDict):
20 """
21 configDict - dictionary of configuration items
22 """
23 Toplevel.__init__(self, parent)
24 self.configure(borderwidth=5)
25 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
26 parent.winfo_rooty()+30))
Steven M. Gava60fc7072001-08-04 13:58:22 +000027 self.LoadConfig()
Steven M. Gavad721c482001-07-31 10:46:53 +000028 #elguavas - config placeholders til config stuff completed
29 self.bg=self.cget('bg')
30 self.fg=None
31 #no ugly bold default text font on *nix
32 self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',)
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000033
Steven M. Gavad721c482001-07-31 10:46:53 +000034 self.CreateWidgets()
35 self.resizable(height=FALSE,width=FALSE)
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000036 self.ChangePage()
Steven M. Gavad721c482001-07-31 10:46:53 +000037 self.transient(parent)
38 self.grab_set()
39 self.protocol("WM_DELETE_WINDOW", self.Cancel)
40 self.parent = parent
41 self.framePages.focus_set()
42 #key bindings for this dialog
Steven M. Gavad721c482001-07-31 10:46:53 +000043 self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save
44 self.bind('<Alt-s>',self.SaveBinding) #dismiss dialog, save
Steven M. Gava952d0a52001-08-03 04:43:44 +000045 self.bind('<F1>',self.HelpBinding) #context help
Steven M. Gavad721c482001-07-31 10:46:53 +000046 self.bind('<Alt-f>',self.ChangePageBinding)
Steven M. Gava952d0a52001-08-03 04:43:44 +000047 self.bind('<Alt-h>',self.ChangePageBinding)
Steven M. Gavad721c482001-07-31 10:46:53 +000048 self.bind('<Alt-k>',self.ChangePageBinding)
49 self.bind('<Alt-g>',self.ChangePageBinding)
50 self.wait_window()
51
Steven M. Gava60fc7072001-08-04 13:58:22 +000052 def LoadConfig(self):
53 #self.configParser=IdleConf.idleconf
54 #self.loadedConfig={}
55 #self.workingConfig={}
56 #for key in .keys():
57 #print self.configParser.getsection('Colors').options()
58 self.workingTestColours={
59 'Foo-Bg': '#ffffff',
60 'Foo-Fg': '#000000',
61 'Bar-Bg': '#777777'}
62
Steven M. Gavad721c482001-07-31 10:46:53 +000063 def Cancel(self):
64 self.destroy()
65
66 def Save(self):
67 pass
68
Steven M. Gava952d0a52001-08-03 04:43:44 +000069 def Help(self):
Steven M. Gavad721c482001-07-31 10:46:53 +000070 pass
71
Steven M. Gavad721c482001-07-31 10:46:53 +000072 def CancelBinding(self,event):
73 self.Cancel()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000074
Steven M. Gavad721c482001-07-31 10:46:53 +000075 def SaveBinding(self,event):
76 self.Save()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000077
Steven M. Gava952d0a52001-08-03 04:43:44 +000078 def HelpBinding(self,event):
79 self.Help()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000080
Steven M. Gava952d0a52001-08-03 04:43:44 +000081 def ChangePage(self):
82 self.pages[self.pageNum.get()].lift()
Steven M. Gava60fc7072001-08-04 13:58:22 +000083 self.title('Settings - '+self.pageButtons[self.pageNum.get()].cget('text'))
Steven M. Gava952d0a52001-08-03 04:43:44 +000084
Steven M. Gavad721c482001-07-31 10:46:53 +000085 def ChangePageBinding(self,event):
Steven M. Gava952d0a52001-08-03 04:43:44 +000086 pageKeys=('f','h','k','g')
Steven M. Gavad721c482001-07-31 10:46:53 +000087 pos=0
88 for key in pageKeys:
89 if event.char == key:
90 self.pageNum.set(pos)
91 self.ChangePage()
92 return
93 pos=pos+1
94
Steven M. Gava952d0a52001-08-03 04:43:44 +000095 def SetThemeType(self):
96 if self.themeType.get()==0:
97 self.optMenuThemeBuiltin.config(state=NORMAL)
98 self.optMenuThemeCustom.config(state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +000099 self.buttonDeleteCustomTheme.config(state=DISABLED)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000100 elif self.themeType.get()==1:
101 self.optMenuThemeBuiltin.config(state=DISABLED)
102 self.optMenuThemeCustom.config(state=NORMAL)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000103 self.buttonDeleteCustomTheme.config(state=NORMAL)
104
105 def SetKeysType(self):
106 if self.keysType.get()==0:
107 self.optMenuKeysBuiltin.config(state=NORMAL)
108 self.optMenuKeysCustom.config(state=DISABLED)
109 self.buttonDeleteCustomKeys.config(state=DISABLED)
110 elif self.keysType.get()==1:
111 self.optMenuKeysBuiltin.config(state=DISABLED)
112 self.optMenuKeysCustom.config(state=NORMAL)
113 self.buttonDeleteCustomKeys.config(state=NORMAL)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000114
Steven M. Gavad721c482001-07-31 10:46:53 +0000115 def CreateWidgets(self):
Steven M. Gava952d0a52001-08-03 04:43:44 +0000116 self.framePages = Frame(self)
Steven M. Gavad721c482001-07-31 10:46:53 +0000117 frameActionButtons = Frame(self)
118 framePageButtons = Frame(self.framePages,borderwidth=1,relief=SUNKEN)
119 #action buttons
Steven M. Gava952d0a52001-08-03 04:43:44 +0000120 self.buttonHelp = Button(frameActionButtons,text='Help',
121 command=self.Help,takefocus=FALSE)
122 self.buttonSave = Button(frameActionButtons,text='Save, Apply and Exit',
Steven M. Gavad721c482001-07-31 10:46:53 +0000123 command=self.Save,underline=0,takefocus=FALSE)
124 self.buttonCancel = Button(frameActionButtons,text='Cancel',
125 command=self.Cancel,takefocus=FALSE)
126 #page buttons
127 self.pageNum=IntVar()
128 self.pageNum.set(0)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000129 buttonPageFontTab = Radiobutton(framePageButtons,value=0,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000130 text='Font/Tabs',padx=5,pady=5)
131 buttonPageHighlight = Radiobutton(framePageButtons,value=1,
132 text='Highlighting',padx=5,pady=5)
133 buttonPageKeys = Radiobutton(framePageButtons,value=2,
134 text='Keys',padx=5,pady=5)
135 buttonPageGeneral = Radiobutton(framePageButtons,value=3,
136 text='General',padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000137 self.pageButtons=(buttonPageFontTab,buttonPageHighlight,
Steven M. Gavad721c482001-07-31 10:46:53 +0000138 buttonPageKeys,buttonPageGeneral)
139 for button in self.pageButtons:
140 button.config(command=self.ChangePage,underline=0,takefocus=FALSE,
141 indicatoron=FALSE,highlightthickness=0,variable=self.pageNum,
142 selectcolor=self.bg,borderwidth=1)
143 button.pack(side=LEFT)
144 #pages
Steven M. Gava60fc7072001-08-04 13:58:22 +0000145 self.pages=(self.CreatePageFontTab(),
Steven M. Gava952d0a52001-08-03 04:43:44 +0000146 self.CreatePageHighlight(),
147 self.CreatePageKeys(),
148 self.CreatePageGeneral())
149
Steven M. Gavad721c482001-07-31 10:46:53 +0000150 #grid in framePages so we can overlap pages
151 framePageButtons.grid(row=0,column=0,sticky=W)
152 for page in self.pages: page.grid(row=1,column=0,sticky=(N,S,E,W))
153
Steven M. Gava952d0a52001-08-03 04:43:44 +0000154 self.buttonHelp.pack(side=RIGHT,padx=20,pady=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000155 self.buttonSave.pack(side=LEFT,padx=5,pady=5)
156 self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
157 frameActionButtons.pack(side=BOTTOM)
158 self.framePages.pack(side=TOP,expand=TRUE,fill=BOTH)
159
Steven M. Gava60fc7072001-08-04 13:58:22 +0000160 def CreatePageFontTab(self):
Steven M. Gava952d0a52001-08-03 04:43:44 +0000161 frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000162 Button(frame,text='font/tabs page test').pack(padx=90,pady=90)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000163 return frame
164
165 def CreatePageHighlight(self):
166 #tkVars
Steven M. Gava60fc7072001-08-04 13:58:22 +0000167 self.highlightTarget=StringVar()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000168 self.builtinTheme=StringVar()
169 self.customTheme=StringVar()
170 self.colour=StringVar()
171 self.fontName=StringVar()
172 self.fontBold=StringVar()
173 self.fontItalic=StringVar()
174 self.fontSize=IntVar()
175 self.themeType=IntVar()
176 ##widget creation
177 #body frame
178 frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN)
179 #body section frames
180 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
181 frameTheme=Frame(frame,borderwidth=2,relief=GROOVE)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000182 #frameCustom
183 frameTarget=Frame(frameCustom)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000184 frameSample=Frame(frameCustom,relief=SOLID,borderwidth=1,
185 bg=self.workingTestColours['Foo-Bg'])
Steven M. Gava952d0a52001-08-03 04:43:44 +0000186 frameSet=Frame(frameCustom)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000187 frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1,
188 bg=self.workingTestColours['Foo-Bg'])
Steven M. Gava952d0a52001-08-03 04:43:44 +0000189 frameFontSet=Frame(frameSet)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000190 labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting')
191 labelTargetTitle=Label(frameTarget,text='for : ')
192 optMenuTarget=OptionMenu(frameTarget,
Steven M. Gava60fc7072001-08-04 13:58:22 +0000193 self.highlightTarget,'test target interface item','test target interface item 2')
194 self.highlightTarget.set('test target interface item')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000195 buttonSetColour=Button(frameColourSet,text='Set Colour')
196 labelFontTitle=Label(frameFontSet,text='Set Font Style')
197 checkFontBold=Checkbutton(frameFontSet,variable=self.fontBold,
198 onvalue='Bold',offvalue='',text='Bold')
199 checkFontItalic=Checkbutton(frameFontSet,variable=self.fontItalic,
200 onvalue='Italic',offvalue='',text='Italic')
201 labelTestSample=Label(frameSample,justify=LEFT,
Steven M. Gava60fc7072001-08-04 13:58:22 +0000202 text='def Ahem(foo,bar):\n test=foo\n text=bar\n return',
203 bg=self.workingTestColours['Foo-Bg'])
204 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000205 text='Save as a Custom Theme')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000206 #frameTheme
207 #frameDivider=Frame(frameTheme,relief=SUNKEN,borderwidth=1,
208 # width=2,height=10)
209 labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme')
210 labelTypeTitle=Label(frameTheme,text='Select : ')
211 radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeType,
212 value=0,command=self.SetThemeType,text='a Built-in Theme')
213 radioThemeCustom=Radiobutton(frameTheme,variable=self.themeType,
214 value=1,command=self.SetThemeType,text='a Custom Theme')
215 self.optMenuThemeBuiltin=OptionMenu(frameTheme,
216 self.builtinTheme,'test builtin junk','test builtin junk 2')
217 self.builtinTheme.set('test builtin junk')
218 self.optMenuThemeCustom=OptionMenu(frameTheme,
219 self.customTheme,'test custom junk','test custom junk 2')
220 self.customTheme.set('test custom junk')
221 self.themeType.set(0)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000222 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000223 self.SetThemeType()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000224 ##widget packing
225 #body
Steven M. Gava60fc7072001-08-04 13:58:22 +0000226 frameCustom.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
227 frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000228 #frameCustom
229 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
230 frameTarget.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
231 frameSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
232 frameSet.pack(side=TOP,fill=X)
233 frameColourSet.pack(side=LEFT,padx=5,pady=5,fill=BOTH)
234 frameFontSet.pack(side=RIGHT,padx=5,pady=5,anchor=W)
235 labelTargetTitle.pack(side=LEFT,anchor=E)
236 optMenuTarget.pack(side=RIGHT,anchor=W,fill=X,expand=TRUE)
237 buttonSetColour.pack(expand=TRUE,fill=BOTH,padx=10,pady=10)
238 labelFontTitle.pack(side=TOP,anchor=W)
239 checkFontBold.pack(side=LEFT,anchor=W,pady=2)
240 checkFontItalic.pack(side=RIGHT,anchor=W)
241 labelTestSample.pack()
Steven M. Gava60fc7072001-08-04 13:58:22 +0000242 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000243 #frameTheme
244 #frameDivider.pack(side=LEFT,fill=Y,padx=5,pady=5)
245 labelThemeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
246 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
247 radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
248 radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
249 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
250 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000251 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000252 return frame
253
254 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000255 #tkVars
256 self.bindingTarget=StringVar()
257 self.builtinKeys=StringVar()
258 self.customKeys=StringVar()
259 self.keyChars=StringVar()
260 self.keyCtrl=StringVar()
261 self.keyAlt=StringVar()
262 self.keyShift=StringVar()
263 self.keysType=IntVar()
264 ##widget creation
265 #body frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000266 frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000267 #body section frames
268 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
269 frameKeySets=Frame(frame,borderwidth=2,relief=GROOVE)
270 #frameCustom
271 frameTarget=Frame(frameCustom)
272 frameSet=Frame(frameCustom)
273 labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings')
274 labelTargetTitle=Label(frameTarget,text='Action')
275 scrollTarget=Scrollbar(frameTarget)
276 listTarget=Listbox(frameTarget)
277 labelKeyBindTitle=Label(frameSet,text='Binding')
278 labelModifierTitle=Label(frameSet,text='Modifier:')
279 checkCtrl=Checkbutton(frameSet,text='Ctrl')
280 checkAlt=Checkbutton(frameSet,text='Alt')
281 checkShift=Checkbutton(frameSet,text='Shift')
282 labelKeyEntryTitle=Label(frameSet,text='Key:')
283 entryKey=Entry(frameSet,width=4)
284 buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set')
285 #frameKeySets
286 labelKeysTitle=Label(frameKeySets,text='Select a Key Binding Set')
287 labelTypeTitle=Label(frameKeySets,text='Select : ')
288 radioKeysBuiltin=Radiobutton(frameKeySets,variable=self.keysType,
289 value=0,command=self.SetKeysType,text='a Built-in Key Set')
290 radioKeysCustom=Radiobutton(frameKeySets,variable=self.keysType,
291 value=1,command=self.SetKeysType,text='a Custom Key Set')
292 self.optMenuKeysBuiltin=OptionMenu(frameKeySets,
293 self.builtinKeys,'test builtin junk','test builtin junk 2')
294 self.builtinKeys.set('test builtin junk')
295 self.optMenuKeysCustom=OptionMenu(frameKeySets,
296 self.customKeys,'test custom junk','test custom junk 2')
297 self.customKeys.set('test custom junk')
298 self.keysType.set(0)
299 self.buttonDeleteCustomKeys=Button(frameKeySets,text='Delete Custom Key Set')
300 self.SetKeysType()
301 ##widget packing
302 #body
303 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
304 frameKeySets.pack(side=LEFT,padx=5,pady=5,fill=Y)
305 #frameCustom
306 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
307 buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
308 frameTarget.pack(side=LEFT,padx=5,pady=5,fill=Y)
309 frameSet.pack(side=LEFT,padx=5,pady=5,fill=Y)
310 labelTargetTitle.pack(side=TOP,anchor=W)
311 scrollTarget.pack(side=RIGHT,anchor=W,fill=Y)
312 listTarget.pack(side=TOP,anchor=W,expand=TRUE,fill=BOTH)
313 labelKeyBindTitle.pack(side=TOP,anchor=W)
314 labelModifierTitle.pack(side=TOP,anchor=W,pady=5)
315 checkCtrl.pack(side=TOP,anchor=W)
316 checkAlt.pack(side=TOP,anchor=W,pady=2)
317 checkShift.pack(side=TOP,anchor=W)
318 labelKeyEntryTitle.pack(side=TOP,anchor=W,pady=5)
319 entryKey.pack(side=TOP,anchor=W)
320 #frameKeySets
321 labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
322 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
323 radioKeysBuiltin.pack(side=TOP,anchor=W,padx=5)
324 radioKeysCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
325 self.optMenuKeysBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
326 self.optMenuKeysCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
327 self.buttonDeleteCustomKeys.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000328 return frame
329
330 def CreatePageGeneral(self):
331 frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN)
332 Button(frame,text='general page test').pack(padx=110,pady=110)
333 return frame
334
Steven M. Gava44d3d1a2001-07-31 06:59:02 +0000335if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +0000336 #test the dialog
337 root=Tk()
338 Button(root,text='Dialog',
339 command=lambda:ConfigDialog(root,'Settings',None)).pack()
340 root.mainloop()