gui/addons/user_object_setting_float.rb
class UserObjectSettingFloat
attr_accessor :min, :max, :enable_enter_animation, :enable_exit_animation
pipe :grab_keyboard_focus, :vbox
DEFAULT_DIGITS = 2
DISABLED_SETTINGS_STYLE = {:opacity => 0.2, :hidden => false}
ENABLED_SETTINGS_STYLE = {:opacity => 1.0, :hidden => false}
def gui_build_editor
box = GuiBox.new
box << create_user_object_setting_name_label
box << @vbox = GuiVBox.new.set(:scale_y => 0.8, :offset_y => -0.1)
digits = @options[:digits] || DEFAULT_DIGITS
unless @options[:simple]
box << (@enable_enter_exit_button=GuiEnterExitButton.new(self).set(:scale_x => 0.10, :offset_x => 0.5 - 0.05, :scale_y => 0.3, :offset_y => 0.5))
end
row = GuiHBox.new #.set(:scale_y => 0.5, :offset_y => 0.23)
row << GuiFloat.new(self, :animation_min, @min, @max, digits).set(:text_align => :center, :scale_x => 0.15, :float => :left)
unless @options[:simple]
row << (@enable_animation_toggle=GuiToggle.new(self, :enable_animation).set(:scale_x => 0.07, :float => :left, :color => [1,0,0,1], :image => $engine.load_image('images/buttons/play.png')))
row << (@animation_curve_widget=GuiCurve.new(self, :animation_curve).set(:scale_x => 0.1, :scale_y => 0.85, :float => :left, :opacity => 0.0, :hidden => true))
row << (@animation_max_widget=GuiFloat.new(self, :animation_max, @min, @max, digits).set(:text_align => :center, :scale_x => 0.15, :float => :left, :opacity => 0.0, :hidden => true))
row << (@animation_every_text=GuiLabel.new.set(:width => 4, :text_align => :fill, :string => 'every', :offset_x => 0.014, :scale_x => 0.08, :float => :left, :opacity => 0.0, :hidden => true))
row << (@animation_repeat_number_widget=GuiFloat.new(self, :animation_repeat_number, 0.25, 128.0, 2).set(:text_align => :center, :step_amount => 0.25, :scale_x => 0.12, :float => :left, :opacity => 0.0, :hidden => true))
row << (@animation_repeat_unit_widget=GuiSelect.new(self, :animation_repeat_unit, UserObjectSettingFloat::TIME_UNIT_OPTIONS).set(:width => 5, :text_align => :left, :scale_x => 0.15, :float => :left, :opacity => 0.0, :hidden => true))
@animation_widgets = [@animation_curve_widget, @animation_max_widget, @animation_every_text, @animation_repeat_number_widget, @animation_repeat_unit_widget]
@enable_animation_toggle.on_clicked_with_init { |pointer|
if @enable_animation_toggle.on?
# shift-click auto-copies min -> max, meaning no actual animation
if pointer && $gui.keyboard.shift_down?
@animation_max = @animation_min
$engine.project_changed!
end
@animation_widgets.each_with_index { |widget, index| widget.animate(ENABLED_SETTINGS_STYLE, duration = (0.05 + (index * 0.3))) }
else
@animation_widgets.each_with_index { |widget, index| widget.animate(DISABLED_SETTINGS_STYLE, duration = (0.2)) }
end
}
end
@vbox << row
# Row 2
row = GuiHBox.new #.set(:scale_y => 0.5, :offset_y => -0.25)
unless @options[:simple]
@enable_enter_exit_button.on_clicked { |pointer|
if @enter_exit_popup
@enter_exit_popup.animate({:scale_x => 0.0, :scale_y => 0.0}, 0.05) {
@enter_exit_popup.remove_from_parent! if @enter_exit_popup
@enter_exit_popup = nil
}
else
$gui << (@enter_exit_popup=GuiEnterExitPopup.new(self).set(:offset_x => pointer.x, :offset_y => pointer.y - 0.035, :scale_x => 0.0, :scale_y => 0.03).animate({:scale_x => 0.25, :scale_y => 0.05}, duration=0.25))
pointer.capture_object!(@enter_exit_popup) { |click_object| # callback is for a click
if @enter_exit_popup.include?(click_object)
pointer.click_on(click_object)
true
else
@enter_exit_popup.animate({:scale_x => 0.0, :scale_y => 0.0}, 0.05) {
@enter_exit_popup.remove_from_parent!
@enter_exit_popup = nil
}
pointer.uncapture_object!
false
end
}
end
}
row << (@enable_activation_toggle=GuiToggle.new(self, :enable_activation).set(:scale_x => 0.07, :float => :left, :offset_x => 0.15, :color => [1,0,0,1], :image => $engine.load_image('images/buttons/play.png')))
row << (@activation_curve_widget=GuiCurveIncreasing.new(self, :activation_curve).set(:scale_x => 0.1, :scale_y => 0.8, :float => :left, :opacity => 0.0, :hidden => true))
row << (@activation_direction_widget=GuiSelect.new(self, :activation_direction, UserObjectSettingFloat::ACTIVATION_DIRECTION_OPTIONS).set(:width => 3, :text_align => :center, :scale_x => 0.08, :float => :left, :opacity => 0.0, :hidden => true))
row << (@activation_value_widget=GuiFloat.new(self, :activation_value, @min, @max, digits).set(:text_align => :center, :scale_x => 0.15, :float => :left, :opacity => 0.0, :hidden => true))
row << (@activation_when_text=GuiLabel.new.set(:string => 'when', :width => 4, :text_align => :center, :scale_x => 0.1, :float => :left, :opacity => 0.0, :hidden => true))
row << (@activation_variable_widget=GuiVariable.new(self, :activation_variable).set(:no_value_text => 'variable', :scale_x => 0.26, :float => :left, :opacity => 0.0, :hidden => true))
row << @new_activation_variable_button=GuiButton.new.set(:scale_x => 0.08, :float => :left, :background_image => $engine.load_image('images/buttons/new-variable.png'), :background_image_hover => $engine.load_image('images/buttons/new-variable-hover.png'), :background_image_click => $engine.load_image('images/buttons/new-variable-click.png'))
@new_activation_variable_button.on_clicked { |pointer|
@activation_variable = $gui.new_variable!(pointer)
}
@activation_widgets = [@activation_curve_widget, @activation_value_widget, @activation_direction_widget, @activation_when_text, @activation_variable_widget, @new_activation_variable_button]
@enable_activation_toggle.on_clicked_with_init { |pointer|
if @enable_activation_toggle.on?
# shift-click auto-copies min -> activation, meaning no actual activation
if pointer && $gui.keyboard.shift_down?
@activation_value = @animation_min
$engine.project_changed!
end
@activation_widgets.each_with_index { |widget, index| widget.animate(ENABLED_SETTINGS_STYLE, duration = (0.05 + (index * 0.3))) }
else
@activation_widgets.each_with_index { |widget, index| widget.animate(DISABLED_SETTINGS_STYLE, duration = (0.2)) }
end
}
end
@vbox << row
box
end
end