{-|
This is a composite which consists of 'selectList' and buttons:

- New slot
- Save
- Load
- Remove

@
saveManager field
@
-}

module Monomer.SaveManager
    ( -- * Re-exported modules
      module Monomer.SaveManager.SaveManagerModel
    , module Monomer.SaveManager.SaveManagerCfg
      -- * Configuration
    , SaveManagerEvent
      -- * Constructors
    , saveManager
    , saveManager_
    , saveManagerV
    , saveManagerV_
    , saveManagerD_
    ) where

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

import Monomer.SaveManager.SaveManagerCfg
import Monomer.SaveManager.SaveManagerEvent
import Monomer.SaveManager.SaveManagerModel
import Monomer.SaveManager.UI

{-|
Creates a save manager using the given lens.
-}
saveManager
    :: (WidgetModel s, WidgetEvent e, Eq a, Typeable a)
    => ALens' s (SaveManagerModel a)  -- ^ The lens into the model.
    -> WidgetNode s e                 -- ^ The created save manager.
saveManager :: forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
ALens' s (SaveManagerModel a) -> WidgetNode s e
saveManager ALens' s (SaveManagerModel a)
field = forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
ALens' s (SaveManagerModel a)
-> [SaveManagerCfg s e a] -> WidgetNode s e
saveManager_ ALens' s (SaveManagerModel a)
field forall a. Default a => a
def

{-|
Creates a save manager using the given lens. Accepts config.
-}
saveManager_
    :: (WidgetModel s, WidgetEvent e, Eq a, Typeable a)
    => ALens' s (SaveManagerModel a)  -- ^ The lens into the model.
    -> [SaveManagerCfg s e a]         -- ^ The config options.
    -> WidgetNode s e                 -- ^ The created save manager.
saveManager_ :: forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
ALens' s (SaveManagerModel a)
-> [SaveManagerCfg s e a] -> WidgetNode s e
saveManager_ ALens' s (SaveManagerModel a)
field [SaveManagerCfg s e a]
configs = forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
WidgetData s (SaveManagerModel a)
-> [SaveManagerCfg s e a]
-> [CompositeCfg (SaveManagerModel a) (SaveManagerEvent a) s e]
-> WidgetNode s e
saveManagerD_ WidgetData s (SaveManagerModel a)
wlens [SaveManagerCfg s e a]
configs [] where
    wlens :: WidgetData s (SaveManagerModel a)
wlens = forall s a. ALens' s a -> WidgetData s a
WidgetLens ALens' s (SaveManagerModel a)
field

{-|
Creates a save manager using the given composite model and
'onChange' event handler.
-}
saveManagerV
    :: (WidgetModel s, WidgetEvent e, Eq a, Typeable a)
    => SaveManagerModel a  -- ^ The composite model.
    -> (a -> e)            -- ^ The event to raise on change.
    -> WidgetNode s e      -- ^ The created save manager.
saveManagerV :: forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
SaveManagerModel a -> (a -> e) -> WidgetNode s e
saveManagerV SaveManagerModel a
value a -> e
handler = forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
SaveManagerModel a
-> (a -> e) -> [SaveManagerCfg s e a] -> WidgetNode s e
saveManagerV_ SaveManagerModel a
value a -> e
handler forall a. Default a => a
def

{-|
Creates a save manager using the given composite model and
'onChange' event handler. Accepts config.
-}
saveManagerV_
    :: (WidgetModel s, WidgetEvent e, Eq a, Typeable a)
    => SaveManagerModel a      -- ^ The composite model.
    -> (a -> e)                -- ^ The event to raise on change.
    -> [SaveManagerCfg s e a]  -- ^ The config options.
    -> WidgetNode s e          -- ^ The created save manager.
saveManagerV_ :: forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
SaveManagerModel a
-> (a -> e) -> [SaveManagerCfg s e a] -> WidgetNode s e
saveManagerV_ SaveManagerModel a
value a -> e
handler [SaveManagerCfg s e a]
configs = WidgetNode s e
node where
    node :: WidgetNode s e
node = forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
WidgetData s (SaveManagerModel a)
-> [SaveManagerCfg s e a]
-> [CompositeCfg (SaveManagerModel a) (SaveManagerEvent a) s e]
-> WidgetNode s e
saveManagerD_ forall {s}. WidgetData s (SaveManagerModel a)
wdata [SaveManagerCfg s e a]
newConfigs []
    wdata :: WidgetData s (SaveManagerModel a)
wdata = forall s a. a -> WidgetData s a
WidgetValue SaveManagerModel a
value
    newConfigs :: [SaveManagerCfg s e a]
newConfigs = forall t a e. CmbOnChange t a e => (a -> e) -> t
onChange a -> e
handler forall a. a -> [a] -> [a]
: [SaveManagerCfg s e a]
configs

{-|
Creates a save manager providing a 'WidgetData' instance and config.
-}
saveManagerD_
    :: (WidgetModel s, WidgetEvent e, Eq a, Typeable a)
    => WidgetData s (SaveManagerModel a)
    -- ^ The 'WidgetData' to retrieve the model from.
    -> [SaveManagerCfg s e a]
    -- ^ The config options.
    -> [CompositeCfg (SaveManagerModel a) (SaveManagerEvent a) s e]
    -- ^ The composite config options.
    -> WidgetNode s e
    -- ^ The created save manager.
saveManagerD_ :: forall s e a.
(WidgetModel s, WidgetEvent e, Eq a, Typeable a) =>
WidgetData s (SaveManagerModel a)
-> [SaveManagerCfg s e a]
-> [CompositeCfg (SaveManagerModel a) (SaveManagerEvent a) s e]
-> WidgetNode s e
saveManagerD_ WidgetData s (SaveManagerModel a)
wdata [SaveManagerCfg s e a]
configs [CompositeCfg (SaveManagerModel a) (SaveManagerEvent 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 (SaveManagerModel a)
wdata UIBuilder (SaveManagerModel a) (SaveManagerEvent a)
uiBuilder EventHandler (SaveManagerModel a) (SaveManagerEvent a) s e
eventHandler [CompositeCfg (SaveManagerModel a) (SaveManagerEvent a) s e]
cmpConfigs
    wt :: WidgetType
wt = WidgetType
"saveManager"
    uiBuilder :: UIBuilder (SaveManagerModel a) (SaveManagerEvent a)
uiBuilder = forall a s e.
(Typeable a, Eq a) =>
SaveManagerCfg s e a
-> UIBuilder (SaveManagerModel a) (SaveManagerEvent a)
buildUI SaveManagerCfg s e a
config
    eventHandler :: EventHandler (SaveManagerModel a) (SaveManagerEvent a) s e
eventHandler = forall sp ep a.
SaveManagerCfg sp ep a
-> EventHandler (SaveManagerModel a) (SaveManagerEvent a) sp ep
handleEvent SaveManagerCfg s e a
config
    config :: SaveManagerCfg s e a
config = forall a. Monoid a => [a] -> a
mconcat [SaveManagerCfg s e a]
configs