Top

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