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.
@@ -0,0 +1,241 @@
1
+ require_relative 'cdk_objs'
2
+
3
+ module CDK
4
+ class MARQUEE < CDK::CDKOBJS
5
+ def initialize(cdkscreen, xpos, ypos, width, box, shadow)
6
+ super()
7
+
8
+ @screen = cdkscreen
9
+ @parent = cdkscreen.window
10
+ @win = Curses::Window.new(1, 1, ypos, xpos)
11
+ @active = true
12
+ @width = width
13
+ @shadow = shadow
14
+
15
+ self.setBox(box)
16
+ if @win.nil?
17
+ self.destroy
18
+ # return (0);
19
+ end
20
+
21
+ cdkscreen.register(:MARQUEE, self)
22
+ end
23
+
24
+ # This activates the widget.
25
+ def activate(mesg, delay, repeat, box)
26
+ mesg_length = []
27
+ start_pos = 0
28
+ first_char = 0
29
+ last_char = 1
30
+ repeat_count = 0
31
+ view_size = 0
32
+ message = []
33
+ first_time = true
34
+
35
+ if mesg.nil? or mesg == ''
36
+ return -1
37
+ end
38
+
39
+ # Keep the box info, setting BorderOf()
40
+ self.setBox(box)
41
+
42
+ padding = if mesg[-1] == ' ' then 0 else 1 end
43
+
44
+ # Translate the string to a chtype array
45
+ message = CDK.char2Chtype(mesg, mesg_length, [])
46
+
47
+ # Draw in the widget.
48
+ self.draw(@box)
49
+ view_limit = @width - (2 * @border_size)
50
+
51
+ # Start doing the marquee thing...
52
+ oldcurs = Curses.curs_set(0)
53
+ while @active
54
+ if first_time
55
+ first_char = 0
56
+ last_char = 1
57
+ view_size = last_char - first_char
58
+ start_pos = @width - view_size - @border_size
59
+
60
+ first_time = false
61
+ end
62
+
63
+ # Draw in the characters.
64
+ y = first_char
65
+ (start_pos...(start_pos + view_size)).each do |x|
66
+ ch = if y < mesg_length[0] then message[y].ord else ' '.ord end
67
+ @win.mvwaddch(@border_size, x, ch)
68
+ y += 1
69
+ end
70
+ @win.refresh
71
+
72
+ # Set my variables
73
+ if mesg_length[0] < view_limit
74
+ if last_char < (mesg_length[0] + padding)
75
+ last_char += 1
76
+ view_size += 1
77
+ start_pos = @width - view_size - @border_size
78
+ elsif start_pos > @border_size
79
+ # This means the whole string is visible.
80
+ start_pos -= 1
81
+ view_size = mesg_length[0] + padding
82
+ else
83
+ # We have to start chopping the view_size
84
+ start_pos = @border_size
85
+ first_char += 1
86
+ view_size -= 1
87
+ end
88
+ else
89
+ if start_pos > @border_size
90
+ last_char += 1
91
+ view_size += 1
92
+ start_pos -= 1
93
+ elsif last_char < mesg_length[0] + padding
94
+ first_char += 1
95
+ last_char += 1
96
+ start_pos = @border_size
97
+ view_size = view_limit
98
+ else
99
+ start_pos = @border_size
100
+ first_char += 1
101
+ view_size -= 1
102
+ end
103
+ end
104
+
105
+ # OK, let's check if we have to start over.
106
+ if view_size <= 0 && first_char == (mesg_length[0] + padding)
107
+ # Check if we repeat a specified number or loop indefinitely
108
+ repeat_count += 1
109
+ if repeat > 0 && repeat_count >= repeat
110
+ break
111
+ end
112
+
113
+ # Time to start over.
114
+ @win.mvwaddch(@border_size, @border_size, ' '.ord)
115
+ @win.refresh
116
+ first_time = true
117
+ end
118
+
119
+ # Now sleep
120
+ Curses.napms(delay * 10)
121
+ end
122
+ if oldcurs < 0
123
+ oldcurs = 1
124
+ end
125
+ Curses.curs_set(oldcurs)
126
+ return 0
127
+ end
128
+
129
+ # This de-activates a marquee widget.
130
+ def deactivate
131
+ @active = false
132
+ end
133
+
134
+ # This moves the marquee field to the given location.
135
+ # Inherited
136
+ # def move(xplace, yplace, relative, refresh_flag)
137
+ # end
138
+
139
+ # This draws the marquee widget on the screen.
140
+ def draw(box)
141
+ # Keep the box information.
142
+ @box = box
143
+
144
+ # Do we need to draw a shadow???
145
+ unless @shadow_win.nil?
146
+ Draw.drawShadow(@shadow_win)
147
+ end
148
+
149
+ # Box it if needed.
150
+ if box
151
+ Draw.drawObjBox(@win, self)
152
+ end
153
+
154
+ # Refresh the window.
155
+ @win.refresh
156
+ end
157
+
158
+ # This destroys the widget.
159
+ def destroy
160
+ # Clean up the windows.
161
+ CDK.deleteCursesWindow(@shadow_win)
162
+ CDK.deleteCursesWindow(@win)
163
+
164
+ # Clean the key bindings.
165
+ self.cleanBindings(:MARQUEE)
166
+
167
+ # Unregister this object.
168
+ CDK::SCREEN.unregister(:MARQUEE, self)
169
+ end
170
+
171
+ # This erases the widget.
172
+ def erase
173
+ if self.validCDKObject
174
+ CDK.eraseCursesWindow(@win)
175
+ CDK.eraseCursesWindow(@shadow_win)
176
+ end
177
+ end
178
+
179
+ # This sets the widgets box attribute.
180
+ def setBox(box)
181
+ xpos = if @win.nil? then 0 else @win.begx end
182
+ ypos = if @win.nil? then 0 else @win.begy end
183
+
184
+ super
185
+
186
+ self.layoutWidget(xpos, ypos)
187
+ end
188
+
189
+ def object_type
190
+ :MARQUEE
191
+ end
192
+
193
+ def position
194
+ super(@win)
195
+ end
196
+
197
+ # This sets the background attribute of the widget.
198
+ def setBKattr(attrib)
199
+ Curses.wbkgd(@win, attrib)
200
+ end
201
+
202
+ def layoutWidget(xpos, ypos)
203
+ cdkscreen = @screen
204
+ parent_width = @screen.window.maxx
205
+
206
+ CDK::MARQUEE.discardWin(@win)
207
+ CDK::MARQUEE.discardWin(@shadow_win)
208
+
209
+ box_width = CDK.setWidgetDimension(parent_width, @width, 0)
210
+ box_height = (@border_size * 2) + 1
211
+
212
+ # Rejustify the x and y positions if we need to.
213
+ xtmp = [xpos]
214
+ ytmp = [ypos]
215
+ CDK.alignxy(@screen.window, xtmp, ytmp, box_width, box_height)
216
+ window = Curses::Window.new(box_height, box_width, ytmp[0], xtmp[0])
217
+
218
+ unless window.nil?
219
+ @win = window
220
+ @box_height = box_height
221
+ @box_width = box_width
222
+
223
+ @win.keypad(true)
224
+
225
+ # Do we want a shadow?
226
+ if @shadow
227
+ @shadow_win = @screen.window.subwin(box_height, box_width,
228
+ ytmp[0] + 1, xtmp[0] + 1)
229
+ end
230
+ end
231
+ end
232
+
233
+ def self.discardWin(winp)
234
+ unless winp.nil?
235
+ winp.erase
236
+ winp.refresh
237
+ winp.close
238
+ end
239
+ end
240
+ end
241
+ end