lighttroupe/luz

View on GitHub
gui/addons/user_object_setting_float.rb

Summary

Maintainability
C
1 day
Test Coverage
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