slithernix-cdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/COPYING +131 -0
- data/README.md +45 -0
- data/lib/cdk/alphalist.rb +561 -0
- data/lib/cdk/buttonbox.rb +355 -0
- data/lib/cdk/calendar.rb +770 -0
- data/lib/cdk/cdk_objs.rb +463 -0
- data/lib/cdk/dialog.rb +727 -0
- data/lib/cdk/display.rb +63 -0
- data/lib/cdk/draw.rb +233 -0
- data/lib/cdk/dscale.rb +13 -0
- data/lib/cdk/entry.rb +556 -0
- data/lib/cdk/fscale.rb +44 -0
- data/lib/cdk/fselect.rb +940 -0
- data/lib/cdk/fslider.rb +61 -0
- data/lib/cdk/histogram.rb +410 -0
- data/lib/cdk/itemlist.rb +475 -0
- data/lib/cdk/label.rb +207 -0
- data/lib/cdk/marquee.rb +241 -0
- data/lib/cdk/matrix.rb +1176 -0
- data/lib/cdk/mentry.rb +616 -0
- data/lib/cdk/menu.rb +448 -0
- data/lib/cdk/radio.rb +533 -0
- data/lib/cdk/scale.rb +529 -0
- data/lib/cdk/screen.rb +281 -0
- data/lib/cdk/scroll.rb +996 -0
- data/lib/cdk/scroller.rb +183 -0
- data/lib/cdk/selection.rb +619 -0
- data/lib/cdk/slider.rb +542 -0
- data/lib/cdk/swindow.rb +762 -0
- data/lib/cdk/template.rb +562 -0
- data/lib/cdk/traverse.rb +289 -0
- data/lib/cdk/uscale.rb +14 -0
- data/lib/cdk/uslider.rb +14 -0
- data/lib/cdk/viewer.rb +812 -0
- data/lib/cdk.rb +1015 -0
- metadata +149 -0
data/lib/cdk/screen.rb
ADDED
@@ -0,0 +1,281 @@
|
|
1
|
+
module CDK
|
2
|
+
class SCREEN
|
3
|
+
attr_accessor :object_focus, :object_count, :object_limit, :object, :window
|
4
|
+
attr_accessor :exit_status
|
5
|
+
|
6
|
+
NOEXIT = 0
|
7
|
+
EXITOK = 1
|
8
|
+
EXITCANCEL = 2
|
9
|
+
|
10
|
+
def initialize (window)
|
11
|
+
Curses.curs_set(0)
|
12
|
+
# initialization for the first time
|
13
|
+
if CDK::ALL_SCREENS.size == 0
|
14
|
+
# Set up basic curses settings.
|
15
|
+
# #ifdef HAVE_SETLOCALE
|
16
|
+
# setlocale (LC_ALL, "");
|
17
|
+
# #endif
|
18
|
+
|
19
|
+
Curses.noecho
|
20
|
+
Curses.cbreak
|
21
|
+
end
|
22
|
+
|
23
|
+
CDK::ALL_SCREENS << self
|
24
|
+
@object_count = 0
|
25
|
+
@object_limit = 2
|
26
|
+
@object = Array.new(@object_limit, nil)
|
27
|
+
@window = window
|
28
|
+
@object_focus = 0
|
29
|
+
end
|
30
|
+
|
31
|
+
# This registers a CDK object with a screen.
|
32
|
+
def register(cdktype, object)
|
33
|
+
if @object_count + 1 >= @object_limit
|
34
|
+
@object_limit += 2
|
35
|
+
@object_limit *= 2
|
36
|
+
@object.concat(Array.new(@object_limit - @object.size, nil))
|
37
|
+
end
|
38
|
+
|
39
|
+
if object.validObjType(cdktype)
|
40
|
+
self.setScreenIndex(@object_count, object)
|
41
|
+
@object_count += 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# This removes an object from the CDK screen.
|
46
|
+
def self.unregister(cdktype, object)
|
47
|
+
if object.validObjType(cdktype) && object.screen_index >= 0
|
48
|
+
screen = object.screen
|
49
|
+
|
50
|
+
unless screen.nil?
|
51
|
+
index = object.screen_index
|
52
|
+
object.screen_index = -1
|
53
|
+
|
54
|
+
# Resequence the objects
|
55
|
+
(index...screen.object_count - 1).each do |x|
|
56
|
+
screen.setScreenIndex(x, screen.object[x+1])
|
57
|
+
end
|
58
|
+
|
59
|
+
if screen.object_count <= 1
|
60
|
+
# if no more objects, remove the array
|
61
|
+
screen.object = []
|
62
|
+
screen.object_count = 0
|
63
|
+
screen.object_limit = 0
|
64
|
+
else
|
65
|
+
screen.object[screen.object_count] = nil
|
66
|
+
screen.object_count -= 1
|
67
|
+
|
68
|
+
# Update the object-focus
|
69
|
+
if screen.object_focus == index
|
70
|
+
screen.object_focus -= 1
|
71
|
+
Traverse.setCDKFocusNext(screen)
|
72
|
+
elsif screen.object_focus > index
|
73
|
+
screen.object_focus -= 1
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def setScreenIndex(number, obj)
|
81
|
+
obj.screen_index = number
|
82
|
+
obj.screen = self
|
83
|
+
@object[number] = obj
|
84
|
+
end
|
85
|
+
|
86
|
+
def validIndex(n)
|
87
|
+
n >= 0 && n < @object_count
|
88
|
+
end
|
89
|
+
|
90
|
+
def swapCDKIndices(n1, n2)
|
91
|
+
if n1 != n2 && self.validIndex(n1) && self.validIndex(n2)
|
92
|
+
o1 = @object[n1]
|
93
|
+
o2 = @object[n2]
|
94
|
+
self.setScreenIndex(n1, o2)
|
95
|
+
self.setScreenIndex(n2, o1)
|
96
|
+
|
97
|
+
if @object_focus == n1
|
98
|
+
@object_focus = n2
|
99
|
+
elsif @object_focus == n2
|
100
|
+
@object_focus = n1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# This 'brings' a CDK object to the top of the stack.
|
106
|
+
def self.raiseCDKObject(cdktype, object)
|
107
|
+
if object.validObjType(cdktype)
|
108
|
+
screen = object.screen
|
109
|
+
screen.swapCDKIndices(object.screen_index, screen.object_count - 1)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# This 'lowers' an object.
|
114
|
+
def self.lowerCDKObject(cdktype, object)
|
115
|
+
if object.validObjType(cdktype)
|
116
|
+
object.screen.swapCDKIndices(object.screen_index, 0)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# This pops up a message.
|
121
|
+
def popupLabel(mesg, count)
|
122
|
+
#Create the label.
|
123
|
+
popup = CDK::LABEL.new(self, CENTER, CENTER, mesg, count, true, false)
|
124
|
+
|
125
|
+
old_state = Curses.curs_set(0)
|
126
|
+
#Draw it on the screen
|
127
|
+
popup.draw(true)
|
128
|
+
|
129
|
+
# Wait for some input.
|
130
|
+
popup.win.keypad(true)
|
131
|
+
popup.getch([])
|
132
|
+
|
133
|
+
# Kill it.
|
134
|
+
popup.destroy
|
135
|
+
|
136
|
+
# Clean the screen.
|
137
|
+
Curses.curs_set(old_state)
|
138
|
+
self.erase
|
139
|
+
self.refresh
|
140
|
+
end
|
141
|
+
|
142
|
+
# This pops up a message
|
143
|
+
def popupLabelAttrib(mesg, count, attrib)
|
144
|
+
# Create the label.
|
145
|
+
popup = CDK::LABEL.new(self, CENTER, CENTER, mesg, count, true, false)
|
146
|
+
popup.setBackgroundAttrib
|
147
|
+
|
148
|
+
old_state = Curses.curs_set(0)
|
149
|
+
# Draw it on the screen)
|
150
|
+
popup.draw(true)
|
151
|
+
|
152
|
+
# Wait for some input
|
153
|
+
popup.win.keypad(true)
|
154
|
+
popup.getch([])
|
155
|
+
|
156
|
+
# Kill it.
|
157
|
+
popup.destroy
|
158
|
+
|
159
|
+
# Clean the screen.
|
160
|
+
Curses.curs_set(old_state)
|
161
|
+
screen.erase
|
162
|
+
screen.refresh
|
163
|
+
end
|
164
|
+
|
165
|
+
# This pops up a dialog box.
|
166
|
+
def popupDialog(mesg, mesg_count, buttons, button_count)
|
167
|
+
# Create the dialog box.
|
168
|
+
popup = CDK::DIALOG.new(self, CDK::CENTER, CDK::CENTER,
|
169
|
+
mesg, mesg_count, buttons, button_count, Curses::A_REVERSE,
|
170
|
+
true, true, false)
|
171
|
+
|
172
|
+
# Activate the dialog box
|
173
|
+
popup.draw(true)
|
174
|
+
|
175
|
+
# Get the choice
|
176
|
+
choice = popup.activate('')
|
177
|
+
|
178
|
+
# Destroy the dialog box
|
179
|
+
popup.destroy
|
180
|
+
|
181
|
+
# Clean the screen.
|
182
|
+
self.erase
|
183
|
+
self.refresh
|
184
|
+
|
185
|
+
return choice
|
186
|
+
end
|
187
|
+
|
188
|
+
# This calls SCREEN.refresh, (made consistent with widgets)
|
189
|
+
def draw
|
190
|
+
self.refresh
|
191
|
+
end
|
192
|
+
|
193
|
+
# Refresh one CDK window.
|
194
|
+
# FIXME(original): this should be rewritten to use the panel library, so
|
195
|
+
# it would not be necessary to touch the window to ensure that it covers
|
196
|
+
# other windows.
|
197
|
+
def SCREEN.refreshCDKWindow(win)
|
198
|
+
win.touch
|
199
|
+
win.refresh
|
200
|
+
end
|
201
|
+
|
202
|
+
# This refreshes all the objects in the screen.
|
203
|
+
def refresh
|
204
|
+
focused = -1
|
205
|
+
visible = -1
|
206
|
+
|
207
|
+
CDK::SCREEN.refreshCDKWindow(@window)
|
208
|
+
|
209
|
+
# We erase all the invisible objects, then only draw it all back, so
|
210
|
+
# that the objects can overlap, and the visible ones will always be
|
211
|
+
# drawn after all the invisible ones are erased
|
212
|
+
(0...@object_count).each do |x|
|
213
|
+
obj = @object[x]
|
214
|
+
if obj.validObjType(obj.object_type)
|
215
|
+
if obj.is_visible
|
216
|
+
if visible < 0
|
217
|
+
visible = x
|
218
|
+
end
|
219
|
+
if obj.has_focus && focused < 0
|
220
|
+
focused = x
|
221
|
+
end
|
222
|
+
else
|
223
|
+
obj.erase
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
(0...@object_count).each do |x|
|
229
|
+
obj = @object[x]
|
230
|
+
|
231
|
+
if obj.validObjType(obj.object_type)
|
232
|
+
obj.has_focus = (x == focused)
|
233
|
+
|
234
|
+
if obj.is_visible
|
235
|
+
obj.draw(obj.box)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
# This clears all the objects in the screen
|
242
|
+
def erase
|
243
|
+
# We just call the object erase function
|
244
|
+
(0...@object_count).each do |x|
|
245
|
+
obj = @object[x]
|
246
|
+
if obj.validObjType(obj.object_type)
|
247
|
+
obj.erase
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
# Refresh the screen.
|
252
|
+
@window.refresh
|
253
|
+
end
|
254
|
+
|
255
|
+
# Destroy all the objects on a screen
|
256
|
+
def destroyCDKScreenObjects
|
257
|
+
(0...@object_count).each do |x|
|
258
|
+
obj = @object[x]
|
259
|
+
before = @object_count
|
260
|
+
|
261
|
+
if obj.validObjType(obj.object_type)
|
262
|
+
obj.erase
|
263
|
+
obj.destroy
|
264
|
+
x -= (@object_count - before)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
# This destroys a CDK screen.
|
270
|
+
def destroy
|
271
|
+
CDK::ALL_SCREENS.delete(self)
|
272
|
+
end
|
273
|
+
|
274
|
+
# This is added to remain consistent
|
275
|
+
def self.endCDK
|
276
|
+
Curses.echo
|
277
|
+
Curses.nocbreak
|
278
|
+
Curses.close_screen
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|