rubygoo 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,301 +1,302 @@
1
- class TextField < Widget
2
- SPACE = " "
1
+ module Rubygoo
2
+ class TextField < Widget
3
+ SPACE = " "
3
4
 
4
- def initialize(text, opts={})
5
- super opts
6
- @text = text
7
-
8
- # TODO make widget respect these?
9
- @max_length = opts[:max_length]
10
- @min_length = opts[:min_length]
5
+ def initialize(text, opts={})
6
+ super opts
7
+ @text = text
11
8
 
12
- @key_handlers = {}
13
- end
9
+ # TODO make widget respect these?
10
+ @max_length = opts[:max_length]
11
+ @min_length = opts[:min_length]
14
12
 
15
- # Allows for registering callbacks for various key presses.
16
- # note: this will override default behavior such as K_RIGHT and
17
- # such
18
- # Example:
19
- # text_field.on_key K_RETURN, K_KP_ENTER do |evt|
20
- # puts "BOO-YAH"
21
- # end
22
- def on_key(*keys, &block)
23
- for key in keys
24
- @key_handlers[key] ||= []
25
- @key_handlers[key] << block
13
+ @key_handlers = {}
26
14
  end
27
- end
28
15
 
29
- def added()
30
- font = theme_property :font
31
- @font_size = theme_property :font_size
32
- @color = theme_property :color
33
- @fg_color = theme_property :fg_color
34
- @bg_color = theme_property :bg_color
35
- @bg_select_color = theme_property :bg_select_color
36
- @fg_select_color = theme_property :fg_select_color
37
- @focus_color = theme_property :focus_color
38
- @border_color = theme_property :border_color
39
-
40
- @font_file = File.join(@app.theme_dir,font)
41
-
42
- if @w == 1
43
- # we have the default from widget, we want to set the
44
- # default to 6 chars wide and 1 char tall
45
- size = @app.renderer.size_text "MMMMMM", @font_file, @font_size
46
- @min_w = size[0]
47
- @min_h = size[1]
16
+ # Allows for registering callbacks for various key presses.
17
+ # note: this will override default behavior such as K_RIGHT and
18
+ # such
19
+ # Example:
20
+ # text_field.on_key K_RETURN, K_KP_ENTER do |evt|
21
+ # puts "BOO-YAH"
22
+ # end
23
+ def on_key(*keys, &block)
24
+ for key in keys
25
+ @key_handlers[key] ||= []
26
+ @key_handlers[key] << block
27
+ end
48
28
  end
49
29
 
50
- set_text @text
51
- end
30
+ def added()
31
+ font = theme_property :font
32
+ @font_size = theme_property :font_size
33
+ @color = theme_property :color
34
+ @fg_color = theme_property :fg_color
35
+ @bg_color = theme_property :bg_color
36
+ @bg_select_color = theme_property :bg_select_color
37
+ @fg_select_color = theme_property :fg_select_color
38
+ @focus_color = theme_property :focus_color
39
+ @border_color = theme_property :border_color
40
+
41
+ @font_file = File.join(@app.theme_dir,font)
42
+
43
+ if @w == 1
44
+ # we have the default from widget, we want to set the
45
+ # default to 6 chars wide and 1 char tall
46
+ size = @app.renderer.size_text "MMMMMM", @font_file, @font_size
47
+ @min_w = size[0]
48
+ @min_h = size[1]
49
+ end
52
50
 
53
- def render()
54
- if @text.empty?
55
- w = [@w,@min_w].max + @x_pad
56
- h = [@h,@min_h].max + @y_pad
57
- @rendered_text = nil
58
- @rect = Rect.new [@x,@y,w,h]
59
- else
60
- @rendered_text = @app.renderer.render_text @text, @font_file, @font_size, @color
61
- w = [@rendered_text.width,@min_w].max + @x_pad
62
- h = [@rendered_text.height,@min_h].max + @y_pad
63
- @rect = Rect.new [@x,@y,w,h]
51
+ set_text @text
64
52
  end
