Skip to content

Commit 0afbd67

Browse files
committed
refactor code into new seprate files from the 1200 line one file
1 parent c9c1619 commit 0afbd67

File tree

12 files changed

+1342
-1147
lines changed

12 files changed

+1342
-1147
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ You can load playlists using the `Load` function and save by calling `Save` or `
1010
## GUI
1111
Get the latest GUI app from [Releases](/releases/latest)
1212

13-
###### note: the gui code needs is just something I did quickly and needs serous refactoring
13+
1414

1515
[comment]: <> (##Examples)
1616

cmd/gui/customStyles.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package main
2+
3+
import (
4+
"fyne.io/fyne/v2"
5+
"fyne.io/fyne/v2/container"
6+
"fyne.io/fyne/v2/theme"
7+
)
8+
9+
type AdaptiveColumn struct {
10+
vertical bool
11+
size fyne.Size
12+
}
13+
14+
func (a *AdaptiveColumn) Layout(objs []fyne.CanvasObject, cont fyne.Size) {
15+
a.size = cont
16+
pos := fyne.NewPos(0, 0)
17+
for i, o := range objs {
18+
adjust := theme.Padding() / 2
19+
if i == len(objs)-1 {
20+
adjust = 0
21+
}
22+
if a.vertical {
23+
s := o.MinSize().Height
24+
o.Resize(fyne.NewSize(cont.Width, s-adjust))
25+
o.Move(pos)
26+
pos = pos.Add(fyne.NewPos(0, s))
27+
} else {
28+
s := cont.Width / float32(len(objs))
29+
o.Resize(fyne.NewSize(s-adjust, cont.Height))
30+
o.Move(pos)
31+
pos = pos.Add(fyne.NewPos(s, 0))
32+
}
33+
}
34+
}
35+
func (a *AdaptiveColumn) MinSize(objs []fyne.CanvasObject) fyne.Size {
36+
var w, h, sumHeight float32
37+
for _, O := range objs {
38+
s := O.MinSize()
39+
sumHeight += s.Height
40+
w = fyne.Max(w, s.Width)
41+
h = fyne.Max(h, s.Height)
42+
}
43+
a.vertical = w > (a.size.Width-theme.Padding()*float32(len(objs)-1))/float32(len(objs))
44+
if a.vertical {
45+
h = sumHeight
46+
}
47+
return fyne.NewSize(w, h)
48+
}
49+
50+
func NewShrinkingColumns(obj ...fyne.CanvasObject) *fyne.Container {
51+
return container.New(&AdaptiveColumn{size: fyne.NewSize(10, 10)}, obj...)
52+
}
53+
54+
// ---
55+
56+
const (
57+
posLeading = iota
58+
posCenter
59+
posTrailing
60+
)
61+
62+
type Center struct {
63+
VCenter, HCenter int
64+
}
65+
66+
func (c Center) MinSize(objects []fyne.CanvasObject) fyne.Size {
67+
return objects[0].MinSize()
68+
}
69+
70+
func (c Center) Layout(objects []fyne.CanvasObject, containerSize fyne.Size) {
71+
s := c.MinSize(objects)
72+
var xPos, yPos float32
73+
switch c.HCenter {
74+
case posLeading:
75+
xPos = 0
76+
case posCenter:
77+
xPos = containerSize.Width/2 - s.Width/2
78+
case posTrailing:
79+
xPos = containerSize.Width - s.Width
80+
}
81+
82+
switch c.VCenter {
83+
case posLeading:
84+
yPos = 0
85+
case posCenter:
86+
yPos = containerSize.Height/2 - s.Height/2
87+
case posTrailing:
88+
yPos = containerSize.Height - s.Height
89+
}
90+
91+
pos := fyne.NewPos(xPos, yPos)
92+
o1 := objects[0]
93+
o1.Resize(s)
94+
o1.Move(pos)
95+
}
96+
97+
func NewCenter(obj fyne.CanvasObject, vPos, hPos int) *fyne.Container {
98+
return container.New(&Center{vPos, hPos}, obj)
99+
}
100+
101+
// ---
102+
103+
type MinSize struct {
104+
w, h float32
105+
}
106+
107+
func (m MinSize) MinSize(objects []fyne.CanvasObject) fyne.Size {
108+
w, h := m.w, m.h
109+
o1 := objects[0]
110+
if w == 0 {
111+
w = o1.MinSize().Width
112+
}
113+
if h == 0 {
114+
h = o1.MinSize().Height
115+
}
116+
return fyne.NewSize(w, h)
117+
}
118+
119+
func (m MinSize) Layout(objects []fyne.CanvasObject, containerSize fyne.Size) {
120+
o1 := objects[0]
121+
o1.Resize(containerSize)
122+
}
123+
124+
func NewSetMinSize(obj fyne.CanvasObject, width, height float32) *fyne.Container {
125+
return container.New(&MinSize{w: width, h: height}, obj)
126+
}

cmd/gui/fileHandlers.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package main
2+
3+
import (
4+
"log"
5+
6+
"github.com/zivoy/BeatList/pkg/playlist"
7+
8+
"fyne.io/fyne/v2"
9+
"fyne.io/fyne/v2/dialog"
10+
"fyne.io/fyne/v2/storage"
11+
)
12+
13+
var playlistFilter = storage.NewExtensionFileFilter([]string{".json", ".bplist"})
14+
15+
func saveMenu() {
16+
d := dialog.NewFileSave(func(closer fyne.URIWriteCloser, err error) {
17+
if err != nil {
18+
dialog.ShowError(err, window)
19+
log.Println(err)
20+
return
21+
}
22+
if closer == nil {
23+
return
24+
}
25+
defer func(closer fyne.URIWriteCloser) {
26+
err := closer.Close()
27+
if err != nil {
28+
log.Println(err)
29+
}
30+
}(closer)
31+
32+
err = activePlaylist.SavePretty(closer)
33+
if err != nil {
34+
dialog.ShowError(err, window)
35+
log.Println(err)
36+
return
37+
}
38+
changes(false)
39+
}, window)
40+
d.SetFileName(lastOpened.Name())
41+
d.SetFilter(playlistFilter)
42+
d.Show()
43+
}
44+
45+
func openMenu() {
46+
confirmUnedited(func() {
47+
d := dialog.NewFileOpen(func(closer fyne.URIReadCloser, err error) {
48+
if err != nil {
49+
dialog.ShowError(err, window)
50+
log.Println(err)
51+
return
52+
}
53+
if closer == nil {
54+
return
55+
}
56+
defer func(closer fyne.URIReadCloser) {
57+
err := closer.Close()
58+
if err != nil {
59+
log.Println(err)
60+
}
61+
}(closer)
62+
63+
p, err := playlist.Load(closer)
64+
if err != nil {
65+
dialog.ShowError(err, window)
66+
log.Println(err)
67+
return
68+
}
69+
70+
// load info on songs
71+
go func() {
72+
loadAll(p.Songs)
73+
changes(false)
74+
}()
75+
76+
lastOpened = closer.URI()
77+
activePlaylist = p
78+
ui.refresh()
79+
changes(false)
80+
}, window)
81+
//d.SetFileName(lastOpened.Name())
82+
//uri, _ := storage.ListerForURI(lastOpened)
83+
//if err != nil {
84+
// return
85+
//}
86+
//d.SetLocation()
87+
d.SetFilter(playlistFilter)
88+
d.Show()
89+
}, window)
90+
}

cmd/gui/gui.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package main
2+
3+
import (
4+
"log"
5+
6+
"fyne.io/fyne/v2/dialog"
7+
"fyne.io/fyne/v2/storage"
8+
"github.com/zivoy/BeatList/pkg/playlist"
9+
10+
"fyne.io/fyne/v2"
11+
"fyne.io/fyne/v2/canvas"
12+
"fyne.io/fyne/v2/widget"
13+
)
14+
15+
type UI struct {
16+
Title, Author, Description, SyncURL, ArchiveURL *widget.Entry
17+
Image *canvas.Image
18+
AllowDuplicates, ReadOnly *widget.Check
19+
songInfo *SongListUI
20+
LoadingBar *widget.ProgressBar
21+
ImageChangeButton *widget.Button
22+
}
23+
24+
var ui UI
25+
26+
func initGUI() {
27+
ui = UI{}
28+
ui.LoadingBar = widget.NewProgressBar()
29+
ui.LoadingBar.Hide()
30+
31+
// playlist info
32+
ui.Author = widget.NewEntry()
33+
ui.Author.OnChanged = func(s string) {
34+
activePlaylist.Author = s
35+
changes(true)
36+
}
37+
ui.Author.SetPlaceHolder("(Optional)")
38+
ui.Title = widget.NewEntry()
39+
ui.Title.OnChanged = func(s string) {
40+
activePlaylist.Title = s
41+
changes(true)
42+
}
43+
ui.Description = widget.NewMultiLineEntry()
44+
ui.Description.Wrapping = fyne.TextWrapWord
45+
ui.Description.OnChanged = func(s string) {
46+
activePlaylist.Description = s
47+
changes(true)
48+
}
49+
ui.Description.SetPlaceHolder("(Optional)")
50+
ui.Image = canvas.NewImageFromImage(playlist.DefaultImage())
51+
ui.Image.Hide()
52+
ui.Image.SetMinSize(fyne.NewSize(128, 128))
53+
ui.ImageChangeButton = widget.NewButton("Change", func() {
54+
d := dialog.NewFileOpen(func(closer fyne.URIReadCloser, err error) {
55+
if err != nil {
56+
dialog.ShowError(err, window)
57+
log.Println(err)
58+
return
59+
}
60+
if closer == nil {
61+
return
62+
}
63+
defer func(closer fyne.URIReadCloser) {
64+
err := closer.Close()
65+
if err != nil {
66+
log.Println(err)
67+
}
68+
}(closer)
69+
70+
cover, err := playlist.ReaderToCover(closer)
71+
if err != nil {
72+
log.Println(err)
73+
}
74+
cover.Rescale(imageSize)
75+
76+
activePlaylist.Cover = cover
77+
ui.Image.Image = canvas.NewImageFromImage(cover.GetImage()).Image
78+
ui.Image.Refresh()
79+
ui.Image.Show()
80+
changes(true)
81+
}, window)
82+
d.SetFilter(storage.NewMimeTypeFileFilter([]string{"image/png", "image/jpeg"})) //"image/gif"}))
83+
//d.SetFileName(defaultLoc.)
84+
d.Show()
85+
})
86+
87+
// metadata
88+
ui.ReadOnly = widget.NewCheck("", func(b bool) {
89+
activePlaylist.CustomData.ReadOnly = b
90+
changes(true)
91+
})
92+
ui.AllowDuplicates = widget.NewCheck("", func(b bool) {
93+
activePlaylist.CustomData.AllowDuplicates = b
94+
if !b {
95+
items := map[string]bool{}
96+
for _, s := range activePlaylist.Songs {
97+
items[s.Hash] = true
98+
}
99+
songs := make([]*playlist.Song, len(items))
100+
i := 0
101+
for _, s := range activePlaylist.Songs {
102+
if items[s.Hash] {
103+
songs[i] = s
104+
i++
105+
items[s.Hash] = false
106+
}
107+
}
108+
activePlaylist.Songs = songs
109+
}
110+
changes(true)
111+
})
112+
ui.SyncURL = widget.NewEntry()
113+
ui.SyncURL.OnChanged = func(s string) {
114+
activePlaylist.CustomData.SyncURL = s
115+
changes(true)
116+
}
117+
ui.SyncURL.SetPlaceHolder("(Optional)")
118+
ui.ArchiveURL = widget.NewEntry()
119+
ui.ArchiveURL.OnChanged = func(s string) {
120+
activePlaylist.CustomData.ArchiveURL = s
121+
changes(true)
122+
}
123+
ui.ArchiveURL.SetPlaceHolder("(Optional)")
124+
125+
// songlist
126+
ui.songInfo = initSongList()
127+
}
128+
129+
func (u UI) refresh() {
130+
u.Author.SetText(activePlaylist.Author)
131+
u.Description.SetText(activePlaylist.Description)
132+
u.Title.SetText(activePlaylist.Title)
133+
if activePlaylist.Cover == "" {
134+
u.Image.Hide()
135+
} else {
136+
u.Image.Image = canvas.NewImageFromImage(activePlaylist.Cover.GetImage()).Image
137+
u.Image.Refresh()
138+
u.Image.Show()
139+
}
140+
141+
u.ReadOnly.SetChecked(activePlaylist.CustomData.ReadOnly)
142+
u.AllowDuplicates.SetChecked(activePlaylist.CustomData.AllowDuplicates)
143+
u.SyncURL.SetText(activePlaylist.CustomData.SyncURL)
144+
u.ArchiveURL.SetText(activePlaylist.CustomData.ArchiveURL)
145+
146+
u.songInfo.SongDiffChecks.Hide()
147+
u.songInfo.SongDiffText.Show()
148+
u.songInfo.SongDiffDropDown.Hide()
149+
u.songInfo.Songs.Select(0)
150+
u.songInfo.Songs.Unselect(0)
151+
}

0 commit comments

Comments
 (0)