rndk 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -4
  3. data/TODO +21 -1
  4. data/demos/appointment.rb +279 -299
  5. data/demos/clock.rb +13 -8
  6. data/demos/rss-reader.rb +84 -0
  7. data/examples/01-hello-world.rb +13 -11
  8. data/examples/02-colors.rb +14 -21
  9. data/examples/03-markup.rb +7 -7
  10. data/examples/04-quick-widgets.rb +2 -2
  11. data/examples/05-position-widget.rb +50 -31
  12. data/examples/06-callbacks.rb +77 -0
  13. data/examples/07-traverse.rb +90 -0
  14. data/examples/10-all-widgets.rb +165 -0
  15. data/examples/calendar.rb +20 -32
  16. data/examples/entry.rb +15 -20
  17. data/examples/label.rb +11 -11
  18. data/examples/scroll.rb +16 -60
  19. data/examples/slider.rb +18 -19
  20. data/examples/viewer.rb +65 -0
  21. data/lib/rndk.rb +28 -7
  22. data/lib/rndk/alphalist.rb +309 -313
  23. data/lib/rndk/button.rb +239 -157
  24. data/lib/rndk/buttonbox.rb +136 -103
  25. data/lib/rndk/calendar.rb +246 -203
  26. data/lib/rndk/core/color.rb +63 -13
  27. data/lib/rndk/core/display.rb +1 -1
  28. data/lib/rndk/core/draw.rb +11 -11
  29. data/lib/rndk/core/markup.rb +21 -21
  30. data/lib/rndk/core/quick_widgets.rb +75 -96
  31. data/lib/rndk/core/screen.rb +145 -102
  32. data/lib/rndk/core/traverse.rb +150 -136
  33. data/lib/rndk/core/utils.rb +5 -6
  34. data/lib/rndk/core/widget.rb +207 -191
  35. data/lib/rndk/core/widget_bind.rb +108 -0
  36. data/lib/rndk/dialog.rb +88 -56
  37. data/lib/rndk/entry.rb +79 -64
  38. data/lib/rndk/fscale.rb +38 -20
  39. data/lib/rndk/fslider.rb +38 -23
  40. data/lib/rndk/graph.rb +92 -53
  41. data/lib/rndk/itemlist.rb +80 -62
  42. data/lib/rndk/label.rb +111 -77
  43. data/lib/rndk/radio.rb +138 -128
  44. data/lib/rndk/scale.rb +123 -122
  45. data/lib/rndk/scroll.rb +444 -391
  46. data/lib/rndk/scroller.rb +21 -21
  47. data/lib/rndk/slider.rb +149 -140
  48. data/lib/rndk/template.rb +74 -61
  49. data/lib/rndk/version.rb +1 -1
  50. data/lib/rndk/viewer.rb +499 -298
  51. metadata +8 -14
  52. data/demos/fileview.rb +0 -141
  53. data/lib/rndk/dscale.rb +0 -13
  54. data/lib/rndk/fselect.rb +0 -938
  55. data/lib/rndk/histogram.rb +0 -412
  56. data/lib/rndk/marquee.rb +0 -244
  57. data/lib/rndk/matrix.rb +0 -1189
  58. data/lib/rndk/mentry.rb +0 -619
  59. data/lib/rndk/menu.rb +0 -478
  60. data/lib/rndk/selection.rb +0 -630
  61. data/lib/rndk/swindow.rb +0 -766
  62. data/lib/rndk/uscale.rb +0 -14
  63. data/lib/rndk/uslider.rb +0 -14
@@ -1,14 +1,43 @@
1
1
  require 'rndk'
2
2
 
3
3
  module RNDK
4
- class BUTTONBOX < Widget
4
+ class Buttonbox < Widget
5
5
  attr_reader :current_button
6
6
 
7
- def initialize(rndkscreen, x_pos, y_pos, height, width, title, rows, cols,
8
- buttons, button_count, highlight, box, shadow)
7
+ def initialize(screen, config={})
9
8
  super()
10
- parent_width = Ncurses.getmaxx(rndkscreen.window)
11
- parent_height = Ncurses.getmaxy(rndkscreen.window)
9
+ @widget_type = :buttonbox
10
+ @supported_signals += [:before_pressing, :pressed]
11
+
12
+ x = 0
13
+ y = 0
14
+ width = 0
15
+ height = 0
16
+ title = "buttonbox"
17
+ buttons = []
18
+ button_rows = 0
19
+ button_cols = 0
20
+ highlight = RNDK::Color[:reverse]
21
+ box = true
22
+ shadow = false
23
+
24
+ config.each do |key, val|
25
+ x = val if key == :x
26
+ y = val if key == :y
27
+ width = val if key == :width
28
+ height = val if key == :height
29
+ title = val if key == :title
30
+ button_rows = val if key == :button_rows
31
+ button_cols = val if key == :button_cols
32
+ buttons = val if key == :buttons
33
+ highlight = val if key == :highlight
34
+ box = val if key == :box
35
+ shadow = val if key == :shadow
36
+ end
37
+
38
+ button_count = buttons.size
39
+ parent_width = Ncurses.getmaxx(screen.window)
40
+ parent_height = Ncurses.getmaxy(screen.window)
12
41
  col_width = 0
13
42
  current_button = 0
14
43
  @button = []
@@ -28,12 +57,12 @@ module RNDK
28
57
  @col_adjust = 0
29
58
 
30
59
  # If the height is a negative value, the height will be
