Top

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