pyxforms/Pyxform/__init__.py

925 lines
25 KiB
Python

##########################################################
# This is the Python interface to the pyxforms C module
#
import sys
from . import (
xforms,
forms,
objects,
bitmaps,
pixmaps,
box,
browser,
button,
choice,
clock,
counter,
dial,
frame,
input,
menu,
positioner,
slider,
timer,
)
###############################################################################
# These are function needed to run the XForms library
# Needs a LOT of work
def xfinit(appname, appclass, argv0):
xforms.init(appname, appclass, argv0)
###############################################################################
# This is the synthetic event-loop to use under python:
_objects = {}
def runforms():
while 1:
ob = _objects[str(xforms.do_forms())]
ob.cb(ob.args)
###############################################################################
# This is the default callback function:
def _nocb(args):
print("This object has no Callback!")
##############################################################################
# This is the Form class
class Form:
def __init__(self, t=6, w=200, h=200):
self.id = forms.create(0, w, h)
self.__box = Box(t, 0, 0, w, h, "")
self.Add(self.__box)
self.__box.c1 = 11
self.__box.c2 = 15
self.__minx = 1 # Reasonable defaults for things that
self.__miny = 1 # I can't get from XForms
self.__maxx = 10000 # Notice that if the C code changes them
self.__maxy = 10000 # They get out of sync!
self.__title = sys.argv[0] # the "preferred" form title
self.__placement = 16388
self.__decoration = 1
self.objs = () # A place to store the obj list. Useful?
def Show(self):
self.winid = forms.show(
self.id, self.__placement, self.__decoration, self.title
)
def Hide(self):
forms.hide(self.id)
def Freeze(self):
forms.freeze(self.id)
def Unfreeze(self):
forms.unfreeze(self.id)
def Activate(self):
forms.activate(self.id)
def Deactivate(self):
forms.deactivate(self.id)
def Scale(self, x, y):
forms.scale(self.id, x, y)
def Redraw(self):
forms.redraw(self.id)
def Add(self, object):
forms.add_object(self.id, object.id)
object.parent = self
def Setminsize(self, x, y):
forms.set_minsize(self.id, x, y)
self.__minx = x # The __ is needed to avoid endless looping
self.__miny = y # on min[xy], which are non-gettable from XForms
def Setmaxsize(self, x, y):
forms.set_maxsize(self.id, x, y)
self.__maxx = x
self.__maxy = y
def Settitle(self, title):
forms.set_title(self.id, title)
self.__title = title
def Gettitle(self):
if self.visible:
return forms.get_title(self.id)
else:
return self.__title
def Setcolor(c1, c2):
self.__box.Setcolor(c1, c2)
def __setattr__(self, name, value):
if name == "x":
(tx, ty, tw, th) = forms.get_geometry(self.id)
forms.set_geometry(self.id, value, ty, tw, th)
elif name == "y":
(tx, ty, tw, th) = forms.get_geometry(self.id)
forms.set_geometry(self.id, tx, value, tw, th)
elif name == "w":
(tx, ty, tw, th) = forms.get_geometry(self.id)
forms.set_geometry(self.id, tx, ty, value, th)
elif name == "h":
(tx, ty, tw, th) = forms.get_geometry(self.id)
forms.set_geometry(self.id, tx, ty, tw, value)
elif name == "dblbuffer":
forms.set_dblbuffer(self.id, value)
elif name == "frozen":
if value:
self.Freeze()
else:
self.Unfreeze()
elif name == "active":
if value:
self.Activate()
else:
self.Deactivate()
elif name == "visible":
if value:
self.Show()
else:
self.Hide()
elif name == "minx":
self.Setminsize(value, self.__miny)
elif name == "miny":
self.Setminsize(self.__minx, value)
elif name == "maxx":
self.Setminsize(value, self.__maxy)
elif name == "maxy":
self.Setminsize(self.__maxx, value)
elif name == "title":
self.Settitle(value)
elif name == "c1":
self.__box.c1 = value
elif name == "c2":
self.__box.c2 = value
else:
self.__dict__[name] = value
def __getattr__(self, name):
if name == "x":
(tx, ty, tw, th) = forms.get_geometry(self.id)
return tx
elif name == "y":
(tx, ty, tw, th) = forms.get_geometry(self.id)
return ty
elif name == "w":
(tx, ty, tw, th) = forms.get_geometry(self.id)
return tw
elif name == "h":
(tx, ty, tw, th) = forms.get_geometry(self.id)
return th
elif name == "minx":
return self.__minx
elif name == "miny":
return self.__miny
elif name == "maxx":
return self.__maxx
elif name == "maxy":
return self.__maxy
elif name == "vmode":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return vmode
elif name == "active":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return active
elif name == "dblbuffer":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return dblbuffer
elif name == "frozen":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return frozen
elif name == "visible":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return visible
elif name == "border":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return border
elif name == "other":
(vmode, active, dblbuffer, frozen, visible, border, other) = forms.get_attr(
self.id
)
return other
elif name == "title":
return self.Gettitle()
elif name == "c1":
return self.__box.c1
elif name == "c2":
return self.__box.c2
def __del__(self):
pass
# I'm not sure if this is a nice thing to do
# forms.free (self.id)
###############################################################################
# This is the XFObject class, for generic XForms objects
class XFObject:
def __init__(self):
self.id = 0
self.__c1 = 11
self.__c2 = 15
def Setgravity(self, a, b):
objects.set_gravity(self.id, a, b)
def Redraw(self):
objects.redraw(self.id)
def Scale(self, x, y):
objects.scale(self.id, x, y)
def Show(self):
objects.show(self.id)
self.Setcolor(self.__c1, self.__c2)
def Hide(self):
objects.hide(self.id)
def Delete(self):
objects.delete(self.id)
def Setcolor(self, c1, c2):
self.__c1 = c1
self.__c2 = c2
objects.set_color(self.id, c1, c2)
def Activate(self):
objects.activate(self.id)
def Deactivate(self):
objects.deactivate(self.id)
def __setattr__(self, name, value):
if name == "boxtype":
objects.set_boxtype(self.id, value)
elif name == "bw":
objects.set_bw(self.id, value)
elif name == "labelsize":
objects.set_ls(self.id, value)
elif name == "labelstyle":
objects.set_lstyle(self.id, value)
elif name == "labelcolor":
objects.set_lcol(self.id, value)
elif name == "labelalign":
objects.set_lalign(self.id, value)
elif name == "label":
objects.set_label(self.id, value)
elif name == "shortcut":
objects.set_shortcut(self.id, value, 1)
elif name == "dblbuffer":
objects.set_dblbuffer(self.id, value)
elif name == "x":
(tx, ty, tw, th) = objects.get_geometry(self.id)
objects.set_geometry(self.id, value, ty, tw, th)
elif name == "y":
(tx, ty, tw, th) = objects.get_geometry(self.id)
objects.set_geometry(self.id, tx, value, tw, th)
elif name == "w":
(tx, ty, tw, th) = objects.get_geometry(self.id)
objects.set_geometry(self.id, tx, ty, value, th)
elif name == "h":
(tx, ty, tw, th) = objects.get_geometry(self.id)
objects.set_geometry(self.id, tx, ty, tw, value)
elif name == "resize":
objects.set_resize(self.id, value)
elif name == "c1":
self.Setcolor(value, self.__c2)
elif name == "c2":
self.Setcolor(self.__c1, value)
else:
self.__dict__[name] = value
def __getattr__(self, name):
if name == "c1":
return self.__c1
elif name == "c2":
return self.__c2
def __del__(self):
# probably a BAD idea
objects.free(self.id)
###############################################################################
# The Bitmap Class
class Bitmap(XFObject):
def __init__(self, t=0, x=10, y=10, w=100, h=100, l="Bitmap"):
XFObject.__init__(self)
self.id = bitmaps.create(t, x, y, w, h, l)
def Load(self, file):
bitmaps.set_file(self.id, file)
def __setattr__(self, name, value):
if name == "background":
objects.set_color(self.id, value, 0)
elif name == "foreground":
objects.set_lcol(self.id, value)
else:
XFObject.__setattr__(self, name, value)
###############################################################################
# The Pixmap Class
class Pixmap(XFObject):
def __init__(self, t=0, x=10, y=10, w=100, h=100, l="Pixmap"):
XFObject.__init__(self)
self.id = pixmaps.create(t, x, y, w, h, l)
def Load(self, file):
pixmaps.set_file(self.id, file)
def __setattr__(self, name, value):
if name == "background":
objects.set_color(self.id, value, 0)
elif name == "foreground":
objects.set_lcol(self.id, value)
else:
XFObject.__setattr__(self, name, value)
###############################################################################
# The Box Class
class Box(XFObject):
def __init__(self, t=6, x=10, y=10, w=90, h=90, l="Box"):
XFObject.__init__(self)
self.id = box.create(t, x, y, w, h, l)
###############################################################################
# The Browser class
#
# I want the Browser class to act just like what it is: a list
# only with a "few" more methods and stuff
class Browser(XFObject):
def __init__(self, t=1, x=10, y=10, w=90, h=120, l="Browser"):
XFObject.__init__(self)
self.id = browser.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Add(self, line):
browser.add_line(self.id, line)
def Addto(self, line):
browser.addto(self.id, line)
def Insert(self, n, line):
browser.insert_line(self.id, n, line)
def Delete(self, n):
browser.delete_line(self.id, n)
def Replace(self, n, line):
browser.replace_line(self.id, n, line)
def Getline(self, n):
return browser.get_line(self.id, n)
def Load(self, path):
return browser.load(self.id, path)
def Select(self, n):
browser.select_line(self.id, n)
def Deselect(self, n):
browser.deselect_line(self.id, n)
def Deselectall(self):
browser.deselect(self.id)
def Isselected(self, n):
return browser.isselected_line(self.id, n)
def Gettopline(self):
return browser.get_topline(self.id)
def Get(self):
return browser.get(self.id)
def Getmaxline(self):
return browser.get_maxline(self.id)
def Screenlines(self):
return browser.get_screenlines(self.id)
def Settopline(self, n):
browser.set_topline(self.id, n)
def Setfontsize(self, n):
browser.set_fontsize(self.id, n)
def Setfontstyle(self, n):
browser.set_fontstyle(self.id, n)
def Setspecialkey(self, c):
browser.set_specialkey(self.id, c)
def Setleftslider(self, l):
browser.set_leftslider(self.id, l)
def __setattr__(self, name, value):
if name == "leftslider":
self.Setleftslider(value)
elif name == "specialkey":
self.Setspecialkey(value)
elif name == "fontstyle":
self.Setfontstyle(value)
elif name == "fontsize":
self.Setfontsize(value)
elif name == "topline":
self.Settopline(value)
else:
XFObject.__setattr__(self, name, value)
###############################################################################
# This is the Button class.
class Button(XFObject):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Button"):
XFObject.__init__(self)
self.id = button.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def __call__(self, v=-1):
# I think this is nice: if you have a button called b,
# b() returns the button's value
# b(1) or b(0) SETS the button value.
# You can also set/get it with b.value, though
if v == -1:
return button.get(self.id)
else:
button.set(self.id, v)
def __setattr__(self, name, value):
if name == "value":
self(value)
else:
XFObject.__setattr__(self, name, value)
def __getattr__(self, name):
if name == "value":
return self()
elif name == "numb":
return button.get_numb(self.id)
pass
else:
return XFObject.__getattr__(self, name)
###############################################################################
# This is the Roundbutton class
class Roundbutton(Button):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Roundbutton"):
XFObject.__init__(self)
self.id = button.create_round(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
###############################################################################
# This is the Lightbutton class
class Lightbutton(Button):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Lightbutton"):
XFObject.__init__(self)
self.id = button.create_light(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
###############################################################################
# This is the Checkbutton class
class Checkbutton(Button):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Checkbutton"):
XFObject.__init__(self)
self.id = button.create_check(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
###############################################################################
# This is the Bitmapbutton class
class Bitmapbutton(Button):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Bitmapbutton"):
XFObject.__init__(self)
self.id = button.create_bitmap(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
###############################################################################
# This is the Pixmapbutton class
class Pixmapbutton(Button):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Pixmapbutton"):
XFObject.__init__(self)
self.id = button.create_pixmap(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
###############################################################################
# This is the Choice Class
# This one needs a getattr, setattr pair
class Choice(XFObject):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Choice"):
XFObject.__init__(self)
self.id = choice.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Clear(self):
choice.clear(self.id)
def Addto(self, s):
choice.addto(self.id, s)
def Replace(self, n, s):
choice.replace(self.id, n, s)
def Delete(self, n):
choice.delete(self.id, n)
def Set(self, n):
choice.set(self.id, n)
def Settext(self, s):
choice.set_text(self.id, s)
def Get(self):
return choice.get(self.id)
def Getmaxitems(self):
return choice.get_maxitems(self.id)
def Gettext(self):
return choice.get_text(self.id)
def Setfontsize(self, n):
choice.set_fontsize(self.id, n)
def Setalign(self, n):
choice.set_align(self.id, n)
def Setmode(self, n, m):
choice.set_item_mode(self.id, n, m)
##############################################################################
# This is the clock class
class Clock(XFObject):
def __init__(self, t=0, x=10, y=10, w=90, h=90, l="Clock"):
XFObject.__init__(self)
self.id = clock.create(t, x, y, w, h, l)
def Get(self):
return clock.get(self.id)
##############################################################################
# This is the counter class
class Counter(XFObject):
def __init__(self, t=0, x=10, y=10, w=90, h=30, l="Counter"):
XFObject.__init__(self)
self.id = counter.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Set(self, v):
counter.set_value(self.id, v)
def Setbounds(self, min, max):
counter.set_bounds(self.id, min, max)
def Setstep(self, s1, s2):
counter.set_step(self.id, s1, s2)
def Setprecision(self, p):
counter.set_precision(self.id, p)
def Get(self):
return counter.get_value(self.id)
def Setreturn(self, v):
counter.set_return(self.id, v)
##############################################################################
# This is the Dial class
class Dial(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=60, l="Dial"):
XFObject.__init__(self)
self.id = dial.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Set(self, v):
dial.set_value(self.id, v)
def Get(self):
return dial.get_value(self.id)
def Setbounds(self, min, max):
dial.set_bounds(self.id, min, max)
def Getbounds(self):
return dial.get_bounds(self.id)
def Setstep(self, v):
dial.set_step(self.id, v)
def Setreturn(self, v):
dial.set_return(self.id, v)
###############################################################################
# This is the Frame class
class Frame(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=60, l="Frame"):
XFObject.__init__(self)
self.id = frame.create(t, x, y, w, h, l)
###############################################################################
# This is the Input class
class Input(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=30, l="Input"):
XFObject.__init__(self)
self.id = input.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Set(self, s):
input.set(self.id, s)
def Setcolor(self, c1, c2):
input.set_color(self.id, c1, c2)
def Get(self):
return input.get(self.id)
def Setreturn(self, v):
input.set_return(self.id, v)
def Setscroll(self, v):
input.set_scroll(self.id, v)
def Setcursorpos(self, x, y=1):
input.set_cursorpos(self.id, x, y)
def Setselected(self, v):
input.set_selected(self.id, v)
def Setselectedrange(self, x1, x2):
input.set_selected_range(self.id, x1, x2)
def __setattr__(self, name, value):
if name == "value":
self.Set(value)
else:
XFObject.__setattr__(self, name, value)
def __getattr__(self, name):
if name == "value":
return self.Get()
else:
return XFObject.__getattr__(self, name)
###############################################################################
# This is the Menu class
class Menu(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=30, l="Menu"):
XFObject.__init__(self)
self.id = menu.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Clear(self):
menu.clear(self.id)
def Set(self, s):
menu.set(self.id, s)
def Addto(self, s):
menu.addto(self.id, s)
def Replace(self, n, s):
menu.replace_item(self.id, n, s)
def Delete(self, n):
menu.delete_item(self.id, n)
def Setshortcut(self, n, s):
menu.set_item_shortcut(self.id, n, s)
def Setmode(self, n, m):
menu.set_item_mode(self.id, n, m)
def Showsymbol(self, n):
menu.show_symbol(self.id, n)
def Get(self):
return menu.get(self.id)
def Getmaxitems(self):
return menu.get_maxitems(self.id)
def Gettext(self):
return menu.get_text(self.id)
###############################################################################
# This is the Positioner class
class Positioner(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=60, l="Positioner"):
XFObject.__init__(self)
self.id = positioner.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Setx(self, v):
positioner.set_xvalue(self.id, v)
def Sety(self, v):
positioner.set_yvalue(self.id, v)
def Setxbounds(self, x1, x2):
positioner.set_xbounds(self.id, x1, x2)
def Setybounds(self, y1, y2):
positioner.set_ybounds(self.id, y1, y2)
def Setxstep(self, v):
positioner.set_xstep(self.id, v)
def Setystep(self, v):
positioner.set_ystep(self.id, v)
def Getx(self):
return positioner.get_xvalue(self.id)
def Gety(self):
return positioner.get_yvalue(self.id)
def Getxbounds(self):
positioner.get_xbounds(self.id)
def Getybounds(self):
positioner.get_ybounds(self.id)
def Setreturn(self, v):
positioner.set_return(self.id, v)
###############################################################################
# This is the Slider class
class Slider(XFObject):
def __init__(self, t=0, x=10, y=10, w=60, h=30, l="Slider"):
XFObject.__init__(self)
self.id = slider.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Get(self):
return slider.get_value(self.id)
def Set(self, v):
slider.set_value(self.id, v)
def Getbounds(self):
return slider.get_bounds(self.id)
def Setbounds(self, v1, v2):
slider.set_bounds(self.id, v1, v2)
def Setreturn(self, v):
slider.set_return(self.id, v)
def Setstep(self, v):
slider.set_step(self.id, v)
def Setsize(self, v):
slider.set_size(self.id, v)
###############################################################################
# This is the Valslider class
class Valslider(Slider):
def __init__(self, t=0, x=10, y=10, w=60, h=30, l="Valslider"):
XFObject.__init__(self)
self.id = slider.create_val(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Setprecision(self, v):
slider.set_precision(self.id, v)
##############################################################################
# This is the Timer class
class Timer(XFObject):
def __init__(self, t=1, x=10, y=10, w=60, h=30, l="Timer"):
XFObject.__init__(self)
self.id = timer.create(t, x, y, w, h, l)
_objects[str(self.id)] = self
self.cb = _nocb
self.args = self
def Set(self, v):
timer.set(self.id, v)
def Get(self):
return timer.get(self.id)