Load and save tasks

This commit includes new popups and proper error messages.
This commit is contained in:
Joscha 2018-09-30 17:35:57 +00:00
parent 9fc57bd056
commit cad2f5741f
8 changed files with 152 additions and 65 deletions

View file

@ -1,16 +1,18 @@
module TaskMachine.UI
( myApp
, startUIState
, loadTasks
) where
import qualified Brick as B
import qualified Brick.Themes as B
import Control.Monad.Trans
import qualified Data.Vector as V
import qualified Graphics.Vty.Input.Events as VTY
import TaskMachine.Options
import TaskMachine.UI.Behaviors
import TaskMachine.UI.Popup
import TaskMachine.UI.Stuff
import TaskMachine.UI.TaskList
import TaskMachine.UI.Types
@ -20,7 +22,7 @@ drawTaskList :: UIState -> B.Widget RName
drawTaskList s = renderTaskList (taskEdit s) True (tasks s)
drawUIState :: UIState -> [B.Widget RName]
--drawUIState s@UIState{errorPopup=Just p} = [renderPopupOk p, drawTaskList s]
drawUIState s@UIState{errorPopup=Just p} = [renderPopup p, drawTaskList s]
drawUIState s = [drawTaskList s]
{- Updating the state -}
@ -30,9 +32,19 @@ closeBehavior _ s (VTY.EvKey VTY.KEsc []) = B.halt s
closeBehavior _ s (VTY.EvKey (VTY.KChar 'q') []) = B.halt s
closeBehavior f s e = f s e -- wrapper around another behavior
popupBehavior :: Popup RName (UIState -> NewState) -> UIState -> VTY.Event -> NewState
popupBehavior p s (VTY.EvKey VTY.KEnter []) =
case popupSelection p of
Nothing -> B.continue s{errorPopup=Nothing}
Just action -> do
action s{errorPopup=Nothing}
popupBehavior p s e = do
newPopup <- handlePopupEvent e p
B.continue s{errorPopup=Just newPopup}
selectBehavior :: UIState -> VTY.Event -> NewState
-- Deal with popup if there is one
--selectBehavior s@UIState{errorPopup=Just popup} e = undefined popup s e
selectBehavior s@UIState{errorPopup=Just p} e = popupBehavior p s e
-- Under the assumption that tasks can only be edited while the task list is focused, edit a task
selectBehavior s@UIState{taskEdit=Just edit} e = taskEditBehavior edit s e
-- If nothing immediately jumps out at you, see which part has focus.
@ -44,19 +56,22 @@ updateUIState s _ = B.continue s
{- Starting the app -}
startEvent :: UIState -> B.EventM RName UIState
startEvent = liftIO . loadTasks
myApp :: B.App UIState () RName
myApp = B.App
{ B.appDraw = drawUIState
, B.appChooseCursor = B.showFirstCursor
, B.appHandleEvent = updateUIState
, B.appStartEvent = pure
, B.appStartEvent = startEvent
, B.appAttrMap = const (B.themeToAttrMap defaultTheme)
}
startUIState :: Options -> UIState
startUIState o = UIState
{ options = o
--, errorPopup = Nothing
, tasks = taskList RTaskList V.empty
, taskEdit = Nothing
{ options = o
, errorPopup = Nothing
, tasks = taskList RTaskList V.empty
, taskEdit = Nothing
}