about summary refs log tree commit diff stats
path: root/dwm.h
Commit message (Expand)AuthorAgeFilesLines
* changed Client->tags and Rule->tags to be Bool (I'll also try to remove the T...arg@10ksloc.org2006-08-031-3/+4
* removed the CONFIG variable from config.mk, renamed config.h into config.defa...arg@10ksloc.org2006-08-021-1/+1
* made fullscreen apps working fine in floating mode (there is no sane way to m...arg@10ksloc.org2006-08-021-2/+2
* renamed WM_PROTOCOL_DELWIN into PROTODELWINarg@10ksloc.org2006-08-011-1/+1
* cleaned config.*h to prevent some confusionarg@10ksloc.org2006-08-011-2/+3
* uppercasing all define'd values (uppercase-prefixed should only be enum field...arg@10ksloc.org2006-08-011-2/+2
* centralized/externalized configuration to config.harg@10ksloc.org2006-08-011-20/+1
* applied Jukkas prev/next patch with XK_{h,l}arg@10ksloc.org2006-08-011-0/+2
* applied Sanders patchesarg@10ksloc.org2006-08-011-2/+6
* committed a patch which fixes the hints of Jukkaarg@10ksloc.org2006-08-011-1/+1
* sanitization of several clunky stuff, removed heretag (rarely of use), simpli...arg@10ksloc.org2006-07-211-12/+10
* applied sanders no_sizehints for tiled mode patch (thx!)arg@10ksloc.org2006-07-201-1/+1
* using double-linked list in order to get correct prev focus handlingarg@10ksloc.org2006-07-201-1/+2
* cleaned the CUSTOMIZE flagsarg@10ksloc.org2006-07-201-2/+2
* made status bar drawing more robust, implemented togglemax and togglemode, wo...arg@10ksloc.org2006-07-201-1/+3
* removed c->f{x,y,w,h} and c->t{x,y,w,h} in favor for the new rule handling re...arg@10ksloc.org2006-07-201-5/+2
* implemented regexp matching for rulesarg@10ksloc.org2006-07-191-17/+0
* applied Jukka's patch with s/ModKeyMask/MODKEY/garg@10ksloc.org2006-07-191-0/+1
* refactored Sanders code somewhatarg@10ksloc.org2006-07-191-2/+2
* applied Sanders resize patch, fixed lower bugarg@10ksloc.org2006-07-191-1/+4
* implemened distinguishing float/managed geometries of clients (works quite well)Anselm R. Garbe2006-07-181-2/+5
* pop on heretagAnselm R. Garbe2006-07-181-0/+1
* added heretag command which allows to tag a client of a foreign tag with curr...Anselm R. Garbe2006-07-181-1/+2
* ordered variables in structs and source files alphabeticallyAnselm R. Garbe2006-07-171-20/+18
* several additions in mouse handling ;)Anselm R. Garbe2006-07-161-2/+2
* changing XFlush into XSyncAnselm R. Garbe2006-07-151-0/+5
* sanitized other stuffAnselm R. Garbe2006-07-151-3/+1
* proceeded with cleaning up, sorting functions, etcAnselm R. Garbe2006-07-151-20/+19
* rearranged several stuffAnselm R. Garbe2006-07-151-14/+22
* sanitized namesAnselm R. Garbe2006-07-141-12/+12
* rearrangedAnselm R. Garbe2006-07-141-19/+12
* removed a bunch of lines through swap removalAnselm R. Garbe2006-07-141-2/+1
* searching for a better way to discard enter notifiesAnselm R. Garbe2006-07-141-6/+0
* implemented dwm reading status text from stdin Anselm R. Garbe2006-07-141-2/+2
* made barclick to select the specific tagAnselm R. Garbe2006-07-141-0/+1
* implemented bar for dwm (I miss status text), I plan that status text is read...Anselm R. Garbe2006-07-141-4/+7
* added mini stuffAnselm R. Garbe2006-07-131-3/+6
* fixed several things, nearly feature completeAnselm R. Garbe2006-07-131-1/+1
* new stuffAnselm R. Garbe2006-07-131-8/+16
* several other additions/fixes, dwm is quite usable alreadyAnselm R. Garbe2006-07-131-3/+5
* implemented tagging a clientAnselm R. Garbe2006-07-131-11/+19
* added xlock command (I need it regularly)Anselm R. Garbe2006-07-131-1/+2
* changed default colorsAnselm R. Garbe2006-07-131-0/+136
e>257affc ^
2349b7d ^


24196d2 ^
a782b70 ^





257affc ^




cf66462 ^
257affc ^





cf66462 ^

84965d6 ^
cf66462 ^


257affc ^

2349b7d ^
b60999c ^




































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
150
151
152
153
154
155







                                  
                                          




                                                
                                          
                             

                                        
                           
                           
                             


                                  


                                                                  










                                                          

 
                                                                    
                         




                                                                         
                                                             
                                         

                                                   
                                                      
                                                    


                                                  



                         
                                                   





                                                                        
                                         



                                                                    


                            



                                                 
                                                                              
                                           


                                            


                                             


                                                     
                                                                          





                                         




                                           
                                                                              





                                                                             

                                             
                                                   


                                                            

                     
 




































                                                                                              
package widgets

import (
	"log"
	"sort"

	"github.com/gdamore/tcell"

	"git.sr.ht/~sircmpwn/aerc2/config"
	"git.sr.ht/~sircmpwn/aerc2/lib/ui"
	"git.sr.ht/~sircmpwn/aerc2/worker/types"
)

type DirectoryList struct {
	conf         *config.AccountConfig
	dirs         []string
	logger       *log.Logger
	onInvalidate func(d ui.Drawable)
	selecting    string
	selected     string
	spinner      *Spinner
	worker       *types.Worker
}

func NewDirectoryList(conf *config.AccountConfig,
	logger *log.Logger, worker *types.Worker) *DirectoryList {

	dirlist := &DirectoryList{
		conf:    conf,
		logger:  logger,
		spinner: NewSpinner(),
		worker:  worker,
	}
	dirlist.spinner.OnInvalidate(func(_ ui.Drawable) {
		dirlist.Invalidate()
	})
	dirlist.spinner.Start()
	return dirlist
}

func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
	var dirs []string
	dirlist.worker.PostAction(
		&types.ListDirectories{}, func(msg types.WorkerMessage) {

			switch msg := msg.(type) {
			case *types.Directory:
				dirs = append(dirs, msg.Name)
			case *types.Done:
				sort.Strings(dirs)
				dirlist.dirs = dirs
				dirlist.spinner.Stop()
				dirlist.Invalidate()
				if done != nil {
					done(dirs)
				}
			}
		})
}

