Files
AynaLivePlayer/app/fyne_demo/tutorials/dialog.go
2022-06-21 13:02:22 -07:00

186 lines
4.7 KiB
Go

package tutorials
import (
"errors"
"fmt"
"image/color"
"io/ioutil"
"log"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/validation"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/storage"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func confirmCallback(response bool) {
fmt.Println("Responded with", response)
}
func colorPicked(c color.Color, w fyne.Window) {
log.Println("Color picked:", c)
rectangle := canvas.NewRectangle(c)
size := 2 * theme.IconInlineSize()
rectangle.SetMinSize(fyne.NewSize(size, size))
dialog.ShowCustom("Color Picked", "Ok", rectangle, w)
}
// dialogScreen loads demos of the dialogs we support
func dialogScreen(win fyne.Window) fyne.CanvasObject {
return container.NewVScroll(container.NewVBox(
widget.NewButton("Info", func() {
dialog.ShowInformation("Information", "You should know this thing...", win)
}),
widget.NewButton("Error", func() {
err := errors.New("a dummy error message")
dialog.ShowError(err, win)
}),
widget.NewButton("Confirm", func() {
cnf := dialog.NewConfirm("Confirmation", "Are you enjoying this demo?", confirmCallback, win)
cnf.SetDismissText("Nah")
cnf.SetConfirmText("Oh Yes!")
cnf.Show()
}),
widget.NewButton("File Open With Filter (.jpg or .png)", func() {
fd := dialog.NewFileOpen(func(reader fyne.URIReadCloser, err error) {
if err != nil {
dialog.ShowError(err, win)
return
}
if reader == nil {
log.Println("Cancelled")
return
}
imageOpened(reader)
}, win)
fd.SetFilter(storage.NewExtensionFileFilter([]string{".png", ".jpg", ".jpeg"}))
fd.Show()
}),
widget.NewButton("File Save", func() {
dialog.ShowFileSave(func(writer fyne.URIWriteCloser, err error) {
if err != nil {
dialog.ShowError(err, win)
return
}
if writer == nil {
log.Println("Cancelled")
return
}
fileSaved(writer, win)
}, win)
}),
widget.NewButton("Folder Open", func() {
dialog.ShowFolderOpen(func(list fyne.ListableURI, err error) {
if err != nil {
dialog.ShowError(err, win)
return
}
if list == nil {
log.Println("Cancelled")
return
}
children, err := list.List()
if err != nil {
dialog.ShowError(err, win)
return
}
out := fmt.Sprintf("Folder %s (%d children):\n%s", list.Name(), len(children), list.String())
dialog.ShowInformation("Folder Open", out, win)
}, win)
}),
widget.NewButton("Color Picker", func() {
picker := dialog.NewColorPicker("Pick a Color", "What is your favorite color?", func(c color.Color) {
colorPicked(c, win)
}, win)
picker.Show()
}),
widget.NewButton("Advanced Color Picker", func() {
picker := dialog.NewColorPicker("Pick a Color", "What is your favorite color?", func(c color.Color) {
colorPicked(c, win)
}, win)
picker.Advanced = true
picker.Show()
}),
widget.NewButton("Form Dialog (Login Form)", func() {
username := widget.NewEntry()
username.Validator = validation.NewRegexp(`^[A-Za-z0-9_-]+$`, "username can only contain letters, numbers, '_', and '-'")
password := widget.NewPasswordEntry()
password.Validator = validation.NewRegexp(`^[A-Za-z0-9_-]+$`, "password can only contain letters, numbers, '_', and '-'")
remember := false
items := []*widget.FormItem{
widget.NewFormItem("Username", username),
widget.NewFormItem("Password", password),
widget.NewFormItem("Remember me", widget.NewCheck("", func(checked bool) {
remember = checked
})),
}
dialog.ShowForm("Login...", "Log In", "Cancel", items, func(b bool) {
if !b {
return
}
var rememberText string
if remember {
rememberText = "and remember this login"
}
log.Println("Please Authenticate", username.Text, password.Text, rememberText)
}, win)
}),
))
}
func imageOpened(f fyne.URIReadCloser) {
if f == nil {
log.Println("Cancelled")
return
}
defer f.Close()
showImage(f)
}
func fileSaved(f fyne.URIWriteCloser, w fyne.Window) {
defer f.Close()
_, err := f.Write([]byte("Written by Fyne demo\n"))
if err != nil {
dialog.ShowError(err, w)
}
err = f.Close()
if err != nil {
dialog.ShowError(err, w)
}
log.Println("Saved to...", f.URI())
}
func loadImage(f fyne.URIReadCloser) *canvas.Image {
data, err := ioutil.ReadAll(f)
if err != nil {
fyne.LogError("Failed to load image data", err)
return nil
}
res := fyne.NewStaticResource(f.URI().Name(), data)
return canvas.NewImageFromResource(res)
}
func showImage(f fyne.URIReadCloser) {
img := loadImage(f)
if img == nil {
return
}
img.FillMode = canvas.ImageFillOriginal
w := fyne.CurrentApp().NewWindow(f.URI().Name())
w.SetContent(container.NewScroll(img))
w.Resize(fyne.NewSize(320, 240))
w.Show()
}