]> git.cworth.org Git - sup/blob - lib/sup/textfield.rb
bugfix: spurious nil pointer in textfield
[sup] / lib / sup / textfield.rb
1 require 'curses'
2
3 module Redwood
4
5 class TextField
6   attr_reader :value
7
8   def initialize window, y, x, width
9     @w, @x, @y = window, x, y
10     @width = width
11     @i = nil
12     @history = []
13   end
14
15   def activate question, default=nil
16     @question = question
17     @value = nil
18     @field = Ncurses::Form.new_field 1, @width - question.length,
19                                      @y, @x + question.length, 0, 0
20     @form = Ncurses::Form.new_form [@field]
21
22     @history[@i = @history.size] = default || ""
23     Ncurses::Form.post_form @form
24     @field.set_field_buffer 0, @history[@i]
25   end
26
27   def position_cursor
28     @w.attrset Colormap.color_for(:none)
29     @w.mvaddstr @y, 0, @question
30     Ncurses.curs_set 1
31     Ncurses::Form.form_driver @form, Ncurses::Form::REQ_END_FIELD
32     Ncurses::Form.form_driver @form, Ncurses::Form::REQ_NEXT_CHAR if @history[@i] =~ / $/ # fucking RETARDED!!!!
33   end
34
35   def deactivate
36     @form.unpost_form
37     @form.free_form
38     @field.free_field
39     Ncurses.curs_set 0
40   end
41
42   def handle_input c
43     if c == 10 # Ncurses::KEY_ENTER
44       Ncurses::Form.form_driver @form, Ncurses::Form::REQ_VALIDATION
45       @value = @history[@i] = @field.field_buffer(0).gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ")
46       return false
47     elsif c == Ncurses::KEY_CANCEL
48       @history.delete_at @i
49       @i = @history.empty? ? nil : (@i - 1) % @history.size 
50       @value = nil
51       return false
52     end
53
54     d =
55       case c
56       when Ncurses::KEY_LEFT
57         Ncurses::Form::REQ_PREV_CHAR
58       when Ncurses::KEY_RIGHT
59         Ncurses::Form::REQ_NEXT_CHAR
60       when Ncurses::KEY_BACKSPACE
61         Ncurses::Form::REQ_DEL_PREV
62       when ?\001
63         Ncurses::Form::REQ_BEG_FIELD
64       when ?\005
65         Ncurses::Form::REQ_END_FIELD
66       when Ncurses::KEY_UP
67         @history[@i] = @field.field_buffer(0)
68         @i = (@i - 1) % @history.size
69         @field.set_field_buffer 0, @history[@i]
70       when Ncurses::KEY_DOWN
71         @history[@i] = @field.field_buffer(0)
72         @i = (@i + 1) % @history.size
73         @field.set_field_buffer 0, @history[@i]
74       else
75         c
76       end
77
78     Ncurses::Form.form_driver @form, d if d
79     Ncurses.refresh
80
81     true
82   end
83 end
84 end