{-# 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