rubygoo 0.0.6 → 0.0.7

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.
@@ -2,12 +2,16 @@ module Rubygoo
2
2
  # all events in the system are converted to these for internal use by our
3
3
  # adapter
4
4
  class GooEvent
5
- attr_accessor :event_type, :data
5
+ attr_accessor :event_type, :data, :handled
6
6
 
7
7
  def initialize(event_type, event_data = nil)
8
8
  @event_type = event_type
9
9
  @data = event_data
10
10
  end
11
11
 
12
+ def handled?()
13
+ @handled
14
+ end
15
+
12
16
  end
13
17
  end
@@ -0,0 +1,26 @@
1
+ module Rubygoo
2
+ # Icon is basically a place holder for images
3
+ class Icon < Widget
4
+ def initialize(opts={})
5
+ @icon = opts[:icon]
6
+ super opts
7
+ end
8
+
9
+ def added()
10
+ update_rect
11
+ end
12
+
13
+ def draw(adapter)
14
+ x1 = @rect[0]
15
+ y1 = @rect[1]
16
+ x2 = @rect[2] + x1
17
+ y2 = @rect[3] + y1
18
+
19
+ # TODO center icon
20
+ ix = x1#+((x2-x1)-@icon.w)
21
+ iy = y1#+((y2-y1)-@icon.h)
22
+ adapter.draw_image @icon, ix+@x_pad,iy+@y_pad
23
+ end
24
+ end
25
+ end
26
+
data/lib/rubygoo/label.rb CHANGED
@@ -2,18 +2,19 @@ require 'publisher'
2
2
  module Rubygoo
3
3
  class Label < Widget
4
4
  def initialize(text, opts={})
5
+ @font_size = opts[:font_size]
5
6
  super opts
6
7
  @text = text
7
8
  end
8
9
 
9
10
  def added()
10
11
  font = theme_property :font
11
- @font_size = theme_property :font_size
12
+ @font_size ||= theme_property :font_size
12
13
  @color = theme_property :color
13
14
  @bg_color = theme_property :bg_color
14
15
  @focus_color = theme_property :focus_color
15
16
  @border_color = theme_property :border_color
16
- @font_file = File.join(@app.theme_dir,font)
17
+ @font_file ||= File.join(@app.theme_dir,font)
17
18
 
18
19
  set_text @text
19
20
  end
@@ -21,7 +22,9 @@ module Rubygoo
21
22
  def set_text(text)
22
23
  @text = text
23
24
  @rendered_text = @app.renderer.render_text @text, @font_file, @font_size, @color
24
- @rect = Rect.new [@x,@y,@rendered_text.width+@x_pad,@rendered_text.height+@y_pad]
25
+ @w = @rendered_text.width
26
+ @h = @rendered_text.height
27
+ update_rect
25
28
  end
26
29
 
27
30
  def draw(adapter)
@@ -20,6 +20,10 @@ module Rubygoo
20
20
  adapter.draw_circle_filled @rect.centerx, @rect.centery, radius-@x_pad, @checked_color
21
21
  end
22
22
 
23
+ if mouse_over? and @hover_color
24
+ adapter.draw_circle_filled @rect.centerx, @rect.centery, radius-@x_pad, @hover_color
25
+ end
26
+
23
27
  if @border_color
24
28
  adapter.draw_circle @rect.centerx, @rect.centery, radius, @border_color
25
29
  end
@@ -4,7 +4,6 @@ module Rubygoo
4
4
  class RadioGroup < Container
5
5
 
6
6
  def initialize(opts={})
7
- # TODO add label, border
8
7
  super opts
9
8
  end
10
9
 
@@ -24,13 +23,9 @@ module Rubygoo
24
23
  end
25
24
 
26
25
  def update_group_selection(selected_widget)
27
- @widgets.each do |w|
28
- if w.respond_to? :checked?
29
- if w.checked?
30
- unless selected_widget == w
31
- w.uncheck
32
- end
33
- end
26
+ @widgets.select{|w| w.respond_to? :checked? and w.checked?}.each do |w|
27
+ unless selected_widget == w
28
+ w.uncheck
34
29
  end
35
30
  end
36
31
  end
@@ -48,18 +48,18 @@ module Rubygoo
48
48
  def focus(w)
49
49
  index = @widgets.index w
50
50
  if index
51
- @widgets[@selected_index].unfocus if @widgets[@selected_index]
51
+ @widgets[@selected_index]._unfocus if @widgets[@selected_index]
52
52
  @selected_index = index
53
- @widgets[@selected_index].focus
53
+ @widgets[@selected_index]._focus
54
54
  end
