{-# LANGUAGE RecordWildCards #-}

module Monomer.EnhancedSlider.EnhancedSliderEvent
    ( EnhancedSliderEvent(..)
    , handleEvent
    ) where

import Monomer.Widgets.Composite
import Monomer.Widgets.Singles.Slider

import Monomer.EnhancedSlider.EnhancedSliderCfg

data EnhancedSliderEvent a
    = EventSetField a
    | EventFocus Path
    | EventBlur Path
    deriving EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
forall a.
Eq a =>
EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
$c/= :: forall a.
Eq a =>
EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
== :: EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
$c== :: forall a.
Eq a =>
EnhancedSliderEvent a -> EnhancedSliderEvent a -> Bool
Eq

handleEvent
    :: (SliderValue a)
    => (EnhancedSliderCfg sp ep a)
    -> a
    -> a
    -> EventHandler a (EnhancedSliderEvent a) sp ep
handleEvent :: forall a sp ep.
SliderValue a =>
EnhancedSliderCfg sp ep a
-> a -> a -> EventHandler a (EnhancedSliderEvent a) sp ep
handleEvent EnhancedSliderCfg sp ep a
config a
a a
b WidgetEnv a (EnhancedSliderEvent a)
_ WidgetNode a (EnhancedSliderEvent a)
node a
_ EnhancedSliderEvent a
event = case EnhancedSliderEvent a
event of
    EventSetField a
value -> forall a sp ep.
SliderValue a =>
EnhancedSliderCfg sp ep a
-> a -> a -> a -> [EventResponse a (EnhancedSliderEvent a) sp ep]
setFieldHandle EnhancedSliderCfg sp ep a
config a
a a
b a
value
    EventFocus Path
prev -> forall s e sp ep a.
WidgetNode s e
-> Path
-> EnhancedSliderCfg sp ep a
-> [EventResponse a (EnhancedSliderEvent a) sp ep]
focusHandle WidgetNode a (EnhancedSliderEvent a)
node Path
prev EnhancedSliderCfg sp ep a
config
    EventBlur Path
next -> forall s e sp ep a.
WidgetNode s e
-> Path
-> EnhancedSliderCfg sp ep a
-> [EventResponse a (EnhancedSliderEvent a) sp ep]
blurHandle WidgetNode a (EnhancedSliderEvent a)
node Path
next EnhancedSliderCfg sp ep a
config

setFieldHandle
    :: (SliderValue a)
    => (EnhancedSliderCfg sp ep a)
    -> a
    -> a
    -> a
    -> [EventResponse a (EnhancedSliderEvent a) sp ep]
setFieldHandle :: forall a sp ep.
SliderValue a =>
EnhancedSliderCfg sp ep a
-> a -> a -> a -> [EventResponse a (EnhancedSliderEvent a) sp ep]
setFieldHandle EnhancedSliderCfg{[a -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Rational
Maybe Text
Maybe AlignH
Maybe AlignV
Maybe (a -> Text)
_escOnChangeReq :: forall s e a. EnhancedSliderCfg s e a -> [a -> WidgetRequest s e]
_escOnBlurReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escOnFocusReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escAlignV :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignV
_escAlignH :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignH
_escTitleMethod :: forall s e a. EnhancedSliderCfg s e a -> Maybe (a -> Text)
_escTitle :: forall s e a. EnhancedSliderCfg s e a -> Maybe Text
_escHideLabel :: forall s e a. EnhancedSliderCfg s e a -> Maybe Bool
_escDragRate :: forall s e a. EnhancedSliderCfg s e a -> Maybe Rational
_escOnChangeReq :: [a -> WidgetRequest sp ep]
_escOnBlurReq :: [Path -> WidgetRequest sp ep]
_escOnFocusReq :: [Path -> WidgetRequest sp ep]
_escAlignV :: Maybe AlignV
_escAlignH :: Maybe AlignH
_escTitleMethod :: Maybe (a -> Text)
_escTitle :: Maybe Text
_escHideLabel :: Maybe Bool
_escDragRate :: Maybe Rational
..} a
a a
b a
value = forall {e}. [EventResponse a e sp ep]
response where
    response :: [EventResponse a e sp ep]
response = [forall s e sp ep. s -> EventResponse s e sp ep
Model a
newValue] forall a. Semigroup a => a -> a -> a
<> forall {s} {e}. [EventResponse s e sp ep]
report
    report :: [EventResponse s e sp ep]
report = forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ a
newValue) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a -> WidgetRequest sp ep]
_escOnChangeReq)
    newValue :: a
