picrate 0.0.2-java

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 (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)