55
55
  end
56
56
 
57
57
  def rotate(dir)
58
58
  if @widgets.size > 0
59
- @widgets[@selected_index].unfocus if @widgets[@selected_index]
59
+ @widgets[@selected_index]._unfocus if @widgets[@selected_index]
60
60
  @selected_index += dir
61
61
  @selected_index %= @widgets.size
62
- @widgets[@selected_index].focus
62
+ @widgets[@selected_index]._focus
63
63
  end
64
64
  end
65
65
 
@@ -1,5 +1,4 @@
1
1
  require 'publisher'
2
- require 'css_colors'
3
2
  require 'goo_color'
4
3
  require 'rect'
5
4
  module Rubygoo
@@ -7,11 +6,13 @@ module Rubygoo
7
6
  extend Publisher
8
7
 
9
8
  # fire resized whenever a dimensional variable changes
10
- can_fire :clicked, :resized
9
+ can_fire :resized, :mouse_enter, :mouse_exit, :focus, :unfocus,
10
+ :key_pressed, :key_released, :mouse_down, :mouse_up, :mouse_drag,
11
+ :mouse_dragging, :mouse_motion, :enable, :disable, :hide, :show
11
12
 
12
- attr_accessor :enabled, :parent, :container,
13
+ attr_accessor :enabled, :parent, :container, :opts,
13
14
  :x, :y, :w, :h, :app, :x_pad, :y_pad, :focussed,
14
- :focus_priority, :relative
15
+ :focus_priority, :relative, :mouse_over, :visible
15
16
 
16
17
  DEFAULT_PARAMS = {
17
18
  :x => 0,
@@ -21,6 +22,8 @@ module Rubygoo
21
22
  :x_pad => 2,
22
23
  :y_pad => 2,
23
24
  :relative => false,
25
+ :enabled => true,
26
+ :visible => true,
24
27
  }
25
28
  def initialize(opts={})
26
29
  merged_opts = DEFAULT_PARAMS.merge opts
@@ -31,6 +34,11 @@ module Rubygoo
31
34
  @w = merged_opts[:w]
32
35
  @h = merged_opts[:h]
33
36
  @relative = merged_opts[:relative]
37
+ @enabled = merged_opts[:enabled]
38
+ @visible = merged_opts[:visible]
39
+
40
+ @opts = merged_opts
41
+
34
42
  update_rect
35
43
  end
36
44
 
@@ -38,75 +46,32 @@ module Rubygoo
38
46
  @rect = Rect.new [@x,@y,@w,@h]
39
47
  end
40
48
 
41
- # called when the widget is added to a container
42
- def added()
43
- end
44
-
45
- # called when the widget is removed from a container
46
- def removed()
47
- end
48
-
49
- def contains?(pos)
50
- @rect.collide_point? pos[0], pos[1]
51
- end
52
-
53
- def enabled?()
54
- @enabled
55
- end
56
-
57
- def update(millis)
58
- end
59
-
60
- # draw ourself on the screen
61
- def draw(screen)
62
- end
63
-
64
- # called when there is a mouse click
65
- def mouse_down(event)
66
- end
67
-
68
- # called when there is a mouse motion and no button pressed
69
- def mouse_motion(event)
70
- end
71
- #
72
- # called when there is a mouse motion and a button pressed
73
- def mouse_dragging(event)
49
+ def contains?(x, y)
50
+ @rect.collide_point? x, y
74
51
  end
75
52
 
76
- # called when there is a mouse release w/o drag
77
- def mouse_up(event)
78
- end
79
-
80
- # called when there is a mouse release at the end of a drag
81
- def mouse_drag(event)
53
+ def mouse_over?()
54
+ @mouse_over
82
55
  end
83
56
 
84
- # called when a key press is sent to us
85
- def key_pressed(event)
86
- end
87
-
88
- # called when a key release is sent to us
89
- def key_released(event)
90
- end
91
-
92
- # called when the widget receives focus
93
- def on_focus()
94
- end
95
-
96
- def focus()
97
- @focussed = true
98
- on_focus
99
- end
100
-
101
- # called when the widget loses focus
102
- def on_unfocus()
57
+ def _mouse_motion(event) #:nodoc:
58
+ if contains?(event.data[:x],event.data[:y])
59
+ unless @mouse_over
60
+ @mouse_over = true
61
+ fire :mouse_enter, event
62
+ mouse_enter event
63
+ end
64
+ else
65
+ if @mouse_over
66
+ @mouse_over = false
67
+ fire :mouse_exit, event
68
+ mouse_exit event
69
+ end
70
+ end
71
+ fire :mouse_motion, event
72
+ mouse_motion event
103
73
  end
