Skip to content

Commit

Permalink
First draft of has_slider. Now you can bring up a window with sliders…
Browse files Browse the repository at this point in the history
… to control instance variables.

Use it like:

has_slider :alpha_value, 0.0..1.0

To create a slider for @alpha_value between 0.0 and 1.0


Former-commit-id: 4da4877
Former-commit-id: ff62ea365d45458a4bec4913625316f53d4350a2
  • Loading branch information
jashkenas committed Apr 21, 2008
1 parent f2178e7 commit e3dcb9e
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
55 changes: 55 additions & 0 deletions ruby-processing.rb
Expand Up @@ -16,6 +16,11 @@ module Processing
class App < PApplet

include_class "javax.swing.JFrame"
include_class "javax.swing.JSlider"
@@has_sliders = false
include_class "javax.swing.JPanel"
include_class "javax.swing.JLabel"

attr_accessor :frame, :title
alias_method :oval, :ellipse
alias_method :stroke_width, :stroke_weight
Expand Down Expand Up @@ -88,6 +93,30 @@ def self.load_java_library(folder)
return @@loaded_libraries[folder.to_sym]
end

# Creates a slider, in a new window, to control an instance variable.
# Sliders take a name and a range (optionally), returning an integer.
def self.has_slider(name, range=0..100)
return if Object.const_defined?(:JRUBY_APPLET)
@@has_sliders = true
@@slider_frame ||= JFrame.new
@@slider_frame.instance_eval do
def sliders; @sliders ||= []; end
def listeners; @listeners ||= []; end
end
@@slider_panel ||= JPanel.new(java.awt.FlowLayout.new)
attr_accessor name
slider = JSlider.new((range.begin * 100), (range.end * 100))
listener = SliderListener.new(slider, name.to_s + "=")
slider.add_change_listener listener
@@slider_frame.listeners << listener
slider.set_minor_tick_spacing 1000
slider.set_paint_ticks true
label = JLabel.new(name.to_s)
@@slider_panel.add label
@@slider_panel.add slider
@@slider_frame.sliders << {:name => name, :slider => slider}
end

def initialize(options = {})
super()
App.current = self
Expand All @@ -97,11 +126,25 @@ def initialize(options = {})
:full_screen => false}.merge(options)
@width, @height, @title = options[:width], options[:height], options[:title]
display options
display_slider_frame
end

def setup() end
def draw() end

def display_slider_frame
if @@has_sliders
@@slider_frame.add @@slider_panel
@@slider_frame.set_size 200, 26 + (65 * @@slider_frame.sliders.size)
@@slider_frame.setDefaultCloseOperation(JFrame::DISPOSE_ON_CLOSE)
@@slider_frame.set_resizable false
@@slider_frame.set_location(@width + 10, 0)
@@slider_frame.show
@@slider_frame.sliders.each {|s| s[:slider].set_value(self.send(s[:name]).to_i)}
@@slider_frame.listeners.each {|l| l.stateChanged(nil)}
end
end

def display_full_screen(graphics_env)
@frame = java.awt.Frame.new
mode = graphics_env.display_mode
Expand Down Expand Up @@ -182,5 +225,17 @@ def mouse_y
end

end

class SliderListener
include javax.swing.event.ChangeListener

def initialize(slider, callback)
@slider, @callback = slider, callback
end

def stateChanged(state)
Processing::App.current.send(@callback, @slider.get_value / 100.0)
end
end

end
9 changes: 8 additions & 1 deletion samples/jwishy.rb
Expand Up @@ -7,13 +7,16 @@
# playing with the attr_accessors, as
# well as the background.

# This example now demonstrates the use of sliders.

# -- omygawshkenas

require 'ruby-processing'

class Sketch < Processing::App

attr_accessor :x_wiggle, :y_wiggle, :magnitude, :bluish
has_slider :bluish, 0.0..1.0
has_slider :alpha, 0.0..1.0

def setup
@x_wiggle, @y_wiggle = 10.0, 0
Expand All @@ -25,6 +28,10 @@ def setup
smooth
end

def alpha=(num)
@background[3] = num
end

def background=(*args)
@background = args.flatten
end
Expand Down

0 comments on commit e3dcb9e

Please sign in to comment.