note
	description: "Controller of the game library."
	author: "Louis Marchand"
	date: "Sat, 28 Mar 2015 03:42:16 +0000"
	revision: "2.1"

class interface
	GAME_LIBRARY_CONTROLLER

create 
	default_create,
	make_no_parachute

feature -- Subs Systems

	enable_video
			-- Unable the video functionalities
		require
			sdl_controller_enable_video_already_enabled: not is_video_enable
		ensure
			sdl_controller_enable_video_enabled: is_video_enable

	disable_video
			-- Disable the video functionalities
		require
			sdl_controller_disable_video_not_enabled: is_video_enable
		ensure
			sdl_controller_disable_video_disabled: not is_video_enable

	is_video_enable: BOOLEAN assign set_is_video_enable
			-- Return true if the text surface functionnality is enabled.

	set_is_video_enable (a_value: BOOLEAN)
			-- Assign to is_video_enable the value of a_value
		ensure
			is_assign: is_video_enable ~ a_value

	enable_joystick
			-- Unable the joystick functionality
		require
			sdl_controller_enable_joystick_already_enabled: not is_joystick_enable
		ensure
			sdl_controller_enable_joystick_enabled: is_joystick_enable

	disable_joystick
			-- Disable the joystick fonctionality
		require
			sdl_controller_disable_joystick_not_enabled: is_joystick_enable
		ensure
			sdl_controller_disable_joystick_disabled: not is_joystick_enable

	is_joystick_enable: BOOLEAN assign set_is_joystick_enable
			-- Return true if the joystick functionnality is enabled.

	set_is_joystick_enable (a_value: BOOLEAN)
			-- Assign to is_joystick_enable the value of a_value
		ensure
			is_assign: is_joystick_enable ~ a_value

	enable_haptic
			-- Unable the haptic (force feedback) functionality.
			-- Often use for Controller rumble.
		require
			sdl_controller_enable_haptic_already_enabled: not is_haptic_enable
		ensure
			sdl_controller_enable_haptic_enabled: is_haptic_enable

	disable_haptic
			-- Disable the haptic (force feedback) fonctionality
		require
			sdl_controller_disable_haptic_not_enabled: is_haptic_enable
		ensure
			sdl_controller_disable_haptic_disabled: not is_haptic_enable

	is_haptic_enable: BOOLEAN assign set_is_haptic_enable
			-- Return true if the haptic (force feedback) functionnality is enabled.

	set_is_haptic_enable (a_value: BOOLEAN)
			-- Assign to is_haptic_enable the value of a_value
		ensure
			is_assign: is_haptic_enable ~ a_value

	enable_events
			-- Unable the events functionality.
		require
			sdl_controller_enable_events_already_enabled: not is_events_enable
		ensure
			sdl_controller_enable_events_enabled: is_events_enable

	disable_events
			-- Disable the events fonctionality
		require
			sdl_controller_disable_events_not_enabled: is_events_enable
		ensure
			sdl_controller_disable_events_disabled: not is_events_enable

	is_events_enable: BOOLEAN assign set_is_events_enable
			-- Return true if the events functionnality is enabled.

	set_is_events_enable (a_value: BOOLEAN)
			-- Assign to is_events_enable the value of a_value
		ensure
			is_assign: is_events_enable ~ a_value
	
feature -- Video methods

	renderer_drivers_count: INTEGER_32
			-- Return the number of renderer driver. 0 if error.
		require
			video_enabled: is_video_enable

	renderer_drivers: LIST [GAME_RENDERER_DRIVER]
			-- All renderer driver of the system. 0 driver on error.
		require
			displays_is_video_enabled: is_video_enable

	displays_count: INTEGER_32
			-- Return the number of display. 0 if error.
		require
			displays_count_is_video_enabled: is_video_enable

	displays: LIST [GAME_DISPLAY]
			-- All displays of the system. 0 display on error.
		require
			displays_is_video_enabled: is_video_enable

	windows: CHAIN_INDEXABLE_ITERATOR [GAME_WINDOW]
			-- Every GAME_WINDOW in the system.
	