104
74
 
105
- def unfocus()
106
- @focussed = false
107
- on_unfocus
108
- end
109
-
110
75
  def focussed?()
111
76
  @focussed
112
77
  end
@@ -121,19 +86,21 @@ module Rubygoo
121
86
  if class_theme
122
87
  class_prop = class_theme[prop_key]
123
88
  if class_prop
89
+ return nil if class_prop == :none
124
90
  prop = class_prop
125
91
  break
126
92
  end
127
93
  end
128
94
  parent = parent.superclass
129
95
  end
130
- if prop_key.to_s.match /color/i
96
+ if prop_key.to_s.match(/color/i) and prop
131
97
  get_color prop
132
98
  else
133
99
  prop
134
100
  end
135
101
  end
136
102
 
103
+ # converts theme property to a GooColor
137
104
  def get_color(color)
138
105
  new_color = nil
139
106
  if color.is_a? Array
@@ -141,14 +108,14 @@ module Rubygoo
141
108
  new_color = color
142
109
  else
143
110
  # fill in zeros for all other colors
144
- 3-color.size.times do
111
+ (3 - color.size).times do
145
112
  color << 0
146
113
  end
147
114
  # fill in alpha as 255
148
115
  color << 255
149
116
  end
150
117
  elsif color.is_a? Symbol
151
- new_color = CSS_COLORS[color]
118
+ new_color = COLORS[color]
152
119
  else
153
120
  raise "invalid color"
154
121
  end
@@ -156,43 +123,213 @@ module Rubygoo
156
123
  GooColor.new *new_color
157
124
  end
158
125
 
159
- # does this widget want tabbed focus? Widget do usually
160
- def tab_to?()
161
- true
162
- end
163
-
164
- def modal?()
165
- false
166
- end
167
-
168
- # called each update cycle with the amount of time that has
169
- # passed. useful for animations, etc
170
- def update(time)
171
- end
172
-
126
+ # sets x and fires resized event
173
127
  def x=(val)
174
128
  @x = val
129
+ update_rect
175
130
  fire :resized, self
176
131
  end
132
+
133
+ # sets y and fires resized event
177
134
  def y=(val)
178
135
  @y = val
136
+ update_rect
179
137
  fire :resized, self
180
138
  end
139
+
140
+ # sets width and fires resized event
181
141
  def w=(val)
182
142
  @w = val
143
+ update_rect
183
144
  fire :resized, self
184
145
  end
146
+
147
+ # sets height and fires resized event
185
148
  def h=(val)
186
149
  @h = val
150
+ update_rect
187
151
  fire :resized, self
188
152
  end
153
+
154
+ # sets x padding and fires resized event
189
155
  def x_pad=(val)
190
156
  @x_pad = val
157
+ update_rect
191
158
  fire :resized, self
192
159
  end
160
+
161
+ # sets y padding and fires resized event
193
162
  def y_pad=(val)
194
163
  @y_pad = val
164
+ update_rect
195
165
  fire :resized, self
196
166
  end
