lighttroupe/luz

View on GitHub
gui/gui_variables_flyout.rb

Summary

Maintainability
C
7 hrs
Test Coverage
#
# GuiVariablesFlyout is the left-edge window containing variables and events lists.
#
class GuiVariablesFlyout < GuiWindow
    def initialize
        super
        create!
    end

    def create!
        # Background
        self << (@background = GuiObject.new.set(:background_image => $engine.load_image('images/variables-flyout-background.png')))

        # Events list
        self << @events_list = GuiList.new.set(:scale_x => 0.85, :scale_y => 0.37, :offset_x => -0.06, :offset_y => 0.22, :item_aspect_ratio => 3.0, :spacing_y => -1.0)
        @events_list.contents = $engine.project.events.map { |event| create_renderer_for_event(event) }
        @events_list.on_contents_change { $engine.project.events = @events_list.map(&:object) ; $engine.project_changed! }
        @gui_events_list_scrollbar = GuiScrollbar.new(@events_list).set(:scale_x => 0.08, :scale_y => 0.37, :offset_x => 0.4, :offset_y => 0.22)
        self << @gui_events_list_scrollbar

        # New Event button
        self << (@new_event_button = GuiButton.new.set(:scale_x => 1.0, :scale_y => 0.045, :offset_x => 0.0, :offset_y => -0.013, :background_image => $engine.load_image('images/buttons/new-event-button.png'), :background_image_hover => $engine.load_image('images/buttons/new-event-button-hover.png')))
        @new_event_button.on_clicked { |pointer| new_event! }

        #
        # Variables
        #
        self << @variables_list = GuiList.new($engine.project.variables.map(&:new_renderer)).set(:scale_x => 0.85, :scale_y => 0.37, :offset_x => -0.06, :offset_y => -0.24, :item_aspect_ratio => 3.0, :spacing_y => -1.0)
        @variables_list.contents = $engine.project.variables.map { |variable| create_renderer_for_variable(variable) }
        @variables_list.on_contents_change { $engine.project.variables = @variables_list.map(&:object) ; $engine.project_changed! }
        @gui_variables_list_scrollbar = GuiScrollbar.new(@variables_list).set(:scale_x => 0.08, :scale_y => 0.37, :offset_x => 0.4, :offset_y => -0.24)
        self << @gui_variables_list_scrollbar

        # New Variable button
        self << (@new_variable_button = GuiButton.new.set(:scale_x => 1.0, :scale_y => 0.043, :offset_x => 0.0, :offset_y => -0.476, :background_image => $engine.load_image('images/buttons/new-variable-button.png'), :background_image_hover => $engine.load_image('images/buttons/new-variable-button-hover.png')))
        @new_variable_button.on_clicked { |pointer| new_variable!(pointer) }
    end

    def remove(obj)
        @variables_list.remove(obj)
        @events_list.remove(obj)
    end

    def new_variable!(pointer=nil)
        variable = Variable.new
        renderer = create_renderer_for_variable(variable)
        @variables_list.add_after_selection(renderer)
        @variables_list.set_selection(renderer)
        $gui.build_editor_for(variable, :pointer => pointer)
        $gui.user_object_editor_edit_text
        $engine.project.variables = @variables_list.map(&:object)
        $engine.project_changed!
        variable
    end

    def create_renderer_for_variable(variable)
        renderer = variable.new_renderer
        renderer.on_clicked { |pointer| $gui.build_editor_for(variable, :pointer => pointer, :grab_keyboard_focus => true) }
        renderer.on_double_clicked { |pointer| $gui.user_object_editor_edit_text }
        renderer
    end

    def new_event!(pointer=nil)
        event = Event.new
        renderer = create_renderer_for_event(event)
        @events_list.add_after_selection(renderer)
        @events_list.set_selection(renderer)
        $gui.build_editor_for(event, :pointer => pointer)
        $gui.user_object_editor_edit_text
        #$engine.project.events = @events_list.map(&:object)
        $engine.project_changed!
        event
    end

    def create_renderer_for_event(event)
        renderer = event.new_renderer
        renderer.on_clicked { |pointer| $gui.build_editor_for(event, :pointer => pointer, :grab_keyboard_focus => true) }
        renderer.on_double_clicked { |pointer| $gui.user_object_editor_edit_text }
        renderer
    end

    def on_key_press(key)
        if key.control?
            case key
            when 'n'
                if key.control?
                    if @events_list.keyboard_focus?
                        new_event!
                    elsif @variables_list.keyboard_focus?
                        new_variable!
                    end
                end
            when 'd'
                if key.control?
                    $gui.negative_message "duplicate not implemented"

                    #if @events_list.keyboard_focus?
                        #if (selected = @events_list.selection.first)
                            #original = selected.object
                            #duplicate = original.deep_clone_user_object
                            #renderer = create_renderer_for_event(duplicate)
                            #@events_list.add_after_selection(renderer)
                            #@events_list.set_selection(renderer)
                        #end
                    #elsif @variables_list.keyboard_focus?
                        #if (selected = @variables_list.selection.first)
                            #original = selected.object
                            #duplicate = original.deep_clone_user_object
                            #renderer = create_renderer_for_variable(duplicate)
                            #@variables_list.add_after_selection(renderer)
                            #@variables_list.set_selection(renderer)
                        #end
                    #end
                end
            else
                super
            end
        else
            case key
            when 'up'
                @events_list.grab_keyboard_focus!
            when 'down'
                @variables_list.grab_keyboard_focus!
            when 'left'
                self.grab_keyboard_focus!
            when 'right'
                if @events_list.keyboard_focus?
                    @variables_list.grab_keyboard_focus!
                elsif @variables_list.keyboard_focus?
                    @events_list.grab_keyboard_focus!
                elsif self.keyboard_focus?
                    @events_list.grab_keyboard_focus!
                end
            when 'return'
                if @events_list.keyboard_focus?
                    renderer = @events_list.selection.first
                    $gui.build_editor_for(renderer.object, :grab_keyboard_focus => true) if renderer
                elsif @variables_list.keyboard_focus?
                    renderer = @variables_list.selection.first
                    $gui.build_editor_for(renderer.object, :grab_keyboard_focus => true) if renderer
                end
            else
                super
            end
        end
    end
end