func (dirlist *DirectoryList) Select(name string) {
	dirlist.selecting = name
	dirlist.worker.PostAction(&types.OpenDirectory{Directory: name},
		func(msg types.WorkerMessage) {
			switch msg.(type) {
			case *types.Error:
				dirlist.selecting = ""
			case *types.Done:
				dirlist.selected = dirlist.selecting
			}
			dirlist.Invalidate()
		})
	dirlist.Invalidate()
}

func (dirlist *DirectoryList) Selected() string {
	return dirlist.selected
}

func (dirlist *DirectoryList) OnInvalidate(onInvalidate func(d ui.Drawable)) {
	dirlist.onInvalidate = onInvalidate
}

func (dirlist *DirectoryList) Invalidate() {
	if dirlist.onInvalidate != nil {
		dirlist.onInvalidate(dirlist)
	}
}

func (dirlist *DirectoryList) Draw(ctx *ui.Context) {
	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)

	if dirlist.spinner.IsRunning() {
		dirlist.spinner.Draw(ctx)
		return
	}

	row := 0
	for _, name := range dirlist.dirs {
		if row >= ctx.Height() {
			break
		}
		if len(dirlist.conf.Folders) > 1 && name != dirlist.selected {
			idx := sort.SearchStrings(dirlist.conf.Folders, name)
			if idx == len(dirlist.conf.Folders) ||
				dirlist.conf.Folders[idx] != name {
				continue
			}
		}
		style := tcell.StyleDefault
		if name == dirlist.selected {
			style = style.Reverse(true)
		}
		ctx.Fill(0, row, ctx.Width(), 1, ' ', style)
		ctx.Printf(0, row, style, "%s", name)
		row++
	}
}

func (dirlist *DirectoryList) nextPrev(delta int) {
	for i, dir := range dirlist.dirs {
		if dir == dirlist.selected {
			var j int
			ndirs := len(dirlist.dirs)
			for j = i + delta; j != i; j += delta {
				if j < 0 {
					j = ndirs - 1
				}
				if j >= ndirs {
					j = 0
				}
				name := dirlist.dirs[j]
				if len(dirlist.conf.Folders) > 1 && name != dirlist.selected {
					idx := sort.SearchStrings(dirlist.conf.Folders, name)
					if idx == len(dirlist.conf.Folders) ||
						dirlist.conf.Folders[idx] != name {

						continue
					}
				}
				break
			}
			dirlist.Select(dirlist.dirs[j])
			break
		}
	}
}

func (dirlist *DirectoryList) Next() {
	dirlist.nextPrev(1)
}

func (dirlist *DirectoryList) Prev() {
	dirlist.nextPrev(-1)
}