55 lines
1.3 KiB
Haskell
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
|
|
}
|