{-|
This is a slider with a label, which shows current value, and
buttons to increase and decrease value.

@
enhancedSlider lens 0 100
@
-}

module Monomer.EnhancedSlider
    ( -- * Re-exported modules
      module Monomer.EnhancedSlider.EnhancedSliderCfg
      -- * Constructors
    , enhancedSlider
    , enhancedSlider_
    , enhancedSliderV
    , enhancedSliderV_
    , enhancedSliderD_
    ) where

import Control.Lens
import Data.Default
import Data.Typeable
import Monomer.Core.Combinators
import Monomer.Widgets.Composite
import Monomer.Widgets.Singles.Slider
import TextShow

import Monomer.EnhancedSlider.EnhancedSliderCfg
import Monomer.EnhancedSlider.EnhancedSliderEvent
import Monomer.EnhancedSlider.UI

{-|
Creates an enhanced slider using the given lens, providing minimum
and maximum values.
-}
enhancedSlider
    :: (WidgetModel s, WidgetEvent e, SliderValue a)
    => ALens' s a      -- ^ The lens into the model.
    -> a               -- ^ Minimum value.
    -> a               -- ^ Maximum value.
    -> WidgetNode s e  -- ^ The created enhanced slider.
enhancedSlider :: forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
ALens' s a -> a -> a -> WidgetNode s e
enhancedSlider ALens' s a
field a
a a
b = forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
ALens' s a -> a -> a -> [EnhancedSliderCfg s e a] -> WidgetNode s e
enhancedSlider_ ALens' s a
field a
a a
b forall a. Default a => a
def

{-|
Creates an enhanced slider using the given lens, providing minimum
and maximum values. Accepts config.
-}
enhancedSlider_
    :: (WidgetModel s, WidgetEvent e, SliderValue a)
    => ALens' s a                 -- ^ The lens into the model.
    -> a                          -- ^ Minimum value.
    -> a                          -- ^ Maximum value.
    -> [EnhancedSliderCfg s e a]  -- ^ The config options.
    -> WidgetNode s e             -- ^ The created enhanced slider.
enhancedSlider_ :: forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
ALens' s a -> a -> a -> [EnhancedSliderCfg s e a] -> WidgetNode s e
enhancedSlider_ ALens' s a
field a
a a
b [EnhancedSliderCfg s e a]
configs = WidgetNode s e
node where
    node :: WidgetNode s e
node = forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
WidgetData s a
-> a
-> a
-> [EnhancedSliderCfg s e a]
-> [CompositeCfg a (EnhancedSliderEvent a) s e]
-> WidgetNode s e
enhancedSliderD_ WidgetData s a
wlens a
a a
b [EnhancedSliderCfg s e a]
configs []
    wlens :: WidgetData s a
wlens = forall s a. ALens' s a -> WidgetData s a
WidgetLens ALens' s a
field

{-|
Creates an enhanced slider using the given value and 'onChange'
event handler, providing minimum and maximum values.
-}
enhancedSliderV
    :: (WidgetModel s, WidgetEvent e, SliderValue a)
    => a               -- ^ The current value.
    -> (a -> e)        -- ^ The event to raise on change.
    -> a               -- ^ Minimum value.
    -> a               -- ^ Maximum value.
    -> WidgetNode s e  -- ^ The created enhanced slider.
enhancedSliderV :: forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
a -> (a -> e) -> a -> a -> WidgetNode s e
enhancedSliderV a
v a -> e
handler a
a a
b = forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
a
-> (a -> e)
-> a
-> a
-> [EnhancedSliderCfg s e a]
-> WidgetNode s e
enhancedSliderV_ a
v a -> e
handler a
a a
b forall a. Default a => a
def

{-|
Creates an enhanced slider using the given value and 'onChange'
event handler, providing minimum and maximum values. Accepts config.
-}
enhancedSliderV_
    :: (WidgetModel s, WidgetEvent e, SliderValue a)
    => a                          -- ^ The current value.
    -> (a -> e)                   -- ^ The event to raise on change.
    -> a                          -- ^ Minimum value.
    -> a                          -- ^ Maximum value.
    -> [EnhancedSliderCfg s e a]  -- ^ The config options.
    -> WidgetNode s e             -- ^ The created enhanced slider.
