author_engine 0.1.0

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +7 -0
  4. data/API.md +81 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +26 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +38 -0
  9. data/Rakefile +10 -0
  10. data/SAVEFILE.md +23 -0
  11. data/assets/fonts/Connection.otf +0 -0
  12. data/assets/fonts/ConnectionBold.otf +0 -0
  13. data/assets/fonts/README.md +3 -0
  14. data/assets/fonts/SIL Open Font License.txt +94 -0
  15. data/assets/ui/bucket_icon.png +0 -0
  16. data/assets/ui/code_icon.png +0 -0
  17. data/assets/ui/error_icon.png +0 -0
  18. data/assets/ui/level_icon.png +0 -0
  19. data/assets/ui/loading_icon.png +0 -0
  20. data/assets/ui/lock_icon.png +0 -0
  21. data/assets/ui/pencil_icon.png +0 -0
  22. data/assets/ui/play_icon.png +0 -0
  23. data/assets/ui/sprite_icon.png +0 -0
  24. data/assets/ui/unlock_icon.png +0 -0
  25. data/author_engine.gemspec +41 -0
  26. data/bin/author_engine +4 -0
  27. data/lib/author_engine/button.rb +154 -0
  28. data/lib/author_engine/code_editor/cursor.rb +339 -0
  29. data/lib/author_engine/code_editor/highlighting.rb +49 -0
  30. data/lib/author_engine/container.rb +24 -0
  31. data/lib/author_engine/containers/editor.rb +97 -0
  32. data/lib/author_engine/containers/loader.rb +105 -0
  33. data/lib/author_engine/game/game.rb +26 -0
  34. data/lib/author_engine/game/parts/colors.rb +59 -0
  35. data/lib/author_engine/game/parts/common.rb +13 -0
  36. data/lib/author_engine/game/parts/graphics.rb +41 -0
  37. data/lib/author_engine/game/parts/input.rb +25 -0
  38. data/lib/author_engine/image.rb +53 -0
  39. data/lib/author_engine/palette.rb +114 -0
  40. data/lib/author_engine/save_file.rb +134 -0
  41. data/lib/author_engine/sprite.rb +4 -0
  42. data/lib/author_engine/sprite_picker.rb +154 -0
  43. data/lib/author_engine/support.rb +22 -0
  44. data/lib/author_engine/text.rb +41 -0
  45. data/lib/author_engine/version.rb +3 -0
  46. data/lib/author_engine/view.rb +55 -0
  47. data/lib/author_engine/views/code_editor.rb +154 -0
  48. data/lib/author_engine/views/level_editor.rb +7 -0
  49. data/lib/author_engine/views/play_viewer.rb +163 -0
  50. data/lib/author_engine/views/sprite_editor.rb +333 -0
  51. data/lib/author_engine/window.rb +132 -0
  52. data/lib/author_engine.rb +32 -0
  53. data/test_3.authorengine +519 -0
  54. data/testing.authorengine +578 -0
  55. metadata +169 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: aa9450a11aa87c07b6af55a87d7ebf3a68feaff0c671662e6662a14ebf45a004
