module Vedeu

  module Bindings

    # System events relating to movement of cursors or interfaces.
    #
    # @api public
    module Movement

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_down_) do |name|
        Vedeu::Move.by_name(Vedeu::Cursor, :down, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_left_) do |name|
        Vedeu::Move.by_name(Vedeu::Cursor, :left, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_origin_) do |name|
        Vedeu::Move.by_name(Vedeu::Cursor, :origin, name)
      end

      # Move the cursor to a relative position inside the interface.
      #
      # @todo
      #   - The content of the interface needs to be a consideration.
      #   - If the screen size changes, what should happen to the cursor.
      #   - How do we represent cursors which are deliberately positioned
      #     outside of the viewable area?
      #
      Vedeu.bind(:_cursor_reposition_) do |name, y, x|
        Vedeu::Reposition.to(Vedeu::Cursor, name, y, x)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_reset_) do |name|
        Vedeu.trigger(:_cursor_origin_, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_right_) do |name|
        Vedeu::Move.by_name(Vedeu::Cursor, :right, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_cursor_up_) do |name|
        Vedeu::Move.by_name(Vedeu::Cursor, :up, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_geometry_down_) do |name|
        Vedeu::Move.by_name(Vedeu::Geometry, :down, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_geometry_left_) do |name|
        Vedeu::Move.by_name(Vedeu::Geometry, :left, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_geometry_right_) do |name|
        Vedeu::Move.by_name(Vedeu::Geometry, :right, name)
      end

      # @see {Vedeu::Move}
      Vedeu.bind(:_geometry_up_) do |name|
        Vedeu::Move.by_name(Vedeu::Geometry, :up, name)
      end

    end # Movement

  end # Bindings

end # Vedeu