{-# OPTIONS_HADDOCK hide #-}

module Graphics.Gloss.Internals.Interface.ViewPort.ControlState
	( State (..)
	, stateInit )
where
import Graphics.Gloss.Internals.Interface.ViewPort.Command
import Graphics.Gloss.Internals.Interface.Backend
import qualified Data.Map			as Map
import Data.Map					(Map)

-- ViewControl State ------------------------------------------------------------------------------
-- | State for controlling the viewport.
--	These are used by the viewport control component.
data State
	= State {
	-- | The command list for the viewport controller.
	--	These can be safely overwridden at any time by deleting / adding entries to the list.
	--	Entries at the front of the list take precedence.
	  stateCommands		:: !(Map Command [(Key, Maybe Modifiers)])

	-- | How much to scale the world by for each step of the mouse wheel.
	, stateScaleStep	:: !Float	
							
	-- | How many degrees to rotate the world by for each pixel of x motion.
	, stateRotateFactor	:: !Float

	-- | During viewport translation,
	--	where the mouse was clicked on the window.
	, stateTranslateMark	:: !(Maybe (Int, Int))

	-- | During viewport rotation,	
	--	where the mouse was clicked on the window
	, stateRotateMark	:: !(Maybe (Int, Int))
	}


-- | The initial view state.
stateInit :: State
stateInit
	= State
	{ stateCommands		= Map.fromList defaultCommandConfig
	, stateScaleStep	= 0.85
	, stateRotateFactor	= 0.6
	, stateTranslateMark	= Nothing
	, stateRotateMark	= Nothing }