This repository has been archived on 2023-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
tomo-old/popups/dialog.go

89 lines
2.3 KiB
Go
Raw Normal View History

2023-01-12 10:51:42 -07:00
package popups
import "image"
2023-01-12 10:51:42 -07:00
import "git.tebibyte.media/sashakoshka/tomo"
2023-02-01 23:48:16 -07:00
import "git.tebibyte.media/sashakoshka/tomo/elements"
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
2023-01-12 10:51:42 -07:00
2023-01-12 12:12:24 -07:00
// DialogKind defines the semantic role of a dialog window.
2023-01-12 10:51:42 -07:00
type DialogKind int
const (
DialogKindInfo DialogKind = iota
DialogKindQuestion
DialogKindWarning
DialogKindError
)
2023-04-15 17:14:44 -06:00
// TODO: add ability to have an icon for buttons
2023-01-12 12:12:24 -07:00
// Button represents a dialog response button.
2023-01-12 10:51:42 -07:00
type Button struct {
2023-01-12 12:12:24 -07:00
// Name contains the text to display on the button.
2023-01-12 10:51:42 -07:00
Name string
2023-01-12 12:12:24 -07:00
// OnPress specifies a callback to run when the button is pressed. If
// this callback is nil, the button will appear disabled.
2023-01-12 10:51:42 -07:00
OnPress func ()
}
// NewDialog creates a new modal dialog window and returns it. If parent is nil,
// the dialog will just be a normal window
2023-01-12 12:12:24 -07:00
func NewDialog (
kind DialogKind,
2023-03-30 21:19:04 -06:00
parent tomo.Window,
2023-01-12 12:12:24 -07:00
title, message string,
buttons ...Button,
) (
2023-03-30 21:19:04 -06:00
window tomo.Window,
2023-01-12 12:12:24 -07:00
) {
if parent == nil {
window, _ = tomo.NewWindow(image.Rectangle { })
} else {
window, _ = parent.NewModal(image.Rectangle { })
}
2023-01-12 10:51:42 -07:00
window.SetTitle(title)
2023-04-15 17:14:44 -06:00
box := containers.NewVBox(true, true)
messageRow := containers.NewHBox(false, true)
controlRow := containers.NewHBox(false, true)
2023-03-04 21:09:46 -07:00
2023-03-30 23:06:29 -06:00
iconId := tomo.IconInformation
2023-03-04 21:09:46 -07:00
switch kind {
2023-03-30 23:06:29 -06:00
case DialogKindInfo: iconId = tomo.IconInformation
case DialogKindQuestion: iconId = tomo.IconQuestion
case DialogKindWarning: iconId = tomo.IconWarning
case DialogKindError: iconId = tomo.IconError
2023-03-04 21:09:46 -07:00
}
2023-04-15 17:14:44 -06:00
messageRow.Adopt(elements.NewIcon(iconId, tomo.IconSizeLarge), false)
messageRow.Adopt(elements.NewLabel(message, false), true)
2023-03-04 21:09:46 -07:00
2023-04-15 17:14:44 -06:00
controlRow.Adopt(elements.NewSpacer(false), true)
2023-01-12 10:51:42 -07:00
if len(buttons) == 0 {
2023-03-30 21:19:04 -06:00
button := elements.NewButton("OK")
2023-03-30 23:06:29 -06:00
button.SetIcon(tomo.IconYes)
2023-01-12 10:51:42 -07:00
button.OnClick(window.Close)
2023-04-15 17:14:44 -06:00
controlRow.Adopt(button, false)
button.Focus()
2023-01-12 10:51:42 -07:00
} else {
2023-03-30 21:19:04 -06:00
var button *elements.Button
2023-01-12 10:51:42 -07:00
for _, buttonDescriptor := range buttons {
2023-03-30 21:19:04 -06:00
button = elements.NewButton(buttonDescriptor.Name)
2023-01-12 10:51:42 -07:00
button.SetEnabled(buttonDescriptor.OnPress != nil)
button.OnClick (func () {
buttonDescriptor.OnPress()
window.Close()
})
2023-04-15 17:14:44 -06:00
controlRow.Adopt(button, false)
2023-01-12 10:51:42 -07:00
}
button.Focus()
2023-01-12 10:51:42 -07:00
}
2023-04-15 17:14:44 -06:00
box.Adopt(messageRow, true)
box.Adopt(controlRow, false)
window.Adopt(box)
2023-01-12 10:51:42 -07:00
window.Show()
2023-01-12 12:12:24 -07:00
return
2023-01-12 10:51:42 -07:00
}