65
- end
66
53
 
67
- def set_text(text)
68
- if text.nil?
69
- @text = ""
70
- @caret_pos = 0
71
- @select_pos = 0
72
- else
73
- @text = text
74
- @caret_pos = text.length
75
- @select_pos = @caret_pos
54
+ def render()
55
+ if @text.empty?
56
+ w = [@w,@min_w].max + @x_pad
57
+ h = [@h,@min_h].max + @y_pad
58
+ @rendered_text = nil
59
+ @rect = Rect.new [@x,@y,w,h]
60
+ else
61
+ @rendered_text = @app.renderer.render_text @text, @font_file, @font_size, @color
62
+ w = [@rendered_text.width,@min_w].max + @x_pad
63
+ h = [@rendered_text.height,@min_h].max + @y_pad
64
+ @rect = Rect.new [@x,@y,w,h]
65
+ end
76
66
  end
77
67
 
78
- render
68
+ def set_text(text)
69
+ if text.nil?
70
+ @text = ""
71
+ @caret_pos = 0
72
+ @select_pos = 0
73
+ else
74
+ @text = text
75
+ @caret_pos = text.length
76
+ @select_pos = @caret_pos
77
+ end
79
78
 
80
- end
79
+ render
81
80
 
82
- def draw(screen)
83
- screen.fill @fg_color, @rect
84
- screen.fill @bg_color, [@rect[0]-2,@rect[1]-2,@rect[2]+4,@rect[3]+4]
85
- if @border_color
86
- x1 = @rect[0] - 2
87
- y1 = @rect[1] - 2
88
- x2 = @rect[2] + x1 + 4
89
- y2 = @rect[3] + y1 + 4
90
- screen.draw_box x1, y1, x2, y2, @border_color
91
81
  end
92
- defaultY = @app.renderer.size_text(@text.slice(0,1),@font_file,@font_size)[1]
93
- x,y,w,h = @rect
94
- if @focussed
95
- caretX = @app.renderer.size_text(@text.slice(0,@caret_pos),@font_file,@font_size)[0]
96
- unless @select_pos.nil?
97
- # draw selection highlight
98
- selectX = @app.renderer.size_text(@text.slice(0,@select_pos),@font_file,@font_size)[0]
99
- selectX0 = [caretX, selectX].min
100
- selectX1 = [caretX, selectX].max
101
- if selectX0 < selectX1
102
- # TODO cache this height
103
- screen.fill(@bg_select_color, [x+1+selectX0, y+1, selectX1-selectX0, defaultY])
82
+
83
+ def draw(screen)
84
+ screen.fill @fg_color, @rect
85
+ screen.fill @bg_color, [@rect[0]-2,@rect[1]-2,@rect[2]+4,@rect[3]+4]
86
+ if @border_color
87
+ x1 = @rect[0] - 2
88
+ y1 = @rect[1] - 2
89
+ x2 = @rect[2] + x1 + 4
90
+ y2 = @rect[3] + y1 + 4
91
+ screen.draw_box x1, y1, x2, y2, @border_color
92
+ end
93
+ defaultY = @app.renderer.size_text(@text.slice(0,1),@font_file,@font_size)[1]
94
+ x,y,w,h = @rect
95
+ if @focussed
96
+ caretX = @app.renderer.size_text(@text.slice(0,@caret_pos),@font_file,@font_size)[0]
97
+ unless @select_pos.nil?
98
+ # draw selection highlight
99
+ selectX = @app.renderer.size_text(@text.slice(0,@select_pos),@font_file,@font_size)[0]
100
+ selectX0 = [caretX, selectX].min
101
+ selectX1 = [caretX, selectX].max
102
+ if selectX0 < selectX1
103
+ # TODO cache this height
104
+ screen.fill(@bg_select_color, [x+1+selectX0, y+1, selectX1-selectX0, defaultY])
105
+ end
104
106
  end
105
107
  end
106
- end
107
108
 