feature -- Mouse		

	show_mouse_cursor
			-- Show the mouse cursor when the mouse is on a window created by the library.
		ensure
			show_mouse_cursor_valid: is_cursor_visible

	hide_mouse_cursor
			-- Don't show the mouse cursor when the mouse is on a window created by the library.
		ensure
			hide_mouse_cursor_valid: not is_cursor_visible

	is_cursor_visible: BOOLEAN assign set_is_cursor_visible
			-- Return true if the library is set to show the mous cursor when the mouse is on a window created by the library.

	set_is_cursor_visible (a_value: BOOLEAN)
			-- Assign to is_cursor_visible the value of a_value
		ensure
			is_assign: is_cursor_visible ~ a_value

	enable_relative_mouse
			-- Set the is_relative_mouse_enabled mode
		ensure
			is_assign: not has_error implies is_relative_mouse_enabled

	disable_relative_mouse
			-- Unset the is_relative_mouse_enabled mode
		ensure
			is_assign: not has_error implies not is_relative_mouse_enabled

	is_relative_mouse_enabled: BOOLEAN assign set_is_relative_mouse_enabled
			-- While Enabled, the cursor is hidden, and only relative motion events (delta_x and delta_y)
			-- will be delivered to the current window the mouse position will not change.
			-- Note: This function will flush any pending mouse motion.

	set_is_relative_mouse_enabled (a_value: BOOLEAN)
			-- Assign is_relative_mouse_enabled with the value of a_value
		ensure
			is_assign: not has_error implies is_relative_mouse_enabled ~ a_value

	cursor: GAME_CURSOR
			-- The GAME_CURSOR presently used in Current

	default_cursor: GAME_CURSOR
			-- The GAME_CURSOR used in the creation of Current

	set_cursor (a_cursor: GAME_CURSOR)
			-- Assign cursor with the value of a_cursor
		require
			cursor_valid: a_cursor.exists
		ensure
			is_assign: not has_error implies cursor ~ a_cursor

	redraw_cursor
			-- Redraw the cursor

	set_default_cursor
			-- Put back the default GAME_CURSOR
	
feature -- Joystick methods

	joysticks: CHAIN_INDEXABLE_ITERATOR [GAME_JOYSTICK]
			-- Every GAME_JOYSTICK detected by Current
		require
			joysticks_is_joystick_enabled: is_joystick_enable

	update_joysticks_state
			-- Update the state of all opened joystick. This procedure is
			-- Called at each game loop instead you disable every joystick event
			-- with GAME_EVENTS_CONTROLLER.disable_joy_*_event or with
			-- GAME_EVENTS_CONTROLLER.disable_every_joy_events
	
feature -- Haptic methods

	haptics: CHAIN_INDEXABLE_ITERATOR [GAME_HAPTIC_DEVICE]
			-- Every haptic devices on the system
		require
			haptic_is_haptic_enabled: is_haptic_enable

	refresh_haptics
			-- Update the haptics list (if haptics as been add or remove)
			-- Warning: This will close all opened haptics
		require
			controller_update_haptics_haptic_enabled: is_haptic_enable

	haptic_maximum_gain: INTEGER_32 assign set_haptic_maximum_gain
			-- The maximum gain used by haptics in the system.
			-- The GAME_HAPTIC.set_gain always take 0-100
			-- gain value, but the real value is scaled
		require
			haptic_enabled: is_haptic_enable
		ensure
			result_valid: Result >= 0 and Result <= 100

	set_haptic_maximum_gain (a_gain: INTEGER_32)
			-- Assign haptic_maximum_gain with the value of a_gain
		require
			haptic_enabled: is_haptic_enable
			gain_is_valid: a_gain >= 0 and a_gain <= 100
		ensure
			is_assign: not has_error implies haptic_maximum_gain = a_gain
	
