1- # frozen_string_literal: true
21# Here's a little library for quickly hooking up controls to sketches.
32# For messing with the parameters and such.
43# These controls will set instance variables on the sketches.
54# You can make sliders, checkboxes, buttons, and drop-down menus.
6- # (optionally) pass the range and default value.
5+ # Optionally pass range and a default value to sliders .
76module ControlPanel
7+ def self . app_value ( name , val )
8+ Processing . app . instance_variable_set ( "@#{ name } " , val )
9+ end
10+
811 # class used to create slider elements for control_panel
912 class Slider < javax . swing . JSlider
10- def initialize ( control_panel , name , range , initial_value , proc = nil )
13+ def initialize ( control_panel , name , range , initial , proc = nil )
1114 min = range . begin * 100
12- max = (
13- ( range . exclude_end? && range . begin . respond_to? ( :succ ) ) ?
14- range . max : range . end ) * 100
15+ mx = range . end
16+ mx = range . max if range . exclude_end? && range . begin . respond_to? ( :succ )
17+ max = mx * 100
1518 super ( min , max )
1619 set_minor_tick_spacing ( ( max - min ) . abs / 10 )
1720 set_paint_ticks true
@@ -20,11 +23,12 @@ def initialize(control_panel, name, range, initial_value, proc = nil)
2023 label = control_panel . add_element ( self , name )
2124 add_change_listener do
2225 update_label ( label , name , value )
23- Processing . app . instance_variable_set ( "@ #{ name } " , value ) unless value . nil?
26+ ControlPanel . app_value ( name , value )
2427 proc . call ( value ) if proc
2528 end
26- set_value ( initial_value ? initial_value * 100 : min )
27- fire_state_changed
29+ val = initial . nil? ? ( range . first + range . last ) * 50 : initial * 100
30+ set_value ( val )
31+ ControlPanel . app_value ( name , val )
2832 end
2933
3034 def value
@@ -45,7 +49,7 @@ def initialize(control_panel, name, elements, initial_value, proc = nil)
4549 set_preferred_size ( java . awt . Dimension . new ( 190 , 30 ) )
4650 control_panel . add_element ( self , name )
4751 add_action_listener do
48- Processing . app . instance_variable_set ( "@ #{ name } " , value ) unless value . nil?
52+ ControlPanel . app_value ( name , value ) unless value . nil?
4953 proc . call ( value ) if proc
5054 end
5155 set_selected_index ( initial_value ? elements . index ( initial_value ) : 0 )
@@ -65,11 +69,12 @@ def initialize(control_panel, name, proc = nil)
6569 set_horizontal_alignment javax . swing . SwingConstants ::CENTER
6670 control_panel . add_element ( self , name , false )
6771 add_action_listener do
68- Processing . app . instance_variable_set ( "@ #{ name } " , value ) unless value . nil?
72+ ControlPanel . app_value ( name , value )
6973 proc . call ( value ) if proc
7074 end
7175 end
7276
77+ # define value as checkbox state
7378 def value
7479 is_selected
7580 end
@@ -82,7 +87,7 @@ def initialize(control_panel, name, proc = nil)
8287 set_preferred_size ( java . awt . Dimension . new ( 170 , 64 ) )
8388 control_panel . add_element ( self , name , false , true )
8489 add_action_listener do
85- Processing . app . send ( name . to_s )
90+ Processing . app . send ( name )
8691 proc . call ( value ) if proc
8792 end
8893 end
@@ -98,19 +103,16 @@ def initialize
98103 super ( )
99104 @elements = [ ]
100105 @panel = javax . swing . JPanel . new ( java . awt . FlowLayout . new ( 1 , 0 , 0 ) )
101- set_feel
102- end
103-
104- def title ( name )
105- set_title ( name )
106+ feel
106107 end
107108
108109 def display
109110 add panel
110111 set_size 200 , 30 + ( 64 * elements . size )
111112 set_default_close_operation javax . swing . JFrame ::HIDE_ON_CLOSE
112113 set_resizable false
113- set_location ( Processing . app . width + 10 , 0 ) unless Processing . app . width + 10 > Processing . app . displayWidth
114+ xoffset = Processing . app . width + 10
115+ set_location ( xoffset , 0 ) unless xoffset > Processing . app . displayWidth
114116 panel . visible = true
115117 end
116118
@@ -129,8 +131,12 @@ def remove
129131 dispose
130132 end
131133
132- def slider ( name , range = 0 ..100 , initial_value = nil , &block )
133- Slider . new ( self , name , range , initial_value , block || nil )
134+ def title ( name )
135+ set_title ( name )
136+ end
137+
138+ def slider ( name , range = 0 ..100 , initial = nil , &block )
139+ Slider . new ( self , name , range , initial , block || nil )
134140 end
135141
136142 def menu ( name , elements , initial_value = nil , &block )
@@ -147,17 +153,17 @@ def button(name, &block)
147153 end
148154
149155 def look_feel ( lf )
150- set_feel ( lf )
156+ feel ( lf )
151157 end
152158
153159 private
154160
155- def set_feel ( lf = 'metal' )
161+ def feel ( lf = 'metal' )
156162 lafinfo = javax . swing . UIManager . getInstalledLookAndFeels
157- laf = lafinfo . to_ary . select do |info |
163+ laf = lafinfo . to_ary . find do |info |
158164 info . name =~ Regexp . new ( Regexp . escape ( lf ) , Regexp ::IGNORECASE )
159165 end
160- javax . swing . UIManager . setLookAndFeel ( laf [ 0 ] . class_name )
166+ javax . swing . UIManager . setLookAndFeel ( laf . class_name )
161167 end
162168 end
163169
@@ -168,6 +174,8 @@ def control_panel
168174 return @control_panel unless block_given?
169175 yield ( @control_panel )
170176 @control_panel . display
177+ @control_panel . set_visible true
178+ @control_panel # for legacy compat
171179 end
172180 end
173181end
0 commit comments