31
- # ROWS-height, otherwise the height will be the given height.
32
- box_height = RNDK.setWidgetDimension(parent_height, height, rows + 1)
60
+ # BUTTON_ROWS-height, otherwise the height will be the given height.
61
+ box_height = RNDK.set_widget_dimension(parent_height, height, button_rows + 1)
33
62
 
34
63
  # If the width is a negative value, the width will be
35
64
  # COLS-width, otherwise the width will be the given width.
36
- box_width = RNDK.setWidgetDimension(parent_width, width, 0)
65
+ box_width = RNDK.set_widget_dimension(parent_width, width, 0)
37
66
 
38
67
  box_width = self.set_title(title, box_width)
39
68
 
@@ -45,11 +74,11 @@ module RNDK
45
74
  end
46
75
 
47
76
  # Set the button positions.
48
- (0...cols).each do |x|
77
+ (0...button_cols).each do |x|
49
78
  max_col_width = -2**31
50
79
 
51
80
  # Look for the widest item in this column.
52
- (0...rows).each do |y|
81
+ (0...button_rows).each do |y|
53
82
  if current_button < button_count
54
83
  max_col_width = [@button_len[current_button], max_col_width].max
55
84
  current_button += 1
@@ -67,37 +96,37 @@ module RNDK
67
96
  box_height = [box_height, parent_height].min
68
97
 
69
98
  # Now we have to readjust the x and y positions
70
- xtmp = [x_pos]
71
- ytmp = [y_pos]
72
- RNDK.alignxy(rndkscreen.window, xtmp, ytmp, box_width, box_height)
99
+ xtmp = [x]
100
+ ytmp = [y]
101
+ RNDK.alignxy(screen.window, xtmp, ytmp, box_width, box_height)
73
102
  xpos = xtmp[0]
74
103
  ypos = ytmp[0]
75
104
 
76
105
  # Set up the buttonbox box attributes.
77
- @screen = rndkscreen
78
- @parent = rndkscreen.window
106
+ @screen = screen
107
+ @parent = screen.window
79
108
  @win = Ncurses.newwin(box_height, box_width, ypos, xpos)
80
109
  @shadow_win = nil
81
110
  @button_count = button_count
82
111
  @current_button = 0
83
- @rows = rows
84
- @cols = [button_count, cols].min
112
+ @button_rows = button_rows
113
+ @button_cols = [button_count, button_cols].min
85
114
  @box_height = box_height
86
115
  @box_width = box_width
87
116
  @highlight = highlight
88
117
  @accepts_focus = true
89
118
  @input_window = @win
90
119
  @shadow = shadow
91
- @button_attrib = Ncurses::A_NORMAL
120
+ @button_color = RNDK::Color[:normal]
92
121
 
93
122
  # Set up the row adjustment.
94
- if box_height - rows - @title_lines > 0
95
- @row_adjust = (box_height - rows - @title_lines) / @rows
123
+ if box_height - button_rows - @title_lines > 0
124
+ @row_adjust = (box_height - button_rows - @title_lines) / @button_rows
96
125
  end
97
126
 
98
127
  # Set the col adjustment
99
128
  if box_width - col_width > 0
100
- @col_adjust = ((box_width - col_width) / @cols) - 1
129
+ @col_adjust = ((box_width - col_width) / @button_cols) - 1
101
130
  end
102
131
 
103
132
  # If we couldn't create the window, we should return a null value.
@@ -114,17 +143,17 @@ module RNDK
114
143
  end
115
144
 
116
145
  # Register this baby.
117
- rndkscreen.register(:BUTTONBOX, self)
146
+ screen.register(@widget_type, self)
118
147
  end
119
148
 
120
149
  # This activates the widget.
121
- def activate(actions)
150
+ def activate(actions=[])
122
151
  # Draw the buttonbox box.
123
- self.draw(@box)
152
+ self.draw
124
153
 
125
154
  if actions.nil? || actions.size == 0
126
155
  while true
127
- input = self.getch([])
156
+ input = self.getch
128
157
 
129
158
  # Inject the characer into the widget.
130
159
  ret = self.inject(input)
@@ -148,39 +177,39 @@ module RNDK
148
177
  end
149
178
 
150
179
  # This injects a single character into the widget.
151
- def inject(input)
180
+ def inject input
152
181
  first_button = 0
153
182
  last_button = @button_count - 1
154
- pp_return = 1
155
- ret = -1
183
+ pp_return = true
184
+ ret = false
156
185
  complete = false
157
186
 
158
187
  # Set the exit type
159
188
  self.set_exit_type(0)
160
189
 
161
- unless @pre_process_func.nil?
162
- pp_return = @pre_process_func.call(:BUTTONBOX, self,
163
- @pre_process_data, input)
164
- end
190
+ keep_going = self.run_signal_binding(:before_input, input)
165
191
 
166
192
  # Should we continue?
167
- if pp_return != 0
193
+ if keep_going
194
+
168
195
  # Check for a key binding.
169
- if self.checkBind(:BUTTONBOX, input)
170
- complete = true
196
+ if self.is_bound? input
197
+ self.run_key_binding input
198
+ #complete = true
199
+
171
200
  else
172
201
  case input
173
202
  when Ncurses::KEY_LEFT, Ncurses::KEY_BTAB, Ncurses::KEY_BACKSPACE
174
- if @current_button - @rows < first_button
203
+ if @current_button - @button_rows < first_button
175
204
  @current_button = last_button
176
205
  else
177
- @current_button -= @rows
206
+ @current_button -= @button_rows
178
207
  end
179
208
  when Ncurses::KEY_RIGHT, RNDK::KEY_TAB, ' '.ord
