rubygoo 0.0.3

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.
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,107 @@
1
+ class CodeStatistics #:nodoc:
2
+
3
+ TEST_TYPES = %w(Units Functionals Unit\ tests Functional\ tests Integration\ tests)
4
+
5
+ def initialize(*pairs)
6
+ @pairs = pairs
7
+ @statistics = calculate_statistics
8
+ @total = calculate_total if pairs.length > 1
9
+ end
10
+
11
+ def to_s
12
+ print_header
13
+ @pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
14
+ print_splitter
15
+
16
+ if @total
17
+ print_line("Total", @total)
18
+ print_splitter
19
+ end
20
+
21
+ print_code_test_stats
22
+ end
23
+
24
+ private
25
+ def calculate_statistics
26
+ @pairs.inject({}) { |stats, pair| stats[pair.first] = calculate_directory_statistics(pair.last); stats }
27
+ end
28
+
29
+ def calculate_directory_statistics(directory, pattern = /.*\.rb$/)
30
+ stats = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
31
+
32
+ Dir.foreach(directory) do |file_name|
33
+ if File.stat(directory + "/" + file_name).directory? and (/^\./ !~ file_name)
34
+ newstats = calculate_directory_statistics(directory + "/" + file_name, pattern)
35
+ stats.each { |k, v| stats[k] += newstats[k] }
36
+ end
37
+
38
+ next unless file_name =~ pattern
39
+
40
+ f = File.open(directory + "/" + file_name)
41
+
42
+ while line = f.gets
43
+ stats["lines"] += 1
44
+ stats["classes"] += 1 if line =~ /class [A-Z]/
45
+ stats["methods"] += 1 if line =~ /def [a-z]/
46
+ stats["codelines"] += 1 unless line =~ /^\s*$/ || line =~ /^\s*#/
47
+ end
48
+ end
49
+
50
+ stats
51
+ end
52
+
53
+ def calculate_total
54
+ total = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
55
+ @statistics.each_value { |pair| pair.each { |k, v| total[k] += v } }
56
+ total
57
+ end
58
+
59
+ def calculate_code
60
+ code_loc = 0
61
+ @statistics.each { |k, v| code_loc += v['codelines'] unless TEST_TYPES.include? k }
62
+ code_loc
63
+ end
64
+
65
+ def calculate_tests
66
+ test_loc = 0
67
+ @statistics.each { |k, v| test_loc += v['codelines'] if TEST_TYPES.include? k }
68
+ test_loc
69
+ end
70
+
71
+ def print_header
72
+ print_splitter
73
+ puts "| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |"
74
+ print_splitter
75
+ end
76
+
77
+ def print_splitter
78
+ puts "+----------------------+-------+-------+---------+---------+-----+-------+"
79
+ end
80
+
81
+ def print_line(name, statistics)
82
+ m_over_c = (statistics["methods"] / statistics["classes"]) rescue m_over_c = 0
83
+ loc_over_m = (statistics["codelines"] / statistics["methods"]) - 2 rescue loc_over_m = 0
84
+
85
+ start = if TEST_TYPES.include? name
86
+ "| #{name.ljust(18)} "
87
+ else
88
+ "| #{name.ljust(20)} "
89
+ end
90
+
91
+ puts start +
92
+ "| #{statistics["lines"].to_s.rjust(5)} " +
93
+ "| #{statistics["codelines"].to_s.rjust(5)} " +
94
+ "| #{statistics["classes"].to_s.rjust(7)} " +
95
+ "| #{statistics["methods"].to_s.rjust(7)} " +
96
+ "| #{m_over_c.to_s.rjust(3)} " +
97
+ "| #{loc_over_m.to_s.rjust(5)} |"
98
+ end
99
+
100
+ def print_code_test_stats
101
+ code = calculate_code
102
+ tests = calculate_tests
103
+
104
+ puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f/code)}"
105
+ puts ""
106
+ end
107
+ end
data/lib/platform.rb ADDED
@@ -0,0 +1,15 @@
1
+ # Helper functions for determining platform
2
+
3
+ class Platform
4
+ def self.mac?
5
+ return PLATFORM =~ /darwin/
6
+ end
7
+
8
+ def self.windows?
9
+ return PLATFORM =~ /mswin/
10
+ end
11
+
12
+ def self.linux?
13
+ PLATFORM =~ /linux/
14
+ end
15
+ end
data/lib/rubygoo.rb ADDED
@@ -0,0 +1,19 @@
1
+ $: << File.dirname(__FILE__)
2
+ $: << File.join(File.dirname(__FILE__),"rubygoo")
3
+ $: << File.join(File.dirname(__FILE__),"rubygoo","adapters")
4
+ class Rubygoo
5
+ VERSION = '0.0.3'
6
+ end
7
+
8
+ require 'goo_event'
9
+ require 'goo_color'
10
+ require 'adapter_factory'
11
+ require 'yaml'
12
+ require 'widget'
13
+ require 'container'
14
+ require 'app'
15
+ require 'label'
16
+ require 'button'
17
+ require 'check_box'
18
+ require 'text_field'
19
+ require 'dialog'
@@ -0,0 +1,14 @@
1
+ class AdapterFactory
2
+
3
+ def app_for(platform,*args)
4
+ require "#{platform}_app_adapter"
5
+ ObjectSpace.const_get("#{platform.to_s.capitalize}AppAdapter").new *args
6
+ end
7
+
8
+ def renderer_for(platform,*args)
9
+ require "#{platform}_render_adapter"
10
+ ObjectSpace.const_get("#{platform.to_s.capitalize}RenderAdapter").new *args
11
+ end
12
+
13
+
14
+ end
@@ -0,0 +1,50 @@
1
+ class GosuAppAdapter
2
+
3
+ def initialize(app,main_window)
4
+ @app = app
5
+ @main_window = main_window
6
+ end
7
+
8
+ def update(time)
9
+ @app.update time
10
+ end
11
+
12
+ def draw(target)
13
+ @app.draw target
14
+ end
15
+
16
+ # TODO convert keys?!?
17
+ def button_down(id)
18
+ case id
19
+ when MsLeft
20
+ @app.on_event GooEvent.new(:mouse_down, {
21
+ :x => @main_window.mouse_x, :y => @main_window.mouse_y,
22
+ :button => MOUSE_LEFT})
23
+
24
+ # gosu doens't track mouse motion?
25
+ when MouseMotionEvent
26
+ @app.on_event GooEvent.new(:mouse_motion, {
27
+ :x => event.pos[0], :y => event.pos[1]})
28
+ else
29
+ # assume it's a key
30
+ # where do I get the mods? ie shift,alt,ctrl
31
+ # where do I get the string rep of the char?
32
+ mods = []
33
+ mods << K_LALT if @main_window.button_down? KbLeftAlt
34
+ mods << K_RALT if @main_window.button_down? KbRightAlt
35
+ mods << K_LCTRL if @main_window.button_down? KbLeftControl
36
+ mods << K_RCTRL if @main_window.button_down? KbRightControl
37
+ mods << K_LSHIFT if @main_window.button_down? KbLeftShift
38
+ mods << K_RSHIFT if @main_window.button_down? KbRightShift
39
+ button_string = @main_window.button_id_to_char(id)
40
+ @app.on_event GooEvent.new(:key_pressed, {
41
+ :key => id, :mods => mods, :string => button_string})
42
+ end
43
+ end
44
+
45
+ def button_up(id)
46
+ # TODO copy and tweak from above
47
+ end
48
+
49
+
50
+ end
@@ -0,0 +1,53 @@
1
+ class GosuRenderAdapter
2
+
3
+ def initialize(window)
4
+ @window = window
5
+ end
6
+
7
+ def draw_box(x1,y1,x2,y2,color)
8
+ c = convert_color(color)
9
+ @window.draw_quad x1, y1, c, x2, y1, c, x1, y2, c, x2, y2, c
10
+ end
11
+
12
+ # fill in a rect with color or full screen if no color
13
+ def fill(color,rect=nil)
14
+ if rect.nil?
15
+ draw_box 0, 0, @window.width, @window.height, color
16
+ else
17
+ draw_box rect[0], rect[1], rect[2], rect[3], color
18
+ end
19
+ end
20
+
21
+ # make static for now for migration ease of rendering fonts
22
+ def convert_color(goo_color)
23
+ Gosu::Color.new goo_color.a,goo_color.r,goo_color.g,goo_color.b
24
+ end
25
+
26
+ def start_drawing(); end
27
+
28
+ def finish_drawing(); end
29
+
30
+ def draw_image(img, x, y)
31
+ # z is unused here
32
+ img.draw x, y, 1
33
+ end
34
+
35
+ def size_text(text, font_file, font_size)
36
+ @font_cache ||= {}
37
+ @font_cache[font_file] ||= {}
38
+ font = @font_cache[font_file][font_size] ||= Font.new(@window, font_file, font_size)
39
+
40
+ return [font.text_width(text),font.height]
41
+ end
42
+
43
+ def render_text(text, font_file, font_size, color)
44
+ @font_cache ||= {}
45
+ @font_cache[font_file] ||= {}
46
+ font = @font_cache[font_file][font_size] ||= Font.new(@window, font_file, font_size)
47
+
48
+ # TODO how do you set the color here?
49
+ text_image = Image.from_text(@window, text, font_file, font_size, 2, 9999, :left)
50
+ end
51
+
52
+
53
+ end
@@ -0,0 +1,37 @@
1
+ class RubygameAppAdapter
2
+
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def update(time)
8
+ @app.update time
9
+ end
10
+
11
+ def draw(target)
12
+ @app.draw target
13
+ end
14
+
15
+ # TODO convert keys?!?
16
+ def on_event(event)
17
+ case event
18
+ when KeyUpEvent
19
+ @app.on_event GooEvent.new(:key_released, {
20
+ :key => event.key, :mods => event.mods, :string => event.string})
21
+ when KeyDownEvent
22
+ @app.on_event GooEvent.new(:key_pressed, {
23
+ :key => event.key, :mods => event.mods, :string => event.string})
24
+ when MouseUpEvent
25
+ @app.on_event GooEvent.new(:mouse_up, {
26
+ :x => event.pos[0], :y => event.pos[1], :button => event.button})
27
+ when MouseDownEvent
28
+ @app.on_event GooEvent.new(:mouse_down, {
29
+ :x => event.pos[0], :y => event.pos[1], :button => event.button})
30
+ when MouseMotionEvent
31
+ @app.on_event GooEvent.new(:mouse_motion, {
32
+ :x => event.pos[0], :y => event.pos[1]})
33
+ end
34
+ end
35
+
36
+
37
+ end
@@ -0,0 +1,51 @@
1
+ class RubygameRenderAdapter
2
+
3
+ def initialize(screen)
4
+ @screen = screen
5
+ TTF.setup
6
+ end
7
+
8
+ def draw_box(x1,y1,x2,y2,color)
9
+ @screen.draw_box [x1,y1], [x2,y2], convert_color(color)
10
+ end
11
+
12
+ # fill in a rect with color or full screen if no color
13
+ def fill(color,rect=nil)
14
+ if rect.nil?
15
+ @screen.fill convert_color(color)
16
+ else
17
+ @screen.fill convert_color(color), rect
18
+ end
19
+ end
20
+
21
+ def convert_color(goo_color)
22
+ [goo_color.r,goo_color.g,goo_color.b,goo_color.a]
23
+ end
24
+
25
+ def start_drawing(); end
26
+
27
+ def finish_drawing()
28
+ @screen.flip
29
+ end
30
+
31
+ def draw_image(img, x, y)
32
+ img.blit @screen, [x,y]
33
+ end
34
+
35
+ def size_text(text, font_file, font_size)
36
+ @font_cache ||= {}
37
+ @font_cache[font_file] ||= {}
38
+ font = @font_cache[font_file][font_size] ||= TTF.new(font_file, font_size)
39
+
40
+ font.size_text text
41
+ end
42
+
43
+ def render_text(text, font_file, font_size, color)
44
+ @font_cache ||= {}
45
+ @font_cache[font_file] ||= {}
46
+ font = @font_cache[font_file][font_size] ||= TTF.new(font_file, font_size)
47
+
48
+ text_image = font.render text, true, convert_color(color)
49
+ end
50
+
51
+ end
@@ -0,0 +1,80 @@
1
+ class App < Container
2
+
3
+ DEFAULT_PARAMS = {:theme=>'default',:x=>10,:y=>10,:width=>600,:height=>480,:data_dir=>File.join(File.dirname(__FILE__),"..","..","themes")}
4
+ attr_accessor :theme_name, :theme, :data_dir, :theme_dir, :renderer
5
+
6
+ def initialize(opts={})
7
+ merged_opts = DEFAULT_PARAMS.merge opts
8
+ @widgets = []
9
+ @tabbed_widgets = []
10
+ @focussed_widget = 0
11
+ theme_name = merged_opts[:theme]
12
+ @data_dir = merged_opts[:data_dir]
13
+ @theme_name = theme_name
14
+ @theme = load_theme theme_name
15
+ @renderer = merged_opts[:renderer]
16
+ super merged_opts
17
+ end
18
+
19
+ def app()
20
+ self
21
+ end
22
+
23
+ def load_theme(theme_name)
24
+ @theme_dir = File.join(@data_dir,theme_name)
25
+ @theme = YAML::load_file(File.join(@theme_dir,"config.yml"))
26
+ end
27
+
28
+ def draw(screen)
29
+ screen.start_drawing
30
+ super screen
31
+ screen.finish_drawing
32
+ end
33
+
34
+ def add_tabbed_widget(w)
35
+ w.focus_priority = @tabbed_widgets.size unless w.focus_priority
36
+ @focussed_widget = 1
37
+ w.focus if @tabbed_widgets.empty?
38
+ @tabbed_widgets << w
39
+ @tabbed_widgets.sort_by {|w| w.focus_priority}
40
+ end
41
+
42
+ def focus_back()
43
+ @tabbed_widgets[@focussed_widget].unfocus
44
+ @focussed_widget += 1
45
+ @focussed_widget %= @tabbed_widgets.size
46
+ @tabbed_widgets[@focussed_widget].focus
47
+ end
48
+
49
+ def focus_forward()
50
+ @tabbed_widgets[@focussed_widget].unfocus
51
+ @focussed_widget -= 1
52
+ @focussed_widget %= @tabbed_widgets.size
53
+ @tabbed_widgets[@focussed_widget].focus
54
+ end
55
+
56
+ # this is where all the rubygame to rubygoo event mapping will
57
+ # happen
58
+ def on_event(event)
59
+ case event.event_type
60
+ when :key_released
61
+ modal_keyboard_call :key_released, event
62
+ when :key_pressed
63
+ case event.data[:key]
64
+ when K_TAB
65
+ if event.data[:mods].include? K_LSHIFT or event.data[:mods].include? K_RSHIFT
66
+ focus_back
67
+ else
68
+ focus_forward
69
+ end
70
+ else
71
+ modal_keyboard_call :key_pressed, event
72
+ end
73
+ else
74
+ # ALL mouse events go here
75
+ modal_mouse_call event.event_type, event
76
+ end
77
+ end
78
+
79
+ end
80
+