├── Dummy.txt
├── .gitignore
├── Chapter08
├── say
│ ├── main.go
│ ├── say_other.go
│ └── say_darwin.go
├── test
│ ├── testdata
│ │ ├── default.png
│ │ └── typed_joe.png
│ ├── ui_test.go
│ └── ui.go
├── go.mod
└── go.sum
├── Chapter09
├── bundle
│ ├── main.go
│ └── data
│ │ ├── demo.svg
│ │ └── demo2.svg
├── package
│ ├── Icon.png
│ └── main.go
├── go.mod
├── hints
│ └── main.go
└── go.sum
├── Chapter02
├── go.mod
└── cgo.go
├── Chapter10
├── release
│ ├── Icon.png
│ └── main.go
├── go.mod
└── go.sum
├── Chapter03
├── go.mod
├── window
│ └── main.go
├── raster
│ └── main.go
├── canvas
│ └── main.go
├── example
│ └── main.go
└── go.sum
├── Chapter06
├── go.mod
├── listen.go
├── widget.go
├── preferences.go
├── example
│ └── main.go
└── go.sum
├── Chapter07
├── go.mod
├── indeterminate_check_box-24px.svg
├── submitentry.go
├── example
│ ├── theme.go
│ ├── main.go
│ └── message.go
├── tapicon.go
├── theme.go
├── threestate.go
└── go.sum
├── Chapter05
├── go.mod
├── data_test.go
├── data.go
├── main.go
└── go.sum
├── Chapter04
├── go.mod
├── example
│ ├── main.go
│ ├── layout.go
│ └── image.go
├── customlayout
│ └── main.go
└── go.sum
├── LICENSE
└── README.md
/Dummy.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .DS_Store
3 | fyne-cross
4 |
5 |
--------------------------------------------------------------------------------
/Chapter08/say/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func main() {
4 | say("Hello world!")
5 | }
6 |
--------------------------------------------------------------------------------
/Chapter09/bundle/main.go:
--------------------------------------------------------------------------------
1 | //go:generate fyne bundle -o bundled.go data
2 |
3 | package main
4 |
--------------------------------------------------------------------------------
/Chapter02/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter02
2 |
3 | go 1.16
4 |
--------------------------------------------------------------------------------
/Chapter09/package/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/HEAD/Chapter09/package/Icon.png
--------------------------------------------------------------------------------
/Chapter10/release/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/HEAD/Chapter10/release/Icon.png
--------------------------------------------------------------------------------
/Chapter03/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter03
2 |
3 | go 1.16
4 |
5 | require fyne.io/fyne/v2 v2.0.4
6 |
--------------------------------------------------------------------------------
/Chapter06/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter06
2 |
3 | go 1.16
4 |
5 | require fyne.io/fyne/v2 v2.0.4
6 |
--------------------------------------------------------------------------------
/Chapter07/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter07
2 |
3 | go 1.16
4 |
5 | require fyne.io/fyne/v2 v2.0.4
6 |
--------------------------------------------------------------------------------
/Chapter08/test/testdata/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/HEAD/Chapter08/test/testdata/default.png
--------------------------------------------------------------------------------
/Chapter09/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter09
2 |
3 | go 1.16
4 |
5 | require fyne.io/fyne/v2 v2.0.4
6 |
--------------------------------------------------------------------------------
/Chapter10/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter10
2 |
3 | go 1.16
4 |
5 | require fyne.io/fyne/v2 v2.0.4
6 |
--------------------------------------------------------------------------------
/Chapter08/test/testdata/typed_joe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/HEAD/Chapter08/test/testdata/typed_joe.png
--------------------------------------------------------------------------------
/Chapter03/window/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fyne.io/fyne/v2/app"
4 |
5 | func main() {
6 | a := app.New()
7 |
8 | w := a.NewWindow("Hello")
9 | w.ShowAndRun()
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter05/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter05
2 |
3 | go 1.16
4 |
5 | require (
6 | fyne.io/fyne/v2 v2.1.4
7 | github.com/stretchr/testify v1.7.0
8 | )
9 |
--------------------------------------------------------------------------------
/Chapter08/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter08
2 |
3 | go 1.16
4 |
5 | require (
6 | fyne.io/fyne/v2 v2.0.4
7 | github.com/stretchr/testify v1.7.0
8 | )
9 |
--------------------------------------------------------------------------------
/Chapter08/say/say_other.go:
--------------------------------------------------------------------------------
1 | // +build !darwin
2 |
3 | package main
4 |
5 | import (
6 | "log"
7 | "runtime"
8 | )
9 |
10 | func say(_ string) {
11 | log.Println("Say support is not available for", runtime.GOOS)
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter04/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/PacktPublishing/Building-Cross-Platform-GUI-Applications-with-Fyne/Chapter04
2 |
3 | go 1.16
4 |
5 | require (
6 | fyne.io/fyne/v2 v2.0.4
7 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
8 | )
9 |
--------------------------------------------------------------------------------
/Chapter07/indeterminate_check_box-24px.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter08/say/say_darwin.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 | "os/exec"
6 | )
7 |
8 | func say(text string) {
9 | cmd := exec.Command("say", text)
10 |
11 | err := cmd.Run()
12 | if err != nil {
13 | log.Println("Error saying text", err)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter02/cgo.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | /*
4 | #include
5 | #include
6 | void print_hello(const char *name) {
7 | printf("Hello %s!\n", name);
8 | }
9 | */
10 | import "C"
11 | import "unsafe"
12 |
13 | func main() {
14 | cName := C.CString("World")
15 | C.print_hello(cName)
16 |
17 | C.free(unsafe.Pointer(cName))
18 | }
19 |
--------------------------------------------------------------------------------
/Chapter06/listen.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "time"
6 |
7 | "fyne.io/fyne/v2/data/binding"
8 | )
9 |
10 | func main() {
11 | val := binding.NewString()
12 | callback := binding.NewDataListener(func() {
13 | str, _ := val.Get()
14 | fmt.Println("String changed to:", str)
15 | })
16 | val.AddListener(callback)
17 |
18 | time.Sleep(time.Millisecond * 100)
19 | }
20 |
--------------------------------------------------------------------------------
/Chapter09/package/main.go:
--------------------------------------------------------------------------------
1 | // Package main loads a very basic Hello World graphical application.
2 | package main
3 |
4 | import (
5 | "fyne.io/fyne/v2/app"
6 | "fyne.io/fyne/v2/container"
7 | "fyne.io/fyne/v2/widget"
8 | )
9 |
10 | func main() {
11 | a := app.New()
12 | w := a.NewWindow("Hello")
13 |
14 | hello := widget.NewLabel("Hello Fyne!")
15 | w.SetContent(container.NewVBox(
16 | hello,
17 | widget.NewButton("Hi!", func() {
18 | hello.SetText("Welcome :)")
19 | }),
20 | ))
21 |
22 | w.ShowAndRun()
23 | }
24 |
--------------------------------------------------------------------------------
/Chapter03/raster/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/canvas"
9 | )
10 |
11 | func main() {
12 | a := app.New()
13 |
14 | w := a.NewWindow("Pixels")
15 | w.SetContent(canvas.NewRasterWithPixels(generate))
16 | w.SetPadded(false)
17 | w.Resize(fyne.NewSize(40, 40))
18 | w.ShowAndRun()
19 | }
20 |
21 | func generate(x, y, w, h int) color.Color {
22 | if (x/20)%2 == (y/20)%2 {
23 | return color.White
24 | }
25 |
26 | return color.Black
27 | }
28 |
--------------------------------------------------------------------------------
/Chapter09/hints/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fyne.io/fyne/v2/app"
5 | "fyne.io/fyne/v2/container"
6 | "fyne.io/fyne/v2/theme"
7 | "fyne.io/fyne/v2/widget"
8 | )
9 |
10 | func makeTabs() *container.AppTabs {
11 | return container.NewAppTabs(
12 | container.NewTabItemWithIcon("Home", theme.HomeIcon(), widget.NewLabel("Tab 1")),
13 | container.NewTabItem("JustText", widget.NewLabel("Tab 2")),
14 | )
15 | }
16 |
17 | func main() {
18 | a := app.New()
19 | w := a.NewWindow("Tabs hints")
20 |
21 | w.SetContent(makeTabs())
22 | w.ShowAndRun()
23 | }
24 |
--------------------------------------------------------------------------------
/Chapter06/widget.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fyne.io/fyne/v2"
5 | "fyne.io/fyne/v2/app"
6 | "fyne.io/fyne/v2/container"
7 | "fyne.io/fyne/v2/data/binding"
8 | "fyne.io/fyne/v2/widget"
9 | )
10 |
11 | func makeUI() fyne.CanvasObject {
12 | f := binding.NewFloat()
13 |
14 | prog := widget.NewProgressBarWithData(f)
15 | slide := widget.NewSliderWithData(0, 1, f)
16 | slide.Step = 0.01
17 | btn := widget.NewButton("Set to 0.5", func() {
18 | _ = f.Set(0.5)
19 | })
20 |
21 | return container.NewVBox(prog, slide, btn)
22 | }
23 |
24 | func main() {
25 | a := app.New()
26 | w := a.NewWindow("Widget Binding")
27 |
28 | w.SetContent(makeUI())
29 | w.ShowAndRun()
30 | }
31 |
--------------------------------------------------------------------------------
/Chapter07/submitentry.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/widget"
9 | )
10 |
11 | type submitEntry struct {
12 | widget.Entry
13 | }
14 |
15 | func newSubmitEntry() *submitEntry {
16 | e := &submitEntry{}
17 | e.ExtendBaseWidget(e)
18 | return e
19 | }
20 |
21 | func (s *submitEntry) TypedKey(k *fyne.KeyEvent) {
22 | if k.Name == fyne.KeyReturn {
23 | log.Println("Submit data", s.Text)
24 | s.SetText("")
25 | return
26 | }
27 |
28 | s.Entry.TypedKey(k)
29 | }
30 |
31 | func main() {
32 | a := app.New()
33 | w := a.NewWindow("Submit Entry")
34 |
35 | w.SetContent(newSubmitEntry())
36 | w.ShowAndRun()
37 | }
38 |
--------------------------------------------------------------------------------
/Chapter08/test/ui_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "testing"
5 |
6 | "fyne.io/fyne/v2/test"
7 |
8 | "github.com/stretchr/testify/assert"
9 | )
10 |
11 | func TestGreeter_UpdateGreeting(t *testing.T) {
12 | g := &greeter{}
13 | g.makeUI()
14 | assert.Equal(t, "Hello World!", g.greeting.Text)
15 | assert.Equal(t, "", g.name.Text)
16 |
17 | test.Type(g.name, "Joe")
18 | test.Tap(g.updateGreeting)
19 | assert.Equal(t, "Hello Joe!", g.greeting.Text)
20 | }
21 |
22 | func TestGreeter_Render(t *testing.T) {
23 | g := &greeter{}
24 | w := test.NewWindow(g.makeUI())
25 | test.AssertImageMatches(t, "default.png", w.Canvas().Capture())
26 |
27 | test.Type(g.name, "Joe")
28 | test.Tap(g.updateGreeting)
29 | test.AssertImageMatches(t, "typed_joe.png", w.Canvas().Capture())
30 | }
31 |
--------------------------------------------------------------------------------
/Chapter10/release/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fyne.io/fyne/v2"
5 | "fyne.io/fyne/v2/app"
6 | "fyne.io/fyne/v2/dialog"
7 | "fyne.io/fyne/v2/widget"
8 | )
9 |
10 | const (
11 | serverKeyDevelopment = "DEVELOPMENT_KEY"
12 | serverKeyProduction = "PRODUCTION_KEY"
13 | )
14 |
15 | func connectToServer(a fyne.App, w fyne.Window) {
16 | key := serverKeyDevelopment
17 | if a.Settings().BuildType() == fyne.BuildRelease {
18 | key = serverKeyProduction
19 | }
20 |
21 | dialog.ShowInformation("Connect to server", "Using key: "+key, w)
22 | }
23 |
24 | func main() {
25 | a := app.New()
26 | w := a.NewWindow("Server key demo")
27 |
28 | w.SetContent(widget.NewLabel("Connecting..."))
29 | w.Resize(fyne.NewSize(300, 160))
30 | connectToServer(a, w)
31 | w.ShowAndRun()
32 | }
33 |
--------------------------------------------------------------------------------
/Chapter03/canvas/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/canvas"
9 | "fyne.io/fyne/v2/container"
10 | )
11 |
12 | func main() {
13 | a := app.New()
14 |
15 | w := a.NewWindow("Sign")
16 | w.SetContent(makeSign())
17 | w.SetPadded(false)
18 | w.Resize(fyne.NewSize(120, 120))
19 | w.ShowAndRun()
20 | }
21 |
22 | func makeSign() fyne.CanvasObject {
23 | bg := canvas.NewCircle(color.NRGBA{255, 0, 0, 255})
24 | bg.StrokeColor = color.White
25 | bg.StrokeWidth = 5
26 | bar := canvas.NewRectangle(color.White)
27 |
28 | c := container.NewWithoutLayout(bg, bar)
29 | bg.Resize(fyne.NewSize(100, 100))
30 | bg.Move(fyne.NewPos(10, 10))
31 | bar.Resize(fyne.NewSize(80, 20))
32 | bar.Move(fyne.NewPos(20, 50))
33 | return c
34 | }
35 |
--------------------------------------------------------------------------------
/Chapter06/preferences.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "fyne.io/fyne/v2/app"
7 | "fyne.io/fyne/v2/data/binding"
8 | )
9 |
10 | func main() {
11 | a := app.NewWithID("com.example.preferences")
12 |
13 | key := "demokey"
14 | a.Preferences().SetString(key, "somevalue")
15 | val := a.Preferences().String(key)
16 | fmt.Println("Value is:", val)
17 |
18 | key = "anotherkey"
19 | val = a.Preferences().String(key)
20 | fmt.Println("Value is:", val)
21 | val = a.Preferences().StringWithFallback(key, "missing")
22 | fmt.Println("Value is:", val)
23 |
24 | fmt.Println("Removing")
25 | a.Preferences().RemoveValue(key)
26 | val = a.Preferences().String(key)
27 | fmt.Println("Value is:", val)
28 |
29 | data := binding.BindPreferenceString("demokey", a.Preferences())
30 | val, _ = data.Get()
31 | fmt.Println("Bound value:", val)
32 | }
33 |
--------------------------------------------------------------------------------
/Chapter08/test/ui.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/container"
9 | "fyne.io/fyne/v2/widget"
10 | )
11 |
12 | type greeter struct {
13 | greeting *widget.Label
14 | name *widget.Entry
15 | updateGreeting *widget.Button
16 | }
17 |
18 | func (g *greeter) setGreeting() {
19 | text := fmt.Sprintf("Hello %s!", g.name.Text)
20 | g.greeting.SetText(text)
21 | }
22 |
23 | func (g *greeter) makeUI() fyne.CanvasObject {
24 | g.greeting = widget.NewLabel("Hello World!")
25 | g.name = widget.NewEntry()
26 | g.name.PlaceHolder = "Enter name"
27 | g.updateGreeting = widget.NewButton("Welcome", g.setGreeting)
28 | return container.NewVBox(g.greeting, g.name, g.updateGreeting)
29 | }
30 |
31 | func main() {
32 | a := app.New()
33 | w := a.NewWindow("Hello!")
34 |
35 | g := &greeter{}
36 | w.SetContent(g.makeUI())
37 | w.ShowAndRun()
38 | }
39 |
--------------------------------------------------------------------------------
/Chapter07/example/theme.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/theme"
8 | )
9 |
10 | type myTheme struct {
11 | }
12 |
13 | func (m *myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
14 | switch n {
15 | case theme.ColorNameBackground:
16 | if v == theme.VariantLight {
17 | return &color.NRGBA{0xcf, 0xd8, 0xdc, 0xff}
18 | }
19 | return &color.NRGBA{0x45, 0x5A, 0x64, 0xff}
20 | case theme.ColorNameFocus:
21 | return &color.NRGBA{0xff, 0xc1, 0x07, 0xff}
22 | }
23 |
24 | return theme.DefaultTheme().Color(n, v)
25 | }
26 |
27 | func (m *myTheme) Size(s fyne.ThemeSizeName) float32 {
28 | return theme.DefaultTheme().Size(s)
29 | }
30 |
31 | func (m *myTheme) Font(s fyne.TextStyle) fyne.Resource {
32 | return theme.DefaultTheme().Font(s)
33 | }
34 |
35 | func (m *myTheme) Icon(i fyne.ThemeIconName) fyne.Resource {
36 | return theme.DefaultTheme().Icon(i)
37 | }
38 |
--------------------------------------------------------------------------------
/Chapter05/data_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "testing"
5 |
6 | "github.com/stretchr/testify/assert"
7 | )
8 |
9 | func TestTaskList_Add(t *testing.T) {
10 | list := &taskList{}
11 | list.add(&task{title: "First"})
12 | assert.Equal(t, 1, len(list.tasks))
13 |
14 | list.add(&task{title: "Next"})
15 | assert.Equal(t, 2, len(list.tasks))
16 | assert.Equal(t, "Next", list.tasks[0].title)
17 | }
18 |
19 | func TestTaskList_Remaining(t *testing.T) {
20 | item := &task{title: "Remain"}
21 | list := &taskList{tasks: []*task{item}}
22 |
23 | remain := list.remaining()
24 | assert.Equal(t, 1, len(remain))
25 | done := list.done()
26 | assert.Equal(t, 0, len(done))
27 | }
28 |
29 | func TestTaskList_Done(t *testing.T) {
30 | item := &task{title: "Done", done: true}
31 | list := &taskList{tasks: []*task{item}}
32 |
33 | remain := list.remaining()
34 | assert.Equal(t, 0, len(remain))
35 | done := list.done()
36 | assert.Equal(t, 1, len(done))
37 | }
38 |
--------------------------------------------------------------------------------
/Chapter07/tapicon.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/container"
9 | "fyne.io/fyne/v2/theme"
10 | "fyne.io/fyne/v2/widget"
11 | )
12 |
13 | type tapIcon struct {
14 | widget.Icon
15 | tap func()
16 | }
17 |
18 | func newTapIcon(res fyne.Resource, fn func()) *tapIcon {
19 | i := &tapIcon{tap: fn}
20 | i.Resource = res
21 | i.ExtendBaseWidget(i)
22 | return i
23 | }
24 |
25 | func (t *tapIcon) Tapped(_ *fyne.PointEvent) {
26 | t.tap()
27 | }
28 |
29 | func makeUI() fyne.CanvasObject {
30 | return container.NewHBox(
31 | newTapIcon(theme.HomeIcon(), func() {
32 | log.Println("Go home")
33 | }),
34 | newTapIcon(theme.NavigateBackIcon(), func() {
35 | log.Println("Go back")
36 | }),
37 | newTapIcon(theme.NavigateNextIcon(), func() {
38 | log.Println("Go forward")
39 | }),
40 | )
41 | }
42 |
43 | func main() {
44 | a := app.New()
45 | w := a.NewWindow("Navigate")
46 |
47 | w.SetContent(makeUI())
48 | w.ShowAndRun()
49 | }
50 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Packt
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Chapter07/example/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fyne.io/fyne/v2"
5 | "fyne.io/fyne/v2/app"
6 | "fyne.io/fyne/v2/container"
7 | "fyne.io/fyne/v2/theme"
8 | "fyne.io/fyne/v2/widget"
9 | )
10 |
11 | func loadMessages() *fyne.Container {
12 | return container.NewVBox(
13 | newMessage("Hi there, how are you doing?", "Jim"),
14 | newMessage("Yeah good thanks, you?", myName),
15 | newMessage("Not bad thanks. Weekend!", "Jim"),
16 | newMessage("Want to visit the cinema?", "Jim"),
17 | newMessage("Great idea, what's showing?", myName),
18 | )
19 | }
20 |
21 | func makeUI() fyne.CanvasObject {
22 | list := loadMessages()
23 | msg := widget.NewEntry()
24 | send := widget.NewButtonWithIcon("", theme.MailSendIcon(), func() {
25 | list.Add(newMessage(msg.Text, myName))
26 | msg.SetText("")
27 | })
28 | input := container.NewBorder(nil, nil, nil, send, msg)
29 | return container.NewBorder(nil, input, nil, nil,
30 | container.NewVScroll(list))
31 | }
32 |
33 | func main() {
34 | a := app.New()
35 | a.Settings().SetTheme(&myTheme{})
36 | w := a.NewWindow("Messages")
37 |
38 | w.SetContent(makeUI())
39 | w.Resize(fyne.NewSize(160, 280))
40 | w.ShowAndRun()
41 | }
42 |
--------------------------------------------------------------------------------
/Chapter07/theme.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/container"
9 | "fyne.io/fyne/v2/theme"
10 | "fyne.io/fyne/v2/widget"
11 | )
12 |
13 | type myTheme struct {
14 | }
15 |
16 | func (t *myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
17 | if n == theme.ColorNameForeground {
18 | return &color.NRGBA{0xff, 0xc1, 0x07, 0xff}
19 | }
20 |
21 | return theme.DefaultTheme().Color(n, v)
22 | }
23 |
24 | func (t *myTheme) Size(n fyne.ThemeSizeName) float32 {
25 | return theme.DefaultTheme().Size(n)
26 | }
27 |
28 | func (t *myTheme) Font(fyne.TextStyle) fyne.Resource {
29 | return theme.DefaultTextMonospaceFont()
30 | }
31 |
32 | func (t *myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
33 | return theme.DefaultTheme().Icon(n)
34 | }
35 |
36 | func makeUI() fyne.CanvasObject {
37 | return container.NewVBox(
38 | widget.NewLabel("Hello there"),
39 | widget.NewEntry(),
40 | widget.NewButton("Tap me", func() {}),
41 | )
42 | }
43 |
44 | func main() {
45 | a := app.New()
46 | a.Settings().SetTheme(&myTheme{})
47 | w := a.NewWindow("Theme")
48 |
49 | w.SetContent(makeUI())
50 | w.ShowAndRun()
51 | }
52 |
--------------------------------------------------------------------------------
/Chapter04/example/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "flag"
5 | "log"
6 | "os"
7 | "path/filepath"
8 |
9 | "fyne.io/fyne/v2"
10 | "fyne.io/fyne/v2/app"
11 | "fyne.io/fyne/v2/dialog"
12 | "fyne.io/fyne/v2/storage"
13 | )
14 |
15 | func chooseDirectory(w fyne.Window) {
16 | dialog.ShowFolderOpen(func(dir fyne.ListableURI, err error) {
17 | if err != nil {
18 | dialog.ShowError(err, w)
19 | return
20 | }
21 | w.SetContent(makeUI(dir))
22 | }, w)
23 | }
24 |
25 | func startDirectory() fyne.ListableURI {
26 | flag.Parse()
27 | if len(flag.Args()) < 1 {
28 | cwd, _ := os.Getwd()
29 | list, _ := storage.ListerForURI(storage.NewFileURI(cwd))
30 | return list
31 | }
32 |
33 | dir, err := filepath.Abs(flag.Arg(0))
34 | if err != nil {
35 | log.Println("Could not find directory", dir)
36 | cwd, _ := os.Getwd()
37 | list, _ := storage.ListerForURI(storage.NewFileURI(cwd))
38 | return list
39 | }
40 |
41 | list, _ := storage.ListerForURI(storage.NewFileURI(dir))
42 | return list
43 | }
44 |
45 | func main() {
46 | a := app.New()
47 | w := a.NewWindow("Image Browser")
48 |
49 | w.SetContent(makeUI(startDirectory()))
50 | w.Resize(fyne.NewSize(480, 360))
51 |
52 | w.SetMainMenu(fyne.NewMainMenu(fyne.NewMenu("File",
53 | fyne.NewMenuItem("Open Directory...", func() {
54 | chooseDirectory(w)
55 | }))))
56 |
57 | go doLoadImages()
58 | w.ShowAndRun()
59 | }
60 |
--------------------------------------------------------------------------------
/Chapter05/data.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "time"
4 |
5 | const (
6 | dateFormat = "02 Jan 06 15:04"
7 |
8 | lowPriority = 0
9 | midPriority = 1
10 | highPriority = 2
11 | )
12 |
13 | func dateValidator(text string) error {
14 | _, err := time.Parse(dateFormat, text)
15 | return err
16 | }
17 |
18 | type task struct {
19 | title, description string
20 | done bool
21 | category string
22 | priority int
23 | due *time.Time
24 | completion float64
25 | }
26 |
27 | type taskList struct {
28 | tasks []*task
29 | }
30 |
31 | func (l *taskList) add(t *task) {
32 | l.tasks = append([]*task{t}, l.tasks...)
33 | }
34 |
35 | func (l *taskList) remaining() []*task {
36 | var items []*task
37 | for _, task := range l.tasks {
38 | if !task.done {
39 | items = append(items, task)
40 | }
41 | }
42 |
43 | return items
44 | }
45 |
46 | func (l *taskList) done() []*task {
47 | var items []*task
48 | for _, task := range l.tasks {
49 | if task.done {
50 | items = append(items, task)
51 | }
52 | }
53 |
54 | return items
55 | }
56 |
57 | func dummyData() *taskList {
58 | return &taskList{
59 | tasks: []*task{
60 | {title: "Nearly done",
61 | description: `You can tick my checkbox
62 | and I will be marked as
63 | done and disappear`},
64 | {title: "Functions",
65 | description: `Tap the plus icon above to add
66 | a new task, or tap the minus
67 | icon to remove this one`},
68 | }}
69 | }
70 |
--------------------------------------------------------------------------------
/Chapter04/example/layout.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "image/color"
6 | "log"
7 | "strings"
8 |
9 | "fyne.io/fyne/v2"
10 | "fyne.io/fyne/v2/canvas"
11 | "fyne.io/fyne/v2/container"
12 | )
13 |
14 | func isImage(file fyne.URI) bool {
15 | ext := strings.ToLower(file.Extension())
16 |
17 | return ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif"
18 | }
19 |
20 | func filterImages(files []fyne.URI) []fyne.URI {
21 | images := []fyne.URI{}
22 |
23 | for _, file := range files {
24 | if isImage(file) {
25 | images = append(images, file)
26 | }
27 | }
28 |
29 | return images
30 | }
31 |
32 | func makeImageGrid(images []fyne.URI) fyne.CanvasObject {
33 | items := []fyne.CanvasObject{}
34 |
35 | for _, item := range images {
36 | img := makeImageItem(item)
37 | items = append(items, img)
38 | }
39 |
40 | cellSize := fyne.NewSize(160, 120)
41 | return container.NewGridWrap(cellSize, items...)
42 | }
43 |
44 | func makeStatus(dir fyne.ListableURI, images []fyne.URI) fyne.CanvasObject {
45 | status := fmt.Sprintf("Directory %s, %d items", dir.Name(), len(images))
46 | return canvas.NewText(status, color.Gray{128})
47 | }
48 |
49 | func makeUI(dir fyne.ListableURI) fyne.CanvasObject {
50 | list, err := dir.List()
51 | if err != nil {
52 | log.Println("Error listing directory", err)
53 | }
54 | images := filterImages(list)
55 | status := makeStatus(dir, images)
56 | content := container.NewScroll(makeImageGrid(images))
57 | return container.NewBorder(nil, status, nil, nil, status, content)
58 | }
59 |
--------------------------------------------------------------------------------
/Chapter04/customlayout/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/canvas"
9 | "fyne.io/fyne/v2/container"
10 | )
11 |
12 | type diagonal struct{}
13 |
14 | func (d *diagonal) MinSize(items []fyne.CanvasObject) fyne.Size {
15 | total := fyne.NewSize(0, 0)
16 | for _, obj := range items {
17 | if !obj.Visible() {
18 | continue
19 | }
20 |
21 | total = total.Add(obj.MinSize())
22 | }
23 |
24 | return total
25 | }
26 |
27 | func (d *diagonal) Layout(items []fyne.CanvasObject, size fyne.Size) {
28 | topLeft := fyne.NewPos(0, 0)
29 |
30 | visibleCount := float32(0)
31 | for _, obj := range items {
32 | if !obj.Visible() {
33 | continue
34 | }
35 |
36 | visibleCount++
37 | }
38 |
39 | min := d.MinSize(items)
40 | extraX := (size.Width - min.Width) / visibleCount
41 | extraY := (size.Height - min.Height) / visibleCount
42 |
43 | for _, obj := range items {
44 | if !obj.Visible() {
45 | continue
46 | }
47 |
48 | size := obj.MinSize()
49 | size = size.Add(fyne.NewSize(extraX, extraY))
50 |
51 | obj.Move(topLeft)
52 | obj.Resize(size)
53 | topLeft = topLeft.Add(fyne.NewPos(size.Width,
54 | size.Height))
55 | }
56 | }
57 |
58 | func main() {
59 | a := app.New()
60 | w := a.NewWindow("Layout")
61 |
62 | item1 := canvas.NewRectangle(color.Black)
63 | item2 := canvas.NewRectangle(&color.Gray{128})
64 | item3 := canvas.NewRectangle(color.Black)
65 | myContainer := container.New(&diagonal{}, item1, item2, item3)
66 |
67 | w.SetContent(myContainer)
68 | w.Resize(fyne.NewSize(120, 120))
69 | w.ShowAndRun()
70 | }
71 |
--------------------------------------------------------------------------------
/Chapter09/bundle/data/demo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter09/bundle/data/demo2.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter07/example/message.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/canvas"
8 | "fyne.io/fyne/v2/theme"
9 | "fyne.io/fyne/v2/widget"
10 | )
11 |
12 | const (
13 | myName = "Me"
14 | messageIndent = 20
15 | )
16 |
17 | type message struct {
18 | widget.BaseWidget
19 |
20 | text, from string
21 | }
22 |
23 | func newMessage(text, name string) *message {
24 | m := &message{text: text, from: name}
25 | m.ExtendBaseWidget(m)
26 | return m
27 | }
28 |
29 | func (m *message) CreateRenderer() fyne.WidgetRenderer {
30 | text := widget.NewLabel(m.text)
31 | text.Wrapping = fyne.TextWrapWord
32 | return &messageRender{msg: m, bg: &canvas.Rectangle{},
33 | txt: text}
34 | }
35 |
36 | type messageRender struct {
37 | msg *message
38 |
39 | bg *canvas.Rectangle
40 | txt *widget.Label
41 | }
42 |
43 | func (r *messageRender) messageMinSize(s fyne.Size) fyne.Size {
44 | fitSize := s.Subtract(fyne.NewSize(messageIndent, 0))
45 | r.txt.Resize(fitSize.Max(r.txt.MinSize())) // have the wrap code run
46 | return r.txt.MinSize()
47 | }
48 |
49 | func (r *messageRender) Layout(s fyne.Size) {
50 | itemSize := r.messageMinSize(s)
51 | itemSize = itemSize.Max(fyne.NewSize(s.Width-messageIndent, s.Height))
52 |
53 | bgPos := fyne.NewPos(0, 0)
54 | if r.msg.from == myName {
55 | r.txt.Alignment = fyne.TextAlignTrailing
56 | r.bg.FillColor = theme.PrimaryColorNamed(theme.ColorBlue)
57 | bgPos = fyne.NewPos(s.Width-itemSize.Width, 0)
58 | } else {
59 | r.txt.Alignment = fyne.TextAlignLeading
60 | r.bg.FillColor = theme.PrimaryColorNamed(theme.ColorGreen)
61 | }
62 |
63 | r.txt.Move(bgPos)
64 | r.bg.Resize(itemSize)
65 | r.bg.Move(bgPos)
66 | }
67 |
68 | func (r *messageRender) MinSize() fyne.Size {
69 | itemSize := r.messageMinSize(r.msg.Size())
70 | return itemSize.Add(fyne.NewSize(messageIndent, 0))
71 | }
72 |
73 | func (r *messageRender) Refresh() {
74 | }
75 |
76 | func (r *messageRender) BackgroundColor() color.Color {
77 | return color.Transparent
78 | }
79 |
80 | func (r *messageRender) Destroy() {
81 | }
82 |
83 | func (r *messageRender) Objects() []fyne.CanvasObject {
84 | return []fyne.CanvasObject{r.bg, r.txt}
85 | }
86 |
--------------------------------------------------------------------------------
/Chapter07/threestate.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 | "log"
6 |
7 | "fyne.io/fyne/v2"
8 | "fyne.io/fyne/v2/app"
9 | "fyne.io/fyne/v2/canvas"
10 | "fyne.io/fyne/v2/theme"
11 | "fyne.io/fyne/v2/widget"
12 | )
13 |
14 | type CheckState int
15 |
16 | const (
17 | CheckOff CheckState = iota
18 | CheckOn
19 | CheckIndeterminate
20 | )
21 |
22 | type ThreeStateCheck struct {
23 | widget.BaseWidget
24 | State CheckState
25 | }
26 |
27 | func NewThreeStateCheck() *ThreeStateCheck {
28 | c := &ThreeStateCheck{}
29 | c.ExtendBaseWidget(c)
30 | return c
31 | }
32 |
33 | func (c *ThreeStateCheck) Tapped(_ *fyne.PointEvent) {
34 | if c.State == CheckIndeterminate {
35 | c.State = CheckOff
36 | } else {
37 | c.State++
38 | }
39 |
40 | c.Refresh()
41 | }
42 |
43 | func (c *ThreeStateCheck) CreateRenderer() fyne.WidgetRenderer {
44 | r := &threeStateRender{check: c, img: &canvas.Image{}}
45 | r.updateImage()
46 | return r
47 | }
48 |
49 | type threeStateRender struct {
50 | check *ThreeStateCheck
51 | img *canvas.Image
52 | }
53 |
54 | func (t *threeStateRender) BackgroundColor() color.Color {
55 | return color.Transparent
56 | }
57 |
58 | func (t *threeStateRender) Destroy() {
59 | }
60 |
61 | func (t *threeStateRender) Layout(_ fyne.Size) {
62 | t.img.Resize(t.MinSize())
63 | }
64 |
65 | func (t *threeStateRender) MinSize() fyne.Size {
66 | return fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize())
67 | }
68 |
69 | func (t *threeStateRender) Objects() []fyne.CanvasObject {
70 | return []fyne.CanvasObject{t.img}
71 | }
72 |
73 | func (t *threeStateRender) Refresh() {
74 | t.updateImage()
75 | }
76 |
77 | func (t *threeStateRender) updateImage() {
78 | defer t.img.Refresh()
79 |
80 | switch t.check.State {
81 | case CheckOn:
82 | t.img.Resource = theme.CheckButtonCheckedIcon()
83 | case CheckIndeterminate:
84 | res, err := fyne.LoadResourceFromPath("indeterminate_check_box-24px.svg")
85 | if err != nil {
86 | log.Println("Failed to load indeterminate resource")
87 | return
88 | }
89 |
90 | t.img.Resource = theme.NewThemedResource(res)
91 | default:
92 | t.img.Resource = theme.CheckButtonIcon()
93 | }
94 | }
95 |
96 | func main() {
97 | a := app.New()
98 | w := a.NewWindow("Three State")
99 |
100 | w.SetContent(NewThreeStateCheck())
101 | w.ShowAndRun()
102 | }
103 |
--------------------------------------------------------------------------------
/Chapter04/example/image.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image"
5 | "image/color"
6 | "log"
7 |
8 | "fyne.io/fyne/v2"
9 | "fyne.io/fyne/v2/canvas"
10 | "fyne.io/fyne/v2/container"
11 | "fyne.io/fyne/v2/storage"
12 |
13 | "github.com/nfnt/resize"
14 | )
15 |
16 | type bgImageLoad struct {
17 | uri fyne.URI
18 | img *canvas.Image
19 | }
20 |
21 | var loads = make(chan bgImageLoad, 1024)
22 |
23 | func scaleImage(img image.Image) image.Image {
24 | return resize.Thumbnail(320, 240, img, resize.Lanczos3)
25 | }
26 |
27 | func doLoadImage(u fyne.URI, img *canvas.Image) {
28 | read, err := storage.OpenFileFromURI(u)
29 | if err != nil {
30 | log.Println("Error opening image", err)
31 | return
32 | }
33 |
34 | defer read.Close()
35 | raw, _, err := image.Decode(read)
36 | if err != nil {
37 | log.Println("Error decoding image", err)
38 | return
39 | }
40 |
41 | img.Image = scaleImage(raw)
42 | img.Refresh()
43 | }
44 |
45 | func doLoadImages() {
46 | for load := range loads {
47 | doLoadImage(load.uri, load.img)
48 | }
49 | }
50 |
51 | func loadImage(u fyne.URI) fyne.CanvasObject {
52 | img := canvas.NewImageFromResource(nil)
53 | img.FillMode = canvas.ImageFillContain
54 |
55 | loads <- bgImageLoad{u, img}
56 | return img
57 | }
58 |
59 | type itemLayout struct {
60 | bg, text, gradient fyne.CanvasObject
61 | }
62 |
63 | func (i *itemLayout) MinSize(_ []fyne.CanvasObject) fyne.Size {
64 | return fyne.NewSize(160, 120)
65 | }
66 |
67 | func (i *itemLayout) Layout(objs []fyne.CanvasObject, size fyne.Size) {
68 | textHeight := float32(22)
69 | for _, o := range objs {
70 | if o == i.text {
71 | o.Move(fyne.NewPos(0, size.Height-textHeight))
72 | o.Resize(fyne.NewSize(size.Width, textHeight))
73 | } else if o == i.bg {
74 | o.Move(fyne.NewPos(0, size.Height-textHeight))
75 | o.Resize(fyne.NewSize(size.Width, textHeight))
76 | } else if o == i.gradient {
77 | o.Move(fyne.NewPos(0, size.Height-(textHeight*1.5)))
78 | o.Resize(fyne.NewSize(size.Width, textHeight/2))
79 | } else {
80 | o.Move(fyne.NewPos(0, 0))
81 | o.Resize(size)
82 | }
83 | }
84 | }
85 |
86 | func makeImageItem(u fyne.URI) fyne.CanvasObject {
87 | label := canvas.NewText(u.Name(), color.Gray{128})
88 | label.Alignment = fyne.TextAlignCenter
89 |
90 | bgColor := &color.NRGBA{R: 255, G: 255, B: 255, A: 224}
91 | bg := canvas.NewRectangle(bgColor)
92 | fade := canvas.NewLinearGradient(color.Transparent, bgColor, 0)
93 | return container.New(&itemLayout{text: label, bg: bg, gradient: fade},
94 | loadImage(u), bg, fade, label)
95 | }
96 |
--------------------------------------------------------------------------------
/Chapter06/example/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 | "strconv"
6 | "time"
7 |
8 | "fyne.io/fyne/v2"
9 | "fyne.io/fyne/v2/app"
10 | "fyne.io/fyne/v2/canvas"
11 | "fyne.io/fyne/v2/container"
12 | "fyne.io/fyne/v2/data/binding"
13 | "fyne.io/fyne/v2/theme"
14 | "fyne.io/fyne/v2/widget"
15 | )
16 |
17 | func dateKey(t time.Time) string {
18 | return t.Format("2006-01-02") // ISO 8601 date, YYYY-MM-DD
19 | }
20 |
21 | func dateForMonday() time.Time {
22 | day := time.Now().Weekday()
23 | if day == time.Sunday {
24 | return time.Now().Add(-1 * time.Hour * 24 * 6) // Monday of previous week
25 | }
26 |
27 | daysSinceMonday := time.Duration(day - 1)
28 | dayLength := time.Hour * 24
29 | return time.Now().Add(-1 * dayLength * daysSinceMonday) // Monday is day 1
30 | }
31 |
32 | func historyLabel(date time.Time, p fyne.Preferences) fyne.CanvasObject {
33 | data := binding.BindPreferenceInt(dateKey(date), p)
34 |
35 | str := binding.IntToStringWithFormat(data, "%dml")
36 | num := widget.NewLabelWithData(str)
37 | num.Alignment = fyne.TextAlignTrailing
38 | return num
39 | }
40 |
41 | func makeUI(p fyne.Preferences) fyne.CanvasObject {
42 | total := binding.BindPreferenceInt(dateKey(time.Now()), p)
43 |
44 | label := canvas.NewText("0ml", theme.PrimaryColor())
45 | label.TextSize = 42
46 | label.Alignment = fyne.TextAlignCenter
47 | totalStr := binding.IntToStringWithFormat(total, "%dml")
48 | totalStr.AddListener(binding.NewDataListener(
49 | func() {
50 | label.Text, _ = totalStr.Get()
51 | label.Refresh()
52 | }))
53 |
54 | date := widget.NewLabel(time.Now().Format("Mon Jan 2 2006"))
55 | date.Alignment = fyne.TextAlignCenter
56 |
57 | amount := widget.NewEntry()
58 | amount.SetText("250")
59 | input := container.NewBorder(nil, nil, nil, widget.NewLabel("ml"), amount)
60 | add := widget.NewButton("Add", func() {
61 | inc, err := strconv.Atoi(amount.Text)
62 | if err != nil {
63 | log.Println("Failed to parse integer: " + amount.Text)
64 | return
65 | }
66 |
67 | current, _ := total.Get()
68 | total.Set(current + inc)
69 | })
70 |
71 | weekStart := dateForMonday()
72 | dayLength := time.Hour * 24
73 | history := container.NewGridWithColumns(2,
74 | widget.NewLabel("Monday"), historyLabel(weekStart, p),
75 | widget.NewLabel("Tuesday"), historyLabel(weekStart.Add(dayLength), p),
76 | widget.NewLabel("Wednesday"), historyLabel(weekStart.Add(dayLength*2), p),
77 | widget.NewLabel("Thursday"), historyLabel(weekStart.Add(dayLength*3), p),
78 | widget.NewLabel("Friday"), historyLabel(weekStart.Add(dayLength*4), p),
79 | widget.NewLabel("Saturday"), historyLabel(weekStart.Add(dayLength*5), p),
80 | widget.NewLabel("Sunday"), historyLabel(weekStart.Add(dayLength*6), p),
81 | )
82 |
83 | return container.NewVBox(label, date,
84 | container.NewGridWithColumns(2, input, add),
85 | widget.NewCard("History", "Totals this week", history))
86 | }
87 |
88 | func main() {
89 | a := app.NewWithID("com.example.watertracker")
90 | w := a.NewWindow("Water Tracker")
91 |
92 | pref := a.Preferences()
93 | w.SetContent(makeUI(pref))
94 | w.ShowAndRun()
95 | }
96 |
--------------------------------------------------------------------------------
/Chapter03/example/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 | "time"
6 |
7 | "fyne.io/fyne/v2"
8 | "fyne.io/fyne/v2/app"
9 | "fyne.io/fyne/v2/canvas"
10 | "fyne.io/fyne/v2/container"
11 | )
12 |
13 | type snakePart struct {
14 | x, y float32
15 | }
16 |
17 | type moveType int
18 |
19 | const (
20 | moveUp moveType = iota
21 | moveDown
22 | moveLeft
23 | moveRight
24 | )
25 |
26 | var (
27 | snakeParts []snakePart
28 | game *fyne.Container
29 | head *canvas.Rectangle
30 | move = moveUp
31 | )
32 |
33 | func keyTyped(e *fyne.KeyEvent) {
34 | switch e.Name {
35 | case fyne.KeyUp:
36 | move = moveUp
37 | case fyne.KeyDown:
38 | move = moveDown
39 | case fyne.KeyLeft:
40 | move = moveLeft
41 | case fyne.KeyRight:
42 | move = moveRight
43 | }
44 | }
45 |
46 | func main() {
47 | a := app.New()
48 |
49 | w := a.NewWindow("Snake")
50 | w.Resize(fyne.NewSize(200, 200))
51 | w.SetFixedSize(true)
52 |
53 | game = setupGame()
54 | w.SetContent(game)
55 | w.Canvas().SetOnTypedKey(keyTyped)
56 |
57 | go runGame()
58 | w.ShowAndRun()
59 | }
60 |
61 | func refreshGame() {
62 | for i, seg := range snakeParts {
63 | rect := game.Objects[i]
64 | rect.Move(fyne.NewPos(seg.x*10, seg.y*10))
65 | }
66 |
67 | game.Refresh()
68 | }
69 |
70 | func runGame() {
71 | nextPart := snakePart{snakeParts[0].x, snakeParts[0].y - 1}
72 | for {
73 | oldPos := fyne.NewPos(snakeParts[0].x*10, snakeParts[0].y*10)
74 | newPos := fyne.NewPos(nextPart.x*10, nextPart.y*10)
75 | canvas.NewPositionAnimation(oldPos, newPos, time.Millisecond*250, func(p fyne.Position) {
76 | head.Move(p)
77 | canvas.Refresh(head)
78 | }).Start()
79 |
80 | end := len(snakeParts) - 1
81 | canvas.NewPositionAnimation(fyne.NewPos(snakeParts[end].x*10, snakeParts[end].y*10),
82 | fyne.NewPos(snakeParts[end-1].x*10, snakeParts[end-1].y*10), time.Millisecond*250,
83 | func(p fyne.Position) {
84 | tail := game.Objects[end]
85 | tail.Move(p)
86 | canvas.Refresh(tail)
87 | }).Start()
88 |
89 | time.Sleep(time.Millisecond * 250)
90 | for i := len(snakeParts) - 1; i >= 1; i-- {
91 | snakeParts[i] = snakeParts[i-1]
92 | }
93 | snakeParts[0] = nextPart
94 | refreshGame()
95 | switch move {
96 | case moveUp:
97 | nextPart = snakePart{nextPart.x, nextPart.y - 1}
98 | case moveDown:
99 | nextPart = snakePart{nextPart.x, nextPart.y + 1}
100 | case moveLeft:
101 | nextPart = snakePart{nextPart.x - 1, nextPart.y}
102 | case moveRight:
103 | nextPart = snakePart{nextPart.x + 1, nextPart.y}
104 | }
105 | }
106 | }
107 |
108 | func setupGame() *fyne.Container {
109 | var segments []fyne.CanvasObject
110 | for i := 0; i < 10; i++ {
111 | seg := snakePart{9, float32(5 + i)}
112 | snakeParts = append(snakeParts, seg)
113 |
114 | r := canvas.NewRectangle(&color.RGBA{G: 0x66, A: 0xff})
115 | r.Resize(fyne.NewSize(10, 10))
116 | r.Move(fyne.NewPos(90, float32(50+i*10)))
117 | segments = append(segments, r)
118 | }
119 |
120 | head = canvas.NewRectangle(&color.RGBA{G: 0x66, A: 0xff})
121 | head.Resize(fyne.NewSize(10, 10))
122 | head.Move(fyne.NewPos(snakeParts[0].x*10, snakeParts[0].y*10))
123 | segments = append(segments, head)
124 | return container.NewWithoutLayout(segments...)
125 | }
126 |
--------------------------------------------------------------------------------
/Chapter05/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "time"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/app"
8 | "fyne.io/fyne/v2/container"
9 | "fyne.io/fyne/v2/theme"
10 | "fyne.io/fyne/v2/widget"
11 | )
12 |
13 | type taskApp struct {
14 | data *taskList
15 | visible []*task
16 | current *task
17 |
18 | tasks *widget.List
19 | title, description, due *widget.Entry
20 | category *widget.Select
21 | priority *widget.RadioGroup
22 | completion *widget.Slider
23 | }
24 |
25 | func (a *taskApp) makeUI() fyne.CanvasObject {
26 | a.tasks = widget.NewList(
27 | func() int {
28 | return len(a.visible)
29 | },
30 | func() fyne.CanvasObject {
31 | return container.NewHBox(widget.NewCheck("",
32 | func(bool) {}),
33 | widget.NewLabel("TODO Item x"))
34 | },
35 | func(i int, c fyne.CanvasObject) {
36 | task := a.visible[i]
37 | box := c.(*fyne.Container)
38 | check := box.Objects[0].(*widget.Check)
39 | check.Checked = task.done
40 | check.OnChanged = func(done bool) {
41 | task.done = done
42 | a.refreshData()
43 | }
44 | label := box.Objects[1].(*widget.Label)
45 | label.SetText(task.title)
46 | })
47 | a.tasks.OnSelected = func(id int) {
48 | a.setTask(a.visible[id])
49 | }
50 |
51 | a.title = widget.NewEntry()
52 | a.title.OnChanged = func(text string) {
53 | if a.current == nil {
54 | return
55 | }
56 |
57 | a.current.title = text
58 | a.tasks.Refresh()
59 | }
60 | a.description = widget.NewMultiLineEntry()
61 | a.description.OnChanged = func(text string) {
62 | if a.current == nil {
63 | return
64 | }
65 |
66 | a.current.description = text
67 | }
68 |
69 | a.category = widget.NewSelect([]string{"Home"}, func(cat string) {
70 | if a.current == nil {
71 | return
72 | }
73 |
74 | a.current.category = cat
75 | })
76 | a.priority = widget.NewRadioGroup([]string{"Low", "Mid", "High"}, func(pri string) {
77 | if a.current == nil {
78 | return
79 | }
80 |
81 | if pri == "Mid" {
82 | a.current.priority = midPriority
83 | } else if pri == "High" {
84 | a.current.priority = highPriority
85 | } else {
86 | a.current.priority = lowPriority
87 | }
88 | })
89 | a.due = widget.NewEntry()
90 | a.due.Validator = dateValidator
91 | a.due.OnChanged = func(str string) {
92 | if a.current == nil {
93 | return
94 | }
95 |
96 | if str == "" {
97 | a.current.due = nil
98 | } else {
99 | date, err := time.Parse(dateFormat, str)
100 | if err != nil {
101 | a.current.due = &date
102 | }
103 | }
104 | }
105 |
106 | a.completion = widget.NewSlider(0, 100)
107 | a.completion.OnChanged = func(done float64) {
108 | if a.current == nil {
109 | return
110 | }
111 |
112 | a.current.completion = done
113 | }
114 |
115 | details := widget.NewForm(
116 | widget.NewFormItem("Title", a.title),
117 | widget.NewFormItem("Description", a.description),
118 | widget.NewFormItem("Category", a.category),
119 | widget.NewFormItem("Priority", a.priority),
120 | widget.NewFormItem("Due", a.due),
121 | widget.NewFormItem("Completion", a.completion),
122 | )
123 |
124 | toolbar := widget.NewToolbar(
125 | widget.NewToolbarAction(theme.ContentAddIcon(), func() {
126 | task := &task{title: "New task"}
127 | a.data.add(task)
128 | a.setTask(task)
129 | a.refreshData()
130 | }),
131 | )
132 | return container.NewBorder(toolbar, nil, a.tasks, nil, details)
133 | }
134 |
135 | func (a *taskApp) refreshData() {
136 | // hide done
137 | a.visible = a.data.remaining()
138 | a.tasks.Refresh()
139 | }
140 |
141 | func (a *taskApp) setTask(t *task) {
142 | a.current = t
143 |
144 | a.title.SetText(t.title)
145 | a.description.SetText(t.description)
146 | a.category.SetSelected(t.category)
147 | if t.priority == midPriority {
148 | a.priority.SetSelected("Mid")
149 | } else if t.priority == highPriority {
150 | a.priority.SetSelected("High")
151 | } else {
152 | a.priority.SetSelected("Low")
153 | }
154 | a.due.SetText(formatDate(t.due))
155 | a.completion.Value = t.completion
156 | a.completion.Refresh()
157 | }
158 |
159 | func formatDate(date *time.Time) string {
160 | if date == nil {
161 | return ""
162 | }
163 | return date.Format(dateFormat)
164 | }
165 |
166 | func main() {
167 | a := app.New()
168 | w := a.NewWindow("Task List")
169 |
170 | data := dummyData()
171 | tasks := &taskApp{data: data, visible: data.remaining()}
172 | w.SetContent(tasks.makeUI())
173 | if len(data.remaining()) > 0 {
174 | tasks.setTask(data.remaining()[0])
175 | }
176 | w.ShowAndRun()
177 | }
178 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Building Cross-Platform GUI Applications with Fyne
2 |
3 |
4 |
5 | This is the code repository for [Building Cross-Platform GUI Applications with Fyne](https://www.packtpub.com/product/building-cross-platform-gui-applications-with-fyne/9781800563162?utm_source=github&utm_medium=repository&utm_campaign=9781800563162), published by Packt.
6 |
7 | **Create beautiful, platform-agnostic graphical applications using Fyne and the Go programming language**
8 |
9 | ## What is this book about?
10 | The history of graphical application development is long and complicated, with various development challenges that persist to this day. The mix of technologies involved and the need to use different programming languages lead to a very steep learning curve for developers looking to build applications across multiple platforms.
11 |
12 | This book covers the following exciting features:
13 | Become well-versed with the history of GUI development and how Fyne and the Golang programming language make it easier
14 | Explore how the Fyne toolkit is architected and the various modules are provided
15 | Discover how Fyne apps can be tested and constructed using best practices
16 | Construct five complete applications and deploy them to your devices
17 | Customize the design of your apps by extending widgets and themes
18 | Understand the separation and presentation of data and how to test and build applications that present dynamic data
19 |
20 | If you feel this book is for you, get your [copy](https://www.amazon.com/dp/1800563167) today!
21 |
22 |
24 |
25 | ## Instructions and Navigations
26 | All of the code is organized into folders. For example, Chapter02.
27 |
28 | The code will look like the following:
29 | ```
30 | package main
31 | import (
32 | "log"
33 | "os/exec"
34 | )
35 | ```
36 |
37 | **Following is what you need for this book:**
38 | This Fyne-Golang GUI book is for developers from any background who are looking to build cross-platform applications with a modern toolkit. It will also be useful for Go developers who are looking to explore graphical apps and GUI developers looking for a new toolkit for cross-platform development. Basic knowledge of Graphical User Interface (GUI) development is assumed (although a brief history is also included in the book). The book also features a short introduction to the Go language as a quick refresher.
39 |
40 | With the following software and hardware list you can run all code files present in the book (Chapter 1-10).
41 | ### Software and Hardware List
42 | | Chapter | Software required | OS required |
43 | | -------- | ------------------------------------ | ----------------------------------- |
44 | | 1 | Go 1.12 (or newer) | Windows, Mac OS X, and Linux (Any) |
45 | | 2 | Fyne 2.0 | iOS, iPad or Android |
46 |
47 | We also provide a PDF file that has color images of the screenshots/diagrams used in this book. [Click here to download it](https://static.packt-cdn.com/downloads/9781800563162_ColorImages.pdf).
48 |
49 | ### Related products
50 | * Mastering Go - Second Edition [[Packt]](https://www.packtpub.com/product/mastering-go-second-edition/9781838559335?utm_source=github&utm_medium=repository&utm_campaign=9781838559335) [[Amazon]](https://www.amazon.com/dp/1838559337)
51 |
52 | * Hands-On High Performance with Go [[Packt]](https://www.packtpub.com/product/hands-on-high-performance-with-go/9781789805789?utm_source=github&utm_medium=repository&utm_campaign=9781789805789) [[Amazon]](https://www.amazon.com/dp/B08576P94D)
53 |
54 |
55 | ## Corrections
56 |
57 | ### V2 imports
58 |
59 | In the first edition of this book the import path for fyne is listed as `fyne.io/fyne`. However since the January release of v2.0.0 the imports should be `fyne.io/fyne/v2`.
60 |
61 | For example, on page 49 the line:
62 |
63 | ```go
64 | import "fyne.io/fyne/app"
65 | ```
66 |
67 | should read
68 |
69 | ```go
70 | import "fyne.io/fyne/v2/app"
71 | ```
72 |
73 | In addition to the code changes commands that install Fyne tools are impacted, so to install the `fyne` tool the correct command on page 52 would be:
74 |
75 | ```
76 | go get fyne.io/fyne/v2/cmd/fyne_demo
77 | ```
78 |
79 | With these changes applied, or by using the code directly in this repository, the examples will all operate as described in the book content.
80 |
81 | ### Chapter 5
82 |
83 | Page 121 example of pop-up menu code should read:
84 |
85 | ```go
86 | menu := fyne.NewMenu("",
87 | fyne.NewMenuItem("Item 1", func() {}),
88 | fyne.NewMenuItem("Item 2", func() {}),
89 | )
90 | pos := fyne.NewPos(20, 20)
91 | widget.ShowPopUpMenuAtPosition(menu, w.Canvas(), pos)
92 | ```
93 | ### Chapter 7
94 |
95 | References to `ThemeColourName` should read `ThemeColorName`
96 |
97 |
98 | ### Appendix C: Cross-Compiling
99 |
100 | On pages 282 and 283 where macOS cross-compiling commands are described they assume an Intel based Apple device.
101 | When working on an M1 or M2 processor you will beed to add a `GOARCH=amd64` parameter alongside `GOOS` to specify an intel based 64bit application build.
102 |
103 |
104 | ## Get to Know the Author
105 | **Andrew Williams** graduated from the University of Edinburgh in 2003 with a bachelor’s degree, with honors, in computer science. After university, he went to work as a software engineer and has gained over 15 years of commercial software development experience across a variety of programming languages, including Java, C, Objective-C, and Go. Andrew has spent many years working as a CTO with many early-stage and growing software start-ups. He has been a core developer in large open source projects, including Enlightenment, EFL, and Maven, as well as involved in maintaining various community websites and tutorials. Andrew’s passion for building tools and services that make software development simpler led him to start authoring books on the subject.
106 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/Chapter03/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
44 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
45 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
46 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
47 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
48 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
49 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
52 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
54 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
57 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
67 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
68 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
70 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
72 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
73 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
79 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 |
--------------------------------------------------------------------------------
/Chapter06/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
44 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
45 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
46 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
47 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
48 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
49 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
52 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
54 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
57 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
67 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
68 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
70 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
72 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
73 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
79 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 |
--------------------------------------------------------------------------------
/Chapter07/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
44 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
45 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
46 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
47 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
48 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
49 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
52 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
54 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
57 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
67 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
68 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
70 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
72 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
73 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
79 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 |
--------------------------------------------------------------------------------
/Chapter09/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
44 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
45 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
46 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
47 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
48 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
49 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
52 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
54 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
57 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
67 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
68 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
70 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
72 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
73 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
79 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 |
--------------------------------------------------------------------------------
/Chapter10/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
44 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
45 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
46 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
47 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
48 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
49 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
51 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
52 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
53 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
54 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
57 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
58 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
65 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
66 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
67 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
68 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
69 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
70 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
72 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
73 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
79 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 |
--------------------------------------------------------------------------------
/Chapter04/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
29 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
31 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
32 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
34 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
35 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
36 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
37 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
39 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
41 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
42 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
43 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
44 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
45 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
46 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
47 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
48 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
49 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
51 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
52 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
53 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
54 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
57 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
58 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
60 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
61 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
65 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
66 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
67 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
68 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
69 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
70 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
72 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
73 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
76 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
78 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
79 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
80 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
81 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
82 |
--------------------------------------------------------------------------------
/Chapter08/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.0.4 h1:eDGaPGzeR4qNqWuAp9Li1kY4eVIHldCkf42KMakKIK4=
2 | fyne.io/fyne/v2 v2.0.4/go.mod h1:nNpgL7sZkDVLraGtQII2ArNRnnl6kHup/KfQRxIhbvs=
3 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
4 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
9 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
10 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
11 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
12 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a h1:3TAJhl8vXyli0tooKB0vd6gLCyBdWL4QEYbDoJpHEZk=
13 | github.com/fyne-io/mobile v0.1.3-0.20210412090810-650a3139866a/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY=
14 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
15 | github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
16 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
18 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
19 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
20 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
21 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
22 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
23 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
24 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27 | github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng=
28 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
29 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
30 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
31 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
36 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
37 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
38 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
39 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
40 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
41 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
42 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
43 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
44 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
45 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
46 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
47 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
48 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
49 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
50 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
51 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
52 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
53 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
54 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
55 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
56 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
57 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
58 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
59 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
60 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
61 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
62 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
63 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
64 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8=
65 | golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
66 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
67 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
68 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
69 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
70 | golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
71 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
72 | golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
73 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
74 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
75 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
76 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
77 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
78 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
79 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
80 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
81 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
82 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
83 |
--------------------------------------------------------------------------------
/Chapter05/go.sum:
--------------------------------------------------------------------------------
1 | fyne.io/fyne/v2 v2.1.4 h1:bt1+28++kAzRzPB0GM2EuSV4cnl8rXNX4cjfd8G06Rc=
2 | fyne.io/fyne/v2 v2.1.4/go.mod h1:p+E/Dh+wPW8JwR2DVcsZ9iXgR9ZKde80+Y+40Is54AQ=
3 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4 | github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
5 | github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
6 | github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
7 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
8 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
10 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA=
12 | github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8=
13 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
14 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
15 | github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f h1:s0O46d8fPwk9kU4k1jj76wBquMVETx7uveQD9MCIQoU=
16 | github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f/go.mod h1:wjpnOv6ONl2SuJSxqCPVaPZibGFdSci9HFocT9qtVYM=
17 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be h1:Z28GdQBfKOL8tNHjvaDn3wHDO7AzTRkmAXvHvnopp98=
18 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
19 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
20 | github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
21 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
22 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8=
23 | github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
24 | github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
25 | github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
26 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
27 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
28 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
29 | github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b/go.mod h1:PRq09yoB+Q2OJReAmwzKivcYyremnibWGbK7WfftHzc=
30 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
31 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
32 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
33 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
34 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
35 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
36 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
37 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
38 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
39 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
40 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
41 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM=
42 | github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
43 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM=
44 | github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
45 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
46 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
47 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
48 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
49 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
50 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
51 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
52 | github.com/yuin/goldmark v1.3.8 h1:Nw158Q8QN+CPgTmVRByhVwapp8Mm1e2blinhmx4wx5E=
53 | github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
54 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
55 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
56 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
57 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
58 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
59 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
60 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
61 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
62 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
63 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
64 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
65 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
66 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
67 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
68 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
69 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
70 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
71 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
72 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
73 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
74 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
75 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
76 | golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
77 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
78 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
79 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
80 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
81 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
82 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
83 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
84 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
85 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
86 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
87 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
88 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
89 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
90 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
91 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
92 |
--------------------------------------------------------------------------------