180
- if @current_button + @rows > last_button
209
+ if @current_button + @button_rows > last_button
181
210
  @current_button = first_button
182
211
  else
183
- @current_button += @rows
212
+ @current_button += @button_rows
184
213
  end
185
214
  when Ncurses::KEY_UP
186
215
  if @current_button -1 < first_button
@@ -197,28 +226,32 @@ module RNDK
197
226
  when RNDK::REFRESH
198
227
  @screen.erase
199
228
  @screen.refresh
229
+
200
230
  when RNDK::KEY_ESC
201
231
  self.set_exit_type(input)
202
232
  complete = true
233
+
203
234
  when Ncurses::ERR
204
235
  self.set_exit_type(input)
205
236
  complete = true
237
+
206
238
  when RNDK::KEY_RETURN, Ncurses::KEY_ENTER
207
- self.set_exit_type(input)
208
- ret = @current_button
209
- complete = true
210
- end
211
- end
239
+ keep_going = self.run_signal_binding(:before_pressing)
212
240
 
213
- if !complete && !(@post_process_func.nil?)
214
- @post_process_func.call(:BUTTONBOX, self, @post_process_data,
215
- input)
241
+ if keep_going
242
+ self.run_signal_binding(:pressed)
243
+ self.set_exit_type input
244
+ ret = @current_button
245
+ complete = true
246
+ end
247
+ end
216
248
  end
217
249
 
250
+ self.run_signal_binding(:after_input) if not complete
218
251
  end
219
252
 
220
253
  unless complete
221
- self.drawButtons
254
+ self.draw_buttons
222
255
  self.set_exit_type(0)
223
256
  end
224
257
 
@@ -242,12 +275,12 @@ module RNDK
242
275
  end
243
276
 
244
277
  # This sets th background attribute of the widget.
245
- def set_bg_attrib(attrib)
278
+ def set_bg_color(attrib)
246
279
  Ncurses.wbkgd(@win, attrib)
247
280
  end
248
281
 
249
282
  # This draws the buttonbox box widget.
250
- def draw(box)
283
+ def draw
251
284
  # Is there a shadow?
252
285
  unless @shadow_win.nil?
253
286
  Draw.drawShadow(@shadow_win)
@@ -259,56 +292,15 @@ module RNDK
259
292
  end
260
293
 
261
294
  # Draw in the title if there is one.
262
- self.drawTitle @win
295
+ self.draw_title @win
263
296
 
264
297
  # Draw in the buttons.
265
- self.drawButtons
266
- end
267
-
268
- # This draws the buttons on the button box widget.
269
- def drawButtons
270
- row = @title_lines + 1
271
- col = @col_adjust / 2
272
- current_button = 0
273
- cur_row = -1
274
- cur_col = -1
275
-
276
- # Draw the buttons.
277
- while current_button < @button_count
278
- (0...@cols).each do |x|
279
- row = @title_lines + @border_size
280
-
281
- (0...@rows).each do |y|
282
- attr = @button_attrib
283
- if current_button == @current_button
284
- attr = @highlight
285
- cur_row = row
286
- cur_col = col
287
- end
288
- Draw.writeChtypeAttrib(@win,
289
- col,
290
- row,
291
- @button[current_button],
292
- attr,
293
- RNDK::HORIZONTAL,
294
- 0,
295
- @button_len[current_button])
296
- row += (1 + @row_adjust)
297
- current_button += 1
298
- end
299
- col += @column_widths[x] + @col_adjust + @border_size
300
- end
301
- end
302
-
303
- if cur_row >= 0 && cur_col >= 0
304
- Ncurses.wmove(@win, cur_row, cur_col)
305
- end
306
- Ncurses.wrefresh @win
298
+ self.draw_buttons
307
299
  end
308
300
 
309
301
  # This erases the buttonbox box from the screen.
310
302
  def erase
311
- if self.valid_widget?
303
+ if self.valid?
312
304
  RNDK.window_erase @win
313
305
  RNDK.window_erase @shadow_win
314
306
  end
@@ -316,14 +308,14 @@ module RNDK
316
308
 
317
309
  # This destroys the widget
318
310
  def destroy
319
- self.cleanTitle
311
+ self.clean_title
320
312
 
321
313
  RNDK.window_delete @shadow_win
322
314
  RNDK.window_delete @win
323
315
 
324
- self.clean_bindings(:BUTTONBOX)
316
+ self.clean_bindings
325
317
 
326
- RNDK::Screen.unregister(:BUTTONBOX, self)
318
+ @screen.unregister self
327
319
  end
328
320
 
329
321
  def setCurrentButton(button)
@@ -341,19 +333,60 @@ module RNDK
341
333
  end
342
334
 
343
335
  def focus
344
- self.draw(@box)
336
+ self.draw
345
337
  end
346
338
 
347
339
  def unfocus
348
- self.draw(@box)
349
- end
350
-
351
- def object_type
352
- :BUTTONBOX
340
+ self.draw
353
341
  end
354
342
 
355
343
  def position
356
344
  super(@win)
357
345
  end
