summaryrefslogtreecommitdiff
path: root/module/prefab.m
diff options
context:
space:
mode:
Diffstat (limited to 'module/prefab.m')
-rw-r--r--module/prefab.m113
1 files changed, 113 insertions, 0 deletions
diff --git a/module/prefab.m b/module/prefab.m
new file mode 100644
index 00000000..95d0f62e
--- /dev/null
+++ b/module/prefab.m
@@ -0,0 +1,113 @@
+Prefab: module
+{
+ PATH: con "$Prefab";
+
+ # types of Elements
+ EIcon: con 0;
+ EText: con 1;
+ ETitle: con 2;
+ EHorizontal: con 3;
+ EVertical: con 4;
+ ESeparator: con 5;
+
+ # first arg to Element.adjust: size of elements
+ Adjpack: con 10; # leave alone, pack tightly
+ Adjequal: con 11; # make equal
+ Adjfill: con 12; # make equal, filling available space
+
+ # second arg: position of element within space
+ Adjleft: con 20;
+ Adjup: con 20;
+ Adjcenter: con 21;
+ Adjright: con 22;
+ Adjdown: con 22;
+
+ # default fonts and colors for objects
+ Style: adt
+ {
+ titlefont: ref Draw->Font;
+ textfont: ref Draw->Font;
+ elemcolor: ref Draw->Image;
+ edgecolor: ref Draw->Image;
+ titlecolor: ref Draw->Image;
+ textcolor: ref Draw->Image;
+ highlightcolor: ref Draw->Image;
+ };
+
+ # drawing environment for objects
+ Environ: adt
+ {
+ screen: ref Draw->Screen;
+ style: ref Style;
+ };
+
+ # operand for layout operators; set either (font, color, text) or (icon, mask)
+ Layout: adt
+ {
+ font: ref Draw->Font;
+ color: ref Draw->Image;
+ text: string;
+ icon: ref Draw->Image;
+ mask: ref Draw->Image;
+ tag: string;
+ };
+
+ # graphical objects in the interface, recursively defined for making lists
+ Element: adt
+ {
+ # part of Ell elements
+ kind: int; # type: EIcon, EText, etc.
+ r: Draw->Rect; # rectangle on screen
+ environ: ref Environ; # graphics screen, style
+ tag: string; # identifier for selection
+
+ # different fields defined for different kinds of Elements
+ kids: list of ref Element; # children of EHorizontal, EVertical
+ str: string; # text in an EText element
+ mask: ref Draw->Image; # part of Eicon, ESeparator
+ image: ref Draw->Image; # part of Eicon, ESeparator, EText, Etitle
+ font: ref Draw->Font; # part of EText, Etitle
+
+ # constructors
+ icon: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element;
+ text: fn(env: ref Environ, text: string, r: Draw->Rect, kind: int): ref Element;
+ layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element;
+ elist: fn(env: ref Environ, elem: ref Element, kind: int): ref Element;
+ separator: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element;
+
+ # editing and geometry
+ append: fn(elist: self ref Element, elem: ref Element): int;
+ adjust: fn(elem: self ref Element, equal: int, dir: int);
+ clip: fn(elem: self ref Element, r: Draw->Rect);
+ scroll: fn(elem: self ref Element, d: Draw->Point);
+ translate: fn(elem: self ref Element, d: Draw->Point);
+ show: fn(elist: self ref Element, elem: ref Element): int;
+ };
+
+ # connects an element to a window for display
+ Compound: adt
+ {
+ image: ref Draw->Image; # window on which contents are drawn
+ environ: ref Environ; # graphics screen, style
+ r: Draw->Rect; # rectangle on screen
+ title: ref Element; # above the line (may be nil)
+ contents: ref Element; # below the line
+
+ # constructors
+ iconbox: fn(env: ref Environ, p: Draw->Point, title: string, icon, mask: ref Draw->Image): ref Compound;
+ textbox: fn(env: ref Environ, r: Draw->Rect, title, text: string): ref Compound;
+ layoutbox:fn(env: ref Environ, r: Draw->Rect, title: string, lay: list of Layout): ref Compound;
+ box: fn(env: ref Environ, p: Draw->Point, title, elist: ref Element): ref Compound;
+
+ # display
+ draw: fn(comp: self ref Compound);
+ redraw: fn(comp: self ref Compound, r: Draw->Rect);
+ scroll: fn(comp: self ref Compound, elem: ref Element, d: Draw->Point);
+ show: fn(comp: self ref Compound, elem: ref Element): int;
+
+ # support for using EHorizontal and EVertical as menus
+ select: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element);
+ tagselect: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element);
+ highlight: fn(comp: self ref Compound, elem: ref Element, on: int);
+ };
+};