ped_dialog.message_dialog module
message dialog with button to close implementation for ped editor
# Copyright 2009 James P Goodwin ped tiny python editor """ message dialog with button to close implementation for ped editor """ import curses import curses.ascii import sys import os from ped_dialog import dialog import traceback class MessageDialog(dialog.Dialog): """ dialog subclass to implement a simple message popup that either comes and goes or blocks waiting for done button to be pressed """ def __init__(self,scr, title = "Message", message = "This is a message!", blocking = True): """ takes curses window to pop up over, title, message, and blocking == True to show button and wait, or blocking == False to just display and leave """ max_y, max_x = scr.getmaxyx() min_y, min_x = scr.getbegyx() dw = max_x - 4 dh = 5 if blocking: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0), dialog.Button("done",1,(dw//2)-(6//2),(dh//2-2)+3,"DONE",dialog.Component.CMP_KEY_OK)],min_y,min_x) else: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0)],min_y,min_x) def message( scr, title = "Message", message = "A message!", blocking=True ): """ wrapper function to launch a message dialog, takes curses window to pop up over, title, message, and blocking == True to show button and wait, or False to just display and leave """ try: d = MessageDialog(scr,title,message,blocking) if blocking: d.main() else: d.focus() d.render() except Exception as e: raise def main(stdscr): """ test driver for message dialog """ return message(stdscr,"Test Message","This is a test message!") if __name__ == '__main__': curses.wrapper(main)
Functions
def main(
stdscr)
test driver for message dialog
def main(stdscr): """ test driver for message dialog """ return message(stdscr,"Test Message","This is a test message!")
def message(
scr, title='Message', message='A message!', blocking=True)
wrapper function to launch a message dialog, takes curses window to pop up over, title, message, and blocking == True to show button and wait, or False to just display and leave
def message( scr, title = "Message", message = "A message!", blocking=True ): """ wrapper function to launch a message dialog, takes curses window to pop up over, title, message, and blocking == True to show button and wait, or False to just display and leave """ try: d = MessageDialog(scr,title,message,blocking) if blocking: d.main() else: d.focus() d.render() except Exception as e: raise
Classes
class MessageDialog
dialog subclass to implement a simple message popup that either comes and goes or blocks waiting for done button to be pressed
class MessageDialog(dialog.Dialog): """ dialog subclass to implement a simple message popup that either comes and goes or blocks waiting for done button to be pressed """ def __init__(self,scr, title = "Message", message = "This is a message!", blocking = True): """ takes curses window to pop up over, title, message, and blocking == True to show button and wait, or blocking == False to just display and leave """ max_y, max_x = scr.getmaxyx() min_y, min_x = scr.getbegyx() dw = max_x - 4 dh = 5 if blocking: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0), dialog.Button("done",1,(dw//2)-(6//2),(dh//2-2)+3,"DONE",dialog.Component.CMP_KEY_OK)],min_y,min_x) else: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0)],min_y,min_x)
Ancestors (in MRO)
- MessageDialog
- 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='Message', message='This is a message!', blocking=True)
takes curses window to pop up over, title, message, and blocking == True to show button and wait, or blocking == False to just display and leave
def __init__(self,scr, title = "Message", message = "This is a message!", blocking = True): """ takes curses window to pop up over, title, message, and blocking == True to show button and wait, or blocking == False to just display and leave """ max_y, max_x = scr.getmaxyx() min_y, min_x = scr.getbegyx() dw = max_x - 4 dh = 5 if blocking: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0), dialog.Button("done",1,(dw//2)-(6//2),(dh//2-2)+3,"DONE",dialog.Component.CMP_KEY_OK)],min_y,min_x) else: dialog.Dialog.__init__(self,scr,"MessageDialog",dh,dw, [ dialog.Frame(title), dialog.StaticText("message",max(1,(dw//2)-(len(message)//2)),(dh//2-2)+2,message,0)],min_y,min_x)
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)
handle keystrokes for this component
def handle(self, ch): if self.focus_list and ch != keytab.KEYTAB_MOUSE: ch = self.focus_list[self.current][1].handle(ch) cmd_id,ch = keymap.mapseq( keymap.keymap_dialog, ch) if extension_manager.is_extension(cmd_id): if not extension_manager.invoke_extension( cmd_id, self, ch ): return ch if cmd_id == cmd_names.CMD_DLGNEXT: self.tab() elif cmd_id == cmd_names.CMD_DLGPREV: self.btab() elif cmd_id == cmd_names.CMD_DLGUP: if self.focus_list: self.pop_history(self.focus_list[self.current][1]) ch = Component.CMP_KEY_NOP elif cmd_id == cmd_names.CMD_DLGMOUSE: ret = self.handle_mouse() if ret >= 0: ch = ret elif cmd_id == cmd_names.CMD_DLGRESIZE: self.resize() return 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