346
+
347
+ protected
348
+
349
+ # This draws the buttons on the button box widget.
350
+ def draw_buttons
351
+ row = @title_lines + 1
352
+ col = @col_adjust / 2
353
+ current_button = 0
354
+ cur_row = -1
355
+ cur_col = -1
356
+
357
+ # Draw the buttons.
358
+ while current_button < @button_count
359
+ (0...@button_cols).each do |x|
360
+ row = @title_lines + @border_size
361
+
362
+ (0...@button_rows).each do |y|
363
+ attr = @button_color
364
+ if current_button == @current_button
365
+ attr = @highlight
366
+ cur_row = row
367
+ cur_col = col
368
+ end
369
+ Draw.writeChtypeAttrib(@win,
370
+ col,
371
+ row,
372
+ @button[current_button],
373
+ attr,
374
+ RNDK::HORIZONTAL,
375
+ 0,
376
+ @button_len[current_button])
377
+ row += (1 + @row_adjust)
378
+ current_button += 1
379
+ end
380
+ col += @column_widths[x] + @col_adjust + @border_size
381
+ end
382
+ end
383
+
384
+ if cur_row >= 0 && cur_col >= 0
385
+ Ncurses.wmove(@win, cur_row, cur_col)
386
+ end
387
+ Ncurses.wrefresh @win
388
+ end
389
+
390
+
358
391
  end
359
392
  end
@@ -117,52 +117,66 @@ module RNDK
117
117
 
118
118
  # Creates a Calendar Widget.
119
119
  #
120
- # * `xplace` is the x position - can be an integer or
120
+ # * `x` is the x position - can be an integer or
121
121
  # `RNDK::LEFT`, `RNDK::RIGHT`, `RNDK::CENTER`.
122
- # * `yplace` is the y position - can be an integer or
122
+ # * `y` is the y position - can be an integer or
123
123
  # `RNDK::TOP`, `RNDK::BOTTOM`, `RNDK::CENTER`.
124
- # * `day`, `month` and `year` are integers. I suggest
125
- # you to use Ruby's `Time.now.gmtime`.
124
+ # * `day`, `month` and `year` are integers on the
125
+ # format `dd`, `mm`, `yyyy`.
126
126
  # * `title` can be more than one line - just split them
127
127
  # with `\n`s.
128
- # * `*_attrib` are specific colors.
128
+ # * `*_color` are specific colors.
129
129
  #
130
130
  # @note If `day`, `month` or `year` are zero, we'll use
131
- # the current date for it.
131
+ # the current date for it (`Time.now.gmtime`).
132
132
  # If all of them are 0, will use the complete date
133
133
  # of today.
134
- def initialize(rndkscreen,
135
- xplace,
136
- yplace,
137
- title,
138
- day,
139
- month,
140
- year,
141
- day_attrib,
142
- month_attrib,
143
- year_attrib,
144
- highlight,
145
- box,
146
- shadow)
134
+ def initialize(screen, config={})
147
135
  super()
136
+ @widget_type = :calendar
137
+ @supported_signals += [:before_input, :after_input]
138
+
139
+ # This is UGLY AS HELL
140
+ # But I don't have time to clean this up right now
141
+ # (lots of widgets, you know) :(
142
+ x = 0
143
+ y = 0
144
+ title = "calendar"
145
+ day = 0
146
+ month = 0
147
+ year = 0
148
+ day_color = 0
149
+ month_color = 0
150
+ year_color = 0
151
+ highlight = RNDK::Color[:reverse]
152
+ box = true
153
+ shadow = false
154
+
155
+ config.each do |key, val|
156
+ x = val if key == :x
157
+ y = val if key == :y
158
+ title = val if key == :title
159
+ day = val if key == :day
160
+ month = val if key == :month
161
+ year = val if key == :year
162
+ day_color = val if key == :day_color
163
+ month_color = val if key == :month_color
164
+ year_color = val if key == :year_color
165
+ highlight = val if key == :highlight
166
+ box = val if key == :box
167
+ shadow = val if key == :shadow
168
+ end
169
+
148
170
  self.set_date(day, month, year)
149
171
  self.set_box box
150
172
 
151
- parent_width = Ncurses.getmaxx(rndkscreen.window)
152
- parent_height = Ncurses.getmaxy(rndkscreen.window)
173
+ parent_width = Ncurses.getmaxx(screen.window)
174
+ parent_height = Ncurses.getmaxy(screen.window)
153
175
 
154
176
  box_width = 24
155
177
  box_height = 11
156
178
 
157
179
  dayname = 'Su Mo Tu We Th Fr Sa '
158
- bindings = {
159
- 'T' => Ncurses::KEY_HOME,
160
- 't' => Ncurses::KEY_HOME,
161
- 'n' => Ncurses::KEY_NPAGE,
162
- RNDK::FORCHAR => Ncurses::KEY_NPAGE,
163
- 'p' => Ncurses::KEY_PPAGE,
164
- RNDK::BACKCHAR => Ncurses::KEY_PPAGE,
165
- }
166
180
 
167
181
  box_width = self.set_title(title, box_width)
168
182
  box_height += @title_lines
@@ -173,9 +187,9 @@ module RNDK
173
187
  box_height = [box_height, parent_height].min
174
188
 
175
189
  # Rejustify the x and y positions if we need to.
176
- xtmp = [xplace]
177
- ytmp = [yplace]
178
- RNDK.alignxy(rndkscreen.window, xtmp, ytmp, box_width, box_height)
190
+ xtmp = [x]
191
+ ytmp = [y]
192
+ RNDK.alignxy(screen.window, xtmp, ytmp, box_width, box_height)
179
193
  xpos = xtmp[0]
180
194
  ypos = ytmp[0]
181
195
 
@@ -198,8 +212,8 @@ module RNDK
198
212
  @day_name = dayname
199
213
 
200
214
  # Set the rest of the widget values.
201
- @screen = rndkscreen
202
- @parent = rndkscreen.window
215
+ @screen = screen
216
+ @parent = screen.window
203
217
 
204
218
  @xpos = xpos
