svitak/app/State.hs

55 lines
1.3 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module State where
import Control.Concurrent.Async (Async)
import qualified Data.Text as T
import EpubParser (EpubEnv, getChapterTitle)
import Text.HTML.TagSoup (Tag, renderTags)
data ChapterView = ChapterView
{ viewTitle :: T.Text,
viewHtml :: T.Text,
viewIdx :: Int
}
data AppState = AppState
{ cEnv :: EpubEnv,
cIdx :: Int,
zoomlvl :: Double,
cSpine :: [FilePath],
bTitle :: T.Text,
cAllChapters :: [[Tag T.Text]],
activeTask :: Maybe (Async ()),
taskVersion :: Integer,
cTags :: Maybe [Tag T.Text]
}
-- loading template
initialState :: EpubEnv -> AppState
initialState env =
AppState
{ cEnv = env,
cIdx = 0,
cTags = Nothing,
cSpine = [],
bTitle = "Svitak - Loading...",
zoomlvl = 1.0,
activeTask = Nothing,
cAllChapters = [],
taskVersion = 0
}
-- prepare the data for the UI
prepareView :: AppState -> Int -> Maybe ChapterView
prepareView st index
| null (cAllChapters st) = Nothing
| index < 0 || index >= length (cAllChapters st) = Nothing
| otherwise =
let tags = cAllChapters st !! index
in Just $
ChapterView
{ viewTitle = bTitle st <> " - " <> getChapterTitle tags,
viewHtml = renderTags tags,
viewIdx = index
}