From 11ef9308357b1457e87f25e522b6cd1a8d943db4 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 28 Sep 2018 17:48:08 +0000 Subject: [PATCH] Move editing related controls to new behavior --- src/TaskMachine/UI.hs | 37 ++++---------------- src/TaskMachine/UI/Behaviors/TaskEdit.hs | 43 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 src/TaskMachine/UI/Behaviors/TaskEdit.hs diff --git a/src/TaskMachine/UI.hs b/src/TaskMachine/UI.hs index 0cb729e..e205469 100644 --- a/src/TaskMachine/UI.hs +++ b/src/TaskMachine/UI.hs @@ -4,18 +4,15 @@ module TaskMachine.UI , loadTasks ) where -import qualified Brick as B -import qualified Brick.Focus as B -import qualified Brick.Themes as B -import qualified Brick.Widgets.Edit as B -import qualified Data.Text.Zipper as T -import qualified Data.Vector as V -import qualified Graphics.Vty.Input.Events as VTY -import Text.Megaparsec +import qualified Brick as B +import qualified Brick.Focus as B +import qualified Brick.Themes as B +import qualified Data.Vector as V +import qualified Graphics.Vty.Input.Events as VTY import TaskMachine.LTask import TaskMachine.Options -import TaskMachine.Task +import TaskMachine.UI.Behaviors.TaskEdit import TaskMachine.UI.Popup import TaskMachine.UI.TaskList import TaskMachine.UI.Types @@ -70,32 +67,12 @@ taskListBehavior s (VTY.EvKey (VTY.KChar 'x') []) = undefined s -- Delete tasks taskListBehavior s (VTY.EvKey (VTY.KChar 'd') []) = undefined s -- Start editing a new task -taskListBehavior s (VTY.EvKey (VTY.KChar 'e') []) = - case taskListSelectedElement (tasks s) of - Nothing -> B.continue s -- TODO: Add notification popup - Just t -> - let edit = B.editor RTaskEdit (Just 1) (formatTask t) - in B.continue s{taskEdit=Just edit} +taskListBehavior s (VTY.EvKey (VTY.KChar 'e') []) = B.continue (startEdit s) -- Update the task list (scroll etc.) taskListBehavior s e = do newTasks <- updateTaskList e (tasks s) B.continue s{tasks=newTasks} -taskEditBehavior :: B.Editor String RName -> UIState -> VTY.Event -> NewState -taskEditBehavior _ s (VTY.EvKey VTY.KEsc []) = B.continue s{taskEdit=Nothing} -taskEditBehavior edit s (VTY.EvKey VTY.KHome []) = B.continue s{taskEdit=Just (B.applyEdit T.gotoBOL edit)} -taskEditBehavior edit s (VTY.EvKey VTY.KEnd []) = B.continue s{taskEdit=Just (B.applyEdit T.gotoEOL edit)} -taskEditBehavior edit s (VTY.EvKey VTY.KEnter []) = do -- TODO: Save changes to file - let editedText = unlines $ B.getEditContents edit - case parse pTask "edited task" editedText of - Left parseError -> undefined parseError -- TODO: Add notification here - Right newTask -> do - let newTaskList = taskListModify (const newTask) (tasks s) - B.continue s{tasks=newTaskList, taskEdit=Nothing} -taskEditBehavior edit s e = do - newEdit <- B.handleEditorEvent e edit - B.continue s{taskEdit=Just newEdit} - selectBehavior :: UIState -> VTY.Event -> NewState -- Deal with popup if there is one selectBehavior s@UIState{errorPopup=Just popup} e = undefined popup s e diff --git a/src/TaskMachine/UI/Behaviors/TaskEdit.hs b/src/TaskMachine/UI/Behaviors/TaskEdit.hs new file mode 100644 index 0000000..b529c63 --- /dev/null +++ b/src/TaskMachine/UI/Behaviors/TaskEdit.hs @@ -0,0 +1,43 @@ +module TaskMachine.UI.Behaviors.TaskEdit + ( startEdit + , taskEditBehavior + ) where + +import qualified Brick as B +import qualified Brick.Widgets.Edit as B +import qualified Data.Text.Zipper as T +import qualified Graphics.Vty as VTY +import Text.Megaparsec + +import TaskMachine.Task +import TaskMachine.UI.TaskList +import TaskMachine.UI.Types + +startEdit :: UIState -> UIState +startEdit s = + case taskListSelectedElement (tasks s) of + Nothing -> undefined -- TODO: Add popup notification + Just t -> + let edit = B.editor RTaskEdit (Just 1) (formatTask t) + in s{taskEdit=Just edit} + +finishEdit :: B.Editor String RName -> UIState -> UIState +finishEdit edit s = + let editedText = unlines $ B.getEditContents edit + in case parse pTask "edited task" editedText of + Left parseError -> undefined parseError -- TODO: Add popup notification + Right newTask -> + let newTaskList = taskListModify (const newTask) (tasks s) + in s{tasks=newTaskList, taskEdit=Nothing} + +taskEditBehavior :: B.Editor String RName -> UIState -> VTY.Event -> NewState +taskEditBehavior _ s (VTY.EvKey VTY.KEsc []) = B.continue s{taskEdit=Nothing} +taskEditBehavior edit s (VTY.EvKey VTY.KHome []) = B.continue s{taskEdit=Just (B.applyEdit T.gotoBOL edit)} +taskEditBehavior edit s (VTY.EvKey VTY.KEnd []) = B.continue s{taskEdit=Just (B.applyEdit T.gotoEOL edit)} +taskEditBehavior edit s (VTY.EvKey VTY.KEnter []) = do + let newState = finishEdit edit s + -- TODO: Save changes to file + B.continue newState +taskEditBehavior edit s e = do + newEdit <- B.handleEditorEvent e edit + B.continue s{taskEdit=Just newEdit}