205
219
  @ypos = ypos
@@ -208,9 +222,9 @@ module RNDK
208
222
  @box_width = box_width
209
223
  @box_height = box_height
210
224
 
211
- @day_attrib = day_attrib
212
- @month_attrib = month_attrib
213
- @year_attrib = year_attrib
225
+ @day_color = day_color
226
+ @month_color = month_color
227
+ @year_color = year_color
214
228
  @highlight = highlight
215
229
 
216
230
  @accepts_focus = true
@@ -255,17 +269,16 @@ module RNDK
255
269
  xpos + 1)
256
270
  end
257
271
 
258
- # Setup the key bindings.
259
- bindings.each do |from, to|
260
- self.bind(:calendar, from, :getc, to)
261
- end
272
+ self.bind_key('t') { self.set_date(0, 0, 0) }
273
+ self.bind_key('T') { self.set_date(0, 0, 0) }
274
+ self.bind_key('n') { self.incrementCalendarMonth 1 }
275
+ self.bind_key('p') { self.decrementCalendarMonth 1 }
276
+ self.bind_key('N') { self.incrementCalendarMonth 6 }
277
+ self.bind_key('P') { self.decrementCalendarMonth 6 }
278
+ self.bind_key('-') { self.decrementCalendarYear 1 }
279
+ self.bind_key('+') { self.incrementCalendarYear 1 }
262
280
 
263
- rndkscreen.register(:calendar, self)
264
- end
265
-
266
- # Returns the specific internal index of `d`/`m`/`y`.
267
- def self.calendar_index(d, m, y)
268
- (y * Calendar::MAX_MONTHS + m) * Calendar::MAX_DAYS + d
281
+ screen.register(:calendar, self)
269
282
  end
270
283
 
271
284
  # Sets `d`/`m`/`y` cell to have `value`.
@@ -286,12 +299,12 @@ module RNDK
286
299
  # @return The date or `nil` if something bad happened.
287
300
  def activate(actions=[])
288
301
  ret = nil
289
- self.draw @box
302
+ self.draw
290
303
 
291
304
  if actions.nil? || actions.size == 0
292
305
  # Interacting with the user
293
306
  loop do
294
- input = self.getch([])
307
+ input = self.getch
295
308
 
296
309
  # Inject the character into the widget.
297
310
  ret = self.inject input
@@ -311,57 +324,53 @@ module RNDK
311
324
  end
312
325
 
313
326
  # @see Widget#inject
314
- def inject char
315
- pp_return = 1
327
+ def inject input
328
+ pp_return = true
316
329
  ret = nil
317
330
  complete = false
318
331
 
319
- # Set the exit type
320
332
  self.set_exit_type(0)
321
-
322
- # Refresh the widget field.
323
- self.drawField
333
+ self.draw_field
324
334
 
325
335
  # Check if there is a pre-process function to be called.
326
- unless @pre_process_func.nil?
327
- pp_return = @pre_process_func.call(:calendar, self, @pre_process_data, char)
328
- end
336
+ keep_going = self.run_signal_binding(:before_input, input)
337
+
338
+ if keep_going
329
339
 
330
- # Should we continue?
331
- if pp_return != 0
332
340
  # Check a predefined binding
333
- if self.checkBind(:calendar, char)
341
+ if self.is_bound? input
342
+ self.run_key_binding input
334
343
 
335
344
  ## FIXME What the heck? Missing method?
336
345
  #self.checkEarlyExit
337
346
 
338
- complete = true
347
+ #complete = true
339
348
 
340
349
  else
341
- case char
342
- when Ncurses::KEY_UP then self.decrementCalendarDay 7
343
- when Ncurses::KEY_DOWN then self.incrementCalendarDay 7
344
- when Ncurses::KEY_LEFT then self.decrementCalendarDay 1
345
- when Ncurses::KEY_RIGHT then self.incrementCalendarDay 1
350
+ case input
351
+ when Ncurses::KEY_UP, RNDK::PREV
352
+ self.decrementCalendarDay 7
353
+ when Ncurses::KEY_DOWN, RNDK::NEXT
354
+ self.incrementCalendarDay 7
355
+ when Ncurses::KEY_LEFT, RNDK::BACKCHAR
356
+ self.decrementCalendarDay 1
357
+ when Ncurses::KEY_RIGHT, RNDK::FORCHAR
358
+ self.incrementCalendarDay 1
346
359
  when Ncurses::KEY_NPAGE then self.incrementCalendarMonth 1
347
360
  when Ncurses::KEY_PPAGE then self.decrementCalendarMonth 1
348
- when 'N'.ord then self.incrementCalendarMonth 6
349
- when 'P'.ord then self.decrementCalendarMonth 6
350
- when '-'.ord then self.decrementCalendarYear 1
351
- when '+'.ord then self.incrementCalendarYear 1
352
361
 
353
362
  when Ncurses::KEY_HOME
354
363
  self.set_date(0, 0, 0)
355
364
 
356
365
  when RNDK::KEY_ESC
357
- self.set_exit_type char
366
+ self.set_exit_type input
358
367
  complete = true
359
368
  when Ncurses::ERR
360
- self.set_exit_type char
369
+ self.set_exit_type input
361
370
  complete = true
362
371
  when RNDK::KEY_TAB, RNDK::KEY_RETURN, Ncurses::KEY_ENTER
363
- self.set_exit_type char
364
- ret = self.getCurrentTime
372
+ self.set_exit_type input
373
+ ret = self.get_current_time
365
374
  complete = true
366
375
  when RNDK::REFRESH
367
376
  @screen.erase
@@ -370,9 +379,7 @@ module RNDK
370
379
  end
371
380
 
372
381
  # Should we do a post-process?
373
- if !complete && !(@post_process_func.nil?)
374
- @post_process_func.call(:calendar, self, @post_process_data, char)
375
- end
382
+ self.run_signal_binding(:after_input) if not complete
376
383
  end
377
384
 
378
385
  if !complete
@@ -384,16 +391,16 @@ module RNDK
384
391
  end
385
392
 
386
393
  # @see Widget#move
387
- def move(xplace, yplace, relative, refresh_flag)
394
+ def move(x, y, relative, refresh_flag)
388
395
  windows = [@win, @field_win, @label_win, @shadow_win]
389
396
 
390
- self.move_specific(xplace, yplace, relative, refresh_flag, windows, [])
397
+ self.move_specific(x, y, relative, refresh_flag, windows, [])
391
398
  end
392
399
 
393
400
  # Draws the Widget on the Screen.
394
401
  #
395
402
  # If `box` is true, it is drawn with a box.
396
- def draw(box=false)
403
+ def draw
397
404
 
398
405
  header_len = @day_name.size
399
406
  col_len = (6 + header_len) / 7
@@ -402,9 +409,9 @@ module RNDK
402
409
  Draw.drawShadow(@shadow_win) unless @shadow_win.nil?
403
410
 
404
411
  # Box the widget if asked.
405
- Draw.drawObjBox(@win, self) if box
412
+ Draw.drawObjBox(@win, self) if @box
406
413
 
407
- self.drawTitle @win
414
+ self.draw_title @win
408
415
 
409
416
  # Draw in the day-of-the-week header.
410
417
  (0...7).each do |col|
@@ -420,77 +427,51 @@ module RNDK
420
427
  end
421
428
 
422
429
  Ncurses.wrefresh @win
423
- self.drawField
424
- end
425
-
426
- # Draws the month field.
427
- def drawField
428
- month_name = @month_name[@month]
429
- month_length = Calendar.days_in_month(@year, @month)
430
- year_index = Calendar.global_year_index(@year)
431
- year_len = 0
432
- save_y = -1
433
- save_x = -1
434
-
435
- day = (1 - @week_day + (@week_base % 7))
436
- if day > 0
437
- day -= 7
438
- end
439
-
440
- (1..6).each do |row|
441
- (0...7).each do |col|
442
- if day >= 1 && day <= month_length
443
- xpos = col * 3
444
- ypos = row
445
-
446
- marker = @day_attrib
447
- temp = '%02d' % day
448
-
449
- if @day == day
450
- marker = @highlight
451
- save_y = ypos + Ncurses.getbegy(@field_win) - Ncurses.getbegy(@input_window)
452
- save_x = 1
453
- else
454
- marker |= self.getMarker(day, @month, year_index)
455
- end
456
- Draw.writeCharAttrib(@field_win, xpos, ypos, temp, marker, RNDK::HORIZONTAL, 0, 2)
457
- end
458
- day += 1
459
- end
460
- end
461
- Ncurses.wrefresh @field_win
462
-
463
- # Draw the month in.
464
- if !(@label_win.nil?)
465
- temp = '%s %d,' % [month_name, @day]
466
- Draw.writeChar(@label_win, 0, 0, temp, RNDK::HORIZONTAL, 0, temp.size)
467
- Ncurses.wclrtoeol @label_win
468
-
469
- # Draw the year in.
470
- temp = '%d' % [@year]
471
- year_len = temp.size
472
- Draw.writeChar(@label_win, @field_width - year_len, 0, temp,
473
- RNDK::HORIZONTAL, 0, year_len)
474
-
475
- Ncurses.wmove(@label_win, 0, 0)
476
- Ncurses.wrefresh @label_win
477
-
478
- elsif save_y >= 0
479
- Ncurses.wmove(@input_window, save_y, save_x)
480
- Ncurses.wrefresh @input_window
481
- end
430
+ self.draw_field
482
431
  end
483
432
 
484
433
  # Sets multiple attributes of the Widget.
485
434
  #
486
435
  # See Calendar#initialize.
487
- def set(day, month, year, day_attrib, month_attrib, year_attrib, highlight, box)
488
- self.set_date(day, month, yar)
489
- self.set_day_attrib(day_attrib)
490
- self.set_month_attrib(month_attrib)
491
- self.set_year_attrib(year_attrib)
492
- self.set_highlight(highlight)
493
- self.set_box(box)
436
+ def set(config)
437
+ # This is UGLY AS HELL
438
+ # But I don't have time to clean this up right now
439
+ # (lots of widgets, you know) :(
440
+ x = 0
441
+ y = 0
442
+ title = "calendar"
443
+ day = 0
444
+ month = 0
445
+ year = 0
446
+ day_color = 0
447
+ month_color = 0
448
+ year_color = 0
449
+ highlight = RNDK::Color[:reverse]
450
+ box = false
451
+ shadow = false
452
+
453
+ config.each do |key, val|
454
+ x = val if key == :x
455
+ y = val if key == :y
456
+ title = val if key == :title
457
+ day = val if key == :day
458
+ month = val if key == :month
459
+ year = val if key == :year
460
+ day_color = val if key == :day_color
461
+ month_color = val if key == :month_color
462
+ year_color = val if key == :year_color
463
+ highlight = val if key == :highlight
464
+ box = val if key == :box
465
+ shadow = val if key == :shadow
466
+ end
467
+
468
+ self.set_date(day, month, year) if not day.zero? and month.zero? and year.zero?
469
+ self.set_day_color(day_color) if not day_color.zero?
470
+ self.set_month_color(month_color) if not month_color.zero?
471
+ self.set_year_color(year_color) if not year_color.zero?
472
+ self.set_highlight(highlight) if highlight != RNDK::Color[:reverse]
473
+ self.set_box(box) if box
474
+ @box_width = self.set_title(title, @box_width) if title != "calendar"
494
475
  end