108
- unless @text.nil? or @text.empty?
109
- @rendered_text = @app.renderer.render_text @text, @font_file, @font_size, @color
110
- screen.draw_image @rendered_text, x+1, y+1
111
- end
109
+ unless @text.nil? or @text.empty?
110
+ @rendered_text = @app.renderer.render_text @text, @font_file, @font_size, @color
111
+ screen.draw_image @rendered_text, x+1, y+1, @color
112
+ end
112
113
 
113
- # draw caret
114
- if @focussed
115
- screen.fill(@fg_select_color, [x+1+caretX, y+1, 1, defaultY])
116
- end
114
+ # draw caret
115
+ if @focussed
116
+ screen.fill(@fg_select_color, [x+1+caretX, y+1, 1, defaultY])
117
+ end
117
118
 
118
- # don't really need this??
119
- return @rect
120
- end
119
+ # don't really need this??
120
+ return @rect
121
+ end
121
122
 
122
- def on_unfocus()
123
- @caret_pos = 0
124
- @select_pos = 0
125
- end
123
+ def on_unfocus()
124
+ @caret_pos = 0
125
+ @select_pos = 0
126
+ end
126
127
 
127
- def on_focus()
128
- @select_pos = @text.length
129
- @caret_pos = @text.length
130
- end
128
+ def on_focus()
129
+ @select_pos = @text.length
130
+ @caret_pos = @text.length
131
+ end
131
132
 
132
- def find_mouse_position(pos)
133
- # put hit position in window relative coords
134
- x = pos[0] - @rect[0]
135
- y = pos[1] - @rect[1]
136
-
137
- # find the horizontal position within the text by binary search
138
- l,r = 0, @text.length
139
- c = 0
140
- while l < r
141
- c = (l + r + 1) / 2
142
- w = @app.renderer.size_text(@text.slice(l,c-l), @font_file, @font_size)[0]
143
- if x >= w
144
- l = c
145
- x -= w
146
- else
147
- if r == c
148
- if x > w / 2
149
- l = l + 1
133
+ def find_mouse_position(pos)
134
+ # put hit position in window relative coords
135
+ x = pos[0] - @rect[0]
136
+ y = pos[1] - @rect[1]
137
+
138
+ # find the horizontal position within the text by binary search
139
+ l,r = 0, @text.length
140
+ c = 0
141
+ while l < r
142
+ c = (l + r + 1) / 2
143
+ w = @app.renderer.size_text(@text.slice(l,c-l), @font_file, @font_size)[0]
144
+ if x >= w
145
+ l = c
146
+ x -= w
147
+ else
148
+ if r == c
149
+ if x > w / 2
150
+ l = l + 1
151
+ end
152
+ break
150
153
  end
151
- break
152
- end
153
154
 
154
- r = c
155
+ r = c
156
+ end
155
157
  end
158
+ return l
156
159
  end
157
- return l
158
- end
159
-
160
- def mouse_down(event)
161
- x = event.data[:x]
162
- y = event.data[:y]
163
- return 0 unless contains?([x,y])
164
-
165
- # TODO rework focus and mouse events
166
- # getFocus()
167
- @caret_pos = find_mouse_position([x,y])
168
- @select_pos = @caret_pos
169
- @dragging = true
170
- render
171
- end
172
160
 
173
- def mouse_motion(event)
174
- return 0 unless @dragging
175
- x = event.data[:x]
176
- y = event.data[:y]
177
- @caret_pos = find_mouse_position([x,y])
178
- render
179
- end
161
+ def mouse_down(event)
162
+ x = event.data[:x]
163
+ y = event.data[:y]
164
+ return 0 unless contains?([x,y])
180
165
 
181
- def mouse_up(event)
182
- if not @dragging
183
- return 0
166
+ # TODO rework focus and mouse events
167
+ # getFocus()
168
+ @caret_pos = find_mouse_position([x,y])
169
+ @select_pos = @caret_pos
170
+ @dragging = true
171
+ render
184
172
  end
