Noah Petherbridge
190d4be1b6
* When editing a doodad in the Editor Mode, the toolbar has a "Lyr." button that opens the Layers window. * The Layers window allows switching the active doodad layer that you are drawing on, as well as create and rename layers. * With this feature, Doodads may be fully drawn in-game, including adding alternate named layers for animations and multiple-state doodads. * Update the Pager component to have a configurable MaxPageButtons. Controls that have more pages than this limit will stop having buttons drawn after the limit. The "Forward" and "Next" buttons can still navigate into the extra pages. * Refactored and centralized the various popup windows in Editor Mode into editor_ui_popups.go; the SetupPopups() and various methods such as ShowPaletteWindow() and ShowDoodadDropper() make management of popups simple for the editor_ui! * The Menu Bar in Editor Mode now has context-specific tools in the Tools menu: the Doodad Dropper for levels and Layers for doodads. * Bugfix the Palette Editor window to work equally between Levels and Doodads, by only having it care about the Palette and not the Level that owns it.
211 lines
5.4 KiB
Go
211 lines
5.4 KiB
Go
package doodle
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.kirsle.net/apps/doodle/pkg/doodads"
|
|
"git.kirsle.net/apps/doodle/pkg/level"
|
|
"git.kirsle.net/apps/doodle/pkg/log"
|
|
"git.kirsle.net/apps/doodle/pkg/windows"
|
|
"git.kirsle.net/go/render"
|
|
"git.kirsle.net/go/ui"
|
|
)
|
|
|
|
/*
|
|
Functions to manage popup windows in the Editor Mode, such as:
|
|
|
|
* The Palette Editor
|
|
* The Layers Window
|
|
* etc.
|
|
*/
|
|
|
|
// Opens the "Layers" window (for editing doodads)
|
|
func (u *EditorUI) OpenLayersWindow() {
|
|
u.layersWindow.Hide()
|
|
u.layersWindow = nil
|
|
u.SetupPopups(u.d)
|
|
u.layersWindow.Show()
|
|
}
|
|
|
|
// OpenPaletteWindow opens the Palette Editor window.
|
|
func (u *EditorUI) OpenPaletteWindow() {
|
|
// TODO: recompute the window so the actual loaded level palette gets in
|
|
u.paletteEditor.Hide()
|
|
u.paletteEditor = nil
|
|
u.SetupPopups(u.d)
|
|
u.paletteEditor.Show()
|
|
}
|
|
|
|
// OpenDoodadDropper opens the Doodad Dropper window.
|
|
func (u *EditorUI) OpenDoodadDropper() {
|
|
// NOTE: most places in the code call this directly, nice
|
|
// and simple window :) but OpenDoodadDropper() added for consistency.
|
|
u.doodadWindow.Show()
|
|
}
|
|
|
|
// SetupPopups preloads popup windows like the DoodadDropper.
|
|
func (u *EditorUI) SetupPopups(d *Doodle) {
|
|
// Common window configure function.
|
|
var configure = func(window *ui.Window) {
|
|
var size = window.Size()
|
|
window.Compute(d.Engine)
|
|
window.Supervise(u.Supervisor)
|
|
|
|
// Center the window.
|
|
window.MoveTo(render.Point{
|
|
X: (d.width / 2) - (size.W / 2),
|
|
Y: (d.height / 2) - (size.H / 2),
|
|
})
|
|
}
|
|
|
|
// Doodad Dropper.
|
|
if u.doodadWindow == nil {
|
|
u.doodadWindow = windows.NewDoodadDropper(windows.DoodadDropper{
|
|
Supervisor: u.Supervisor,
|
|
Engine: d.Engine,
|
|
|
|
OnStartDragActor: u.startDragActor,
|
|
OnCancel: func() {
|
|
u.doodadWindow.Hide()
|
|
},
|
|
})
|
|
configure(u.doodadWindow)
|
|
}
|
|
|
|
// Page Settings
|
|
if u.levelSettingsWindow == nil {
|
|
scene, _ := d.Scene.(*EditorScene)
|
|
|
|
u.levelSettingsWindow = windows.NewAddEditLevel(windows.AddEditLevel{
|
|
Supervisor: u.Supervisor,
|
|
Engine: d.Engine,
|
|
EditLevel: scene.Level,
|
|
|
|
OnChangePageTypeAndWallpaper: func(pageType level.PageType, wallpaper string) {
|
|
log.Info("OnChangePageTypeAndWallpaper called: %+v, %+v", pageType, wallpaper)
|
|
scene.Level.PageType = pageType
|
|
scene.Level.Wallpaper = wallpaper
|
|
u.Canvas.LoadLevel(d.Engine, scene.Level)
|
|
},
|
|
OnCancel: func() {
|
|
u.levelSettingsWindow.Hide()
|
|
},
|
|
})
|
|
configure(u.levelSettingsWindow)
|
|
}
|
|
|
|
// Palette Editor.
|
|
if u.paletteEditor == nil {
|
|
scene, _ := d.Scene.(*EditorScene)
|
|
|
|
// Which palette?
|
|
var pal *level.Palette
|
|
if scene.Level != nil {
|
|
pal = scene.Level.Palette
|
|
} else if scene.Doodad != nil {
|
|
pal = scene.Doodad.Palette
|
|
}
|
|
|
|
u.paletteEditor = windows.NewPaletteEditor(windows.PaletteEditor{
|
|
Supervisor: u.Supervisor,
|
|
Engine: d.Engine,
|
|
IsDoodad: scene.Doodad != nil,
|
|
EditPalette: pal,
|
|
|
|
OnChange: func() {
|
|
// Reload the level.
|
|
if scene.Level != nil {
|
|
log.Warn("RELOAD LEVEL")
|
|
u.Canvas.LoadLevel(d.Engine, scene.Level)
|
|
scene.Level.Chunker.Redraw()
|
|
} else if scene.Doodad != nil {
|
|
log.Warn("RELOAD DOODAD")
|
|
u.Canvas.LoadDoodadToLayer(u.Scene.Doodad, u.Scene.ActiveLayer)
|
|
u.Scene.Doodad.Layers[u.Scene.ActiveLayer].Chunker.Redraw()
|
|
}
|
|
|
|
// Reload the palette frame to reflect the changed data.
|
|
u.Palette.Hide()
|
|
u.Palette = u.SetupPalette(d)
|
|
u.Resized(d)
|
|
},
|
|
OnAddColor: func() {
|
|
// Adding a new color to the palette.
|
|
sw := pal.AddSwatch()
|
|
log.Info("Added new palette color: %+v", sw)
|
|
|
|
// Awkward but... reload this very same window.
|
|
u.paletteEditor.Hide()
|
|
u.paletteEditor = nil
|
|
u.SetupPopups(d)
|
|
u.paletteEditor.Show()
|
|
},
|
|
OnCancel: func() {
|
|
u.paletteEditor.Hide()
|
|
},
|
|
})
|
|
configure(u.paletteEditor)
|
|
}
|
|
|
|
// Layers window (doodad editor)
|
|
if u.layersWindow == nil {
|
|
scene, _ := d.Scene.(*EditorScene)
|
|
|
|
u.layersWindow = windows.NewLayerWindow(windows.Layers{
|
|
Supervisor: u.Supervisor,
|
|
Engine: d.Engine,
|
|
EditDoodad: scene.Doodad,
|
|
ActiveLayer: scene.ActiveLayer,
|
|
|
|
OnChange: func(self *doodads.Doodad) {
|
|
// Reload the level.
|
|
log.Warn("RELOAD LEVEL")
|
|
u.Canvas.LoadDoodad(u.Scene.Doodad)
|
|
|
|
for i := range self.Layers {
|
|
scene.Doodad.Layers[i] = self.Layers[i]
|
|
}
|
|
|
|
// Awkward but... reload this very same window.
|
|
// Otherwise, the window doesn't update to show the new
|
|
// layer having been added.
|
|
u.layersWindow.Hide()
|
|
u.layersWindow = nil
|
|
u.SetupPopups(d)
|
|
u.layersWindow.Show()
|
|
},
|
|
OnAddLayer: func() {
|
|
layer := doodads.Layer{
|
|
Name: fmt.Sprintf("layer %d", len(scene.Doodad.Layers)),
|
|
Chunker: level.NewChunker(scene.DoodadSize),
|
|
}
|
|
scene.Doodad.Layers = append(scene.Doodad.Layers, layer)
|
|
log.Info("Added new layer: %d %s",
|
|
len(scene.Doodad.Layers), layer.Name)
|
|
|
|
// Awkward but... reload this very same window.
|
|
// Otherwise, the window doesn't update to show the new
|
|
// layer having been added.
|
|
u.layersWindow.Hide()
|
|
u.layersWindow = nil
|
|
u.SetupPopups(d)
|
|
u.layersWindow.Show()
|
|
},
|
|
OnChangeLayer: func(index int) {
|
|
if index < 0 || index >= len(scene.Doodad.Layers) {
|
|
d.Flash("OnChangeLayer: layer %d out of range", index)
|
|
return
|
|
}
|
|
|
|
log.Info("CHANGE DOODAD LAYER TO %d", index)
|
|
u.Canvas.LoadDoodadToLayer(u.Scene.Doodad, index)
|
|
u.Scene.ActiveLayer = index
|
|
},
|
|
OnCancel: func() {
|
|
u.layersWindow.Hide()
|
|
},
|
|
})
|
|
configure(u.layersWindow)
|
|
}
|
|
}
|