ped_dialog.prompt_dialog module
module that implements a simple prompt dialog for the ped editor
# Copyright 2009 James P Goodwin ped tiny python editor """ module that implements a simple prompt dialog for the ped editor """ import curses import curses.ascii import sys import os from ped_dialog import dialog from ped_core import keytab class PromptDialog(dialog.Dialog): """ Dialog subclass that pops up a simple prompt over the provided screen """ def __init__(self,scr, title = "Prompt", prompt = "Enter something : ", width= -1, name = "value"): """ takes window to pop up over, title of dialog, prompt string, and width of input field, if width is -1 it'll auto fit remaining space in the prompt window, otherwise the width of the input will be set to that number of characters the dialog will fit the parent window """ max_y, max_x = scr.getmaxyx() if width == -1: width = (max_x - 8) - len(prompt) dw = max_x - 4 self.prompt = dialog.Prompt(name,1,2,2,prompt,width) dialog.Dialog.__init__(self,scr,"PromptDialog",5,dw, [ dialog.Frame(title), self.prompt]) def handle(self,ch): """ override the dialog handling to allow enter to do ok and esc to do cancel since we have no buttons """ ret_ch = dialog.Dialog.handle(self,ch) if ch == keytab.KEYTAB_CR: # enter return dialog.Component.CMP_KEY_OK elif ch == keytab.KEYTAB_ESC: # esc return dialog.Component.CMP_KEY_CANCEL else: return ret_ch def prompt( scr, title = "Prompt", prompt = "Enter something: ", width = 10, name = "value" ): """ wrapper function takes curses window to pop up over, title, prompt, and width of field -1 means size field to window """ d = PromptDialog(scr,title,prompt,width,name) value = d.main() if name in value: return value[name] else: return None def main(stdscr): """ test main for prompt dialog """ return prompt(stdscr,"Test Prompt","Enter a number: ", 8 ) if __name__ == '__main__': print(int(curses.wrapper(main)))
Functions
def main(
stdscr)
test main for prompt dialog
def main(stdscr): """ test main for prompt dialog """ return prompt(stdscr,"Test Prompt","Enter a number: ", 8 )
def prompt(
scr, title='Prompt', prompt='Enter something: ', width=10, name='value')
wrapper function takes curses window to pop up over, title, prompt, and width of field -1 means size field to window
def prompt( scr, title = "Prompt", prompt = "Enter something: ", width = 10, name = "value" ): """ wrapper function takes curses window to pop up over, title, prompt, and width of field -1 means size field to window """ d = PromptDialog(scr,title,prompt,width,name) value = d.main() if name in value: return value[name] else: return None
Classes
class PromptDialog
Dialog subclass that pops up a simple prompt over the provided screen
class PromptDialog(dialog.Dialog): """ Dialog subclass that pops up a simple prompt over the provided screen """ def __init__(self,scr, title = "Prompt", prompt = "Enter something : ", width= -1, name = "value"): """ takes window to pop up over, title of dialog, prompt string, and width of input field, if width is -1 it'll auto fit remaining space in the prompt window, otherwise the width of the input will be set to that number of characters the dialog will fit the parent window """ max_y, max_x = scr.getmaxyx() if width == -1: width = (max_x - 8) - len(prompt) dw = max_x - 4 self.prompt = dialog.Prompt(name,1,2,2,prompt,width) dialog.Dialog.__init__(self,scr,"PromptDialog",5,dw, [ dialog.Frame(title), self.prompt]) def handle(self,ch): """ override the dialog handling to allow enter to do ok and esc to do cancel since we have no buttons """ ret_ch = dialog.Dialog.handle(self,ch) if ch == keytab.KEYTAB_CR: # enter return dialog.Component.CMP_KEY_OK elif ch == keytab.KEYTAB_ESC: # esc return dialog.Component.CMP_KEY_CANCEL else: return ret_ch
Ancestors (in MRO)
- PromptDialog
- ped_dialog.dialog.Dialog
- ped_dialog.dialog.Component
- builtins.object
Class variables
var CMP_KEY_CANCEL
var CMP_KEY_NOP
var CMP_KEY_OK
var history
Static methods
def __init__(
self, scr, title='Prompt', prompt='Enter something : ', width=-1, name='value')
takes window to pop up over, title of dialog, prompt string, and width of input field, if width is -1 it'll auto fit remaining space in the prompt window, otherwise the width of the input will be set to that number of characters the dialog will fit the parent window
def __init__(self,scr, title = "Prompt", prompt = "Enter something : ", width= -1, name = "value"): """ takes window to pop up over, title of dialog, prompt string, and width of input field, if width is -1 it'll auto fit remaining space in the prompt window, otherwise the width of the input will be set to that number of characters the dialog will fit the parent window """ max_y, max_x = scr.getmaxyx() if width == -1: width = (max_x - 8) - len(prompt) dw = max_x - 4 self.prompt = dialog.Prompt(name,1,2,2,prompt,width) dialog.Dialog.__init__(self,scr,"PromptDialog",5,dw, [ dialog.Frame(title), self.prompt])
def btab(
self)
def btab(self): if self.focus_list: self.push_history(self.focus_list[self.current][1]) self.current -= 1 if self.current < 0: self.current = len(self.focus_list)-1
def focus(
self)
called when component is the focus
def focus(self): self.focus_list = [] for c in self.children: self.pop_history(c) if c.getorder() > 0: self.focus_list.append((c.getorder(),c)) if not self.focus_list: self.current = 0 return self.focus_list.sort(key=lambda x: x[0]) self.current = 0
def getname(
self)
get the name of this component
def getname(self): """ get the name of this component """ return self.name
def getorder(
self)
get this component's tab order number
def getorder(self): """ get this component's tab order number """ return self.order
def getparent(
self)
get this component's curses target window
def getparent(self): """ get this component's curses target window """ return self.parent
def getvalue(
self)
return the current value of the component
def getvalue(self): value = {} for c in self.children: if c.getname(): value[c.getname()] = c.getvalue() return value
def goto(
self, component)
move focus to this component
def goto(self, component): """ move focus to this component """ for i in range(0,len(self.focus_list)): if self.focus_list[i][1] == component: self.current = i return True return False
def handle(
self, ch)
override the dialog handling to allow enter to do ok and esc to do cancel since we have no buttons
def handle(self,ch): """ override the dialog handling to allow enter to do ok and esc to do cancel since we have no buttons """ ret_ch = dialog.Dialog.handle(self,ch) if ch == keytab.KEYTAB_CR: # enter return dialog.Component.CMP_KEY_OK elif ch == keytab.KEYTAB_ESC: # esc return dialog.Component.CMP_KEY_CANCEL else: return ret_ch
def handle_mouse(
self)
def handle_mouse(self): if self.focus_list and self.win: try: mid, mx, my, mz, mtype = curses.getmouse() by,bx = self.win.getbegyx() oy = my - by ox = mx - bx for i in range(0,len(self.focus_list)): c = self.focus_list[i][1] ret = c.mouse_event(ox,oy,mtype) if ret >= 0: self.current = i return ret else: return -1 except: return -1
def isempty(
self)
test if the component entry is empty
def isempty(self): """ test if the component entry is empty """ return False
def main(
self, blocking=True, force=False, ch_in=None)
def main(self,blocking = True,force=False,ch_in = None): curses.mousemask( curses.BUTTON1_PRESSED| curses.BUTTON1_RELEASED| curses.BUTTON1_CLICKED) self.win.nodelay(1) self.win.notimeout(0) self.win.timeout(0) old_cursor = curses.curs_set(1) while (1): if (not keymap.keypending(self.win)) or force: self.render() if not ch_in: ch = self.handle(keymap.get_keyseq(self.win,keymap.getch(self.win))) else: ch = self.handle(ch_in) if blocking: if ch == Component.CMP_KEY_CANCEL: curses.curs_set(old_cursor) return {} elif ch == Component.CMP_KEY_OK: curses.curs_set(old_cursor) return self.getvalue() else: if ch == Component.CMP_KEY_CANCEL: curses.curs_set(old_cursor) return (ch, {}) else: curses.curs_set(old_cursor) return (ch, self.getvalue())
def mouse_event(
self, ox, oy, mtype)
handle mouse events return key value or -1 for not handled
def mouse_event(self, ox, oy, mtype): """ handle mouse events return key value or -1 for not handled """ return -1
def pop_history(
self, child)
def pop_history( self, child ): if not self.enable_history: return if not issubclass(child.__class__, Prompt): return if self.getname() and child.getname() and child.getorder() >= 0: key = (self.getname(), child.getname()) if key in Dialog.history: hist = Dialog.history[key] self.hist_idx += 1 if self.hist_idx > len(hist): self.hist_idx = 0 child.setvalue(hist[-self.hist_idx])
def push_history(
self, child)
def push_history( self, child ): if not self.enable_history: return if not issubclass(child.__class__, Prompt): return if self.getname() and child.getname() and child.getorder() >= 0 and not child.isempty(): key = (self.getname(), child.getname()) if key in Dialog.history: if Dialog.history[key][-1] != child.getvalue(): Dialog.history[key].append(child.getvalue()) else: Dialog.history[key] = [child.getvalue()]
def render(
self)
render the component use parent as target
def render(self): self.win.leaveok(1) for c in self.children: if not self.focus_list or self.focus_list[self.current][1] != c: c.render() self.win.leaveok(0) if self.focus_list: self.focus_list[self.current][1].focus() self.focus_list[self.current][1].render() self.win.refresh()
def resize(
self)
def resize(self): pass
def set_history(
self, state)
def set_history( self, state ): self.enable_history = state
def setparent(
self, parent)
set the parent curses target window
def setparent(self,parent): """ set the parent curses target window """ self.parent = parent
def setpos(
self, x, y)
set the position of this component
def setpos(self, x, y ): """ set the position of this component """ self.x = x self.y = y
def setsize(
self, height, width)
set the width of this component
def setsize(self, height, width ): """ set the width of this component """ self.height = height self.width = width
def setvalue(
self, value)
set the components value, may be tuple or other data structure
def setvalue(self, value): for c in self.children: if c.getname() in value: c.setvalue(value[c.getname()]) self.push_history(c)
def tab(
self)
def tab(self): if self.focus_list: self.push_history(self.focus_list[self.current][1]) self.current += 1 if self.current >= len(self.focus_list): self.current = 0
Instance variables
var prompt