495
476
 
496
477
  # Sets the current date.
@@ -523,30 +504,30 @@ module RNDK
523
504
  end
524
505
 
525
506
  # Sets the appearance/color of the days.
526
- def set_day_attrib attribute
527
- @day_attrib = attribute
507
+ def set_day_color attribute
508
+ @day_color = attribute
528
509
  end
529
510
 
530
- def get_day_attrib
531
- return @day_attrib
511
+ def get_day_color
512
+ return @day_color
532
513
  end
533
514
 
534
515
  # Sets the appearance/color of the month name.
535
- def set_month_attrib attribute
536
- @month_attrib = attribute
516
+ def set_month_color attribute
517
+ @month_color = attribute
537
518
  end
538
519
 
539
- def get_month_attrib
540
- return @month_attrib
520
+ def get_month_color
521
+ return @month_color
541
522
  end
542
523
 
543
524
  # Sets the appearance/color of the year number.
544
- def set_year_attrib attribute
545
- @year_attrib = attribute
525
+ def set_year_color attribute
526
+ @year_color = attribute
546
527
  end
547
528
 
548
- def get_year_attrib
549
- return @year_attrib
529
+ def get_year_color
530
+ return @year_color
550
531
  end
551
532
 
552
533
  # Sets the attribute/color of the highlight bar of the scrolling list.
@@ -554,12 +535,12 @@ module RNDK
554
535
  @highlight = highlight
555
536
  end
556
537
 
557
- def getHighlight
538
+ def get_highlight
558
539
  return @highlight
559
540
  end
560
541
 
561
542
  # Sets the background attribute/color of the widget.
562
- def set_bg_attrib attrib
543
+ def set_bg_color attrib
563
544
  Ncurses.wbkgd(@win, attrib)
564
545
  Ncurses.wbkgd(@field_win, attrib)
565
546
  Ncurses.wbkgd(@label_win, attrib) unless @label_win.nil?
@@ -567,7 +548,7 @@ module RNDK
567
548
 
568
549
  # @see Widget#erase
569
550
  def erase
570
- return unless self.valid_widget?
551
+ return unless self.valid?
571
552
 
572
553
  RNDK.window_erase @label_win
573
554
  RNDK.window_erase @field_win
@@ -577,26 +558,26 @@ module RNDK
577
558
 
578
559
  # @see Widget#destroy
579
560
  def destroy
580
- self.cleanTitle
561
+ self.clean_title
581
562
 
582
563
  RNDK.window_delete @label_win
583
564
  RNDK.window_delete @field_win
584
565
  RNDK.window_delete @shadow_win
585
566
  RNDK.window_delete @win
586
567
 
587
- self.clean_bindings :calendar
568
+ self.clean_bindings
588
569
 
589
- RNDK::Screen.unregister(:calendar, self)
570
+ @screen.unregister self
590
571
  end
591
572
 
592
573
  # Sets a marker on a specific date.
593
- def setMarker(day, month, year, marker)
574
+ def set_marker(day, month, year, marker)
594
575
  year_index = Calendar.global_year_index(year)
595
576
  oldmarker = self.getMarker(day, month, year)
596
577
 
597
578
  # Check to see if a marker has not already been set
598
579
  if oldmarker != 0
599
- self.setCalendarCell(day, month, year_index, oldmarker | Ncurses::A_BLINK)
580
+ self.setCalendarCell(day, month, year_index, oldmarker | RNDK::Color[:blink])
600
581
  else
601
582
  self.setCalendarCell(day, month, year_index, marker)
602
583
  end
@@ -609,7 +590,7 @@ module RNDK
609
590
  if @marker != 0
610
591
  result = self.getCalendarCell(day, month, year)
611
592
  end
612
- return result
593
+ result
613
594
  end
614
595
 
615
596
  # Removes a marker from the Calendar.
@@ -625,7 +606,6 @@ module RNDK
625
606
  end
626
607
  end
627
608
 
628
-
629
609
  # Sets the names of the days of the week.
630
610
  #
631
611
  # `days` is a String listing the 2-character
@@ -646,17 +626,57 @@ module RNDK
646
626
  # Makes sure that the internal dates exist, capping
647
627
  # the values if too big/small.
648
628
  def normalize_date
629
+ max = 1900 + MAX_YEARS - 1
630
+ @year = max if @year > max
631
+
649
632
  @year = 1900 if @year < 1900
650
633
  @month = 12 if @month > 12
651
634
  @month = 1 if @month < 1
652
635
  @day = 1 if @day < 1
653
636
 
637
+
654
638
  # Make sure the day given is within range of the month.
655
639
  month_length = Calendar.days_in_month(@year, @month)
656
640
 
657
641
  @day = month_length if @day > month_length
658
642
  end
659
643
 
