Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 1 | ##---------------------------------------------------------------------------## |
| 2 | ## |
| 3 | ## idle - configuration dialog |
| 4 | ## elguavas |
| 5 | ## |
| 6 | ##---------------------------------------------------------------------------## |
| 7 | """ |
| 8 | configuration dialog |
| 9 | """ |
| 10 | from Tkinter import * |
| 11 | import tkMessageBox |
| 12 | |
| 13 | class ConfigDialog(Toplevel): |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 14 | """ |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 15 | configuration dialog for idle |
| 16 | """ |
| 17 | def __init__(self,parent,title,configDict): |
| 18 | """ |
| 19 | configDict - dictionary of configuration items |
| 20 | """ |
| 21 | Toplevel.__init__(self, parent) |
| 22 | self.configure(borderwidth=5) |
| 23 | self.geometry("+%d+%d" % (parent.winfo_rootx()+20, |
| 24 | parent.winfo_rooty()+30)) |
| 25 | self.config=configDict |
| 26 | #elguavas - config placeholders til config stuff completed |
| 27 | self.bg=self.cget('bg') |
| 28 | self.fg=None |
| 29 | #no ugly bold default text font on *nix |
| 30 | self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',) |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 31 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 32 | self.CreateWidgets() |
| 33 | self.resizable(height=FALSE,width=FALSE) |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 34 | self.ChangePage() |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 35 | self.transient(parent) |
| 36 | self.grab_set() |
| 37 | self.protocol("WM_DELETE_WINDOW", self.Cancel) |
| 38 | self.parent = parent |
| 39 | self.framePages.focus_set() |
| 40 | #key bindings for this dialog |
| 41 | # self.bind('<Return>',self.Ok) #dismiss dialog |
| 42 | self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save |
| 43 | self.bind('<Alt-s>',self.SaveBinding) #dismiss dialog, save |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 44 | self.bind('<F1>',self.HelpBinding) #context help |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 45 | self.bind('<Alt-f>',self.ChangePageBinding) |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 46 | self.bind('<Alt-h>',self.ChangePageBinding) |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 47 | self.bind('<Alt-k>',self.ChangePageBinding) |
| 48 | self.bind('<Alt-g>',self.ChangePageBinding) |
| 49 | self.wait_window() |
| 50 | |
| 51 | def Cancel(self): |
| 52 | self.destroy() |
| 53 | |
| 54 | def Save(self): |
| 55 | pass |
| 56 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 57 | def Help(self): |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 58 | pass |
| 59 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 60 | def CancelBinding(self,event): |
| 61 | self.Cancel() |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 62 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 63 | def SaveBinding(self,event): |
| 64 | self.Save() |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 65 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 66 | def HelpBinding(self,event): |
| 67 | self.Help() |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 68 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 69 | def ChangePage(self): |
| 70 | self.pages[self.pageNum.get()].lift() |
| 71 | self.title('Settings -'+self.pageButtons[self.pageNum.get()].cget('text')) |
| 72 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 73 | def ChangePageBinding(self,event): |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 74 | pageKeys=('f','h','k','g') |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 75 | pos=0 |
| 76 | for key in pageKeys: |
| 77 | if event.char == key: |
| 78 | self.pageNum.set(pos) |
| 79 | self.ChangePage() |
| 80 | return |
| 81 | pos=pos+1 |
| 82 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 83 | def SetThemeType(self): |
| 84 | if self.themeType.get()==0: |
| 85 | self.optMenuThemeBuiltin.config(state=NORMAL) |
| 86 | self.optMenuThemeCustom.config(state=DISABLED) |
| 87 | self.buttonDeleteCustom.config(state=DISABLED) |
| 88 | elif self.themeType.get()==1: |
| 89 | self.optMenuThemeBuiltin.config(state=DISABLED) |
| 90 | self.optMenuThemeCustom.config(state=NORMAL) |
| 91 | self.buttonDeleteCustom.config(state=NORMAL) |
| 92 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 93 | def CreateWidgets(self): |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 94 | self.framePages = Frame(self) |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 95 | frameActionButtons = Frame(self) |
| 96 | framePageButtons = Frame(self.framePages,borderwidth=1,relief=SUNKEN) |
| 97 | #action buttons |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 98 | self.buttonHelp = Button(frameActionButtons,text='Help', |
| 99 | command=self.Help,takefocus=FALSE) |
| 100 | self.buttonSave = Button(frameActionButtons,text='Save, Apply and Exit', |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 101 | command=self.Save,underline=0,takefocus=FALSE) |
| 102 | self.buttonCancel = Button(frameActionButtons,text='Cancel', |
| 103 | command=self.Cancel,takefocus=FALSE) |
| 104 | #page buttons |
| 105 | self.pageNum=IntVar() |
| 106 | self.pageNum.set(0) |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 107 | buttonPageFonts = Radiobutton(framePageButtons,value=0, |
| 108 | text='Font/Tabs',padx=5,pady=5) |
| 109 | buttonPageHighlight = Radiobutton(framePageButtons,value=1, |
| 110 | text='Highlighting',padx=5,pady=5) |
| 111 | buttonPageKeys = Radiobutton(framePageButtons,value=2, |
| 112 | text='Keys',padx=5,pady=5) |
| 113 | buttonPageGeneral = Radiobutton(framePageButtons,value=3, |
| 114 | text='General',padx=5,pady=5) |
| 115 | self.pageButtons=(buttonPageFonts,buttonPageHighlight, |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 116 | buttonPageKeys,buttonPageGeneral) |
| 117 | for button in self.pageButtons: |
| 118 | button.config(command=self.ChangePage,underline=0,takefocus=FALSE, |
| 119 | indicatoron=FALSE,highlightthickness=0,variable=self.pageNum, |
| 120 | selectcolor=self.bg,borderwidth=1) |
| 121 | button.pack(side=LEFT) |
| 122 | #pages |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 123 | self.pages=(self.CreatePageFonts(), |
| 124 | self.CreatePageHighlight(), |
| 125 | self.CreatePageKeys(), |
| 126 | self.CreatePageGeneral()) |
| 127 | |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 128 | #grid in framePages so we can overlap pages |
| 129 | framePageButtons.grid(row=0,column=0,sticky=W) |
| 130 | for page in self.pages: page.grid(row=1,column=0,sticky=(N,S,E,W)) |
| 131 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 132 | self.buttonHelp.pack(side=RIGHT,padx=20,pady=5) |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 133 | self.buttonSave.pack(side=LEFT,padx=5,pady=5) |
| 134 | self.buttonCancel.pack(side=LEFT,padx=5,pady=5) |
| 135 | frameActionButtons.pack(side=BOTTOM) |
| 136 | self.framePages.pack(side=TOP,expand=TRUE,fill=BOTH) |
| 137 | |
Steven M. Gava | 952d0a5 | 2001-08-03 04:43:44 +0000 | [diff] [blame^] | 138 | def CreatePageFonts(self): |
| 139 | frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN) |
| 140 | Button(frame,text='fonts page test').pack(padx=30,pady=30) |
| 141 | return frame |
| 142 | |
| 143 | def CreatePageHighlight(self): |
| 144 | #tkVars |
| 145 | self.target=StringVar() |
| 146 | self.builtinTheme=StringVar() |
| 147 | self.customTheme=StringVar() |
| 148 | self.colour=StringVar() |
| 149 | self.fontName=StringVar() |
| 150 | self.fontBold=StringVar() |
| 151 | self.fontItalic=StringVar() |
| 152 | self.fontSize=IntVar() |
| 153 | self.themeType=IntVar() |
| 154 | ##widget creation |
| 155 | #body frame |
| 156 | frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN) |
| 157 | #body section frames |
| 158 | frameCustom=Frame(frame,borderwidth=2,relief=GROOVE) |
| 159 | frameTheme=Frame(frame,borderwidth=2,relief=GROOVE) |
| 160 | |
| 161 | #frameCustom |
| 162 | frameTarget=Frame(frameCustom) |
| 163 | frameSample=Frame(frameCustom,relief=SOLID,borderwidth=1) |
| 164 | frameSet=Frame(frameCustom) |
| 165 | frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1) |
| 166 | frameFontSet=Frame(frameSet) |
| 167 | |
| 168 | labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting') |
| 169 | labelTargetTitle=Label(frameTarget,text='for : ') |
| 170 | optMenuTarget=OptionMenu(frameTarget, |
| 171 | self.target,'test target interface item','test target interface item 2') |
| 172 | self.target.set('test target interface item') |
| 173 | buttonSetColour=Button(frameColourSet,text='Set Colour') |
| 174 | labelFontTitle=Label(frameFontSet,text='Set Font Style') |
| 175 | checkFontBold=Checkbutton(frameFontSet,variable=self.fontBold, |
| 176 | onvalue='Bold',offvalue='',text='Bold') |
| 177 | checkFontItalic=Checkbutton(frameFontSet,variable=self.fontItalic, |
| 178 | onvalue='Italic',offvalue='',text='Italic') |
| 179 | labelTestSample=Label(frameSample,justify=LEFT, |
| 180 | text='def Ahem(foo,bar):\n test=foo\n text=bar\n return') |
| 181 | buttonSaveCustom=Button(frameCustom, |
| 182 | text='Save as a Custom Theme') |
| 183 | |
| 184 | #frameTheme |
| 185 | #frameDivider=Frame(frameTheme,relief=SUNKEN,borderwidth=1, |
| 186 | # width=2,height=10) |
| 187 | labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme') |
| 188 | labelTypeTitle=Label(frameTheme,text='Select : ') |
| 189 | radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeType, |
| 190 | value=0,command=self.SetThemeType,text='a Built-in Theme') |
| 191 | radioThemeCustom=Radiobutton(frameTheme,variable=self.themeType, |
| 192 | value=1,command=self.SetThemeType,text='a Custom Theme') |
| 193 | self.optMenuThemeBuiltin=OptionMenu(frameTheme, |
| 194 | self.builtinTheme,'test builtin junk','test builtin junk 2') |
| 195 | self.builtinTheme.set('test builtin junk') |
| 196 | self.optMenuThemeCustom=OptionMenu(frameTheme, |
| 197 | self.customTheme,'test custom junk','test custom junk 2') |
| 198 | self.customTheme.set('test custom junk') |
| 199 | self.themeType.set(0) |
| 200 | self.buttonDeleteCustom=Button(frameTheme,text='Delete Custom Theme') |
| 201 | self.SetThemeType() |
| 202 | |
| 203 | ##widget packing |
| 204 | #body |
| 205 | frameCustom.pack(side=LEFT,padx=5,pady=10,fill=Y) |
| 206 | frameTheme.pack(side=RIGHT,padx=5,pady=10,fill=Y) |
| 207 | #frameCustom |
| 208 | labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) |
| 209 | frameTarget.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X) |
| 210 | frameSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH) |
| 211 | frameSet.pack(side=TOP,fill=X) |
| 212 | frameColourSet.pack(side=LEFT,padx=5,pady=5,fill=BOTH) |
| 213 | frameFontSet.pack(side=RIGHT,padx=5,pady=5,anchor=W) |
| 214 | labelTargetTitle.pack(side=LEFT,anchor=E) |
| 215 | optMenuTarget.pack(side=RIGHT,anchor=W,fill=X,expand=TRUE) |
| 216 | buttonSetColour.pack(expand=TRUE,fill=BOTH,padx=10,pady=10) |
| 217 | labelFontTitle.pack(side=TOP,anchor=W) |
| 218 | checkFontBold.pack(side=LEFT,anchor=W,pady=2) |
| 219 | checkFontItalic.pack(side=RIGHT,anchor=W) |
| 220 | labelTestSample.pack() |
| 221 | buttonSaveCustom.pack(side=BOTTOM,fill=X,padx=5,pady=5) |
| 222 | |
| 223 | #frameTheme |
| 224 | #frameDivider.pack(side=LEFT,fill=Y,padx=5,pady=5) |
| 225 | labelThemeTitle.pack(side=TOP,anchor=W,padx=5,pady=5) |
| 226 | labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5) |
| 227 | radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5) |
| 228 | radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2) |
| 229 | self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5) |
| 230 | self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5) |
| 231 | self.buttonDeleteCustom.pack(side=TOP,fill=X,padx=5,pady=5) |
| 232 | |
| 233 | return frame |
| 234 | |
| 235 | def CreatePageKeys(self): |
| 236 | frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN) |
| 237 | Button(frame,text='keys page test').pack(padx=90,pady=90) |
| 238 | return frame |
| 239 | |
| 240 | def CreatePageGeneral(self): |
| 241 | frame=Frame(self.framePages,borderwidth=2,relief=SUNKEN) |
| 242 | Button(frame,text='general page test').pack(padx=110,pady=110) |
| 243 | return frame |
| 244 | |
Steven M. Gava | 44d3d1a | 2001-07-31 06:59:02 +0000 | [diff] [blame] | 245 | if __name__ == '__main__': |
Steven M. Gava | d721c48 | 2001-07-31 10:46:53 +0000 | [diff] [blame] | 246 | #test the dialog |
| 247 | root=Tk() |
| 248 | Button(root,text='Dialog', |
| 249 | command=lambda:ConfigDialog(root,'Settings',None)).pack() |
| 250 | root.mainloop() |