185
- x = event.data[:x]
186
- y = event.data[:y]
187
- @caret_pos = find_mouse_position([x,y])
188
- @dragging = false
189
- render
190
- end
191
173
 
192
- def delete_selected()
193
- return if @select_pos == @caret_pos
194
- if @caret_pos > @select_pos
195
- @caret_pos, @select_pos = @select_pos, @caret_pos
174
+ def mouse_motion(event)
175
+ return 0 unless @dragging
176
+ x = event.data[:x]
177
+ y = event.data[:y]
178
+ @caret_pos = find_mouse_position([x,y])
179
+ render
196
180
  end
197
181
 
198
- @text = @text.slice(0, @caret_pos) +
199
- @text.slice(@select_pos,@text.length-@select_pos)
200
- render
201
- @select_pos = @caret_pos
202
- end
203
-
204
- def key_pressed(event)
205
- return if not @focussed
206
- @dragging = false
182
+ def mouse_up(event)
183
+ if not @dragging
184
+ return 0
185
+ end
186
+ x = event.data[:x]
187
+ y = event.data[:y]
188
+ @caret_pos = find_mouse_position([x,y])
189
+ @dragging = false
190
+ render
191
+ end
207
192
 
208
- mods = event.data[:mods]
209
- handlers = @key_handlers[event.data[:key]]
210
- unless handlers.nil?
211
- for handler in handlers
212
- handler.call event
193
+ def delete_selected()
194
+ return if @select_pos == @caret_pos
195
+ if @caret_pos > @select_pos
196
+ @caret_pos, @select_pos = @select_pos, @caret_pos
213
197
  end
214
198
 
199
+ @text = @text.slice(0, @caret_pos) +
200
+ @text.slice(@select_pos,@text.length-@select_pos)
215
201
  render
216
- return
202
+ @select_pos = @caret_pos
217
203
  end
218
204
 
219
- case event.data[:key]
220
- when K_LEFT
221
- if @caret_pos > 0
222
- @caret_pos -= 1
205
+ def key_pressed(event)
206
+ return if not @focussed
207
+ @dragging = false
208
+
209
+ mods = event.data[:mods]
210
+ handlers = @key_handlers[event.data[:key]]
211
+ unless handlers.nil?
212
+ for handler in handlers
213
+ handler.call event
214
+ end
215
+
216
+ render
217
+ return
223
218
  end
224
- if mods.include? K_LCTRL or mods.include? K_RCTRL
225
- while @caret_pos > 0 and @text.slice(@caret_pos - 1,1) == SPACE
219
+
220
+ case event.data[:key]
221
+ when K_LEFT
222
+ if @caret_pos > 0
226
223
  @caret_pos -= 1
227
224
  end
228
- while @caret_pos > 0 and not @text.slice(@caret_pos - 1,1) == SPACE
229
- @caret_pos -= 1
225
+ if mods.include? K_LCTRL or mods.include? K_RCTRL
226
+ while @caret_pos > 0 and @text.slice(@caret_pos - 1,1) == SPACE
227
+ @caret_pos -= 1
228
+ end
229
+ while @caret_pos > 0 and not @text.slice(@caret_pos - 1,1) == SPACE
230
+ @caret_pos -= 1
231
+ end
230
232
  end
231
- end
232
233
 
233
- unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
234
- @select_pos = @caret_pos
235
- end
234
+ unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
235
+ @select_pos = @caret_pos
236
+ end
236
237
 
237
- when K_RIGHT
238
- if @caret_pos < @text.length
239
- @caret_pos += 1
240
- end
241
- if mods.include? K_LCTRL or mods.include? K_RCTRL
242
- while @caret_pos < @text.length and not @text.slice(@caret_pos,1) == SPACE
238
+ when K_RIGHT
239
+ if @caret_pos < @text.length
243
240
  @caret_pos += 1
244
241
  end
