module Taskell.UI.Draw.Modal.Due ( due ) where import ClassyPrelude import Brick import Taskell.Data.Seq ((<#>)) import qualified Taskell.Data.Task as T (Task) import Taskell.Types (Pointer) import Taskell.UI.Draw.Task (TaskWidget (..), parts) import Taskell.UI.Draw.Types (DSWidget, ModalWidget) import Taskell.UI.Theme (taskAttr, taskCurrentAttr) import Taskell.UI.Types (ResourceName (RNDue)) renderTask :: Int -> Int -> T.Task -> DSWidget renderTask :: Int -> Int -> Task -> DSWidget renderTask Int current Int position Task task = do (TaskWidget TWidget text TWidget date TWidget _ TWidget _) <- Task -> ReaderDrawState TaskWidget parts Task task let selected :: Bool selected = Int current Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int position let attr :: AttrName attr = if Bool selected then AttrName taskCurrentAttr else AttrName taskAttr let shw :: Widget n -> Widget n shw = if Bool selected then Widget n -> Widget n forall n. Widget n -> Widget n visible else Widget n -> Widget n forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a id TWidget -> DSWidget forall (f :: * -> *) a. Applicative f => a -> f a pure (TWidget -> DSWidget) -> (TWidget -> TWidget) -> TWidget -> DSWidget forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . TWidget -> TWidget forall n. Widget n -> Widget n shw (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . ResourceName -> TWidget -> TWidget forall n. Ord n => n -> Widget n -> Widget n cached (Int -> ResourceName RNDue Int position) (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Padding -> TWidget -> TWidget forall n. Padding -> Widget n -> Widget n padBottom (Int -> Padding Pad Int 1) (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . AttrName -> TWidget -> TWidget forall n. AttrName -> Widget n -> Widget n withAttr AttrName attr (TWidget -> DSWidget) -> TWidget -> DSWidget forall a b. (a -> b) -> a -> b $ [TWidget] -> TWidget forall n. [Widget n] -> Widget n vBox [TWidget date, TWidget text] due :: Seq (Pointer, T.Task) -> Int -> ModalWidget due :: Seq (Pointer, Task) -> Int -> ModalWidget due Seq (Pointer, Task) tasks Int selected = do let items :: Seq Task items = (Pointer, Task) -> Task forall a b. (a, b) -> b snd ((Pointer, Task) -> Task) -> Seq (Pointer, Task) -> Seq Task forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Seq (Pointer, Task) tasks Seq TWidget widgets <- Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget) forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) sequence (Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget)) -> Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget) forall a b. (a -> b) -> a -> b $ Int -> Int -> Task -> DSWidget renderTask Int selected (Int -> Task -> DSWidget) -> Seq Task -> Seq DSWidget forall a b. (Int -> a -> b) -> Seq a -> Seq b <#> Seq Task items (Text, TWidget) -> ModalWidget forall (f :: * -> *) a. Applicative f => a -> f a pure ( Text "Due Tasks" , if Seq Task -> Bool forall mono. MonoFoldable mono => mono -> Bool null Seq Task items then Text -> TWidget forall n. Text -> Widget n txt Text "No due tasks" else [TWidget] -> TWidget forall n. [Widget n] -> Widget n vBox ([TWidget] -> TWidget) -> [TWidget] -> TWidget forall a b. (a -> b) -> a -> b $ Seq TWidget -> [Element (Seq TWidget)] forall mono. MonoFoldable mono => mono -> [Element mono] toList Seq TWidget widgets)