enhancedSliderV_ :: forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
a
-> (a -> e)
-> a
-> a
-> [EnhancedSliderCfg s e a]
-> WidgetNode s e
enhancedSliderV_ a
v a -> e
handler a
a a
b [EnhancedSliderCfg s e a]
configs = WidgetNode s e
node where
    node :: WidgetNode s e
node = forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
WidgetData s a
-> a
-> a
-> [EnhancedSliderCfg s e a]
-> [CompositeCfg a (EnhancedSliderEvent a) s e]
-> WidgetNode s e
enhancedSliderD_ (forall s a. a -> WidgetData s a
WidgetValue a
v) a
a a
b [EnhancedSliderCfg s e a]
newConfigs []
    newConfigs :: [EnhancedSliderCfg s e a]
newConfigs = forall t a e. CmbOnChange t a e => (a -> e) -> t
onChange a -> e
handler forall a. a -> [a] -> [a]
: [EnhancedSliderCfg s e a]
configs

{-|
Creates an enhanced slider providing a 'WidgetData' instance,
minimum and maximum values and config.
-}
enhancedSliderD_
    :: (WidgetModel s, WidgetEvent e, SliderValue a)
    => WidgetData s a
    -- ^ The 'WidgetData' to retrieve the value from.
    -> a
    -- ^ Minimum value.
    -> a
    -- ^ Maximum value.
    -> [EnhancedSliderCfg s e a]
    -- ^ The config options.
    -> [CompositeCfg a (EnhancedSliderEvent a) s e]
    -- ^ The composite config options.
    -> WidgetNode s e
    -- ^ The created enhanced slider.
enhancedSliderD_ :: forall s e a.
(WidgetModel s, WidgetEvent e, SliderValue a) =>
WidgetData s a
-> a
-> a
-> [EnhancedSliderCfg s e a]
-> [CompositeCfg a (EnhancedSliderEvent a) s e]
-> WidgetNode s e
enhancedSliderD_ WidgetData s a
wdata a
a a
b [EnhancedSliderCfg s e a]
configs [CompositeCfg a (EnhancedSliderEvent a) s e]
cmpConfigs = WidgetNode s e
node where
    node :: WidgetNode s e
node = forall s e ep sp.
(CompositeModel s, CompositeEvent e, CompositeEvent ep,
 CompParentModel sp) =>
WidgetType
-> WidgetData sp s
-> UIBuilder s e
-> EventHandler s e sp ep
-> [CompositeCfg s e sp ep]
-> WidgetNode sp ep
compositeD_ WidgetType
wt WidgetData s a
wdata UIBuilder a (EnhancedSliderEvent a)
uiBuilder EventHandler a (EnhancedSliderEvent a) s e
eventHandler [CompositeCfg a (EnhancedSliderEvent a) s e]
cmpConfigs
    wt :: WidgetType
wt = Text -> WidgetType
WidgetType forall a b. (a -> b) -> a -> b
$ Text
"enhancedSlider-" forall a. Semigroup a => a -> a -> a
<> (forall a. TextShow a => a -> Text
showt forall a b. (a -> b) -> a -> b
$ forall a. Typeable a => a -> TypeRep
typeOf a
a)
    uiBuilder :: UIBuilder a (EnhancedSliderEvent a)
uiBuilder = forall a s e.
SliderValue a =>
EnhancedSliderCfg s e a
-> a -> a -> UIBuilder a (EnhancedSliderEvent a)
buildUI EnhancedSliderCfg s e a
config a
a a
b
    eventHandler :: EventHandler a (EnhancedSliderEvent a) s e
eventHandler = forall a sp ep.
SliderValue a =>
EnhancedSliderCfg sp ep a
-> a -> a -> EventHandler a (EnhancedSliderEvent a) sp ep
handleEvent EnhancedSliderCfg s e a
config a
a a
b
    config :: EnhancedSliderCfg s e a
config = forall a. Monoid a => [a] -> a
mconcat [EnhancedSliderCfg s e a]
configs