import W import Wkeys import Wbase import Events import WASTEconst import re import string okkeys = ("-0123456789." + Wkeys.deletekey + Wkeys.backspacekey + string.join(Wkeys.arrowkeys)) num = re.compile("^-?([1-9][0-9]*|0)(.[0-9]+)?$") class NumberField(W.EditText): def __init__(self, possize, text="0", callback = None, inset=(3, 3), fontsettings=None): W.EditText.__init__(self, possize, text, callback, inset, fontsettings) self.wrap = 0 def open(self): W.EditText.open(self) self.ted.WESetAlignment(WASTEconst.weFlushRight) def valid(self): return num.match(self.get()) def key(self, char, event): (what, message, when, where, modifiers) = event if ((self._enabled and not modifiers & Events.cmdKey or char in Wkeys.arrowkeys) and char in okkeys): self.ted.WEKey(ord(char), modifiers) if char not in Wkeys.navigationkeys: self.changed = 1 if char not in Wkeys.scrollkeys: self.selchanged = 1 self.updatescrollbars() if self._callback: Wbase.CallbackCall(self._callback, 0, char, modifiers) def _calctextbounds(self): viewrect = l, t, r, b = self._getviewrect() if self.ted: dl, dt, dr, db = self.ted.WEGetDestRect() vl, vt, vr, vb = self.ted.WEGetViewRect() xshift = l - vl yshift = t - vt if (db - dt) < (b - t): yshift = t - dt destrect = (dl + xshift, dt + yshift, dr + xshift, db + yshift) else: destrect = (l, t, r + 5000, b) return viewrect, destrect def _getflags(self): flags = (WASTEconst.weDoAutoScroll | WASTEconst.weDoOutlineHilite | WASTEconst.weDoMonoStyled | WASTEconst.weDoUndo) return flags if __name__ == "__main__": w = W.Dialog((200, 92), "Number Dialog") w.text = W.TextBox((4, 4, -4, 18), "Please enter a number:", fontsettings = ("charcoal",0,12,(0,0,0))) def toggleOK(): w.OK.enable(w.display.valid()) w.display = NumberField((4,22,-4,22), callback = toggleOK, fontsettings = ("geneva",0,12,(0,0,0))) def done(): print w.display.get() w.close() w.OK = W.Button((-70, 60, 58,20), "OK", done) w.cancel = W.Button((-140,60,58,20), "Cancel", w.close) w.setdefaultbutton(w.OK) w.bind(Wkeys.returnkey, w.OK.push) w.bind(Wkeys.enterkey, w.OK.push) w.open()