newValue = forall a. Ord a => a -> a -> a
min a
b forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> a -> a
max a
a a
value

focusHandle
    :: WidgetNode s e
    -> Path
    -> EnhancedSliderCfg sp ep a
    -> [EventResponse a (EnhancedSliderEvent a) sp ep]
focusHandle :: forall s e sp ep a.
WidgetNode s e
-> Path
-> EnhancedSliderCfg sp ep a
-> [EventResponse a (EnhancedSliderEvent a) sp ep]
focusHandle WidgetNode s e
node Path
prev EnhancedSliderCfg{[a -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Rational
Maybe Text
Maybe AlignH
Maybe AlignV
Maybe (a -> Text)
_escOnChangeReq :: [a -> WidgetRequest sp ep]
_escOnBlurReq :: [Path -> WidgetRequest sp ep]
_escOnFocusReq :: [Path -> WidgetRequest sp ep]
_escAlignV :: Maybe AlignV
_escAlignH :: Maybe AlignH
_escTitleMethod :: Maybe (a -> Text)
_escTitle :: Maybe Text
_escHideLabel :: Maybe Bool
_escDragRate :: Maybe Rational
_escOnChangeReq :: forall s e a. EnhancedSliderCfg s e a -> [a -> WidgetRequest s e]
_escOnBlurReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escOnFocusReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escAlignV :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignV
_escAlignH :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignH
_escTitleMethod :: forall s e a. EnhancedSliderCfg s e a -> Maybe (a -> Text)
_escTitle :: forall s e a. EnhancedSliderCfg s e a -> Maybe Text
_escHideLabel :: forall s e a. EnhancedSliderCfg s e a -> Maybe Bool
_escDragRate :: forall s e a. EnhancedSliderCfg s e a -> Maybe Rational
..} = forall {s} {e}. [EventResponse s e sp ep]
response where
    response :: [EventResponse s e sp ep]
response = if Bool
valid
        then forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ Path
prev) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Path -> WidgetRequest sp ep]
_escOnFocusReq)
        else []
    valid :: Bool
valid = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall s e. WidgetNode s e -> Path -> Bool
isNodeParentOfPath WidgetNode s e
node Path
prev

blurHandle
    :: WidgetNode s e
    -> Path
    -> EnhancedSliderCfg sp ep a
    -> [EventResponse a (EnhancedSliderEvent a) sp ep]
blurHandle :: forall s e sp ep a.
WidgetNode s e
-> Path
-> EnhancedSliderCfg sp ep a
-> [EventResponse a (EnhancedSliderEvent a) sp ep]
blurHandle WidgetNode s e
node Path
next EnhancedSliderCfg{[a -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Rational
Maybe Text
Maybe AlignH
Maybe AlignV
Maybe (a -> Text)
_escOnChangeReq :: [a -> WidgetRequest sp ep]
_escOnBlurReq :: [Path -> WidgetRequest sp ep]
_escOnFocusReq :: [Path -> WidgetRequest sp ep]
_escAlignV :: Maybe AlignV
_escAlignH :: Maybe AlignH
_escTitleMethod :: Maybe (a -> Text)
_escTitle :: Maybe Text
_escHideLabel :: Maybe Bool
_escDragRate :: Maybe Rational
_escOnChangeReq :: forall s e a. EnhancedSliderCfg s e a -> [a -> WidgetRequest s e]
_escOnBlurReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escOnFocusReq :: forall s e a.
EnhancedSliderCfg s e a -> [Path -> WidgetRequest s e]
_escAlignV :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignV
_escAlignH :: forall s e a. EnhancedSliderCfg s e a -> Maybe AlignH
_escTitleMethod :: forall s e a. EnhancedSliderCfg s e a -> Maybe (a -> Text)
_escTitle :: forall s e a. EnhancedSliderCfg s e a -> Maybe Text
_escHideLabel :: forall s e a. EnhancedSliderCfg s e a -> Maybe Bool
_escDragRate :: forall s e a. EnhancedSliderCfg s e a -> Maybe Rational
..} = forall {s} {e}. [EventResponse s e sp ep]
response where
    response :: [EventResponse s e sp ep]
response = if Bool
valid
        then forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ Path
next) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Path -> WidgetRequest sp ep]
_escOnBlurReq)
        else []
    valid :: Bool
valid = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall s e. WidgetNode s e -> Path -> Bool
isNodeParentOfPath WidgetNode s e
node Path
next