4 CursesView
:= Object clone do(
6 position
:= Point clone
12 position
= position
clone
16 newSlot("superview", nil
)
17 redisplay
:= method(superview ?redisplay
)
25 directKey
:= method(k
,
26 if (k
== 4, self ?controlDKey
; return)
27 if (k
== 13, self returnKey
; return)
28 if (k
== 258, self ?downArrowKey
; return)
29 if (k
== 259, self ?upArrowKey
; return)
30 if (k
== 260, self ?leftArrowKey
; return)
31 if (k
== 261, self ?rightArrowKey
; return)
32 if (k
== 330, self ?delKey
; return)
33 if (k
== 127, self ?deleteKey
; return)
34 if (k
== 27, self ?escapeKey
; return)
39 buffer
append(k asCharacter
)
43 screenWidth
:= method(Curses width
)
44 screenHeight
:= method(Curses height
)
45 move
:= method(x
, y
, Curses move(Curses height
- y
, x
))
46 show
:= method(s
, Curses print(s
))
50 // ----------------------------------------
52 CursesScreen
:= Object clone do(
56 Curses nodelay(1) // asynchronous input
61 subviews
:= List clone
62 addSubview
:= method(v
,
65 if (firstResponder
== nil
, setFirstResponder(v
))
68 removeSubview
:= method(v
, subviews
remove(v
))
72 subviews
foreach(view
, view draw
)
73 if (debugMessage size
> 0,
75 Curses print(debugMessage
)
82 newSlot("firstResponder", nil
)
83 newSlot("needsDisplay", 1)
84 redisplay
:= method(needsDisplay
= 1)
93 firstResponder ?
directKey(c
)
94 //debugMessage
= c asString
97 if(needsDisplay
, display
)
110 //CursesScreen
addSubview(CursesView
clone)
112 // ----------------------------------------
114 CursesItem
:= Object clone do(
115 newSlot("object", nil
)
116 setObject
:= method(v
, object
= getSlot("v"); self)
118 newSlot("isSelected", nil
)
122 self getSlot("object") slotNames sort
foreach(slotName
,
123 item
:= CursesItem
clone
124 //item
setTitle(slotName
.. " " .. self getSlot("object") type .. "-" .. self getSlot("object") uniqueId)
125 item
setTitle(slotName
)
127 item
setObject(self getSlot("object") getSlot(slotName
))
130 self subitems
:= items
134 addSubitem
:= method(item
, subitems
append(item
))
135 hasSubitems
:= method(subitems size
> 0)
136 select
:= method(isSelected
= 1)
137 unselect
:= method(isSelected
= nil
)
140 CursesColumn
:= CursesView
clone do(
141 newSlot("delegate", nil
)
142 newSlot("selectedIndex", 0)
148 show(delegate title
.. " " .. delegate
uniqueId)
154 if (delegate hasSubitems
,
155 delegate subitems
foreach(i
, item
,
157 if (selectedIndex
== i
, Curses print("*"))
160 if (item hasSubitems
, move(w
-1, p
); show(">"))
166 for (p
, 1, h
, move(w
, p
); show("|"))
168 clipSelection
:= method(
169 selectedIndex
= selectedIndex
clip(0, delegate subitems size
- 1)
170 self selectedItem
:= item subitems
at(selectedIndex
)
173 upArrowKey
:= method(
174 selectedIndex
= selectedIndex
- 1
176 //CursesScreen debugMessage
= "upArrowKey"
179 downArrowKey
:= method(
180 selectedIndex
= selectedIndex
+ 1
182 //CursesScreen debugMessage
= "downArrowKey"
185 //selectedItem
:= method(item subitems
at(selectedIndex
))
188 if (selectedItem
, self setDelegate(selectedItem
))
193 item
:= CursesItem
clone setTitle("Lobby") setObject(Lobby)
195 CursesScreen
addSubview(CursesColumn
clone setDelegate(item
))