4
+ data.tar.gz: 52c74e684c1d5c402083b5dfa7a630ad99d445ec5cd786db9fc3a3d324f7c9a4
5
+ SHA512:
6
+ metadata.gz: 5b0173f8357c12aadd3d0ac99e0a7b2c78d862d93bca6940d3f383be701e51d00dfd5c63ea7873fb7289778389846bbce2cdb5129c5e5bb6b8801895d0f5f018
7
+ data.tar.gz: a59df8c02965376c9824385f756516a5af44a4c88854c748a8246bf6f2929a63048e6c1f040214cbd193b5837d91f1ca24ab0161d3d9a9e8984a16fd8aafec61
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ _*.rb
11
+ *.authorengine
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.1
7
+ before_install: gem install bundler -v 1.16.3
data/API.md ADDED
@@ -0,0 +1,81 @@
1
+ # Game API
2
+ An example game
3
+ ``` ruby
4
+ # Your setup method
5
+ def init
6
+ @x = 0
7
+ @y = 0
8
+ @z = 0
9
+
10
+ @birdie = 0
11
+ end
12
+
13
+ # All drawing operations must happen in draw
14
+ def draw
15
+ rect(@x, @y, width, height, black, @z)
16
+ sprite(@birdie, @x, @y, @z)
17
+ text("string", @x, @y, 10, @z, white)
18
+ end
19
+
20
+ def update
21
+ @x+=1 if button?("right")
22
+ @x-=1 if button?("left")
23
+ @y-=1 if button?("up")
24
+ @y+=1 if button?("down")
25
+ end
26
+ ```
27
+
28
+ # Common
29
+ ### width
30
+ Virtual display width (e.g. 128)
31
+
32
+ ### height
33
+ Virtual display height (e.g. 128)
34
+
35
+ ### fps
36
+ Current Frames Per Second
37
+
38
+ ### milliseconds
39
+ Milliseconds since game started
40
+
41
+ # Graphics
42
+ ### rect(x = 0, y = 0, width = 1, height = 1, color = white, z = 0)
43
+ ### sprite(sprite_sheet_index, x = 0, y = 0, z = 0, color = white)
44
+ ### text(string, x = 0, y = 0, size = 4, z = 0, color = white)
45
+
46
+ ### translate(x, y, &block)
47
+ Translate the contents of block by x and y
48
+ ### rotate(angle, around_x = 0, around_y = 0, &block)
49
+ Rotate the contents of block by angle, rotating about at around_x and around_y
50
+
51
+ # Input
52
+ ### button?(string)
53
+ returns true if the specied button is currently being pressed
54
+
55
+ Valid values for string are:
56
+ #### "left"
57
+ #### "right"
58
+ #### "up"
59
+ #### "down"
60
+ #### "x"
61
+ mapped to the X key
62
+ #### "y"
63
+ mapped to the C key
64
+
65
+ # Colors
66
+ ### black
67
+ ### dark_blue
68
+ ### dark_purple
69
+ ### dark_green
70
+ ### brown
71
+ ### dark_gray
72
+ ### light_gray
73
+ ### white
74
+ ### red
75
+ ### orange
76
+ ### yellow
77
+ ### green
78
+ ### blue
79
+ ### indigo
80
+ ### pink
81
+ ### peach
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in author_engine.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ author_engine (0.1.0)
5
+ coderay (~> 1.1.2)
6
+ gosu (~> 0.14.4)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ coderay (1.1.2)
12
+ gosu (0.14.4)
13
+ minitest (5.11.3)
14
+ rake (10.5.0)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ author_engine!
21
+ bundler (~> 1.16)
22
+ minitest (~> 5.0)
23
+ rake (~> 10.0)
24
+
25
+ BUNDLED WITH
26
+ 1.16.3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Cyberarm
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # AuthorEngine
2
+ A virtual console¹ that you code in Ruby.
3
+
4
+ ![animated_gif](#)
5
+
6
+ # Getting Started
7
+ ## Install
8
+ `gem install author_engine`
9
+
10
+ ## Run
11
+ `author_engine`
12
+ ### Options
13
+ `--native` Open AuthorEngine in fullscreen and maximized.
14
+
15
+ # Interface
16
+ ## Play
17
+ ![play_view](#)
18
+ ## Sprite Editor
19
+ ![sprite_editor_view](#)
20
+ ## Level Editor
21
+ ![level_editor_view](#)
22
+ ## Code Editor
23
+ ![code_editor_view](#)
24
+
25
+
26
+ ¹: Does not directly run any kind of assembly
27
+
28
+ ## Development
29
+
30
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
31
+
32
+ ## Contributing
33
+
34
+ Bug reports and pull requests are welcome on GitHub at https://github.com/cyberarm/author_engineV2.
35
+
36
+ ## License
37
+
38
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/SAVEFILE.md ADDED
@@ -0,0 +1,23 @@
1
+ # Save File
2
+ ``` text
3
+ # header text
4
+ # comments
5
+ # author
6
+
7
+ ___CODE___
8
+ def init
9
+ end
10
+
11
+ def draw
12
+ end
13
+
14
+ def update
15
+ end
16
+
17
+ ___SPRITES___
18
+ 512x128
19
+ RGBASTREAM of spritesheet which is sliced at spritesheet.width * 4
20
+
21
+ ___LEVELS___
22
+ ???
23
+ ```
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ # Fonts
2
+ ## Connection and ConnectionBold
3
+ [OpenFontLibrary](https://fontlibrary.org/en/font/connection)
@@ -0,0 +1,94 @@
1
+ Copyright (c) 2017, Jasper @ KineticPlasma Fonts (cannotintospacefonts@gmail.com),
2
+ with Reserved Font Name Connection.
3
+
4
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
5
+ This license is copied below, and is also available with a FAQ at:
6
+ http://scripts.sil.org/OFL
7
+
8
+
9
+ -----------------------------------------------------------
10
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
11
+ -----------------------------------------------------------
12
+
13
+ PREAMBLE
14
+ The goals of the Open Font License (OFL) are to stimulate worldwide
15
+ development of collaborative font projects, to support the font creation
16
+ efforts of academic and linguistic communities, and to provide a free and
17
+ open framework in which fonts may be shared and improved in partnership
18
+ with others.
19
+
20
+ The OFL allows the licensed fonts to be used, studied, modified and
21
+ redistributed freely as long as they are not sold by themselves. The
22
+ fonts, including any derivative works, can be bundled, embedded,
23
+ redistributed and/or sold with any software provided that any reserved
24
+ names are not used by derivative works. The fonts and derivatives,
25
+ however, cannot be released under any other type of license. The
26
+ requirement for fonts to remain under this license does not apply
27
+ to any document created using the fonts or their derivatives.
28
+
29
+ DEFINITIONS
30
+ "Font Software" refers to the set of files released by the Copyright
31
+ Holder(s) under this license and clearly marked as such. This may
32
+ include source files, build scripts and documentation.
33
+
34
+ "Reserved Font Name" refers to any names specified as such after the
35
+ copyright statement(s).
36
+
37
+ "Original Version" refers to the collection of Font Software components as
38
+ distributed by the Copyright Holder(s).
39
+
40
+ "Modified Version" refers to any derivative made by adding to, deleting,
41
+ or substituting -- in part or in whole -- any of the components of the
42
+ Original Version, by changing formats or by porting the Font Software to a
43
+ new environment.
44
+
45
+ "Author" refers to any designer, engineer, programmer, technical
46
+ writer or other person who contributed to the Font Software.
47
+
48
+ PERMISSION & CONDITIONS
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
51
+ redistribute, and sell modified and unmodified copies of the Font
52
+ Software, subject to the following conditions:
53
+
54
+ 1) Neither the Font Software nor any of its individual components,
55
+ in Original or Modified Versions, may be sold by itself.
56
+
57
+ 2) Original or Modified Versions of the Font Software may be bundled,
58
+ redistributed and/or sold with any software, provided that each copy
59
+ contains the above copyright notice and this license. These can be
60
+ included either as stand-alone text files, human-readable headers or
61
+ in the appropriate machine-readable metadata fields within text or
62
+ binary files as long as those fields can be easily viewed by the user.
63
+
64
+ 3) No Modified Version of the Font Software may use the Reserved Font
65
+ Name(s) unless explicit written permission is granted by the corresponding
66
+ Copyright Holder. This restriction only applies to the primary font name as
67
+ presented to the users.
68
+
69
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
70
+ Software shall not be used to promote, endorse or advertise any
71
+ Modified Version, except to acknowledge the contribution(s) of the
72
+ Copyright Holder(s) and the Author(s) or with their explicit written
73
+ permission.
74
+
75
+ 5) The Font Software, modified or unmodified, in part or in whole,
76
+ must be distributed entirely under this license, and must not be
77
+ distributed under any other license. The requirement for fonts to
78
+ remain under this license does not apply to any document created
79
+ using the Font Software.
80
+
81
+ TERMINATION
82
+ This license becomes null and void if any of the above conditions are
83
+ not met.
84
+
85
+ DISCLAIMER
86
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
87
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
88
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
89
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
90
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
91
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
92
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
93
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
94
+ OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,41 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "author_engine/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "author_engine"
8
+ spec.version = AuthorEngine::VERSION
9
+ spec.authors = ["Cyberarm"]
10
+ spec.email = ["matthewlikesrobots@gmail.com"]
11
+
12
+ spec.summary = %q{A virtual console that you code in Ruby.}
13
+ spec.description = %q{Create arcade style games quickly and easily}
14
+ spec.homepage = "https://github.com/cyberarm/author_engineV2"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ # Specify which files should be added to the gem when it is released.
27
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ end
31
+ spec.bindir = "bin"
32
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
33
+ spec.require_paths = ["lib"]
34
+
35
+ spec.add_dependency "gosu", "~> 0.14.4"
36
+ spec.add_dependency "coderay", "~> 1.1.2"
37
+
38
+ spec.add_development_dependency "bundler", "~> 1.16"
39
+ spec.add_development_dependency "rake", "~> 10.0"
40
+ spec.add_development_dependency "minitest", "~> 5.0"
41
+ end
data/bin/author_engine ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "author_engine"
4
+ AuthorEngine::Window.new.show
@@ -0,0 +1,154 @@
1
+ class AuthorEngine
2
+ class Button
3
+ include Support
4
+
5
+ PADDING = 2
6
+
7
+ attr_reader :label, :text, :block, :image, :width, :height, :x, :y, :tag
8
+ attr_accessor :z
9
+ def initialize(label: nil, tooltip: nil, image: nil, x: 0, y: 0, z: 0, color:, tag: nil, &block)
10
+ @label, @image = label, image
11
+ @x, @y, @z = x, y, z
12
+ @color = color
13
+ @tag = tag
14
+ @block = block
15
+
16
+ @width, @height = 0, 0
17
+ @x_padding = PADDING * window.scale_x
18
+ @y_padding = PADDING * window.scale_y
19
+
20
+ if @label.is_a?(String)
21
+ @text = AuthorEngine::Text.new(message: @label, x: @x, y: @y, z: @z)
22
+ end
23
+
24
+ if @image.is_a?(String)
25
+ @image = AuthorEngine::Image.new(@image, retro: true)
26
+ end
27
+
28
+ if tooltip.is_a?(String)
29
+ @tooltip = AuthorEngine::Text.new(message: tooltip, x: @x, y: @y+@height, z: 1000)
30
+ end
31
+
32
+ set_interactive_colors
33
+ position_elements
34
+
35
+ return self
36
+ end
37
+
38
+ def image=(gosu_image)
39
+ @image = gosu_image
40
+ position_elements
41
+ end
42
+
43
+ def label=(text)
44
+ @label.text = text
45
+ position_elements
46
+ end
47
+
48
+ def draw
49
+ if mouse_over? && Gosu.button_down?(Gosu::MsLeft)
50
+ draw_background(@color_active)
51
+ elsif mouse_over?
52
+ draw_background(@color_hover)
53
+ else
54
+ draw_background(@color)
55
+ end
56
+ draw_element
57
+
58
+ draw_tooltip if @tooltip && mouse_over?
59
+ end
60
+
61
+ def button_up(id)
62
+ call if mouse_over? && (id == Gosu::MsLeft)
63
+ end
64
+
65
+ def x=(n)
66
+ @x = n
67
+ position_elements
68
+ end
69
+
70
+ def y=(n)
71
+ @y = n
72
+ position_elements
73
+ end
74
+
75
+ def label=(s)
76
+ @label = s
77
+ @text.message = s
78
+ position_elements
79
+ end
80
+
81
+ def set_interactive_colors
82
+ if @color.value > 0.7
83
+ @color_active = window.darken(@color, 50)
84
+ @color_hover = window.darken(@color)
85
+ else
86
+ @color_active = window.lighten(@color, 50)
87
+ @color_hover = window.lighten(@color)
88
+ end
89
+ end
90
+
91
+
92
+ def mouse_over?
93
+ if window.mouse_x.between?(@x, @x+@width) &&
94
+ window.mouse_y.between?(@y, @y+@height)
95
+ true
96
+ end
97
+ end
98
+
99
+ def draw_background(color)
100
+ Gosu.draw_rect(@x, @y, @width, @height, color, @z)
101
+ end
102
+
103
+ def draw_element
104
+ if @text && @text.is_a?(AuthorEngine::Text)
105
+ @text.draw
106
+
107
+ elsif @image && @image.is_a?(AuthorEngine::Sprite)
108
+ @image.draw
109
+
110
+ elsif @image && @image.is_a?(AuthorEngine::Image)
111
+ @image.draw(@x+@x_padding, @y+@y_padding, @z, (1 * window.square_scale), (1 * window.square_scale))
112
+
113
+ else
114
+ raise "Nothing to draw! (text and image were nil or invalid types)"
115
+ end
116
+ end
117
+
118
+ def draw_tooltip
119
+ Gosu.draw_rect(@tooltip.x-@x_padding, @tooltip.y-(@y_padding*2), @tooltip.width+(@x_padding*2), @tooltip.height+(@y_padding*2), Gosu::Color.rgba(0,0,0, 200), @tooltip.z)
120
+ @tooltip.draw
121
+ end
122
+
123
+ def position_elements
124
+ if @text && @text.is_a?(AuthorEngine::Text)
125
+ @text.x, @text.y = @x+@x_padding, @y+@y_padding
126
+ @width, @height = @text.width+(@x_padding*2), @text.height+(@y_padding*2)
127
+
128
+ elsif @image && @image.is_a?(AuthorEngine::Sprite)
129
+ @image.x, @image.y = @x+@x_padding, @y+@y_padding
130
+ @width, @height = @image.width+(@x_padding*2), @image.height+(@y_padding*2)
131
+
132
+ elsif @image && @image.is_a?(AuthorEngine::Image)
133
+ @width, @height = (@image.width * window.square_scale)+(@x_padding*2), (@image.height * window.square_scale)+(@y_padding)
134
+
135
+ else
136
+ raise "From Button -> text and image were nil or invalid types"
137
+ end
138
+
139
+ if @tooltip
140
+ if (@x + @tooltip.width + @x_padding) > window.width
141
+ @tooltip.x = @x - (((@x+@tooltip.width) - window.width) + @x_padding)
142
+ else
143
+ @tooltip.x = (@x - @tooltip.width / 2) + @width/2
144
+ end
145
+
146
+ @tooltip.y = (@y + @height + (@y_padding*2))
147
+ end
148
+ end
149
+
150
+ def call
151
+ @block.call(self) if @block
152
+ end
153
+ end
154
+ end