class Canis::Variable
Like Tk's TkVariable, a simple proxy that can be passed to a widget. The widget will update the Variable
. A variable can be used to link a field with a label or some other widget. This is the new version of Variable
. Deleting old version on 2009-01-17 12:04
Example¶ ↑
x = Variable.new
If x is passed as the variable
for a RadioButton
group, then this keeps the value of the button that is on.
y = Variable.new false z = Variable.new Hash.new
If z is passed as variable to create several Checkboxes, and each has the name
property set, then this hash will contain the status of each checkbox with name
as key.
Public Class Methods
# File lib/canis/core/widgets/rwidget.rb, line 2855 def initialize value="" @update_command = [] @args = [] @value = value @klass = value.class.to_s end
Public Instance Methods
# File lib/canis/core/widgets/rwidget.rb, line 2940 def [](key) @value[key] end
This is to ensure that change handlers for all dependent objects are called so they are updated. This is called from text_variable property of some widgets. If you use one text_variable across objects, all will be updated auto. User does not need to call. NOTE: I have removed text_variable from widget to simplify, so this seems to be dead. @ private
# File lib/canis/core/widgets/rwidget.rb, line 2868 def add_dependent obj $log.debug " ADDING DEPENDE #{obj}" @dependents ||= [] @dependents << obj end
value of the variable
# File lib/canis/core/widgets/rwidget.rb, line 2884 def get_value val=nil if @klass == 'String' return @value elsif @klass == 'Hash' return @value[val] elsif @klass == 'Array' return @value[val] else return @value end end
# File lib/canis/core/widgets/rwidget.rb, line 2937 def inspect @value.inspect end
update the value of this variable. 2008-12-31 18:35 Added source so one can identify multiple sources that are updating. Idea is that mutiple fields (e.g. checkboxes) can share one var and update a hash through it. Source would contain some code or key relatin to each field.
# File lib/canis/core/widgets/rwidget.rb, line 2900 def set_value val, key="" oldval = @value if @klass == 'String' @value = val elsif @klass == 'Hash' #$log.debug " Variable setting hash #{key} to #{val}" oldval = @value[key] @value[key]=val elsif @klass == 'Array' #$log.debug " Variable setting array #{key} to #{val}" oldval = @value[key] @value[key]=val else oldval = @value @value = val end return if @update_command.nil? @update_command.each_with_index do |comm, ix| comm.call(self, *@args[ix]) unless comm.nil? end @dependents.each {|d| d.fire_property_change(d, oldval, val) } unless @dependents.nil? end
in order to run some method we don't yet support
# File lib/canis/core/widgets/rwidget.rb, line 2945 def source @value end
# File lib/canis/core/widgets/rwidget.rb, line 2948 def to_s inspect end
install trigger to call whenever a value is updated @public called by user components
# File lib/canis/core/widgets/rwidget.rb, line 2876 def update_command *args, &block $log.debug "Variable: update command set " # #{args}" @update_command << block @args << args end
# File lib/canis/core/widgets/rwidget.rb, line 2933 def value raise "Please use set_value for hash/array: #{@klass}" if @klass=='Hash' #or @klass=='Array' @value end
# File lib/canis/core/widgets/rwidget.rb, line 2923 def value= (val) raise "Please use set_value for hash/array" if @klass=='Hash' or @klass=='Array' oldval = @value @value=val return if @update_command.nil? @update_command.each_with_index do |comm, ix| comm.call(self, *@args[ix]) unless comm.nil? end @dependents.each {|d| d.fire_property_change(d, oldval, val) } unless @dependents.nil? end