Implement client actions properly
This commit is contained in:
parent
5902421872
commit
70e3386cb5
2 changed files with 41 additions and 12 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
import Brick
|
import Brick
|
||||||
|
import Control.Monad.IO.Class
|
||||||
import Brick.BChan
|
import Brick.BChan
|
||||||
import Control.Exception
|
import Control.Exception
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
|
@ -55,20 +56,34 @@ upAction cs = continue cs{csTree = moveUp $ csTree cs}
|
||||||
downAction :: ClientState -> ClientM (Next ClientState)
|
downAction :: ClientState -> ClientM (Next ClientState)
|
||||||
downAction cs = continue cs{csTree = moveDown $ csTree cs}
|
downAction cs = continue cs{csTree = moveDown $ csTree cs}
|
||||||
|
|
||||||
|
withCurrent
|
||||||
|
:: (ClientState -> Node -> Path -> ClientM (Next ClientState))
|
||||||
|
-> ClientState
|
||||||
|
-> ClientM (Next ClientState)
|
||||||
|
withCurrent f cs = f cs (getCurrent tree) (getCurrentPath tree)
|
||||||
|
where
|
||||||
|
tree = csTree cs
|
||||||
|
|
||||||
editAction :: ClientState -> ClientM (Next ClientState)
|
editAction :: ClientState -> ClientM (Next ClientState)
|
||||||
editAction cs =
|
editAction = withCurrent $ \cs node _ -> do
|
||||||
let node = getCurrent $ csTree cs
|
let editor = editNode $ nodeText node
|
||||||
editor = editNode $ nodeText node
|
continue $ if nodeEdit node then cs{csEditor = Just editor} else cs
|
||||||
in continue cs{csEditor = Just editor}
|
|
||||||
|
|
||||||
deleteAction :: ClientState -> ClientM (Next ClientState)
|
deleteAction :: ClientState -> ClientM (Next ClientState)
|
||||||
deleteAction cs = continue cs -- TODO implement
|
deleteAction = withCurrent $ \cs node path -> do
|
||||||
|
when (nodeDelete node) $
|
||||||
|
liftIO $ sendPacket (csConn cs) $ ClientDelete path
|
||||||
|
continue cs
|
||||||
|
|
||||||
replyAction :: ClientState -> ClientM (Next ClientState)
|
replyAction :: ClientState -> ClientM (Next ClientState)
|
||||||
replyAction cs = continue cs{csEditor = Just replyToNode}
|
replyAction = withCurrent $ \cs node _ ->
|
||||||
|
continue $ if nodeReply node then cs{csEditor = Just replyToNode} else cs
|
||||||
|
|
||||||
actAction :: ClientState -> ClientM (Next ClientState)
|
actAction :: ClientState -> ClientM (Next ClientState)
|
||||||
actAction cs = continue cs -- TODO implement
|
actAction = withCurrent $ \cs node path -> do
|
||||||
|
when (nodeAct node) $
|
||||||
|
liftIO $ sendPacket (csConn cs) $ ClientAct path
|
||||||
|
continue cs
|
||||||
|
|
||||||
onKeyWithoutEditor :: ClientState -> Vty.Event -> EventM ResourceName (Next ClientState)
|
onKeyWithoutEditor :: ClientState -> Vty.Event -> EventM ResourceName (Next ClientState)
|
||||||
onKeyWithoutEditor cs (Vty.EvKey k _)
|
onKeyWithoutEditor cs (Vty.EvKey k _)
|
||||||
|
|
@ -81,14 +96,14 @@ onKeyWithoutEditor cs (Vty.EvKey k _)
|
||||||
| k `elem` replyKeys = replyAction cs
|
| k `elem` replyKeys = replyAction cs
|
||||||
| k `elem` actKeys = actAction cs
|
| k `elem` actKeys = actAction cs
|
||||||
where
|
where
|
||||||
quitKeys = [Vty.KEsc, Vty.KChar 'q']
|
quitKeys = [Vty.KChar 'q', Vty.KEsc]
|
||||||
foldKeys = [Vty.KChar '\t']
|
foldKeys = [Vty.KChar '\t']
|
||||||
upKeys = [Vty.KUp, Vty.KChar 'k']
|
upKeys = [Vty.KChar 'k', Vty.KUp]
|
||||||
downKeys = [Vty.KDown, Vty.KChar 'j']
|
downKeys = [Vty.KChar 'j', Vty.KDown]
|
||||||
editKeys = [Vty.KChar 'e']
|
editKeys = [Vty.KChar 'e']
|
||||||
deleteKeys = [Vty.KChar 'e']
|
deleteKeys = [Vty.KChar 'd']
|
||||||
replyKeys = [Vty.KChar 'r']
|
replyKeys = [Vty.KChar 'r']
|
||||||
actKeys = [Vty.KEnter, Vty.KChar 'a']
|
actKeys = [Vty.KChar 'a', Vty.KChar ' ', Vty.KEnter]
|
||||||
onKeyWithoutEditor cs _ = continue cs
|
onKeyWithoutEditor cs _ = continue cs
|
||||||
|
|
||||||
{- Actions in edit mode -}
|
{- Actions in edit mode -}
|
||||||
|
|
@ -98,7 +113,16 @@ updateEditor ed cs ev = do
|
||||||
newEd <- handleNodeEditorEvent ev ed
|
newEd <- handleNodeEditorEvent ev ed
|
||||||
continue cs{csEditor = Just newEd}
|
continue cs{csEditor = Just newEd}
|
||||||
|
|
||||||
|
finishEditing :: NodeEditor -> ClientState -> ClientM (Next ClientState)
|
||||||
|
finishEditing ed = withCurrent $ \cs _ path -> do
|
||||||
|
let text = T.intercalate "\n" $ getCurrentText ed
|
||||||
|
liftIO $ sendPacket (csConn cs) $
|
||||||
|
if asReply ed then ClientReply path text else ClientEdit path text
|
||||||
|
continue cs{csEditor = Nothing}
|
||||||
|
|
||||||
onKeyWithEditor :: NodeEditor -> ClientState -> Vty.Event -> ClientM (Next ClientState)
|
onKeyWithEditor :: NodeEditor -> ClientState -> Vty.Event -> ClientM (Next ClientState)
|
||||||
|
-- Finish editing normally
|
||||||
|
onKeyWithEditor ed cs (Vty.EvKey Vty.KEnter _) = finishEditing ed cs
|
||||||
-- Abort editing with Escape
|
-- Abort editing with Escape
|
||||||
onKeyWithEditor _ cs (Vty.EvKey Vty.KEsc _) = continue cs{csEditor = Nothing}
|
onKeyWithEditor _ cs (Vty.EvKey Vty.KEsc _) = continue cs{csEditor = Nothing}
|
||||||
-- Insert a newline on C-n
|
-- Insert a newline on C-n
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ module Forest.Client.Tree
|
||||||
, renderTree
|
, renderTree
|
||||||
-- * Focused element
|
-- * Focused element
|
||||||
, getCurrent
|
, getCurrent
|
||||||
|
, getCurrentPath
|
||||||
, moveUp
|
, moveUp
|
||||||
, moveDown
|
, moveDown
|
||||||
-- * Folding
|
-- * Folding
|
||||||
|
|
@ -85,6 +86,10 @@ getCurrent :: Tree -> Node
|
||||||
-- We rely on the invariant that the focused node always exists
|
-- We rely on the invariant that the focused node always exists
|
||||||
getCurrent tree = fromJust $ applyPath (treeFocused tree) (treeNode tree)
|
getCurrent tree = fromJust $ applyPath (treeFocused tree) (treeNode tree)
|
||||||
|
|
||||||
|
-- | Get the path of the currently focused node.
|
||||||
|
getCurrentPath :: Tree -> Path
|
||||||
|
getCurrentPath = treeFocused
|
||||||
|
|
||||||
flatten :: Node -> [Path]
|
flatten :: Node -> [Path]
|
||||||
flatten node =
|
flatten node =
|
||||||
let flattenedChildren =
|
let flattenedChildren =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue