{-# LANGUAGE RecordWildCards #-}

module Monomer.SaveManager.UI
    ( buildUI
    ) where

import Data.Maybe
import Data.Typeable
import Monomer.Core.Combinators
import Monomer.Main.UserUtil
import Monomer.Widgets.Composite
import Monomer.Widgets.Containers.Confirm
import Monomer.Widgets.Containers.Grid
import Monomer.Widgets.Containers.SelectList
import Monomer.Widgets.Containers.Stack
import Monomer.Widgets.Containers.ZStack
import Monomer.Widgets.Singles.Button
import Monomer.Widgets.Singles.Label
import qualified Data.Sequence as Seq

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

buildUI
    :: (Typeable a, Eq a)
    => (SaveManagerCfg s e a)
    -> UIBuilder (SaveManagerModel a) (SaveManagerEvent a)
buildUI :: forall a s e.
(Typeable a, Eq a) =>
SaveManagerCfg s e a
-> UIBuilder (SaveManagerModel a) (SaveManagerEvent a)
buildUI SaveManagerCfg{[a -> WidgetRequest s e]
[Path -> WidgetRequest s e]
[Saves a -> WidgetRequest s e]
Maybe Bool
Maybe (a -> ZonedTime -> Text)
_smcNoConfirm :: forall s e a. SaveManagerCfg s e a -> Maybe Bool
_smcCaptionMethod :: forall s e a.
SaveManagerCfg s e a -> Maybe (a -> ZonedTime -> Text)
_smcOnSavesChangeReq :: forall s e a.
SaveManagerCfg s e a -> [Saves a -> WidgetRequest s e]
_smcOnChangeReq :: forall s e a. SaveManagerCfg s e a -> [a -> WidgetRequest s e]
_smcOnBlurReq :: forall s e a. SaveManagerCfg s e a -> [Path -> WidgetRequest s e]
_smcOnFocusReq :: forall s e a. SaveManagerCfg s e a -> [Path -> WidgetRequest s e]
_smcNoConfirm :: Maybe Bool
_smcCaptionMethod :: Maybe (a -> ZonedTime -> Text)
_smcOnSavesChangeReq :: [Saves a -> WidgetRequest s e]
_smcOnChangeReq :: [a -> WidgetRequest s e]
_smcOnBlurReq :: [Path -> WidgetRequest s e]
_smcOnFocusReq :: [Path -> WidgetRequest s e]
..} WidgetEnv (SaveManagerModel a) (SaveManagerEvent a)
_ SaveManagerModel{a
Bool
Maybe Int
Saves a
_smmShowConfirmRemove :: forall a. SaveManagerModel a -> Bool
_smmSelectedData :: forall a. SaveManagerModel a -> Maybe Int
_smmCurrentData :: forall a. SaveManagerModel a -> a
_smmSavedData :: forall a. SaveManagerModel a -> Seq (a, Text)
_smmShowConfirmRemove :: Bool
_smmSelectedData :: Maybe Int
_smmCurrentData :: a
_smmSavedData :: Saves a
..} = WidgetNode (SaveManagerModel a) (SaveManagerEvent a)
widgetTree where
    widgetTree :: WidgetNode (SaveManagerModel a) (SaveManagerEvent a)
widgetTree = forall (t :: * -> *) s e.
Traversable t =>
t (WidgetNode s e) -> WidgetNode s e
zstack
        [ WidgetNode (SaveManagerModel a) (SaveManagerEvent a)
mainTree
        , forall s e. Bool -> WidgetNode s e -> WidgetNode s e
widgetIf Bool
_smmShowConfirmRemove forall a b. (a -> b) -> a -> b
$
            forall s e.
(CompositeModel s, WidgetEvent e) =>
Text -> e -> e -> [ConfirmCfg] -> WidgetNode s e
confirmMsg_ Text
"Are you sure?" forall a. SaveManagerEvent a
EventRemove forall a. SaveManagerEvent a
EventCancel
                [forall t. CmbAcceptCaption t => Text -> t
acceptCaption Text
"Remove"]
        ]
    mainTree :: WidgetNode (SaveManagerModel a) (SaveManagerEvent a)
mainTree = forall (t :: * -> *) s e.
Traversable t =>
[StackCfg] -> t (WidgetNode s e) -> WidgetNode s e
vstack_ [forall t. CmbChildSpacing t => Double -> t
childSpacing_ Double
16]
        [ forall (t :: * -> *) s e.
Traversable t =>
[GridCfg] -> t (WidgetNode s e) -> WidgetNode s e
hgrid_ [forall t. CmbChildSpacing t => Double -> t
childSpacing_ Double
16]
            [ forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
button' Text
"New slot" forall a. SaveManagerEvent a
EventNewSlot
            , forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
buttonIfSelected Text
"Save" forall a. SaveManagerEvent a
EventSave
            , forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
buttonIfSelected Text
"Load" forall a. SaveManagerEvent a
EventLoad
            , if Maybe Bool
_smcNoConfirm forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just Bool
True
                then forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
buttonIfSelected Text
"Remove" forall a. SaveManagerEvent a
EventRemove
                else forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
buttonIfSelected Text
"Remove" forall a. SaveManagerEvent a
EventConfirmRemove
            ]
        , forall s e (t :: * -> *) a.
(WidgetModel s, WidgetEvent e, Traversable t, SelectListItem a) =>
a
-> (Int -> a -> e)
-> t a
-> SelectListMakeRow s e a
-> [SelectListCfg s e a]
-> WidgetNode s e
selectListV_ Maybe Text
selectedCaption forall {p} {a}. Int -> p -> SaveManagerEvent a
f Seq (Maybe Text)
savedDataList forall {s} {e}. Maybe Text -> WidgetNode s e
makeRow
            [ forall t e a. CmbOnFocus t e a => (a -> e) -> t
onFocus forall a. Path -> SaveManagerEvent a
EventFocus
            , forall t e a. CmbOnBlur t e a => (a -> e) -> t
onBlur forall a. Path -> SaveManagerEvent a
EventBlur
            ]
        ]
    buttonIfSelected :: Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
buttonIfSelected Text
c SaveManagerEvent a
e = forall {a} {s}.
Typeable a =>
Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
button' Text
c SaveManagerEvent a
e forall s e. WidgetNode s e -> Bool -> WidgetNode s e
`nodeEnabled` Bool
selected
    button' :: Text -> SaveManagerEvent a -> WidgetNode s (SaveManagerEvent a)
button' Text
c SaveManagerEvent a
e = forall e s.
WidgetEvent e =>
Text -> e -> [ButtonCfg s e] -> WidgetNode s e
button_ Text
c SaveManagerEvent a
e
        [ forall t e a. CmbOnFocus t e a => (a -> e) -> t
onFocus forall a. Path -> SaveManagerEvent a
EventFocus
        , forall t e a. CmbOnBlur t e a => (a -> e) -> t
onBlur forall a. Path -> SaveManagerEvent a
EventBlur
        ]
    selected :: Bool
selected = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe Int
_smmSelectedData
    selectedCaption :: Maybe Text
selectedCaption = Maybe Int
_smmSelectedData forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. Seq a -> Int -> a
Seq.index Seq (Maybe Text)
savedDataList
    f :: Int -> p -> SaveManagerEvent a
f Int
i p
_ = forall a. Maybe Int -> SaveManagerEvent a
EventSetSelectedData forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Int
i
    savedDataList :: Seq (Maybe Text)
savedDataList = forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Saves a
_smmSavedData
    makeRow :: Maybe Text -> WidgetNode s e
makeRow = forall s e. Text -> WidgetNode s e
label forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust