slithernix-cdk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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