{-|
Module      : Monomer.Widgets.Util.Types
Copyright   : (c) 2018 Francisco Vallarino
License     : BSD-3-Clause (see the LICENSE file)
Maintainer  : fjvallarino@gmail.com
Stability   : experimental
Portability : non-portable

Common types for widget related functions.
-}
{-# LANGUAGE Strict #-}

module Monomer.Widgets.Util.Types (
  IsHovered,
  IsFocused,
  IsActive,
  GetBaseStyle,
  CurrentStyleCfg(..)
) where

import Monomer.Core.StyleTypes
import Monomer.Core.WidgetTypes

-- | Indicates whether the mouse pointer is over a valid region the given node.
type IsHovered s e = WidgetEnv s e -> WidgetNode s e -> Bool
-- | Indicates whether the given node has keyboard focus.
type IsFocused s e = WidgetEnv s e -> WidgetNode s e -> Bool
-- | Indicates whether the given node is clicked on a valid region.
type IsActive s e = WidgetEnv s e -> WidgetNode s e -> Bool

{-|
Returns the base style for a given node, if any. This is widget dependent.

Usually this style comes from the active theme.
-}
type GetBaseStyle s e
  = WidgetEnv s e
  -> WidgetNode s e
  -> Maybe Style

{-|
Configuration for style related functions. It allows to override how each of the
states (hovered, focused and active) is defined for a given widget type.

A usage example can be found in "Monomer.Widgets.Radio".
-}
data CurrentStyleCfg s e = CurrentStyleCfg {
  forall s e. CurrentStyleCfg s e -> IsHovered s e
_ascIsHovered :: IsHovered s e,
  forall s e. CurrentStyleCfg s e -> IsHovered s e
_ascIsFocused :: IsFocused s e,
  forall s e. CurrentStyleCfg s e -> IsHovered s e
_ascIsActive :: IsActive s e
}