Prevent unfolding of nodes without children

This commit is contained in:
Joscha 2020-02-09 11:44:25 +00:00
parent 909d587c53
commit 573a835022
4 changed files with 20 additions and 8 deletions

View file

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

View file

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