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 as B
import qualified Brick.Focus as B import qualified Brick.Focus as B
import qualified Brick.Themes 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 Data.Vector as V
import qualified Graphics.Vty.Input.Events as VTY import qualified Graphics.Vty.Input.Events as VTY
import Text.Megaparsec
import TaskMachine.LTask import TaskMachine.LTask
import TaskMachine.Options import TaskMachine.Options
import TaskMachine.Task import TaskMachine.UI.Behaviors.TaskEdit
import TaskMachine.UI.Popup import TaskMachine.UI.Popup
import TaskMachine.UI.TaskList import TaskMachine.UI.TaskList
import TaskMachine.UI.Types import TaskMachine.UI.Types
@ -70,32 +67,12 @@ taskListBehavior s (VTY.EvKey (VTY.KChar 'x') []) = undefined s
-- Delete tasks -- Delete tasks
taskListBehavior s (VTY.EvKey (VTY.KChar 'd') []) = undefined s taskListBehavior s (VTY.EvKey (VTY.KChar 'd') []) = undefined s
-- Start editing a new task -- Start editing a new task
taskListBehavior s (VTY.EvKey (VTY.KChar 'e') []) = taskListBehavior s (VTY.EvKey (VTY.KChar 'e') []) = B.continue (startEdit s)
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}
-- Update the task list (scroll etc.) -- Update the task list (scroll etc.)
taskListBehavior s e = do taskListBehavior s e = do
newTasks <- updateTaskList e (tasks s) newTasks <- updateTaskList e (tasks s)
B.continue s{tasks=newTasks} 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 selectBehavior :: UIState -> VTY.Event -> NewState
-- Deal with popup if there is one -- Deal with popup if there is one
selectBehavior s@UIState{errorPopup=Just popup} e = undefined popup s e 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}