Dialogs on DialogBase with focusable panels that harbor parked focus, popovers on PopoverBase, bubbles, drawers, sheets, a lightbox, an RPG dialogue box, notifications, a pause menu and a dithered title card. Kit.Cue moves from feedback to pixel.
225 lines
8.1 KiB
Go
225 lines
8.1 KiB
Go
package gallery
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/egoist/mygo/ui"
|
|
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/display"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/icon"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/input"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/overlay"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/text"
|
|
)
|
|
|
|
var overlayEntries = []Entry{
|
|
{176, "Dialog", "对话框", "overlay", "A titled window over a checkered backdrop. Escape or a click outside closes it.", demoDialog},
|
|
{177, "AlertDialog", "警告框", "overlay", "Icon, title, message, buttons. Enter presses the highlighted one.", demoAlertDialog},
|
|
{178, "ConfirmDialog", "确认框", "overlay", "ARE YOU SURE? The hand starts on NO, to be safe.", demoConfirmDialog},
|
|
{179, "Popover", "弹出层", "overlay", "A panel under its button, notched toward it. It flips above near the bottom.", demoPopover},
|
|
{180, "Tooltip", "提示气泡", "overlay", "Rest the pointer half a second, or Tab in, and a bubble says what it does.", demoTooltip},
|
|
{181, "Drawer", "抽屉", "overlay", "A panel that slides in from an edge, four steps at a time.", demoDrawer},
|
|
{182, "Sheet", "底部面板", "overlay", "Rises from the bottom. Drag its bar down to put it away.", demoSheet},
|
|
{183, "HoverCard", "悬停卡片", "overlay", "Point at a name to see the card; the card stays while you read it.", demoHoverCard},
|
|
{184, "Lightbox", "灯箱", "overlay", "Pictures over a dark veil. ◀ ▶ or the arrows turn them.", demoLightbox},
|
|
{185, "DialogueBox", "剧情对话", "overlay", "An RPG text box. A press shows the line, the next turns the page.", demoDialogueBox},
|
|
}
|
|
|
|
type overlayDemo struct {
|
|
dialog, alert, confirm, popover, sheet, lightbox, choice, pause, prompt, saving bool
|
|
drawer display.Side
|
|
drawerOpen bool
|
|
picture, page, step, cue int
|
|
name string
|
|
notes []overlay.Notification
|
|
spot bool
|
|
since time.Time
|
|
}
|
|
|
|
func overlayState(c *ui.Context) *overlayDemo {
|
|
return ui.Local(c.Root(), demoKey("overlay"), func() overlayDemo { return overlayDemo{step: 1} })
|
|
}
|
|
|
|
func demoDialog(c *ui.Context, log func(string)) {
|
|
s := overlayState(c)
|
|
if input.Button(c, "OPEN QUEST", input.ButtonOptions{}).Clicked {
|
|
s.dialog = true
|
|
log("open")
|
|
}
|
|
r := overlay.Dialog(c, "Quest", &s.dialog, overlay.DialogOptions{Actions: []string{"DECLINE", "ACCEPT"}}, func() {
|
|
text.Paragraph(c, "Bring three slime jellies to the baker. Reward: one warm pie.", text.ParagraphOptions{})
|
|
})
|
|
if r.Action >= 0 {
|
|
log([]string{"declined", "accepted"}[r.Action])
|
|
}
|
|
if r.Closed {
|
|
log("closed")
|
|
}
|
|
}
|
|
|
|
func demoAlertDialog(c *ui.Context, log func(string)) {
|
|
s := overlayState(c)
|
|
if input.Button(c, "FIGHT BOSS", input.ButtonOptions{Variant: input.Danger}).Clicked {
|
|
s.alert = true
|
|
log("open")
|
|
}
|
|
buttons := []string{"NO", "HEAL"}
|
|
r := overlay.AlertDialog(c, "Low HP", "You have 3 HP. Heal before the boss?", &s.alert, overlay.AlertDialogOptions{Buttons: buttons, Default: 1})
|
|
if r.Pressed >= 0 {
|
|
log(buttons[r.Pressed])
|
|
}
|
|
if r.Closed {
|
|
log("closed")
|
|
}
|
|
}
|
|
|
|
func demoConfirmDialog(c *ui.Context, log func(string)) {
|
|
s := overlayState(c)
|
|
if input.Button(c, "DROP SWORD", input.ButtonOptions{}).Clicked {
|
|
s.confirm = true
|
|
log("open")
|
|
}
|
|
r := overlay.ConfirmDialog(c, "Drop the legendary sword in the lava?", &s.confirm, overlay.ConfirmDialogOptions{})
|
|
if r.Confirmed {
|
|
log("dropped. it is gone.")
|
|
}
|
|
if r.Canceled {
|
|
log("kept the sword")
|
|
}
|
|
}
|
|
|
|
func demoPopover(c *ui.Context, log func(string)) {
|
|
s := overlayState(c)
|
|
b := input.Button(c, "MAP", input.ButtonOptions{Icon: icon.Map})
|
|
if b.Clicked {
|
|
s.popover = !s.popover
|
|
log(fmt.Sprintf("open %v", s.popover))
|
|
}
|
|
overlay.Popover(c, "Map", b.Element, &s.popover, overlay.PopoverOptions{}, func() {
|
|
pixel.Text(c, "You are here: Town.", pixel.TextOptions{})
|
|
pixel.Text(c, "Cave: 2 screens west.", pixel.TextOptions{Slot: pixel.Faint})
|
|
})
|
|
}
|
|
|
|
func demoTooltip(c *ui.Context, log func(string)) {
|
|
k := pixel.K(c)
|
|
ui.Row(c).Gap(k.D(6)).Children(func() {
|
|
for _, t := range []struct {
|
|
art *pixel.Sprite
|
|
name string
|
|
tip string
|
|
}{{icon.Sword, "Attack", "Swing for 12 damage."}, {icon.Shield, "Defend", "Halve damage this turn."}, {icon.Flame, "Magic", "Costs 4 MP."}} {
|
|
overlay.Tooltip(c, t.tip, overlay.TooltipOptions{}, func() {
|
|
if input.IconButton(c, t.art, t.name, input.IconButtonOptions{}).Clicked {
|
|
log(t.name)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
func demoDrawer(c *ui.Context, log func(string)) {
|
|
k := pixel.K(c)
|
|
s := overlayState(c)
|
|
ui.Row(c).Gap(k.D(6)).Children(func() {
|
|
if input.Button(c, "◀ LEFT", input.ButtonOptions{}).Clicked {
|
|
s.drawer, s.drawerOpen = display.Left, true
|
|
log("open left")
|
|
}
|
|
if input.Button(c, "RIGHT ▶", input.ButtonOptions{}).Clicked {
|
|
s.drawer, s.drawerOpen = display.Right, true
|
|
log("open right")
|
|
}
|
|
})
|
|
if overlay.Drawer(c, "Party", &s.drawerOpen, overlay.DrawerOptions{Side: s.drawer, Size: 120}, func() {
|
|
pixel.Text(c, "PARTY", pixel.TextOptions{Slot: pixel.Faint})
|
|
for _, h := range []string{"Aria LV 7", "Brom LV 5", "Cyra LV 9"} {
|
|
pixel.Text(c, h, pixel.TextOptions{})
|
|
}
|
|
}).Closed {
|
|
log("drawer closed")
|
|
}
|
|
}
|
|
|
|
func demoSheet(c *ui.Context, log func(string)) {
|
|
k := pixel.K(c)
|
|
s := overlayState(c)
|
|
if input.Button(c, "OPTIONS", input.ButtonOptions{Icon: icon.Settings}).Clicked {
|
|
s.sheet = true
|
|
log("open")
|
|
}
|
|
if overlay.Sheet(c, "Options", &s.sheet, overlay.SheetOptions{}, func() {
|
|
ui.Column(c).Gap(k.D(4)).Children(func() {
|
|
pixel.Text(c, "Music: ON", pixel.TextOptions{})
|
|
pixel.Text(c, "Text speed: FAST", pixel.TextOptions{})
|
|
pixel.Text(c, "Drag the bar down to close.", pixel.TextOptions{Slot: pixel.Faint})
|
|
})
|
|
}).Closed {
|
|
log("sheet closed")
|
|
}
|
|
}
|
|
|
|
func demoHoverCard(c *ui.Context, log func(string)) {
|
|
k := pixel.K(c)
|
|
overlay.HoverCard(c, "Aria", overlay.HoverCardOptions{}, func() {
|
|
pixel.Text(c, "@aria", pixel.TextOptions{Slot: pixel.Info})
|
|
}, func() {
|
|
ui.Row(c).Gap(k.D(6)).Children(func() {
|
|
display.Avatar(c, "Aria", display.AvatarOptions{})
|
|
ui.Column(c).Children(func() {
|
|
pixel.Text(c, "Aria", pixel.TextOptions{})
|
|
pixel.Text(c, "Knight · LV 7", pixel.TextOptions{Slot: pixel.Faint})
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
var scenes = []struct {
|
|
art *pixel.Sprite
|
|
name string
|
|
}{{icon.Home, "Town"}, {icon.Map, "Field"}, {icon.Skull, "Cave"}}
|
|
|
|
func demoLightbox(c *ui.Context, log func(string)) {
|
|
k := pixel.K(c)
|
|
s := overlayState(c)
|
|
ui.Row(c).Gap(k.D(4)).Children(func() {
|
|
for i, sc := range scenes {
|
|
if input.IconButton(c, sc.art, sc.name, input.IconButtonOptions{Size: input.Large}).Clicked {
|
|
s.picture, s.lightbox = i, true
|
|
log("open " + sc.name)
|
|
}
|
|
}
|
|
})
|
|
r := overlay.Lightbox(c, "Postcards", len(scenes), &s.picture, &s.lightbox, overlay.LightboxOptions{}, func(i int) {
|
|
ui.Column(c).AlignItems(ui.Center).Padding(k.D(8)).Draw(func(p *ui.Painter, r ui.Rect) {
|
|
g := k.Canvas(p, r)
|
|
g.Frame(0, 0, g.W, g.H, pixel.Window, pixel.Well)
|
|
}).Children(func() {
|
|
display.Icon(c, scenes[i].art, display.IconOptions{Scale: 4, Label: scenes[i].name})
|
|
pixel.Text(c, scenes[i].name, pixel.TextOptions{})
|
|
})
|
|
})
|
|
if r.Changed {
|
|
log("showing " + scenes[s.picture].name)
|
|
}
|
|
if r.Closed {
|
|
log("closed")
|
|
}
|
|
}
|
|
|
|
func demoDialogueBox(c *ui.Context, log func(string)) {
|
|
s := overlayState(c)
|
|
pages := []string{"It is dangerous to go alone!", "Take this. It is a stick.", "Mostly harmless. Good luck."}
|
|
r := overlay.DialogueBox(c, pages, &s.page, overlay.DialogueBoxOptions{Name: "OLD MAN", Portrait: icon.User})
|
|
r.Element.Width(pixel.K(c).D(280))
|
|
if r.Changed {
|
|
log(fmt.Sprintf("page %d", s.page+1))
|
|
}
|
|
if r.Done {
|
|
s.page = 0
|
|
log("the old man starts over")
|
|
}
|
|
}
|