doodle/pkg/editor_ui_palette.go
Noah Petherbridge d6f86487f5 Horizontal Toolbars Option for Editor Mode
On small screen sizes like the Pinephone, the toolbars in the Level
Editor are best made horizontal across the top and bottom of the screen
leaving more room for the drawing.

Enable it with a boolProp for now, and then reopen the level editor:

    boolProp horizontalToolbars true

When launching `doodle -w mobile` it will automatically enable this
option.
2021-06-13 21:23:26 -07:00

117 lines
2.7 KiB
Go

package doodle
import (
"fmt"
"git.kirsle.net/apps/doodle/pkg/balance"
"git.kirsle.net/apps/doodle/pkg/log"
"git.kirsle.net/go/ui"
)
// Width of the panel frame.
var paletteWidth = 50
// SetupPalette sets up the palette panel.
func (u *EditorUI) SetupPalette(d *Doodle) *ui.Window {
window := ui.NewWindow("Palette")
window.ConfigureTitle(balance.TitleConfig)
_, label := window.TitleBar()
label.Font = balance.TitleFont
window.Configure(ui.Config{
Background: balance.WindowBackground,
BorderColor: balance.WindowBorder,
})
// Color Palette Frame.
u.PaletteTab = u.setupPaletteFrame(window)
window.Pack(u.PaletteTab, ui.Pack{
Side: ui.N,
Fill: true,
})
return window
}
// setupPaletteFrame configures the Color Palette tab for Edit Mode.
// This is a subroutine of editor_ui.go#SetupPalette()
func (u *EditorUI) setupPaletteFrame(window *ui.Window) *ui.Frame {
frame := ui.NewFrame("Palette Tab")
frame.SetBackground(balance.WindowBackground)
var (
packAlign = ui.N
packConfig = ui.Pack{
Side: packAlign,
Fill: true,
PadY: 4,
}
tooltipEdge = ui.Left
buttonSize = 32
)
if balance.HorizontalToolbars {
packAlign = ui.W
packConfig = ui.Pack{
Side: packAlign,
Fill: true,
PadX: 2,
}
tooltipEdge = ui.Top
buttonSize = 24
}
// Handler function for the radio buttons being clicked.
onClick := func(ed ui.EventData) error {
name := u.selectedSwatch
swatch, ok := u.Canvas.Palette.Get(name)
if !ok {
log.Error("Palette onClick: couldn't get swatch named '%s' from palette", name)
return nil
}
log.Info("Set swatch: %s", swatch)
u.Canvas.SetSwatch(swatch)
return nil
}
// Draw the radio buttons for the palette.
if u.Canvas != nil && u.Canvas.Palette != nil {
for _, swatch := range u.Canvas.Palette.Swatches {
swFrame := ui.NewFrame(fmt.Sprintf("Swatch(%s) Button Frame", swatch.Name))
swFrame.Configure(ui.Config{
Width: buttonSize,
Height: buttonSize,
Background: swatch.Color,
})
btn := ui.NewRadioButton("palette", &u.selectedSwatch, swatch.Name, swFrame)
btn.Handle(ui.Click, onClick)
u.Supervisor.Add(btn)
// Add a tooltip showing the swatch attributes.
ui.NewTooltip(btn, ui.Tooltip{
Text: fmt.Sprintf("Name: %s\nAttributes: %s", swatch.Name, swatch.Attributes()),
Edge: tooltipEdge,
})
btn.Compute(u.d.Engine)
frame.Pack(btn, packConfig)
}
}
// Draw the Edit Palette button.
btn := ui.NewButton("Edit Palette", ui.NewLabel(ui.Label{
Text: "Edit",
Font: balance.MenuFont,
}))
btn.Handle(ui.Click, func(ed ui.EventData) error {
u.OpenPaletteWindow()
return nil
})
u.Supervisor.Add(btn)
btn.Compute(u.d.Engine)
frame.Pack(btn, packConfig)
return frame
}