167
+
168
+ def enabled?()
169
+ @enabled
170
+ end
171
+
172
+ # called when the widget is disabled
173
+ def disable()
174
+ if enabled?
175
+ fire :disable
176
+ @enabled = false
177
+ end
178
+ end
179
+
180
+ # called when the widget is enabled
181
+ def enable()
182
+ unless enabled?
183
+ fire :enable
184
+ @enabled = true
185
+ end
186
+ end
187
+
188
+ def visible?()
189
+ @visible
190
+ end
191
+
192
+ # called when the widget is hidden
193
+ def hide()
194
+ if visible?
195
+ fire :hide
196
+ @visible = false
197
+ disable
198
+ end
199
+ end
200
+
201
+ # called when the widget is shown
202
+ def show()
203
+ unless visible?
204
+ fire :show
205
+ @visible = true
206
+ enable
207
+ end
208
+ end
209
+
210
+ def _update(time) #:nodoc:
211
+ update time
212
+ end
213
+
214
+ def _focus() #:nodoc:
215
+ fire :focus
216
+ @focussed = true
217
+ focus
218
+ end
219
+
220
+ def _unfocus() #:nodoc:
221
+ fire :unfocus
222
+ @focussed = false
223
+ unfocus
224
+ end
225
+
226
+ def _mouse_dragging(event) #:nodoc:
227
+ fire :mouse_dragging, event
228
+ mouse_dragging event
229
+ end
230
+
231
+ def _mouse_drag(event) #:nodoc:
232
+ fire :mouse_drag, event
233
+ mouse_drag event
234
+ end
235
+
236
+ def _mouse_up(event) #:nodoc:
237
+ fire :mouse_up, event
238
+ mouse_up event
239
+ end
240
+
241
+ def _mouse_down(event) #:nodoc:
242
+ fire :mouse_down, event
243
+ mouse_down event
244
+ end
245
+
246
+ def _key_pressed(event) #:nodoc:
247
+ fire :key_pressed, event
248
+ key_pressed event
249
+ end
250
+
251
+ def _key_released(event) #:nodoc:
252
+ fire :key_released, event
253
+ key_released event
254
+ end
255
+
256
+ def _draw(screen) #:nodoc:
257
+ draw screen
258
+ end
259
+
260
+ #
261
+ # STUFF TO OVER RIDE
262
+ #
263
+
264
+ # does this widget want tabbed focus? Widget do usually
265
+ def tab_to?()
266
+ true
267
+ end
268
+
269
+ def modal?()
270
+ false
271
+ end
272
+
273
+ # called when the widget is added to a container
274
+ def added()
275
+ end
276
+
277
+ # called when the widget is removed from a container
278
+ def removed()
279
+ end
280
+
281
+ # called each update cycle with the amount of time that has
282
+ # passed. useful for animations, etc
283
+ def update(time)
284
+ end
285
+
286
+ # called when there is a mouse motion and a button pressed
287
+ def mouse_dragging(event)
288
+ end
289
+
290
+ # called when there is a mouse release w/o drag
291
+ def mouse_up(event)
292
+ end
293
+
294
+ # called when there is a mouse click
295
+ def mouse_down(event)
296
+ end
297
+
298
+ # called when there is a mouse release at the end of a drag
299
+ def mouse_drag(event)
300
+ end
301
+
302
+ # called when the mouse first enters a widget
303
+ def mouse_enter(event)
304
+ end
305
+
306
+ # called when the mouse exits a widget
307
+ def mouse_exit(event)
308
+ end
309
+
310
+ # called when there is a mouse motion and no button pressed
311
+ def mouse_motion(event)
312
+ end
313
+
314
+ # called when a key press is sent to us
315
+ def key_pressed(event)
316
+ end
317
+
318
+ # called when a key release is sent to us
319
+ def key_released(event)
320
+ end
321
+
322
+ # draw ourself on the screen
323
+ def draw(screen)
324
+ end
325
+
326
+ # called when the widget receives focus
327
+ def focus()
328
+ end
329
+
330
+ # called when the widget loses focus
331
+ def unfocus()
332
+ end
333
+
197
334
  end
198
335
  end
data/lib/rubygoo.rb CHANGED
@@ -12,6 +12,7 @@ require 'rubygoo/mouse_cursor'
12
12
  require 'rubygoo/tab_group'
13
13
  require 'rubygoo/app'
14
14
  require 'rubygoo/label'
15
+ require 'rubygoo/icon'
15
16
  require 'rubygoo/button'
16
17
  require 'rubygoo/check_box'
17
18
  require 'rubygoo/radio_button'
@@ -4,14 +4,28 @@ module CreateGui
4
4
 
5
5
  label = Label.new "click the button to set the time", :x=>20, :y=>30
6
6
 
7
- button = Button.new "Click Me!", :x=>70, :y=>80, :x_pad=>20, :y_pad=>20, :icon => icon
7
+ button = Button.new "Click Me!", :x=>70, :y=>80, :x_pad=>20, :y_pad=>20, :icon => icon, :enabled => false
8
8
  button.on :pressed do |*opts|
9
9
  label.set_text(Time.now.to_s)
10
10
  end
11
11
 
12
- check = CheckBox.new :x=>370, :y=>70, :w=>20, :h=>20
12
+ icon_widget = Icon.new :x => 280, :y => 80, :icon => icon
13
+
14
+ check = CheckBox.new :x=>370, :y=>70, :w=>20, :h=>20, :label=> "Check me out!"
15
+ check.on :mouse_enter do
16
+ puts "ENTERING #{self.class}"
17
+ end
18
+ check.on :mouse_exit do
19
+ puts "EXITING #{self.class}"
20
+ end
21
+
13
22
  check.on :checked do
14
23
  label.set_text("CHECKED [#{check.checked?}]")
24
+ if check.checked?
25
+ button.enable
26
+ else
27
+ button.disable
28
+ end
15
29
  end
16
30
 
17
31
  text_field = TextField.new "initial text", :x => 70, :y => 170, :max_length => 20, :min_length => 6