644
+ # This returns what day of the week the month starts on.
645
+ def get_current_time
646
+ # Determine the current time and determine if we are in DST.
647
+ return Time.mktime(@year, @month, @day, 0, 0, 0).gmtime
648
+ end
649
+
650
+ def focus
651
+ # Original: drawRNDKFscale(widget, ObjOf (widget)->box);
652
+ self.draw
653
+ end
654
+
655
+ def unfocus
656
+ # Original: drawRNDKFscale(widget, ObjOf (widget)->box);
657
+ self.draw
658
+ end
659
+
660
+ # @see Widget#position
661
+ def position
662
+ super(@win)
663
+ end
664
+
665
+ protected
666
+
667
+ # Returns the internal widget `year` index.
668
+ # Minimum year is 1900.
669
+ def self.global_year_index year
670
+ return (year - 1900) if year >= 1900
671
+
672
+ year
673
+ end
674
+
675
+ # Returns the specific internal index of `d`/`m`/`y`.
676
+ def self.calendar_index(d, m, y)
677
+ (y * Calendar::MAX_MONTHS + m) * Calendar::MAX_DAYS + d
678
+ end
679
+
660
680
  # This increments the current day by the given value.
661
681
  def incrementCalendarDay(adjust)
662
682
  month_length = Calendar.days_in_month(@year, @month)
@@ -668,7 +688,7 @@ module RNDK
668
688
  self.incrementCalendarMonth(1)
669
689
  else
670
690
  @day += adjust
671
- self.drawField
691
+ self.draw_field
672
692
  end
673
693
  end
674
694
 
@@ -699,7 +719,7 @@ module RNDK
699
719
  self.decrementCalendarMonth(1)
700
720
  else
701
721
  @day -= adjust
702
- self.drawField
722
+ self.draw_field
703
723
  end
704
724
  end
705
725
 
@@ -724,7 +744,7 @@ module RNDK
724
744
 
725
745
  # Redraw the calendar.
726
746
  self.erase
727
- self.draw(@box)
747
+ self.draw
728
748
  end
729
749
 
730
750
  # This decrements the current month by the given value.
@@ -758,7 +778,7 @@ module RNDK
758
778
 
759
779
  # Redraw the calendar.
760
780
  self.erase
761
- self.draw(@box)
781
+ self.draw
762
782
  end
763
783
 
764
784
  # This increments the current year by the given value.
@@ -779,7 +799,7 @@ module RNDK
779
799
 
780
800
  # Redraw the calendar.
781
801
  self.erase
782
- self.draw(@box)
802
+ self.draw
783
803
  end
784
804
 
785
805
  # This decrements the current year by the given value.
@@ -811,42 +831,65 @@ module RNDK
811
831
 
812
832
  # Redraw the calendar.
813
833
  self.erase
814
- self.draw(@box)
834
+ self.draw
815
835
  end
816
836
 
817
- # This returns what day of the week the month starts on.
818
- def getCurrentTime
819
- # Determine the current time and determine if we are in DST.
820
- return Time.mktime(@year, @month, @day, 0, 0, 0).gmtime
821
- end
837
+ # Draws the month field.
838
+ def draw_field
839
+ month_name = @month_name[@month]
840
+ month_length = Calendar.days_in_month(@year, @month)
841
+ year_index = Calendar.global_year_index(@year)
842
+ year_len = 0
843
+ save_y = -1
844
+ save_x = -1
822
845
 
823
- def focus
824
- # Original: drawRNDKFscale(widget, ObjOf (widget)->box);
825
- self.draw(@box)
826
- end
846
+ day = (1 - @week_day + (@week_base % 7))
847
+ if day > 0
848
+ day -= 7
849
+ end
827
850
 
828
- def unfocus
829
- # Original: drawRNDKFscale(widget, ObjOf (widget)->box);
830
- self.draw(@box)
831
- end
851
+ (1..6).each do |row|
852
+ (0...7).each do |col|
853
+ if day >= 1 && day <= month_length
854
+ xpos = col * 3
855
+ ypos = row
832
856
 
833
- # @see Widget#position
834
- def position
835
- super(@win)
836
- end
857
+ marker = @day_color
858
+ temp = '%02d' % day
837
859
 
838
- def object_type
839
- :calendar
840
- end
860
+ if @day == day
861
+ marker = @highlight
862
+ save_y = ypos + Ncurses.getbegy(@field_win) - Ncurses.getbegy(@input_window)
863
+ save_x = 1
864
+ else
865
+ marker |= self.getMarker(day, @month, year_index)
866
+ end
867
+ Draw.writeCharAttrib(@field_win, xpos, ypos, temp, marker, RNDK::HORIZONTAL, 0, 2)
868
+ end
869
+ day += 1
870
+ end
871
+ end
872
+ Ncurses.wrefresh @field_win
841
873
 
842
- private
874
+ # Draw the month in.
875
+ if !(@label_win.nil?)
876
+ temp = '%s %d,' % [month_name, @day]
877
+ Draw.writeChar(@label_win, 0, 0, temp, RNDK::HORIZONTAL, 0, temp.size)
878
+ Ncurses.wclrtoeol @label_win
843
879
 
844
- # Returns the internal widget `year` index.
845
- # Minimum year is 1900.
846
- def self.global_year_index year
847
- return (year - 1900) if year >= 1900
880
+ # Draw the year in.
881
+ temp = '%d' % [@year]
882
+ year_len = temp.size
883
+ Draw.writeChar(@label_win, @field_width - year_len, 0, temp,
884
+ RNDK::HORIZONTAL, 0, year_len)
848
885
 
849
- year
886
+ Ncurses.wmove(@label_win, 0, 0)
887
+ Ncurses.wrefresh @label_win
888
+
889
+ elsif save_y >= 0
890
+ Ncurses.wmove(@input_window, save_y, save_x)
891
+ Ncurses.wrefresh @input_window
892
+ end
850
893
  end
851
894
 
852
895
  end