245
- while @caret_pos < @text.length and @text.slice(@caret_pos,1) == SPACE
246
- @caret_pos += 1
242
+ if mods.include? K_LCTRL or mods.include? K_RCTRL
243
+ while @caret_pos < @text.length and not @text.slice(@caret_pos,1) == SPACE
244
+ @caret_pos += 1
245
+ end
246
+ while @caret_pos < @text.length and @text.slice(@caret_pos,1) == SPACE
247
+ @caret_pos += 1
248
+ end
249
+ end
250
+ unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
251
+ @select_pos = @caret_pos
247
252
  end
248
- end
249
- unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
250
- @select_pos = @caret_pos
251
- end
252
253
 
253
- when K_HOME
254
- @caret_pos = 0
255
- unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
256
- @select_pos = @caret_pos
257
- end
254
+ when K_HOME
255
+ @caret_pos = 0
256
+ unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
257
+ @select_pos = @caret_pos
258
+ end
258
259
 
259
- when K_END
260
- @caret_pos = @text.length
261
- unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
262
- @select_pos = @caret_pos
263
- end
260
+ when K_END
261
+ @caret_pos = @text.length
262
+ unless mods.include? K_LSHIFT or mods.include? K_RSHIFT
263
+ @select_pos = @caret_pos
264
+ end
264
265
 
265
- when K_BACKSPACE
266
- if @select_pos != @caret_pos
267
- delete_selected()
268
- elsif @caret_pos > 0
269
- @text = @text.slice(0,@caret_pos-1) + @text.slice(@caret_pos,@text.length-@caret_pos)
270
- @caret_pos -= 1
271
- @select_pos = @caret_pos
272
- end
266
+ when K_BACKSPACE
267
+ if @select_pos != @caret_pos
268
+ delete_selected()
269
+ elsif @caret_pos > 0
270
+ @text = @text.slice(0,@caret_pos-1) + @text.slice(@caret_pos,@text.length-@caret_pos)
271
+ @caret_pos -= 1
272
+ @select_pos = @caret_pos
273
+ end
273
274
 
274
- when K_DELETE
275
- if @select_pos != @caret_pos:
276
- delete_selected()
277
- elsif @caret_pos < @text.length:
278
- @text = @text.slice(0,@caret_pos) + @text.slice(@caret_pos+1,@text.length-@caret_pos-1)
279
- @select_pos = @caret_pos
280
- end
275
+ when K_DELETE
276
+ if @select_pos != @caret_pos:
277
+ delete_selected()
278
+ elsif @caret_pos < @text.length:
279
+ @text = @text.slice(0,@caret_pos) + @text.slice(@caret_pos+1,@text.length-@caret_pos-1)
280
+ @select_pos = @caret_pos
281
+ end
281
282
 
282
- # TODO these key numbers are Rubygame specific
283
- when (32..127)
284
- # add regular text to the box
285
- if @caret_pos == @select_pos
286
- @text = @text.slice(0,@caret_pos) + event.data[:string] + @text.slice(@caret_pos,@text.length-@caret_pos)
287
- @caret_pos += 1
288
- else
289
- positions = [@caret_pos,@select_pos]
290
- min = positions.min
291
- max = positions.max
292
- @text = @text.slice(0,min) + event.data[:string] + @text.slice(max,@text.length-max)
293
- @caret_pos = min + 1
283
+ when *KEY2ASCII.keys
284
+ # add regular text to the box
285
+ if @caret_pos == @select_pos
286
+ @text = @text.slice(0,@caret_pos) + event.data[:string] + @text.slice(@caret_pos,@text.length-@caret_pos)
287
+ @caret_pos += 1
288
+ else
289
+ positions = [@caret_pos,@select_pos]
290
+ min = positions.min
291
+ max = positions.max
292
+ @text = @text.slice(0,min) + event.data[:string] + @text.slice(max,@text.length-max)
293
+ @caret_pos = min + 1
294
+ end
295
+
296
+ @select_pos = @caret_pos
294
297
  end
295
298
 
296
- @select_pos = @caret_pos
299
+ render
297
300
  end
298
-
299
- render
300
301
  end
301
302
  end