diff options
author | Koni Marti <koni.marti@gmail.com> | 2023-11-27 17:49:02 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-12-01 17:17:22 +0100 |
commit | feafc433f08761290831e44fccf023badb5588aa (patch) | |
tree | 2cfb16dd64f4ee4d3b5f3d2cc6cadc2094d74cf3 /app/dirtree.go | |
parent | 0be135a38186725e6414cb7c6945f93ae6e71ef9 (diff) | |
download | aerc-feafc433f08761290831e44fccf023badb5588aa.tar.gz |
dirtree: prevent folder selection when archiving
Prevent an unwanted folder selection in the directory tree when
archiving.
A previous fix (commit 0be135a3) introduced a regression which caused
the directory tree to select the folder for which a CreateDirectory
message returned successfully.
Since the :archive command will issue a CreateDirectory message in every
operation, the directory tree will thus erroneously select the target
archive directory.
However, the functionality to select a newly created folder by the
:mkdir command is actually correct and should be kept since this
corresponds to the regular directory list behavior.
Another quirk that is addressed is caused by the rebuilding of the
directory tree when the underyling directories change. In that case, the
ui.DirListCollapse setting would overwrite the user changes. Therefore,
only apply the ui.DirListCollapse setting at the first time of building
the directory tree.
Fixes: 0be135a38186 ("dirtree: fix jumping folders")
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Diffstat (limited to 'app/dirtree.go')
-rw-r--r-- | app/dirtree.go | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/app/dirtree.go b/app/dirtree.go index 1cfd1513..559a717e 100644 --- a/app/dirtree.go +++ b/app/dirtree.go @@ -72,18 +72,16 @@ func (dt *DirectoryTree) ClearList() { } func (dt *DirectoryTree) Update(msg types.WorkerMessage) { + selected := dt.Selected() switch msg := msg.(type) { - case *types.Done: - switch resp := msg.InResponseTo().(type) { - case *types.RemoveDirectory, *types.ListDirectories: - dt.DirectoryList.Update(msg) - dt.buildTree() - dt.Invalidate() - case *types.CreateDirectory: + switch msg.InResponseTo().(type) { + case *types.RemoveDirectory, *types.ListDirectories, *types.CreateDirectory: dt.DirectoryList.Update(msg) dt.buildTree() - dt.reindex(resp.Directory) + if selected != "" { + dt.reindex(selected) + } dt.Invalidate() default: dt.DirectoryList.Update(msg) @@ -241,16 +239,31 @@ func (dt *DirectoryTree) Select(name string) { if name == "" { return } - dt.reindex(name) - dt.DirectoryList.Select(name) + dt.Open(name, dt.UiConfig(name).DirListDelay, nil) } func (dt *DirectoryTree) Open(name string, delay time.Duration, cb func(types.WorkerMessage)) { if name == "" { return } - dt.reindex(name) - dt.DirectoryList.Open(name, delay, cb) + again := false + if findString(dt.dirs, name) < 0 { + again = true + } else { + dt.reindex(name) + } + dt.DirectoryList.Open(name, delay, func(msg types.WorkerMessage) { + if cb != nil { + cb(msg) + } + if _, ok := msg.(*types.Done); ok && again { + if findString(dt.dirs, name) < 0 { + dt.dirs = append(dt.dirs, name) + } + dt.buildTree() + dt.reindex(name) + } + }) } func (dt *DirectoryTree) NextPrev(delta int) { @@ -483,7 +496,7 @@ func (dt *DirectoryTree) buildTreeNode(node *types.Thread, stree [][]string, def } nextNode := &types.Thread{Uid: uid} node.AddChild(nextNode) - if dt.UiConfig(path).DirListCollapse != 0 { + if dt.UiConfig(path).DirListCollapse != 0 && dt.listIdx < 0 { if depth > dt.UiConfig(path).DirListCollapse { node.Hidden = 1 } else { |