summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/ui/grid.go1
-rw-r--r--lib/ui/list.go110
-rw-r--r--widgets/directories.go71
3 files changed, 26 insertions, 156 deletions
diff --git a/lib/ui/grid.go b/lib/ui/grid.go
index 5fe6ab2..3c375ee 100644
--- a/lib/ui/grid.go
+++ b/lib/ui/grid.go
@@ -5,7 +5,6 @@ import (
 	"math"
 )
 
-// A container which arranges its children on a grid.
 type Grid struct {
 	rows         []GridSpec
 	rowLayout    []gridLayout
diff --git a/lib/ui/list.go b/lib/ui/list.go
deleted file mode 100644
index 58f304f..0000000
--- a/lib/ui/list.go
+++ /dev/null
@@ -1,110 +0,0 @@
-package ui
-
-import (
-	"fmt"
-)
-
-// A container which arranges its children in a list.
-type List struct {
-	Items        []*ListItem
-	itemHeight   int
-	onInvalidate func(d Drawable)
-	selected     int
-}
-
-type ListItem struct {
-	Content Drawable
-	invalid bool
-}
-
-type SelectableDrawable interface {
-	Drawable
-	DrawWithSelected(ctx *Context, selected bool)
-}
-
-func NewList() *List {
-	return &List{itemHeight: 1, selected: -1}
-}
-
-func (list *List) OnInvalidate(onInvalidate func(d Drawable)) {
-	list.onInvalidate = onInvalidate
-}
-
-func (list *List) Invalidate() {
-	for _, item := range list.Items {
-		item.Content.Invalidate()
-	}
-	if list.onInvalidate != nil {
-		list.onInvalidate(list)
-	}
-}
-
-func (list *List) Draw(ctx *Context) {
-	for i, item := range list.Items {
-		if !item.invalid {
-			continue
-		}
-		subctx := ctx.Subcontext(0, i, ctx.Width(), list.itemHeight)
-		if content, ok := item.Content.(SelectableDrawable); ok {
-			content.DrawWithSelected(subctx, i == list.selected)
-		} else {
-			item.Content.Draw(subctx)
-		}
-	}
-}
-
-func (list *List) Add(child Drawable) {
-	list.Items = append(list.Items, &ListItem{Content: child, invalid: true})
-	child.OnInvalidate(list.childInvalidated)
-	list.Invalidate()
-}
-
-func (list *List) Remove(child Drawable) {
-	for i, item := range list.Items {
-		if item.Content == child {
-			list.Items = append(list.Items[:i], list.Items[i+1:]...)
-			child.OnInvalidate(nil)
-			list.Invalidate()
-			return
-		}
-	}
-	panic(fmt.Errorf("Attempted to remove unknown child"))
-}
-
-func (list *List) Set(items []Drawable) {
-	for _, item := range list.Items {
-		item.Content.OnInvalidate(nil)
-	}
-	list.Items = make([]*ListItem, len(items))
-	for i, item := range items {
-		list.Items[i] = &ListItem{Content: item, invalid: true}
-		item.OnInvalidate(list.childInvalidated)
-	}
-	list.Invalidate()
-}
-
-func (list *List) Select(index int) {
-	if index >= len(list.Items) || index < 0 {
-		panic(fmt.Errorf("Attempted to select unknown child"))
-	}
-	list.selected = index
-	list.Invalidate()
-}
-
-func (list *List) ItemHeight(height int) {
-	list.itemHeight = height
-	list.Invalidate()
-}
-
-func (list *List) childInvalidated(child Drawable) {
-	for _, item := range list.Items {
-		if item.Content == child {
-			item.invalid = true
-			if list.onInvalidate != nil {
-				list.onInvalidate(list)
-			}
-			return
-		}
-	}
-	panic(fmt.Errorf("Attempted to invalidate unknown child"))
-}
diff --git a/widgets/directories.go b/widgets/directories.go
index ff2f6f5..16b0e5a 100644
--- a/widgets/directories.go
+++ b/widgets/directories.go
@@ -3,7 +3,6 @@ package widgets
 import (
 	"log"
 	"sort"
-	"strings"
 
 	"github.com/gdamore/tcell"
 
@@ -14,7 +13,7 @@ import (
 
 type DirectoryList struct {
 	conf         *config.AccountConfig
-	dirs         *ui.List
+	dirs         []string
 	logger       *log.Logger
 	onInvalidate func(d ui.Drawable)
 	worker       *types.Worker
@@ -23,68 +22,50 @@ type DirectoryList struct {
 func NewDirectoryList(conf *config.AccountConfig,
 	logger *log.Logger, worker *types.Worker) *DirectoryList {
 
-	return &DirectoryList{
-		conf:   conf,
-		dirs:   ui.NewList(),
-		logger: logger,
-		worker: worker,
-	}
+	return &DirectoryList{conf: conf, logger: logger, worker: worker}
 }
 
 func (dirlist *DirectoryList) UpdateList() {
-	var dirs []ui.Drawable
+	var dirs []string
 	dirlist.worker.PostAction(
 		&types.ListDirectories{}, func(msg types.WorkerMessage) {
 
 			switch msg := msg.(type) {
 			case *types.Directory:
-				if len(dirlist.conf.Folders) > 1 {
-					idx := sort.SearchStrings(dirlist.conf.Folders, msg.Name)
-					if idx == len(dirlist.conf.Folders) ||
-						dirlist.conf.Folders[idx] != msg.Name {
-						break
-					}
-				}
-				dirs = append(dirs, directoryEntry(msg.Name))
+				dirs = append(dirs, msg.Name)
 			case *types.Done:
-				sort.Slice(dirs, func(_a, _b int) bool {
-					a, _ := dirs[_a].(directoryEntry)
-					b, _ := dirs[_b].(directoryEntry)
-					return strings.Compare(string(a), string(b)) > 0
-				})
-				dirlist.dirs.Set(dirs)
+				sort.Strings(dirs)
+				dirlist.dirs = dirs
+				dirlist.Invalidate()
 			}
 		})
 }
 
 func (dirlist *DirectoryList) OnInvalidate(onInvalidate func(d ui.Drawable)) {
-	dirlist.dirs.OnInvalidate(func(_ ui.Drawable) {
-		onInvalidate(dirlist)
-	})
+	dirlist.onInvalidate = onInvalidate
 }
 
 func (dirlist *DirectoryList) Invalidate() {
-	dirlist.dirs.Invalidate()
+	if dirlist.onInvalidate != nil {
+		dirlist.onInvalidate(dirlist)
+	}
 }
 
 func (dirlist *DirectoryList) Draw(ctx *ui.Context) {
-	dirlist.dirs.Draw(ctx)
-}
-
-type directoryEntry string
-
-func (d directoryEntry) OnInvalidate(_ func(_ ui.Drawable)) {
-}
-
-func (d directoryEntry) Invalidate() {
-}
-
-func (d directoryEntry) Draw(ctx *ui.Context) {
-	d.DrawWithSelected(ctx, false)
-}
-
-func (d directoryEntry) DrawWithSelected(ctx *ui.Context, selected bool) {
-	// TODO: distinguish the selected item
 	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
-	ctx.Printf(0, 0, tcell.StyleDefault, "%s", d)
+	row := 0
+	for _, name := range dirlist.dirs {
+		if row >= ctx.Height() {
+			break
+		}
+		if len(dirlist.conf.Folders) > 1 {
+			idx := sort.SearchStrings(dirlist.conf.Folders, name)
+			if idx == len(dirlist.conf.Folders) ||
+				dirlist.conf.Folders[idx] != name {
+				continue
+			}
+		}
+		ctx.Printf(0, row, tcell.StyleDefault, "%s", name)
+		row++
+	}
 }
047jump_label.cc.html?h=hlt&id=64586540eccbc0880341782d329b419ab9d002de'>^
c5ffb6e1 ^
65361948 ^










c5ffb6e1 ^
65361948 ^












c5ffb6e1 ^
65361948 ^









1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149