Noah Petherbridge
dc2695cfc9
* Add the other trapdoor directions: Left, Right and Up. * UI: Show a color square in each Palette Swatch button in Edit Mode. * Instead of just the label like "solid", "fire", "decoration" it also shows a square box colored as the swatch color. The label and box are left-aligned in the button. * Minor Play Mode physics update: * The player jump is now limited: they may only continue to move upwards for 20 ticks, after which they must touch ground before jumping again. * Remove the "press Down to move down" button. Only gravity moves you down. * Fix a crash in the Editor Mode when you dragged doodads on top of each other. Source of bug was the loopActorCollision() function, which only should be useful to Play Mode, and it expected the scripting engine to be attached to the Canvas. In EditorMode there is no scripting engine.
117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
package doodle
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.kirsle.net/apps/doodle/lib/render"
|
|
"git.kirsle.net/apps/doodle/lib/ui"
|
|
"git.kirsle.net/apps/doodle/pkg/balance"
|
|
"git.kirsle.net/apps/doodle/pkg/log"
|
|
)
|
|
|
|
// SetupPalette sets up the palette panel.
|
|
func (u *EditorUI) SetupPalette(d *Doodle) *ui.Window {
|
|
window := ui.NewWindow("Palette")
|
|
window.ConfigureTitle(balance.TitleConfig)
|
|
window.TitleBar().Font = balance.TitleFont
|
|
window.Configure(ui.Config{
|
|
Background: balance.WindowBackground,
|
|
BorderColor: balance.WindowBorder,
|
|
})
|
|
|
|
// Doodad frame.
|
|
{
|
|
frame, err := u.setupDoodadFrame(d.Engine, window)
|
|
if err != nil {
|
|
d.Flash(err.Error())
|
|
}
|
|
|
|
// Even if there was an error (userdir.ListDoodads couldn't read the
|
|
// config folder on disk or whatever) the Frame is still valid but
|
|
// empty, which is still the intended behavior.
|
|
u.DoodadTab = frame
|
|
u.DoodadTab.Hide()
|
|
window.Pack(u.DoodadTab, ui.Pack{
|
|
Anchor: ui.N,
|
|
Fill: true,
|
|
})
|
|
}
|
|
|
|
// Color Palette Frame.
|
|
u.PaletteTab = u.setupPaletteFrame(window)
|
|
window.Pack(u.PaletteTab, ui.Pack{
|
|
Anchor: 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)
|
|
|
|
// Handler function for the radio buttons being clicked.
|
|
onClick := func(p render.Point) {
|
|
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
|
|
}
|
|
log.Info("Set swatch: %s", swatch)
|
|
u.Canvas.SetSwatch(swatch)
|
|
}
|
|
|
|
// 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))
|
|
|
|
colorFrame := ui.NewFrame(fmt.Sprintf("Swatch(%s) Color Box", swatch.Name))
|
|
colorFrame.Configure(ui.Config{
|
|
Width: 16,
|
|
Height: 16,
|
|
Background: swatch.Color,
|
|
BorderSize: 1,
|
|
BorderStyle: ui.BorderSunken,
|
|
})
|
|
swFrame.Pack(colorFrame, ui.Pack{
|
|
Anchor: ui.W,
|
|
})
|
|
|
|
label := ui.NewLabel(ui.Label{
|
|
Text: swatch.Name,
|
|
Font: balance.StatusFont,
|
|
})
|
|
label.Font.Color = swatch.Color.Darken(128)
|
|
swFrame.Pack(label, ui.Pack{
|
|
Anchor: ui.W,
|
|
})
|
|
|
|
btn := ui.NewRadioButton("palette", &u.selectedSwatch, swatch.Name, swFrame)
|
|
btn.Handle(ui.Click, onClick)
|
|
u.Supervisor.Add(btn)
|
|
|
|
btn.Compute(u.d.Engine)
|
|
swFrame.Configure(ui.Config{
|
|
Height: label.Size().H,
|
|
|
|
// TODO: magic number, trying to left-align
|
|
// the label by making the frame as wide as possible.
|
|
Width: paletteWidth - 16,
|
|
})
|
|
|
|
frame.Pack(btn, ui.Pack{
|
|
Anchor: ui.N,
|
|
Fill: true,
|
|
PadY: 4,
|
|
})
|
|
}
|
|
}
|
|
|
|
return frame
|
|
}
|