feature -- Touch devices

	touch_device_count: INTEGER_32
			-- The number of touch device detected on the system.
			-- Note: Not necessary the same as touch_devices.count
			-- because a touch device can have been added or remove
			-- since the creation of the touch_devices list.
			-- In that case, used refresh_touch_devices to update
			-- the touch_devices (all touch events will have to be
			-- reset)

	touch_devices: CHAIN_INDEXABLE_ITERATOR [GAME_TOUCH_DEVICE]
			-- Every finger touch device detected in he system.
			-- This list does not update itself, you have to call
			-- refresh_touch_devices to update it (all touch
			-- events will have to be reset)

	refresh_touch_devices
			-- Update the touch_devices list. Note that
			-- all touch events will have to be reset
	
feature -- OpenGL

	is_gl_enabled: BOOLEAN
			-- The OpenGL library has been loaded

	enable_gl
			-- Load the OpenGL library
		require
			not_already_enabled: not is_gl_enabled
			video_must_be_loaded: is_video_enable

	enable_gl_from_file (a_file_name: READABLE_STRING_GENERAL)
			-- Load the OpenGL library contained in file at a_file_name
		require
			not_already_enabled: not is_gl_enabled
			video_must_be_loaded: is_video_enable
			file_valid: attached (create {RAW_FILE}.make_with_name (a_file_name)) as la_file and then (la_file.exists and la_file.is_access_readable)

	disable_gl
			-- Unload the OpenGL library
		require
			is_gl_enabled: is_gl_enabled
	
feature -- Touch devices implementation

	Dollar_gesture_template_index: INTEGER_64 = -1
			-- The internal index of the managed touch device
	
feature -- Other methods

	library_variable (a_variable: READABLE_STRING_GENERAL): READABLE_STRING_GENERAL assign set_library_variable
			-- Retreive the internal variable a_variable or an empty text if it does not exist.

	set_library_variable (a_variable, a_value: READABLE_STRING_GENERAL)
			-- Assign the internal variable a_variable with the value a_value.

	events_controller: GAME_EVENTS_CONTROLLER
			-- Manage every internal events

	clear_all_events
			-- Clear every events set in the system

	update_events
			-- Execute the event polling and throw the event handeler execution for each event.

	delay (a_millisecond: NATURAL_32)
			-- Pause the execution for given time in millisecond.

	time_since_create: NATURAL_32
			-- Number of millisecond since the initialisation of the library.

	launch
			-- Start the main loop. Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handeler.

	launch_with_iteration_per_second (a_iteration_per_second: NATURAL_32)
			-- Start the main loop. Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handeler.
			-- Set iteration_per_second to a_iteration_per_second before launching.

	launch_no_delay
			-- Start the main loop without any loop delay. Use it if you have
			-- a synchronisation system (like vsync) included inside the event handler
			-- Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handler.

	iteration_per_second: NATURAL_32 assign set_iteration_per_second
			-- An approximation of the number of event loop iteration per second.
			-- Not used by launch_no_delay

	set_iteration_per_second (a_iteration_per_second: NATURAL_32)
			-- Set iteration_per_second to a_iteration_per_second
			-- Note that this is an aproximation.

	stop
			-- Stop the main loop

	quit_library
			-- Close the library. Must be used before the end of the application

	mouse_has_haptic: BOOLEAN
			-- Has the mouse have an internal haptic device

	mouse_haptic: GAME_HAPTIC_MOUSE
			-- The haptic device inside the mouse
		require
			mouse_has_haptic: mouse_has_haptic

	base_path: PATH
			-- The PATH of the executable. This PATH is not safe for writing file.

	get_preference_path (a_organisation, a_application_name: READABLE_STRING_GENERAL)
			-- Retreive the preference_path. Create the directory if it does not already exist.

	preference_path: PATH
			-- The PATH to save preference files. Is retreived (or created) by get_preference_path
			-- The directory pointed by this PATH should be writable
			-- Do not use the base_path to write files
		require
			path_retreived: is_preference_path_retreived

	is_preference_path_retreived: BOOLEAN
			-- Is preference_path has been correctly retreived by get_preference_path
	
invariant
	is_singleton: Instance_count.item = 1

end -- class GAME_LIBRARY_CONTROLLER

Generated by ISE EiffelStudio