picrate 0.0.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.mvn/extensions.xml +9 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +10 -0
  6. data/CHANGELOG.md +4 -0
  7. data/LICENSE.md +165 -0
  8. data/README.md +51 -0
  9. data/Rakefile +59 -0
  10. data/bin/picrate +8 -0
  11. data/docs/.gitignore +6 -0
  12. data/docs/_config.yml +30 -0
  13. data/docs/_includes/footer.html +38 -0
  14. data/docs/_includes/head.html +16 -0
  15. data/docs/_includes/header.html +27 -0
  16. data/docs/_includes/icon-github.html +1 -0
  17. data/docs/_includes/icon-github.svg +1 -0
  18. data/docs/_includes/icon-twitter.html +1 -0
  19. data/docs/_includes/icon-twitter.svg +1 -0
  20. data/docs/_includes/navigation.html +24 -0
  21. data/docs/_layouts/default.html +20 -0
  22. data/docs/_layouts/page.html +14 -0
  23. data/docs/_layouts/post.html +15 -0
  24. data/docs/_posts/2018-05-06-getting_started.md +8 -0
  25. data/docs/_posts/2018-05-06-install_jruby.md +35 -0
  26. data/docs/_sass/_base.scss +206 -0
  27. data/docs/_sass/_layout.scss +242 -0
  28. data/docs/_sass/_syntax-highlighting.scss +71 -0
  29. data/docs/about.md +10 -0
  30. data/docs/css/main.scss +38 -0
  31. data/docs/favicon.ico +0 -0
  32. data/docs/feed.xml +30 -0
  33. data/docs/index.html +38 -0
  34. data/lib/picrate.rb +10 -0
  35. data/lib/picrate/app.rb +187 -0
  36. data/lib/picrate/creators/sketch_class.rb +57 -0
  37. data/lib/picrate/creators/sketch_factory.rb +12 -0
  38. data/lib/picrate/creators/sketch_writer.rb +21 -0
  39. data/lib/picrate/helper_methods.rb +214 -0
  40. data/lib/picrate/helpers/numeric.rb +9 -0
  41. data/lib/picrate/library.rb +69 -0
  42. data/lib/picrate/library_loader.rb +53 -0
  43. data/lib/picrate/native_folder.rb +35 -0
  44. data/lib/picrate/native_loader.rb +27 -0
  45. data/lib/picrate/runner.rb +81 -0
  46. data/lib/picrate/version.rb +4 -0
  47. data/library/boids/boids.rb +209 -0
  48. data/library/chooser/chooser.rb +19 -0
  49. data/library/control_panel/control_panel.rb +182 -0
  50. data/library/library_proxy/README.md +99 -0
  51. data/library/library_proxy/library_proxy.rb +14 -0
  52. data/library/slider/slider.rb +42 -0
  53. data/library/vector_utils/vector_utils.rb +69 -0
  54. data/library/video_event/video_event.rb +3 -0
  55. data/license.txt +508 -0
  56. data/picrate.gemspec +35 -0
  57. data/pom.rb +122 -0
  58. data/pom.xml +214 -0
  59. data/src/main/java/japplemenubar/JAppleMenuBar.java +88 -0
  60. data/src/main/java/japplemenubar/libjAppleMenuBar.jnilib +0 -0
  61. data/src/main/java/monkstone/ColorUtil.java +115 -0
  62. data/src/main/java/monkstone/MathToolModule.java +236 -0
  63. data/src/main/java/monkstone/PicrateLibrary.java +47 -0
  64. data/src/main/java/monkstone/core/LibraryProxy.java +127 -0
  65. data/src/main/java/monkstone/fastmath/Deglut.java +122 -0
  66. data/src/main/java/monkstone/fastmath/package-info.java +6 -0
  67. data/src/main/java/monkstone/filechooser/Chooser.java +48 -0
  68. data/src/main/java/monkstone/noise/SimplexNoise.java +465 -0
  69. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +168 -0
  70. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +182 -0
  71. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +149 -0
  72. data/src/main/java/monkstone/slider/SimpleSlider.java +196 -0
  73. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +163 -0
  74. data/src/main/java/monkstone/slider/Slider.java +67 -0
  75. data/src/main/java/monkstone/slider/SliderBar.java +277 -0
  76. data/src/main/java/monkstone/slider/SliderGroup.java +78 -0
  77. data/src/main/java/monkstone/slider/WheelHandler.java +35 -0
  78. data/src/main/java/monkstone/vecmath/AppRender.java +87 -0
  79. data/src/main/java/monkstone/vecmath/JRender.java +56 -0
  80. data/src/main/java/monkstone/vecmath/ShapeRender.java +87 -0
  81. data/src/main/java/monkstone/vecmath/package-info.java +20 -0
  82. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +757 -0
  83. data/src/main/java/monkstone/vecmath/vec2/package-info.java +6 -0
  84. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +727 -0
  85. data/src/main/java/monkstone/vecmath/vec3/package-info.java +6 -0
  86. data/src/main/java/monkstone/videoevent/VideoInterface.java +42 -0
  87. data/src/main/java/monkstone/videoevent/package-info.java +20 -0
  88. data/src/main/java/processing/awt/PGraphicsJava2D.java +3098 -0
  89. data/src/main/java/processing/awt/PShapeJava2D.java +401 -0
  90. data/src/main/java/processing/awt/PSurfaceAWT.java +1660 -0
  91. data/src/main/java/processing/core/PApplet.java +17647 -0
  92. data/src/main/java/processing/core/PConstants.java +1033 -0
  93. data/src/main/java/processing/core/PFont.java +1250 -0
  94. data/src/main/java/processing/core/PGraphics.java +9614 -0
  95. data/src/main/java/processing/core/PImage.java +3608 -0
  96. data/src/main/java/processing/core/PMatrix.java +347 -0
  97. data/src/main/java/processing/core/PMatrix2D.java +694 -0
  98. data/src/main/java/processing/core/PMatrix3D.java +1153 -0
  99. data/src/main/java/processing/core/PShape.java +4332 -0
  100. data/src/main/java/processing/core/PShapeOBJ.java +544 -0
  101. data/src/main/java/processing/core/PShapeSVG.java +1987 -0
  102. data/src/main/java/processing/core/PStyle.java +208 -0
  103. data/src/main/java/processing/core/PSurface.java +242 -0
  104. data/src/main/java/processing/core/PSurfaceNone.java +479 -0
  105. data/src/main/java/processing/core/PVector.java +1140 -0
  106. data/src/main/java/processing/data/FloatDict.java +829 -0
  107. data/src/main/java/processing/data/FloatList.java +912 -0
  108. data/src/main/java/processing/data/IntDict.java +796 -0
  109. data/src/main/java/processing/data/IntList.java +913 -0
  110. data/src/main/java/processing/data/JSONArray.java +1260 -0
  111. data/src/main/java/processing/data/JSONObject.java +2282 -0
  112. data/src/main/java/processing/data/JSONTokener.java +435 -0
  113. data/src/main/java/processing/data/Sort.java +46 -0
  114. data/src/main/java/processing/data/StringDict.java +601 -0
  115. data/src/main/java/processing/data/StringList.java +775 -0
  116. data/src/main/java/processing/data/Table.java +4923 -0
  117. data/src/main/java/processing/data/TableRow.java +198 -0
  118. data/src/main/java/processing/data/XML.java +1149 -0
  119. data/src/main/java/processing/event/Event.java +108 -0
  120. data/src/main/java/processing/event/KeyEvent.java +70 -0
  121. data/src/main/java/processing/event/MouseEvent.java +149 -0
  122. data/src/main/java/processing/event/TouchEvent.java +57 -0
  123. data/src/main/java/processing/javafx/PGraphicsFX2D.java +354 -0
  124. data/src/main/java/processing/opengl/FontTexture.java +379 -0
  125. data/src/main/java/processing/opengl/FrameBuffer.java +503 -0
  126. data/src/main/java/processing/opengl/LinePath.java +623 -0
  127. data/src/main/java/processing/opengl/LineStroker.java +685 -0
  128. data/src/main/java/processing/opengl/PGL.java +3366 -0
  129. data/src/main/java/processing/opengl/PGraphics2D.java +615 -0
  130. data/src/main/java/processing/opengl/PGraphics3D.java +281 -0
  131. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13634 -0
  132. data/src/main/java/processing/opengl/PJOGL.java +1966 -0
  133. data/src/main/java/processing/opengl/PShader.java +1478 -0
  134. data/src/main/java/processing/opengl/PShapeOpenGL.java +5234 -0
  135. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1315 -0
  136. data/src/main/java/processing/opengl/Texture.java +1670 -0
  137. data/src/main/java/processing/opengl/VertexBuffer.java +88 -0
  138. data/src/main/java/processing/opengl/cursors/arrow.png +0 -0
  139. data/src/main/java/processing/opengl/cursors/cross.png +0 -0
  140. data/src/main/java/processing/opengl/cursors/hand.png +0 -0
  141. data/src/main/java/processing/opengl/cursors/license.txt +27 -0
  142. data/src/main/java/processing/opengl/cursors/move.png +0 -0
  143. data/src/main/java/processing/opengl/cursors/text.png +0 -0
  144. data/src/main/java/processing/opengl/cursors/wait.png +0 -0
  145. data/src/main/java/processing/opengl/shaders/ColorFrag.glsl +32 -0
  146. data/src/main/java/processing/opengl/shaders/ColorVert.glsl +34 -0
  147. data/src/main/java/processing/opengl/shaders/LightFrag.glsl +33 -0
  148. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +154 -0
  149. data/src/main/java/processing/opengl/shaders/LightVert.glsl +151 -0
  150. data/src/main/java/processing/opengl/shaders/LineFrag.glsl +32 -0
  151. data/src/main/java/processing/opengl/shaders/LineVert.glsl +100 -0
  152. data/src/main/java/processing/opengl/shaders/MaskFrag.glsl +40 -0
  153. data/src/main/java/processing/opengl/shaders/PointFrag.glsl +32 -0
  154. data/src/main/java/processing/opengl/shaders/PointVert.glsl +56 -0
  155. data/src/main/java/processing/opengl/shaders/TexFrag.glsl +37 -0
  156. data/src/main/java/processing/opengl/shaders/TexLightFrag.glsl +37 -0
  157. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +160 -0
  158. data/src/main/java/processing/opengl/shaders/TexLightVert.glsl +157 -0
  159. data/src/main/java/processing/opengl/shaders/TexVert.glsl +38 -0
  160. data/src/main/resources/icon/icon-1024.png +0 -0
  161. data/src/main/resources/icon/icon-128.png +0 -0
  162. data/src/main/resources/icon/icon-16.png +0 -0
  163. data/src/main/resources/icon/icon-256.png +0 -0
  164. data/src/main/resources/icon/icon-32.png +0 -0
  165. data/src/main/resources/icon/icon-48.png +0 -0
  166. data/src/main/resources/icon/icon-512.png +0 -0
  167. data/src/main/resources/icon/icon-64.png +0 -0
  168. data/src/main/resources/license.txt +508 -0
  169. data/test/create_test.rb +68 -0
  170. data/test/deglut_spec_test.rb +24 -0
  171. data/test/helper_methods_test.rb +58 -0
  172. data/test/math_tool_test.rb +75 -0
  173. data/test/respond_to_test.rb +215 -0
  174. data/test/sketches/key_event.rb +37 -0
  175. data/test/sketches/library/my_library/my_library.rb +32 -0
  176. data/test/test_helper.rb +3 -0
  177. data/test/vecmath_spec_test.rb +522 -0
  178. data/vendors/Rakefile +127 -0
  179. metadata +289 -0
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: false
2
+ require 'optparse'
3
+ require_relative 'version'
4
+
5
+ module Processing
6
+ # Utility class to handle the different commands that the 'picrate' offers
7
+ class Runner
8
+ attr_reader :options, :argc, :filename
9
+
10
+ def initialize
11
+ @options = {}
12
+ end
13
+
14
+ # Start running a picrate command from the passed-in arguments
15
+ def self.execute
16
+ runner = new
17
+ runner.parse_options(ARGV)
18
+ runner.execute!
19
+ end
20
+
21
+ # Dispatch central.
22
+ def execute!
23
+ show_help if options.empty?
24
+ show_version if options[:version]
25
+ create if options[:create]
26
+ install(filename) if options[:install]
27
+ end
28
+
29
+ # Parse the command-line options. Keep it simple.
30
+ def parse_options(args)
31
+ opt_parser = OptionParser.new do |opts|
32
+ # Set a banner, displayed at the top
33
+ # of the help screen.
34
+ opts.banner = 'Usage: picrate [options] [<sketch.rb>]'
35
+
36
+ # Define the options, and what they do
37
+ options[:version] = false
38
+ opts.on('-v', '--version', 'Processing Version') do
39
+ options[:version] = true
40
+ end
41
+
42
+ options[:install] = false
43
+ message = '<Samples><GLVideo><Video><Sound> Install samples or library'
44
+ opts.on('-i', '--install', message) do
45
+ options[:install] = true
46
+ end
47
+
48
+ options[:create] = false
49
+ opts.on('-c', '--create', 'Create new sketch outline') do
50
+ options[:create] = true
51
+ end
52
+
53
+ # This displays the help screen, all programs are
54
+ # assumed to have this option.
55
+ opts.on('-h', '--help', 'Display this screen') do
56
+ puts opts
57
+ exit
58
+ end
59
+ end
60
+ @argc = opt_parser.parse(args)
61
+ @filename = argc.shift
62
+ end
63
+
64
+ def create
65
+ require_relative 'creators/sketch_writer'
66
+ SketchWriter.new(File.basename(filename, '.rb'), argc).write
67
+ end
68
+
69
+ def show_version
70
+ v_format = "Processing version %s\nJRuby version %s"
71
+ puts format(v_format, Processing::VERSION, JRUBY_VERSION)
72
+ end
73
+
74
+ def install(library)
75
+ choice = library.downcase
76
+ valid = Regexp.union('samples', 'sound', 'video', 'glvideo')
77
+ return warn format('No installer for %s', choice) unless valid =~ choice
78
+ system "cd #{PICRATE_ROOT}/vendors && rake download_and_copy_#{choice}"
79
+ end
80
+ end # class Runner
81
+ end # module Processing
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module PiCrate
3
+ VERSION = '0.0.2'.freeze
4
+ end
@@ -0,0 +1,209 @@
1
+ # frozen_string_literal: true
2
+ # Boids -- after Tom de Smedt.
3
+ # See his Python version: http://nodebox.net/code/index.php/Boids
4
+ # This is an example of how a pure-Ruby library can work. Original for
5
+ # ruby-processing Jeremy Ashkenas. Reworked, re-factored for JRubyArt 0.9+
6
+ # by Martin Prout, features forwardable, keyword args, Vec3D and Vec2D.
7
+ class Boid
8
+ attr_reader :boids
9
+ attr_accessor :vel, :pos, :is_perching, :perch_time
10
+ def initialize(boids, pos)
11
+ @boids, @flock = boids, boids
12
+ @pos = pos
13
+ @vel = Vec3D.new
14
+ @is_perching = false
15
+ @perch_time = 0.0
16
+ end
17
+
18
+ def cohesion(d:)
19
+ # Boids gravitate towards the center of the flock,
20
+ # Which is the averaged position of the rest of the boids.
21
+ vect = Vec3D.new
22
+ @boids.each do |boid|
23
+ vect += boid.pos unless boid == self
24
+ end
25
+ count = @boids.length - 1.0
26
+ vect /= count
27
+ (vect - pos) / d
28
+ end
29
+
30
+ def separation(radius:)
31
+ # Boids don't like to cuddle.
32
+ vect = Vec3D.new
33
+ @boids.each do |boid|
34
+ if boid != self
35
+ dv = pos - boid.pos
36
+ vect += dv if dv.mag < radius
37
+ end
38
+ end
39
+ vect
40
+ end
41
+
42
+ def alignment(d:)
43
+ # Boids like to fly at the speed of traffic.
44
+ vect = Vec3D.new
45
+ @boids.each do |boid|
46
+ vect += boid.vel if boid != self
47
+ end
48
+ count = @boids.length - 1.0
49
+ vect /= count
50
+ (vect - vel) / d
51
+ end
52
+
53
+ def limit(max:)
54
+ # Tweet, Tweet! The boid police will bust you for breaking the speed limit.
55
+ most = [vel.x.abs, vel.y.abs, vel.z.abs].max
56
+ return if most < max
57
+ scale = max / most.to_f
58
+ @vel *= scale
59
+ end
60
+
61
+ def angle
62
+ Vec2D.new(vel.x, vel.y).heading
63
+ end
64
+
65
+ def goal(target, d = 50.0)
66
+ # Them boids is hungry.
67
+ (target - pos) / d
68
+ end
69
+ end
70
+
71
+ require 'forwardable'
72
+
73
+ # The Boids class
74
+ class Boids
75
+ include Enumerable
76
+ extend Forwardable
77
+ def_delegators(:@boids, :reject, :<<, :each, :shuffle!, :length, :next)
78
+
79
+ attr_reader :has_goal, :perch, :perch_tm, :perch_y
80
+
81
+ def initialize
82
+ @boids = []
83
+ end
84
+
85
+ def self.flock(n:, x:, y:, w:, h:)
86
+ flock = Boids.new.setup(n, x, y, w, h)
87
+ flock.reset_goal(Vec3D.new(w / 2, h / 2, 0))
88
+ end
89
+
90
+ def setup(n, x, y, w, h)
91
+ n.times do
92
+ dx, dy = rand(w), rand(h)
93
+ z = rand(200.0)
94
+ self << Boid.new(self, Vec3D.new(x + dx, y + dy, z))
95
+ end
96
+ @x, @y, @w, @h = x, y, w, h
97
+ @scattered = false
98
+ @scatter = 0.005
99
+ @scatter_time = 50.0
100
+ @scatter_i = 0.0
101
+ @perch = 1.0 # Lower this number to divebomb.
102
+ @perch_y = h
103
+ @perch_tm = -> { 25.0 + rand(50.0) }
104
+ @has_goal = false
105
+ @flee = false
106
+ @goal = Vec3D.new
107
+ self
108
+ end
109
+
110
+ def scatter(chance = 0.005, frames = 50.0)
111
+ @scatter = chance
112
+ @scatter_time = frames
113
+ end
114
+
115
+ def no_scatter
116
+ @scatter = 0.0
117
+ end
118
+
119
+ def perch(ground = nil, chance = 1.0, frames = nil)
120
+ @perch_tm = frames.nil? ? -> { 25.0 + rand(50.0) } : frames
121
+ @perch_y = ground.nil? ? @h : ground
122
+ @perch = chance
123
+ end
124
+
125
+ def no_perch
126
+ @perch = 0.0
127
+ end
128
+
129
+ def reset_goal(target)
130
+ @has_goal = true
131
+ @flee = false
132
+ @goal = target
133
+ self
134
+ end
135
+
136
+ def goal(target:, flee:)
137
+ @has_goal = true
138
+ @flee = flee
139
+ @goal = target
140
+ self
141
+ end
142
+
143
+ def no_goal
144
+ @has_goal = false
145
+ end
146
+
147
+ def constrain
148
+ # Put them boids in a cage.
149
+ dx, dy = @w * 0.1, @h * 0.1
150
+ each do |b|
151
+ b.vel.x += rand(dx) if b.pos.x < @x - dx
152
+ b.vel.y += rand(dy) if b.pos.y < @y - dy
153
+ b.vel.x -= rand(dx) if b.pos.x > @x + @w + dx
154
+ b.vel.y -= rand(dy) if b.pos.y > @y + @h + dy
155
+ b.vel.z += 10.0 if b.pos.z < 0.0
156
+ b.vel.z -= 10.0 if b.pos.z > 100.0
157
+ next unless b.pos.y > perch_y && rand < perch
158
+ b.pos.y = perch_y
159
+ b.vel.y = b.vel.y.abs * -0.2
160
+ b.is_perching = true
161
+ b.perch_time = perch_tm.respond_to?(:call) ? perch_tm.call : perch_tm
162
+ end
163
+ end
164
+
165
+ def update(goal: 20.0, limit: 30.0, **args)
166
+ shuffled = args.fetch(:shuffled, true)
167
+ cohesion = args.fetch(:cohesion, 100)
168
+ separation = args.fetch(:separation, 10)
169
+ alignment = args.fetch(:alignment, 5.0)
170
+ # Just flutter, little boids ... just flutter away.
171
+ # Shuffling keeps things flowing smooth.
172
+ shuffle! if shuffled
173
+ m1 = 1.0 # cohesion
174
+ m2 = 1.0 # separation
175
+ m3 = 1.0 # alignment
176
+ m4 = 1.0 # goal
177
+ @scattered = true if !@scattered && rand < @scatter
178
+ if @scattered
179
+ m1 = -m1
180
+ m3 *= 0.25
181
+ @scatter_i += 1.0
182
+ end
183
+ if @scatter_i >= @scatter_time
184
+ @scattered = false
185
+ @scatter_i = 0.0
186
+ end
187
+ m4 = 0.0 unless has_goal
188
+ m4 = -m4 if @flee
189
+ each do |b|
190
+ if b.is_perching
191
+ if b.perch_time > 0.0
192
+ b.perch_time -= 1.0
193
+ next
194
+ else
195
+ b.is_perching = false
196
+ end
197
+ end
198
+ v1 = b.cohesion(d: cohesion)
199
+ v2 = b.separation(radius: separation)
200
+ v3 = b.alignment(d: alignment)
201
+ v4 = b.goal(@goal, goal)
202
+ # NB: vector must precede scalar in '*' operation below
203
+ b.vel += (v1 * m1 + v2 * m2 + v3 * m3 + v4 * m4)
204
+ b.limit(max: limit)
205
+ b.pos += b.vel
206
+ end
207
+ constrain
208
+ end
209
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ # Usage:
3
+ # load_library :chooser
4
+ #
5
+ # def setup
6
+ # java_signature 'void selectInput(String, String)'
7
+ # selectInput('Select a file to process:', 'fileSelected')
8
+ # end
9
+ #
10
+ # def fileSelected(selection)
11
+ # if selection.nil?
12
+ # puts 'Window was closed or the user hit cancel.'
13
+ # else
14
+ # puts format('User selected %s', selection.get_absolute_path)
15
+ # end
16
+ # end
17
+ class Processing::App
18
+ include Java::MonkstoneFilechooser::Chooser
19
+ end
@@ -0,0 +1,182 @@
1
+ # Here's a little library for quickly hooking up controls to sketches.
2
+ # For messing with the parameters and such.
3
+ # These controls will set instance variables on the sketches.
4
+ # You can make sliders, checkboxes, buttons, and drop-down menus.
5
+ # Optionally pass range and a default value to sliders.
6
+ module ControlPanel
7
+ def self.app_value(name, val)
8
+ Processing.app.instance_variable_set("@#{name}", val)
9
+ end
10
+
11
+ # class used to create slider elements for control_panel
12
+ class Slider < javax.swing.JSlider
13
+ def initialize(control_panel, name, range, initial, proc = nil)
14
+ min = range.begin * 100
15
+ mx = range.end
16
+ mx = range.max if range.exclude_end? && range.begin.respond_to?(:succ)
17
+ max = mx * 100
18
+ val = range.cover?(initial) ? initial * 100 : (range.first + range.last) * 50
19
+ super(min, max, val)
20
+ set_minor_tick_spacing((max - min).abs / 10)
21
+ set_paint_ticks true
22
+ # paint_labels = true
23
+ set_preferred_size(java.awt.Dimension.new(190, 30))
24
+ label = control_panel.add_element(self, name)
25
+ add_change_listener do
26
+ update_label(label, name, value)
27
+ ControlPanel.app_value(name, value)
28
+ proc.call(value) if proc
29
+ end
30
+ ControlPanel.app_value(name, val)
31
+ end
32
+
33
+ def value
34
+ get_value / 100.0
35
+ end
36
+
37
+ def update_label(label, name, value)
38
+ value = value.to_s
39
+ value << '0' if value.length < 4
40
+ label.set_text "<html><br><b>#{name}: #{value}</b></html>"
41
+ end
42
+ end
43
+
44
+ # class used to combo_box menu elements for control_panel
45
+ class Menu < javax.swing.JComboBox
46
+ def initialize(control_panel, name, elements, initial_value, proc = nil)
47
+ super(elements.to_java(:String))
48
+ set_preferred_size(java.awt.Dimension.new(190, 30))
49
+ control_panel.add_element(self, name)
50
+ add_action_listener do
51
+ ControlPanel.app_value(name, value) unless value.nil?
52
+ proc.call(value) if proc
53
+ end
54
+ set_selected_index(initial_value ? elements.index(initial_value) : 0)
55
+ end
56
+
57
+ def value
58
+ get_selected_item
59
+ end
60
+ end
61
+
62
+ # Creates check-box elements for control_panel
63
+ class Checkbox < javax.swing.JCheckBox
64
+ def initialize(control_panel, name, proc = nil)
65
+ @control_panel = control_panel
66
+ super(name.to_s)
67
+ set_preferred_size(java.awt.Dimension.new(190, 64))
68
+ set_horizontal_alignment javax.swing.SwingConstants::CENTER
69
+ control_panel.add_element(self, name, false)
70
+ add_action_listener do
71
+ ControlPanel.app_value(name, value)
72
+ proc.call(value) if proc
73
+ end
74
+ end
75
+
76
+ # define value as checkbox state
77
+ def value
78
+ is_selected
79
+ end
80
+ end
81
+
82
+ # Creates button elements for control_panel
83
+ class Button < javax.swing.JButton
84
+ def initialize(control_panel, name, proc = nil)
85
+ super(name.to_s)
86
+ set_preferred_size(java.awt.Dimension.new(170, 64))
87
+ control_panel.add_element(self, name, false, true)
88
+ add_action_listener do
89
+ Processing.app.send(name)
90
+ proc.call(value) if proc
91
+ end
92
+ end
93
+ end
94
+
95
+ # class used to contain control_panel elements
96
+ class Panel < javax.swing.JFrame
97
+ java_import javax.swing.UIManager
98
+
99
+ attr_accessor :elements, :panel
100
+
101
+ def initialize
102
+ super()
103
+ @elements = []
104
+ @panel = javax.swing.JPanel.new(java.awt.FlowLayout.new(1, 0, 0))
105
+ feel
106
+ end
107
+
108
+ def display
109
+ add panel
110
+ set_size 200, 30 + (64 * elements.size)
111
+ set_default_close_operation javax.swing.JFrame::HIDE_ON_CLOSE
112
+ set_resizable false
113
+ xoffset = Processing.app.width + 10
114
+ set_location(xoffset, 0) unless xoffset > Processing.app.displayWidth
115
+ panel.visible = true
116
+ end
117
+
118
+ def add_element(element, name, has_label = true, _button_ = false)
119
+ if has_label
120
+ label = javax.swing.JLabel.new("<html><br><b>#{name}</b></html>")
121
+ panel.add label
122
+ end
123
+ elements << element
124
+ panel.add element
125
+ has_label ? label : nil
126
+ end
127
+
128
+ def remove
129
+ remove_all
130
+ dispose
131
+ end
132
+
133
+ def title(name)
134
+ set_title(name)
135
+ end
136
+
137
+ def slider(name, range = 0..100, initial = nil, &block)
138
+ Slider.new(self, name, range, initial, block || nil)
139
+ end
140
+
141
+ def menu(name, elements, initial_value = nil, &block)
142
+ Menu.new(self, name, elements, initial_value, block || nil)
143
+ end
144
+
145
+ def checkbox(name, initial_value = false, &block)
146
+ checkbox = Checkbox.new(self, name, block || nil)
147
+ checkbox.do_click if initial_value == true
148
+ end
149
+
150
+ def button(name, &block)
151
+ Button.new(self, name, block || nil)
152
+ end
153
+
154
+ def look_feel(lf)
155
+ feel(lf)
156
+ end
157
+
158
+ private
159
+
160
+ def feel(lf = 'metal')
161
+ lafinfo = javax.swing.UIManager.getInstalledLookAndFeels
162
+ laf = lafinfo.to_ary.find do |info|
163
+ info.name =~ Regexp.new(Regexp.escape(lf), Regexp::IGNORECASE)
164
+ end
165
+ javax.swing.UIManager.setLookAndFeel(laf.class_name)
166
+ end
167
+ end
168
+
169
+ # instance methods module
170
+ module InstanceMethods
171
+ def control_panel
172
+ @control_panel ||= ControlPanel::Panel.new
173
+ return @control_panel unless block_given?
174
+ yield(@control_panel)
175
+ @control_panel.display
176
+ @control_panel.set_visible true
177
+ @control_panel # for legacy compat
178
+ end
179
+ end
180
+ end
181
+
182
+ Processing::App.include(ControlPanel::InstanceMethods)