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): |
| 14 | """ |
| 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',) |
| 31 | |
| 32 | self.CreateWidgets() |
| 33 | self.resizable(height=FALSE,width=FALSE) |
| 34 | self.ChangePage() |
| 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 |
| 44 | self.bind('<Alt-r>',self.RevertBinding) #revert to defaults |
| 45 | self.bind('<Alt-f>',self.ChangePageBinding) |
| 46 | self.bind('<Alt-c>',self.ChangePageBinding) |
| 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 | |
| 57 | def Revert(self): |
| 58 | pass |
| 59 | |
| 60 | def ChangePage(self): |
| 61 | self.pages[self.pageNum.get()].lift() |
| 62 | self.title('Settings - '+self.pageButtons[self.pageNum.get()].cget('text')) |
| 63 | |
| 64 | def CancelBinding(self,event): |
| 65 | self.Cancel() |
| 66 | |
| 67 | def SaveBinding(self,event): |
| 68 | self.Save() |
| 69 | |
| 70 | def RevertBinding(self,event): |
| 71 | self.Revert() |
| 72 | |
| 73 | def ChangePageBinding(self,event): |
| 74 | pageKeys=('f','c','k','g') |
| 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 | |
| 83 | def CreateWidgets(self): |
| 84 | self.framePages = Frame(self,borderwidth=2,relief=SUNKEN) |
| 85 | frameActionButtons = Frame(self) |
| 86 | framePageButtons = Frame(self.framePages,borderwidth=1,relief=SUNKEN) |
| 87 | #action buttons |
| 88 | self.buttonRevert = Button(frameActionButtons,text='Revert', |
| 89 | command=self.Revert,underline=0,takefocus=FALSE) |
| 90 | self.buttonSave = Button(frameActionButtons,text='Save', |
| 91 | command=self.Save,underline=0,takefocus=FALSE) |
| 92 | self.buttonCancel = Button(frameActionButtons,text='Cancel', |
| 93 | command=self.Cancel,takefocus=FALSE) |
| 94 | #page buttons |
| 95 | self.pageNum=IntVar() |
| 96 | self.pageNum.set(0) |
| 97 | buttonPageFonts = Radiobutton(framePageButtons,value=0,text='Fonts') |
| 98 | buttonPageColours = Radiobutton(framePageButtons,value=1,text='Colours') |
| 99 | buttonPageKeys = Radiobutton(framePageButtons,value=2,text='Keys') |
| 100 | buttonPageGeneral = Radiobutton(framePageButtons,value=3,text='General') |
| 101 | self.pageButtons=(buttonPageFonts,buttonPageColours, |
| 102 | buttonPageKeys,buttonPageGeneral) |
| 103 | for button in self.pageButtons: |
| 104 | button.config(command=self.ChangePage,underline=0,takefocus=FALSE, |
| 105 | indicatoron=FALSE,highlightthickness=0,variable=self.pageNum, |
| 106 | selectcolor=self.bg,borderwidth=1) |
| 107 | button.pack(side=LEFT) |
| 108 | #pages |
| 109 | framePageFonts=Frame(self.framePages) |
| 110 | framePageColours=Frame(self.framePages) |
| 111 | framePageKeys=Frame(self.framePages) |
| 112 | framePageGeneral=Frame(self.framePages) |
| 113 | self.pages=(framePageFonts,framePageColours,framePageKeys,framePageGeneral) |
| 114 | #pageFonts |
| 115 | Button(framePageFonts,text='fonts page test').pack(padx=30,pady=30) |
| 116 | #pageColours |
| 117 | Button(framePageColours,text='colours page test').pack(padx=60,pady=60) |
| 118 | #pageKeys |
| 119 | Button(framePageKeys,text='keys page test').pack(padx=90,pady=90) |
| 120 | #pageGeneral |
| 121 | Button(framePageGeneral,text='general page test').pack(padx=110,pady=110) |
| 122 | |
| 123 | #grid in framePages so we can overlap pages |
| 124 | framePageButtons.grid(row=0,column=0,sticky=W) |
| 125 | for page in self.pages: page.grid(row=1,column=0,sticky=(N,S,E,W)) |
| 126 | |
| 127 | self.buttonRevert.pack(side=LEFT,padx=5,pady=5) |
| 128 | self.buttonSave.pack(side=LEFT,padx=5,pady=5) |
| 129 | self.buttonCancel.pack(side=LEFT,padx=5,pady=5) |
| 130 | frameActionButtons.pack(side=BOTTOM) |
| 131 | self.framePages.pack(side=TOP,expand=TRUE,fill=BOTH) |
| 132 | |
| 133 | if __name__ == '__main__': |
| 134 | #test the dialog |
| 135 | root=Tk() |
| 136 | Button(root,text='Dialog', |
| 137 | command=lambda:ConfigDialog(root,'Settings',None)).pack() |
| 138 | root.mainloop() |