Move editing related controls to new behavior

This commit is contained in:
Joscha 2018-09-28 17:48:08 +00:00
parent 70c11f656d
commit 11ef930835
2 changed files with 50 additions and 30 deletions

View file

@ -7,15 +7,12 @@ module TaskMachine.UI
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 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

View file

@ -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}