@@ -20,7 +34,7 @@ module CreateGui
20
34
  puts "BOO-YAH"
21
35
  end
22
36
 
23
- modal_button = Button.new "Modal dialogs", :x=>270, :y=>280, :x_pad=>20, :y_pad=>20
37
+ modal_button = Button.new "Modal dialogs", :x=>270, :y=>240, :x_pad=>20, :y_pad=>20
24
38
  modal_button.on :pressed do |*opts|
25
39
  # TODO make some of this stuff relative and/or make Dialog's
26
40
  # constructor take a layout to use
@@ -34,11 +48,11 @@ module CreateGui
34
48
 
35
49
  ok_butt = Button.new("OK", :x=>70, :y=>180, :x_pad=>20, :y_pad=>20,:relative=>true)
36
50
  ok_butt.on :pressed do |*opts|
37
- app.remove_modal(modal)
51
+ modal.close
38
52
  end
39
53
  modal.add ok_butt, resize_me
40
54
 
41
- modal.show
55
+ modal.display
42
56
  end
43
57
 
44
58
  grp = RadioGroup.new :x=>10, :y=>380, :x_pad=>20, :y_pad=>20, :w=> 500, :h=>80
@@ -49,11 +63,20 @@ module CreateGui
49
63
 
50
64
  grp.add grp_label, grp_radio_one, grp_radio_two, grp_radio_three
51
65
 
66
+ hide_button = Button.new "Hide the radios!", :x=>170, :y=>330, :x_pad=>10, :y_pad=>10
67
+ hide_button.on :pressed do |*opts|
68
+ if grp.visible?
69
+ grp.hide
70
+ else
71
+ grp.show
72
+ end
73
+ end
74
+
52
75
  # implicit tab ordering based on order of addition, can
53
76
  # specify if you want on widget creation
54
77
 
55
78
  # can add many or one at a time
56
- app.add text_field, label, button, modal_button, grp
79
+ app.add text_field, label, button, modal_button, grp, hide_button, icon_widget
57
80
  app.add check
58
81
 
59
82
  # pulldown = Pulldown.new {:x=>70, :y=>80}
data/samples/gosu_app.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ #require 'unprof'
2
3
  $: << './lib'
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'rubygoo'
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ #require 'unprof'
2
3
  $: << './lib'
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'rubygoo'
@@ -26,7 +27,7 @@ if $0 == __FILE__
26
27
  JoyHatEvent, JoyUpEvent, ResizeEvent
27
28
  ]
28
29
  clock = Clock.new
29
- clock.target_framerate = 20
30
+ clock.target_framerate = 40
30
31
 
31
32
  catch(:rubygame_quit) do
32
33
  loop do
@@ -1,25 +1,31 @@
1
1
  ---
2
- Rubygoo::App:
3
- :bg_color: :Black
2
+ Rubygoo::App: # look at Rubygoo::CssColors for list
3
+ :bg_color: :Snow
4
4
  Rubygoo::Container:
5
- :bg_color: :DarkGray
6
- Rubygoo::Widget:
5
+ :bg_color: :Silver
6
+ Rubygoo::Widget: # fonts should live in the theme's dir
7
7
  :font: Vera.ttf
8
8
  :font_size: 20
9
- :color: :Black
10
- :focus_color: :FireBrick
11
- :bg_color: :Gray
12
- :border_color: :FireBrick
9
+ :color: :Tomato
10
+ :focus_color: :LightSlateGray
11
+ :bg_color: :WhiteSmoke
12
+ :disabled_color: :WhiteSmoke
13
+ :border_color: :DarkSlateBlue
14
+ :hover_color: # can specify a color by r,g,b,a as well
15
+ - 55
16
+ - 55
17
+ - 55
18
+ - 150
13
19
  Rubygoo::Button:
14
- :bg_color: :DimGray
20
+ :bg_color: :LightGray
15
21
  Rubygoo::CheckBox:
16
- :checked_color: :FireBrick
22
+ :checked_color: :LightSlateGray
17
23
  Rubygoo::TextField:
18
- :fg_color: :FireBrick
19
- :bg_color: :Gray
20
- :bg_select_color: :FireBrick
24
+ :fg_color: :Black
25
+ :bg_color: :Silver
26
+ :bg_select_color: :DarkSlateBlue
21
27
  :fg_select_color: :Snow
22
- :border_color: :Black
28
+ :border_color: :DarkSlateBlue
23
29
  Rubygoo::MouseCursor:
24
- :color: :Snow
30
+ :color: :DarkSlateGray
25
31
  :mouse_cursor: cursor.png