content: {-|
  Module      : Tutorial01_Basics
  Copyright   : (c) 2018 Francisco Vallarino
  License     : BSD-3-Clause (see the LICENSE file)
  Maintainer  : fjvallarino@gmail.com
  Stability   : experimental
  Portability : non-portable
  
  Main module for the '01 - Basics' tutorial.
  -}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TemplateHaskell #-}
  
  module Tutorial01_Basics where
  
  import Control.Lens
  import Data.Text (Text)
  import Monomer
  import TextShow
  
  import qualified Monomer.Lens as L
  
  newtype AppModel = AppModel {
    _clickCount :: Int
  } deriving (Eq, Show)
  
  data AppEvent
    = AppInit
    | AppIncrease
    deriving (Eq, Show)
  
  makeLenses 'AppModel
  
  buildUI
    :: WidgetEnv AppModel AppEvent
    -> AppModel
    -> WidgetNode AppModel AppEvent
  buildUI wenv model = widgetTree where
    widgetTree = vstack [
        label "Hello world",
        spacer,
        hstack [
          label $ "Click count: " <> showt (model ^. clickCount),
          spacer,
          button "Increase count" AppIncrease
        ]
      ] `styleBasic` [padding 10]
  
  handleEvent
    :: WidgetEnv AppModel AppEvent
    -> WidgetNode AppModel AppEvent
    -> AppModel
    -> AppEvent
    -> [AppEventResponse AppModel AppEvent]
  handleEvent wenv node model evt = case evt of
    AppInit -> []
    AppIncrease -> [Model (model & clickCount +~ 1)]
  
  main01 :: IO ()
  main01 = do
    startApp model handleEvent buildUI config
    where
      config = [
        appWindowTitle "Tutorial 01 - Basics",
        appWindowIcon "./assets/images/icon.png",
        appTheme darkTheme,
        appFontDef "Regular" "./assets/fonts/Roboto-Regular.ttf",
        appInitEvent AppInit
        ]
      model = AppModel 0
  