Making Samples executable. #!/usr/bin/env io and chmod a+x *.io
[io/jrb1.git] / addons / Socket / samples / IRC / CursesScreen.io
blobd08c21fa20bcd703c4f8620dfe0bc055bb1cfc20
1 #!/usr/bin/env io
4 CursesView := Object clone do(
5 buffer := Buffer clone
6 position := Point clone
7 size := Point clone
9 init := method(
10 resend
11 buffer = buffer clone
12 position = position clone
13 size = size clone
16 newSlot("superview", nil)
17 redisplay := method(superview ?redisplay)
19 draw := method(
20 move(0,0)
21 show(buffer asString)
22 superview size = 1000
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)
35 key(k)
38 key := method(k,
39 buffer append(k asCharacter)
40 redisplay
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(
53 setup := method(
54 Curses init
55 Curses noEcho
56 Curses nodelay(1) // asynchronous input
57 Curses clear
58 Curses refresh
61 subviews := List clone
62 addSubview := method(v,
63 subviews append(v)
64 v setSuperview(self)
65 if (firstResponder == nil, setFirstResponder(v))
68 removeSubview := method(v, subviews remove(v))
70 display := method(
71 Curses clear
72 subviews foreach(view, view draw)
73 if (debugMessage size > 0,
74 Curses move(10, 10)
75 Curses print(debugMessage)
77 Curses refresh
78 needsDisplay = nil
79 //size = size + 1
82 newSlot("firstResponder", nil)
83 newSlot("needsDisplay", 1)
84 redisplay := method(needsDisplay = 1)
86 debugMessage := ""
87 isRunning := nil
88 eventLoop := method(
89 isRunning = 1
90 while(isRunning,
91 c := Curses getCh
92 if (c,
93 firstResponder ?directKey(c)
94 //debugMessage = c asString
95 redisplay
97 if(needsDisplay, display)
99 Curses refresh
100 yield
101 wait(.05)
105 shutdown := method(
106 Curses end
110 //CursesScreen addSubview(CursesView clone)
112 // ----------------------------------------
114 CursesItem := Object clone do(
115 newSlot("object", nil)
116 setObject := method(v, object = getSlot("v"); self)
117 newSlot("title", "")
118 newSlot("isSelected", nil)
120 subitems := method(
121 items := List clone
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))
128 items append(item)
130 self subitems := items
131 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)
143 size setWidth(30)
144 draw := method(
145 w := size width
146 h := screenHeight
147 move(1, h)
148 show(delegate title .. " " .. delegate uniqueId)
150 move(0, h-1)
151 w repeat(show("-"))
153 p := h-2
154 if (delegate hasSubitems,
155 delegate subitems foreach(i, item,
156 move(0, p)
157 if (selectedIndex == i, Curses print("*"))
158 move(1, p)
159 show(item title)
160 if (item hasSubitems, move(w-1, p); show(">"))
161 p = p - 1
162 if (p < 1, break)
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
175 clipSelection
176 //CursesScreen debugMessage = "upArrowKey"
179 downArrowKey := method(
180 selectedIndex = selectedIndex + 1
181 clipSelection
182 //CursesScreen debugMessage = "downArrowKey"
185 //selectedItem := method(item subitems at(selectedIndex))
187 returnKey := method(
188 if (selectedItem, self setDelegate(selectedItem))
189 selectedIndex = 0
193 item := CursesItem clone setTitle("Lobby") setObject(Lobby)
194 item subitems
195 CursesScreen addSubview(CursesColumn clone setDelegate(item))