From e3dcb9e938bfb7b024c05d2ec5f9800a31974f0a Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Mon, 21 Apr 2008 18:54:20 -0400 Subject: [PATCH] First draft of has_slider. Now you can bring up a window with sliders 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: 4da4877137eaefb7c7d485e1ee72796bd1d15a8b Former-commit-id: ff62ea365d45458a4bec4913625316f53d4350a2 --- ruby-processing.rb | 55 ++++++++++++++++++++++++++++++++++++++++++++++ samples/jwishy.rb | 9 +++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/ruby-processing.rb b/ruby-processing.rb index 0d1d8e9a..1531d4f8 100644 --- a/ruby-processing.rb +++ b/ruby-processing.rb @@ -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 @@ -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 @@ -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 @@ -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 \ No newline at end of file diff --git a/samples/jwishy.rb b/samples/jwishy.rb index 3c35eec7..3485a2ce 100644 --- a/samples/jwishy.rb +++ b/samples/jwishy.rb @@ -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 @@ -25,6 +28,10 @@ def setup smooth end + def alpha=(num) + @background[3] = num + end + def background=(*args) @background = args.flatten end