diff --git a/client/Main.hs b/client/Main.hs index 286a223..58715dd 100644 --- a/client/Main.hs +++ b/client/Main.hs @@ -51,7 +51,11 @@ newClientState node = ClientState } clientDraw :: ClientState -> [Widget ResourceName] -clientDraw cs = [renderTree boxDrawingBranching (csEditor cs) (csTree cs)] +clientDraw cs = + [ renderTree boxDrawingBranching (csEditor cs) (csTree cs) <=> + txt "--------------------------------------------------------------------------------" <=> + txtWrap (T.pack $ show $ csTree cs) + ] isQuitEvent :: BrickEvent a b -> Bool isQuitEvent (VtyEvent (Vty.EvKey (Vty.KChar 'q') [])) = True diff --git a/src/Forest/Client/Node.hs b/src/Forest/Client/Node.hs index ff0dfb4..b43275f 100644 --- a/src/Forest/Client/Node.hs +++ b/src/Forest/Client/Node.hs @@ -34,7 +34,7 @@ narrowDrawState nodeId ds = ds nodeToWidget :: Bool -> Node -> Widget ResourceName nodeToWidget focused node = let nodeWidget = txt $ nodeText node - expandStyle = if null (nodeChildren node) then "noexpand" else "expand" + expandStyle = if hasChildren node then "expand" else "noexpand" focusStyle = if focused then "focus" else "nofocus" in withDefAttr focusStyle $ withDefAttr expandStyle nodeWidget diff --git a/src/Forest/Client/Tree.hs b/src/Forest/Client/Tree.hs index da89a0e..d1302b5 100644 --- a/src/Forest/Client/Tree.hs +++ b/src/Forest/Client/Tree.hs @@ -57,7 +57,12 @@ newTree node focused unfolded = Tree , treeUnfolded = safeUnfolded } where - safeUnfolded = Set.filter (isValidPath node) unfolded + isValidFold :: Node -> Path -> Bool + isValidFold n p = case applyPath p n of + Nothing -> False + Just childNode -> hasChildren childNode + + safeUnfolded = Set.filter (isValidFold node) unfolded safeFocused = findNearestFocus (applyFolds safeUnfolded node) focused -- | Switch out a tree's node, keeping as much of the focus and folding @@ -137,14 +142,13 @@ isCurrentFolded tree = not $ treeFocused tree `Set.member` treeUnfolded tree -- | Fold the currently focused node. Does nothing if it is already folded. foldCurrent :: Tree -> Tree -foldCurrent tree@Tree {treeFocused = f, treeUnfolded = u} = - let foldedTree = withFolds tree {treeUnfolded = Set.delete f u} - in foldedTree {treeNode = treeNode tree} +foldCurrent Tree{treeNode=n, treeFocused=f, treeUnfolded=u} = + newTree n f $ Set.delete f u -- | Unfold the currently focused node. Does nothing if it is already unfolded. unfoldCurrent :: Tree -> Tree -unfoldCurrent tree@Tree {treeFocused = f, treeUnfolded = u} = - tree {treeUnfolded = Set.insert f u} +unfoldCurrent Tree{treeNode=n, treeFocused=f, treeUnfolded=u} = + newTree n f $ Set.insert f u -- | Toggle whether the currently focused node is folded. toggleFold :: Tree -> Tree diff --git a/src/Forest/Node.hs b/src/Forest/Node.hs index dfb5d1d..ad5af71 100644 --- a/src/Forest/Node.hs +++ b/src/Forest/Node.hs @@ -7,6 +7,7 @@ module Forest.Node -- * Node NodeId , Node(..) + , hasChildren , emptyNode , initialNode , applyId @@ -55,6 +56,9 @@ instance ToJSON Node where instance FromJSON Node where parseJSON = genericParseJSON nodeOptions +hasChildren :: Node -> Bool +hasChildren = not . Map.null . nodeChildren + emptyNode :: T.Text -> Bool -> Bool -> Bool -> Bool -> Node emptyNode text edit delete reply act = Node text edit delete reply act Map.empty