/
appearance.go
115 lines (93 loc) · 2.6 KB
/
appearance.go
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
package settings
import (
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
"fyne.io/fyne/layout"
"fyne.io/fyne/theme"
"fyne.io/fyne/widget"
)
// Settings gives access to user interfaces to control Fyne settings
type Settings struct {
fyneSettings app.SettingsSchema
preview *canvas.Image
}
// NewSettings returns a new settings instance with the current configuration loaded
func NewSettings() *Settings {
s := &Settings{}
s.load()
return s
}
// AppearanceIcon returns the icon for appearance settings
func (s *Settings) AppearanceIcon() fyne.Resource {
return theme.NewThemedResource(appearanceIcon, nil)
}
// LoadAppearanceScreen creates a new settings screen to handle appearance configuration
func (s *Settings) LoadAppearanceScreen(w fyne.Window) fyne.CanvasObject {
s.preview = canvas.NewImageFromResource(themeDarkPreview)
s.preview.FillMode = canvas.ImageFillContain
def := s.fyneSettings.ThemeName
themes := widget.NewSelect([]string{"dark", "light"}, s.chooseTheme)
themes.SetSelected(def)
scale := s.makeScaleGroup(w.Canvas().Scale())
scale.Append(widget.NewGroup("Theme", themes))
bottom := widget.NewHBox(layout.NewSpacer(),
&widget.Button{Text: "Apply", Style: widget.PrimaryButton, OnTapped: func() {
err := s.save()
if err != nil {
fyne.LogError("Failed on saving", err)
}
s.appliedScale(s.fyneSettings.Scale)
}})
return fyne.NewContainerWithLayout(layout.NewBorderLayout(scale, bottom, nil, nil),
scale, bottom, s.preview)
}
func (s *Settings) chooseTheme(name string) {
s.fyneSettings.ThemeName = name
switch name {
case "light":
s.preview.Resource = themeLightPreview
default:
s.preview.Resource = themeDarkPreview
}
canvas.Refresh(s.preview)
}
func (s *Settings) load() {
err := s.loadFromFile(s.fyneSettings.StoragePath())
if err != nil {
fyne.LogError("Settings load error:", err)
}
}
func (s *Settings) loadFromFile(path string) error {
file, err := os.Open(path) // #nosec
if err != nil {
if os.IsNotExist(err) {
err := os.MkdirAll(filepath.Dir(path), 0700)
if err != nil {
return err
}
return nil
}
return err
}
decode := json.NewDecoder(file)
return decode.Decode(&s.fyneSettings)
}
func (s *Settings) save() error {
return s.saveToFile(s.fyneSettings.StoragePath())
}
func (s *Settings) saveToFile(path string) error {
err := os.MkdirAll(filepath.Dir(path), 0700)
if err != nil { // this is not an exists error according to docs
return err
}
data, err := json.Marshal(&s.fyneSettings)
if err != nil {
return err
}
return ioutil.WriteFile(path, data, 0644)
}