Skip to content

Commit

Permalink
Fix race between workers and changing directory
Browse files Browse the repository at this point in the history
Directory changes now create an Event that synchronizes with Layout by
stopping all the thumbnail workers and creating a new AvatarPicker with
the updated path.
  • Loading branch information
mixmasala committed Oct 21, 2022
1 parent 09d0d18 commit 76f19aa
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
24 changes: 14 additions & 10 deletions avatar.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ func (p *AvatarPicker) Layout(gtx layout.Context) layout.Dimensions {
Color: th.Bg,
Inset: layout.Inset{},
}

return bg.Layout(gtx, func(gtx C) D {
return layout.Flex{Axis: layout.Vertical, Spacing: layout.SpaceBetween, Alignment: layout.Middle}.Layout(gtx,
// back to Edit Contact
Expand Down Expand Up @@ -201,10 +200,8 @@ func (p *AvatarPicker) Layout(gtx layout.Context) layout.Dimensions {
func (p *AvatarPicker) Event(gtx C) interface{} {
if p.up.Clicked() {
if u, err := filepath.Abs(filepath.Join(p.path, "..")); err == nil {
p.path = u
p.scan()
return ChooseAvatarPath{nickname: p.nickname, path: u}
}
return nil
}
if p.back.Clicked() {
return BackEvent{}
Expand Down Expand Up @@ -233,8 +230,8 @@ func (p *AvatarPicker) Event(gtx C) interface{} {
if u, err := filepath.Abs(filepath.Join(p.path, filename)); err == nil {
if f, err := os.Stat(u); err == nil {
if f.IsDir() {
return ChooseAvatarPath{nickname: p.nickname, path: u}
p.path = u
p.scan()
} else {
p.a.setAvatar(p.nickname, u)
}
Expand All @@ -246,6 +243,11 @@ func (p *AvatarPicker) Event(gtx C) interface{} {
return nil
}

type ChooseAvatarPath struct {
nickname string
path string
}

type opThumb struct {
f os.FileInfo
size int
Expand Down Expand Up @@ -305,16 +307,18 @@ func (p *AvatarPicker) scan() {
ff = append(ff, fn)
}
}
p.files = ff
p.tl.Lock()
p.files = ff
p.thumbs = make(map[os.FileInfo]*image.Image)
p.tl.Unlock()
}

func newAvatarPicker(a *App, nickname string) *AvatarPicker {
cwd, _ := app.DataDir() // XXX: select media/storage on android
func newAvatarPicker(a *App, nickname string, path string) *AvatarPicker {
if path == "" {
path, _ = app.DataDir() // XXX: select media/storage on android
}
if runtime.GOOS == "android" {
cwd = "/sdcard/"
path = "/sdcard/"
}

ap := &AvatarPicker{up: &widget.Clickable{},
Expand All @@ -327,7 +331,7 @@ func newAvatarPicker(a *App, nickname string) *AvatarPicker {
thumbs: make(map[os.FileInfo]*image.Image),
files: make([]os.FileInfo, 0),
tl: new(sync.Mutex),
path: cwd}
path: path}
ap.scan()
return ap
}
Expand Down
5 changes: 4 additions & 1 deletion katzen.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,10 @@ func (a *App) update(gtx layout.Context) {
case ChooseContactClick:
a.stack.Push(newConversationPage(a, e.nickname))
case ChooseAvatar:
a.stack.Push(newAvatarPicker(a, e.nickname))
a.stack.Push(newAvatarPicker(a, e.nickname, ""))
case ChooseAvatarPath:
a.stack.Pop()
a.stack.Push(newAvatarPicker(a, e.nickname, e.path))
case RenameContact:
a.stack.Push(newRenameContactPage(a, e.nickname))
case EditContact:
Expand Down

0 comments on commit 76f19aa

Please sign in to comment.