aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorinwit <inwit@sindominio.net>2024-01-29 20:45:47 +0100
committerRobin Jarry <robin@jarry.cc>2024-01-29 22:45:25 +0100
commit0c2af2e354541632c708a1a7d6eb04c1e2a951ae (patch)
tree94bf8c468cc2ab423294630055a696dbb3a8014e /app
parentc48d27b07b90fab54198287c552646607f401228 (diff)
downloadaerc-0c2af2e354541632c708a1a7d6eb04c1e2a951ae.tar.gz
ui: allow thread arrow customization
The thread prefix appearance is inspired by mutt and has been regarded by some as too wide and not very aesthetically pleasing. Nevertheless, it has some technical limitations, like not being able to show if a thread is folded. Allow for full customisation of the thread prefix by introducing 14 new config options. Dirlist is not affected. Changelog-added: Thread arrow prefixes are now fully configurable. Co-authored-by: Robin Jarry <robin@jarry.cc> Signed-off-by: inwit <inwit@sindominio.net> Tested-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'app')
-rw-r--r--app/dirtree.go4
-rw-r--r--app/msglist.go91
2 files changed, 75 insertions, 20 deletions
diff --git a/app/dirtree.go b/app/dirtree.go
index 559a717e..ce9bd27e 100644
--- a/app/dirtree.go
+++ b/app/dirtree.go
@@ -347,7 +347,9 @@ func (dt *DirectoryTree) countVisible(list []*types.Thread) (n int) {
func (dt *DirectoryTree) displayText(node *types.Thread) string {
elems := strings.Split(dt.treeDirs[getAnyUid(node)], dt.DirectoryList.worker.PathSeparator())
- return fmt.Sprintf("%s%s%s", threadPrefix(node, false, false), getFlag(node), elems[countLevels(node)])
+ return fmt.Sprintf("%s%s%s",
+ threadPrefix(node, false, false),
+ getFlag(node), elems[countLevels(node)])
}
func (dt *DirectoryTree) getDirectory(node *types.Thread) string {
diff --git a/app/msglist.go b/app/msglist.go
index 7948e6a1..63089536 100644
--- a/app/msglist.go
+++ b/app/msglist.go
@@ -417,36 +417,89 @@ func unreadInThread(thread *types.Thread, store *lib.MessageStore) (ctr int) {
return
}
-func threadPrefix(t *types.Thread, reverse bool, point bool) string {
- var arrow string
- var tip string
- if point {
- tip = ">"
- }
- arrowPrefixSibling := "├─" + tip
- arrowPrefixReverse := "┌─" + tip
- arrowPrefixEnd := "└─" + tip
- arrowStem := "│"
- arrowIndent := strings.Repeat(" ", runewidth.StringWidth(arrowPrefixSibling)-1)
+func threadPrefix(t *types.Thread, reverse bool, msglist bool) string {
+ uiConfig := SelectedAccountUiConfig()
+ var tip, prefix, firstChild, lastSibling, orphan string
+ if msglist {
+ tip = uiConfig.ThreadPrefixTip
+ } else {
+ threadPrefixSibling := "├─"
+ threadPrefixReverse := "┌─"
+ threadPrefixEnd := "└─"
+ threadStem := "│"
+ threadIndent := strings.Repeat(" ", runewidth.StringWidth(threadPrefixSibling)-1)
+
+ switch {
+ case t.Parent != nil && t.NextSibling != nil:
+ prefix += threadPrefixSibling
+ case t.Parent != nil && reverse:
+ prefix += threadPrefixReverse
+ case t.Parent != nil:
+ prefix += threadPrefixEnd
+ }
+
+ for n := t.Parent; n != nil && n.Parent != nil; n = n.Parent {
+ if n.NextSibling != nil {
+ prefix = threadStem + threadIndent + prefix
+ } else {
+ prefix = " " + threadIndent + prefix
+ }
+ }
+
+ return prefix
+ }
+
+ if reverse {
+ firstChild = uiConfig.ThreadPrefixFirstChildReverse
+ lastSibling = uiConfig.ThreadPrefixLastSiblingReverse
+ orphan = uiConfig.ThreadPrefixOrphanReverse
+ } else {
+ firstChild = uiConfig.ThreadPrefixFirstChild
+ lastSibling = uiConfig.ThreadPrefixLastSibling
+ orphan = uiConfig.ThreadPrefixOrphan
+ }
+
+ var hiddenOffspring bool = t.FirstChild != nil && t.FirstChild.Hidden > 0
+ var parentAndSiblings bool = t.Parent != nil && t.NextSibling != nil
switch {
- case t.Parent != nil && t.NextSibling != nil:
- arrow += arrowPrefixSibling
- case t.Parent != nil && reverse:
- arrow += arrowPrefixReverse
+ case parentAndSiblings && hiddenOffspring:
+ prefix = uiConfig.ThreadPrefixHasSiblings +
+ uiConfig.ThreadPrefixFolded
+ case parentAndSiblings && t.FirstChild != nil:
+ prefix = uiConfig.ThreadPrefixHasSiblings +
+ firstChild + tip
+ case parentAndSiblings:
+ prefix = uiConfig.ThreadPrefixHasSiblings +
+ uiConfig.ThreadPrefixLimb +
+ uiConfig.ThreadPrefixUnfolded + tip
+ case t.Parent != nil && hiddenOffspring:
+ prefix = lastSibling + uiConfig.ThreadPrefixFolded
+ case t.Parent != nil && t.FirstChild != nil:
+ prefix = lastSibling + firstChild + tip
+ case t.Parent != nil && t.FirstChild == nil:
+ prefix = lastSibling + uiConfig.ThreadPrefixLimb + tip
case t.Parent != nil:
- arrow += arrowPrefixEnd
+ prefix = lastSibling + uiConfig.ThreadPrefixUnfolded +
+ uiConfig.ThreadPrefixTip
+ case t.Parent == nil && hiddenOffspring:
+ prefix = uiConfig.ThreadPrefixFolded
+ case t.Parent == nil && t.FirstChild != nil:
+ prefix = orphan
+ case t.Parent == nil && t.FirstChild == nil:
+ prefix = uiConfig.ThreadPrefixLone
}
for n := t.Parent; n != nil && n.Parent != nil; n = n.Parent {
if n.NextSibling != nil {
- arrow = arrowStem + arrowIndent + arrow
+ prefix = uiConfig.ThreadPrefixStem +
+ uiConfig.ThreadPrefixIndent + prefix
} else {
- arrow = " " + arrowIndent + arrow
+ prefix = " " + uiConfig.ThreadPrefixIndent + prefix
}
}
- return arrow
+ return prefix
}
func sameParent(left, right *types.Thread) bool {