initial checkin
[org.ibex.widgets.git] / src / ibex / lib / clickable.t
1 <!-- Copyleft 2004 - see COPYING for details [LGPL] -->
2
3 <ibex>
4     <meta:doc>
5         See ibex.theme.clickable for details
6     </meta:doc>
7
8     <ibex.lib.repeatable />
9     <ui:box>
10
11         // template properties
12         thisbox.enabled;    // self explanatory
13         thisbox.repeats;    // if a repeating action is desired
14
15         // event triggers
16         thisbox.action;     // action trigger
17
18         // state properties
19         thisbox.primed;     // track activation irrespective of mouse.inside
20
21         // physical state triggers
22         thisbox.active;     // active state (mouse.inside and primed)
23         thisbox.hover;      // hover state (mouse.inside and !primed)
24         thisbox.normal;     // normal state (!mouse.inside)
25
26         enabled ++= function(v) {
27             cascade = v;
28             // deprime us when disabled
29             if (!v) { primed = false; normal = true; }
30         }
31
32         focused ++= function(v) {
33             cascade = v;
34             // unprime if defocused
35             if (!v and primed) primed = false;
36         }
37
38         primed ++= function(v) {
39             if (enabled) {
40                 // determine physical state and activate trigger
41                 v ? active = true : (mouse.inside ? hover = true : normal = true);
42                 // set repeat state if necessary
43                 if (repeats) repeat = v;
44             }
45             // do nothing when not enabled
46             else cascade = false;
47         }
48
49         KeyPressed ++= function(v) {
50             if (v == "enter" or v == " ") primed = true;
51             else if (v == "escape") primed = false;
52         }
53
54         KeyReleased ++= function(v) {
55             if (v == "enter" or v == " ")
56                 if (primed and enabled)
57                     { action = true; primed = false; }
58         }
59
60         Enter ++= function(v) {
61             if (enabled) {
62                 if (primed) {
63                     active = true;
64                     if (repeats) repeat = true;
65                 }
66                 else hover = true;
67             }
68         }
69
70         Leave ++= function(v) {
71             if (enabled) {
72                 normal = true;
73                 if (repeats) repeat = false;
74             }
75         }
76
77         Press1 ++= function(v) {
78             if (enabled) {
79                 primed = true;
80
81                 surface.Release1 ++= function(v) {
82                     // clean up
83                     if (enabled) {
84                         if (primed) {
85                             if (mouse.inside) repeats ? repeat = false : action = true;
86                             primed = false; // important: must occur _after_ action
87                         }
88                     }
89
90                     surface.Release1 --= callee;
91                 }
92             }
93         }
94
95         // initialise as normal state
96         // FIXME: redo this using better method (?)
97         SizeChange ++= function(v) {
98             normal = true;
99             SizeChange --= callee;
100         }
101
102     </ui:box>
103 </ibex>