2018-08-05 19:54:57 +00:00
|
|
|
package doodle
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2018-09-26 17:04:46 +00:00
|
|
|
"strconv"
|
2018-08-05 19:54:57 +00:00
|
|
|
|
|
|
|
"git.kirsle.net/apps/doodle/balance"
|
2018-10-08 20:06:42 +00:00
|
|
|
"git.kirsle.net/apps/doodle/doodads"
|
2018-09-26 17:04:46 +00:00
|
|
|
"git.kirsle.net/apps/doodle/enum"
|
2018-08-05 19:54:57 +00:00
|
|
|
"git.kirsle.net/apps/doodle/events"
|
2018-10-08 17:38:49 +00:00
|
|
|
"git.kirsle.net/apps/doodle/level"
|
2018-08-05 19:54:57 +00:00
|
|
|
"git.kirsle.net/apps/doodle/render"
|
|
|
|
"git.kirsle.net/apps/doodle/ui"
|
2018-10-08 17:38:49 +00:00
|
|
|
"git.kirsle.net/apps/doodle/uix"
|
2018-08-05 19:54:57 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// EditorUI manages the user interface for the Editor Scene.
|
|
|
|
type EditorUI struct {
|
2018-08-11 00:19:47 +00:00
|
|
|
d *Doodle
|
|
|
|
Scene *EditorScene
|
2018-08-05 19:54:57 +00:00
|
|
|
|
|
|
|
// Variables
|
2018-08-11 00:19:47 +00:00
|
|
|
StatusMouseText string
|
|
|
|
StatusPaletteText string
|
|
|
|
StatusFilenameText string
|
2018-08-17 03:37:19 +00:00
|
|
|
selectedSwatch string // name of selected swatch in palette
|
2018-10-08 20:06:42 +00:00
|
|
|
selectedDoodad string
|
2018-08-05 19:54:57 +00:00
|
|
|
|
|
|
|
// Widgets
|
|
|
|
Supervisor *ui.Supervisor
|
2018-10-08 17:38:49 +00:00
|
|
|
Canvas *uix.Canvas
|
|
|
|
Workspace *ui.Frame
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
MenuBar *ui.Frame
|
2018-08-05 19:54:57 +00:00
|
|
|
StatusBar *ui.Frame
|
2018-10-08 20:06:42 +00:00
|
|
|
|
|
|
|
// Palette window.
|
|
|
|
Palette *ui.Window
|
|
|
|
PaletteTab *ui.Frame
|
|
|
|
DoodadTab *ui.Frame
|
|
|
|
|
|
|
|
// Palette variables.
|
|
|
|
paletteTab string // selected tab, Palette or Doodads
|
2018-08-05 19:54:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewEditorUI initializes the Editor UI.
|
2018-08-11 00:19:47 +00:00
|
|
|
func NewEditorUI(d *Doodle, s *EditorScene) *EditorUI {
|
2018-08-05 19:54:57 +00:00
|
|
|
u := &EditorUI{
|
2018-08-11 00:19:47 +00:00
|
|
|
d: d,
|
|
|
|
Scene: s,
|
|
|
|
Supervisor: ui.NewSupervisor(),
|
|
|
|
StatusMouseText: "Cursor: (waiting)",
|
|
|
|
StatusPaletteText: "Swatch: <none>",
|
|
|
|
StatusFilenameText: "Filename: <none>",
|
2018-08-05 19:54:57 +00:00
|
|
|
}
|
2018-08-17 03:37:19 +00:00
|
|
|
|
2018-10-08 17:38:49 +00:00
|
|
|
u.Canvas = u.SetupCanvas(d)
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
u.MenuBar = u.SetupMenuBar(d)
|
2018-08-05 19:54:57 +00:00
|
|
|
u.StatusBar = u.SetupStatusBar(d)
|
2018-08-11 00:19:47 +00:00
|
|
|
u.Palette = u.SetupPalette(d)
|
2018-10-08 17:38:49 +00:00
|
|
|
u.Workspace = u.SetupWorkspace(d) // important that this is last!
|
|
|
|
|
|
|
|
// Position the Canvas inside the frame.
|
|
|
|
u.Workspace.Pack(u.Canvas, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
})
|
|
|
|
u.Workspace.Compute(d.Engine)
|
|
|
|
u.ExpandCanvas(d.Engine)
|
|
|
|
|
|
|
|
// Select the first swatch of the palette.
|
|
|
|
if u.Canvas.Palette != nil && u.Canvas.Palette.ActiveSwatch != nil {
|
|
|
|
u.selectedSwatch = u.Canvas.Palette.ActiveSwatch.Name
|
|
|
|
}
|
2018-08-05 19:54:57 +00:00
|
|
|
return u
|
|
|
|
}
|
|
|
|
|
|
|
|
// Loop to process events and update the UI.
|
|
|
|
func (u *EditorUI) Loop(ev *events.State) {
|
2018-08-11 00:19:47 +00:00
|
|
|
u.Supervisor.Loop(ev)
|
|
|
|
|
2018-08-05 19:54:57 +00:00
|
|
|
u.StatusMouseText = fmt.Sprintf("Mouse: (%d,%d)",
|
|
|
|
ev.CursorX.Now,
|
|
|
|
ev.CursorY.Now,
|
|
|
|
)
|
2018-08-11 00:19:47 +00:00
|
|
|
u.StatusPaletteText = fmt.Sprintf("Swatch: %s",
|
2018-10-08 17:38:49 +00:00
|
|
|
u.Canvas.Palette.ActiveSwatch,
|
2018-08-11 00:19:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Statusbar filename label.
|
|
|
|
filename := "untitled.map"
|
2018-09-26 17:04:46 +00:00
|
|
|
fileType := "Level"
|
2018-08-11 00:19:47 +00:00
|
|
|
if u.Scene.filename != "" {
|
|
|
|
filename = u.Scene.filename
|
|
|
|
}
|
2018-09-26 17:04:46 +00:00
|
|
|
if u.Scene.DrawingType == enum.DoodadDrawing {
|
|
|
|
fileType = "Doodad"
|
|
|
|
}
|
|
|
|
u.StatusFilenameText = fmt.Sprintf("Filename: %s (%s)",
|
2018-08-11 00:19:47 +00:00
|
|
|
filename,
|
2018-09-26 17:04:46 +00:00
|
|
|
fileType,
|
2018-08-11 00:19:47 +00:00
|
|
|
)
|
|
|
|
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
u.MenuBar.Compute(u.d.Engine)
|
2018-08-05 19:54:57 +00:00
|
|
|
u.StatusBar.Compute(u.d.Engine)
|
2018-08-11 00:19:47 +00:00
|
|
|
u.Palette.Compute(u.d.Engine)
|
2018-10-08 17:38:49 +00:00
|
|
|
u.Canvas.Loop(ev)
|
2018-08-05 19:54:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Present the UI to the screen.
|
|
|
|
func (u *EditorUI) Present(e render.Engine) {
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
// TODO: if I don't Compute() the palette window, then, whenever the dev console
|
|
|
|
// is open the window will blank out its contents leaving only the outermost Frame.
|
|
|
|
// The title bar and borders are gone. But other UI widgets don't do this.
|
|
|
|
// FIXME: Scene interface should have a separate ComputeUI() from Loop()?
|
|
|
|
u.Palette.Compute(u.d.Engine)
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
u.Palette.Present(e, u.Palette.Point())
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
u.MenuBar.Present(e, u.MenuBar.Point())
|
2018-08-05 19:54:57 +00:00
|
|
|
u.StatusBar.Present(e, u.StatusBar.Point())
|
2018-10-08 17:38:49 +00:00
|
|
|
u.Workspace.Present(e, u.Workspace.Point())
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetupWorkspace configures the main Workspace frame that takes up the full
|
|
|
|
// window apart from toolbars. The Workspace has a single child element, the
|
|
|
|
// Canvas, so it can easily full-screen it or center it for Doodad editing.
|
|
|
|
func (u *EditorUI) SetupWorkspace(d *Doodle) *ui.Frame {
|
|
|
|
frame := ui.NewFrame("Workspace")
|
|
|
|
|
|
|
|
// Position and size the frame around the other main widgets.
|
|
|
|
frame.MoveTo(render.NewPoint(
|
|
|
|
0,
|
|
|
|
u.MenuBar.Size().H,
|
|
|
|
))
|
|
|
|
frame.Resize(render.NewRect(
|
|
|
|
d.width-u.Palette.Size().W,
|
|
|
|
d.height-u.MenuBar.Size().H-u.StatusBar.Size().H,
|
|
|
|
))
|
|
|
|
frame.Compute(d.Engine)
|
|
|
|
|
|
|
|
return frame
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetupCanvas configures the main drawing canvas in the editor.
|
|
|
|
func (u *EditorUI) SetupCanvas(d *Doodle) *uix.Canvas {
|
|
|
|
drawing := uix.NewCanvas(balance.ChunkSize, true)
|
|
|
|
drawing.Palette = level.DefaultPalette()
|
|
|
|
if len(drawing.Palette.Swatches) > 0 {
|
|
|
|
drawing.SetSwatch(drawing.Palette.Swatches[0])
|
|
|
|
}
|
|
|
|
return drawing
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExpandCanvas manually expands the Canvas to fill the frame, to work around
|
|
|
|
// UI packing bugs. Ideally I would use `Expand: true` when packing the Canvas
|
|
|
|
// in its frame, but that would artificially expand the Canvas also when it
|
|
|
|
// _wanted_ to be smaller, as in Doodad Editing Mode.
|
|
|
|
func (u *EditorUI) ExpandCanvas(e render.Engine) {
|
|
|
|
u.Canvas.Resize(u.Workspace.Size())
|
|
|
|
u.Workspace.Compute(e)
|
2018-08-05 19:54:57 +00:00
|
|
|
}
|
|
|
|
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
// SetupMenuBar sets up the menu bar.
|
|
|
|
func (u *EditorUI) SetupMenuBar(d *Doodle) *ui.Frame {
|
|
|
|
frame := ui.NewFrame("MenuBar")
|
|
|
|
frame.Configure(ui.Config{
|
|
|
|
Width: d.width,
|
|
|
|
Background: render.Black,
|
|
|
|
})
|
|
|
|
|
|
|
|
type menuButton struct {
|
|
|
|
Text string
|
|
|
|
Click func(render.Point)
|
|
|
|
}
|
|
|
|
buttons := []menuButton{
|
|
|
|
menuButton{
|
|
|
|
Text: "New Level",
|
|
|
|
Click: func(render.Point) {
|
|
|
|
d.NewMap()
|
|
|
|
},
|
|
|
|
},
|
|
|
|
menuButton{
|
|
|
|
Text: "New Doodad",
|
|
|
|
Click: func(render.Point) {
|
2018-09-26 17:04:46 +00:00
|
|
|
d.Prompt("Doodad size [100]>", func(answer string) {
|
|
|
|
size := balance.DoodadSize
|
|
|
|
if answer != "" {
|
|
|
|
i, err := strconv.Atoi(answer)
|
|
|
|
if err != nil {
|
|
|
|
d.Flash("Error: Doodad size must be a number.")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
size = i
|
|
|
|
}
|
|
|
|
d.NewDoodad(size)
|
|
|
|
})
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
menuButton{
|
|
|
|
Text: "Save",
|
|
|
|
Click: func(render.Point) {
|
2018-09-26 17:04:46 +00:00
|
|
|
var saveFunc func(filename string)
|
|
|
|
|
|
|
|
switch u.Scene.DrawingType {
|
|
|
|
case enum.LevelDrawing:
|
|
|
|
saveFunc = func(filename string) {
|
|
|
|
if err := u.Scene.SaveLevel(filename); err != nil {
|
|
|
|
d.Flash("Error: %s", err)
|
|
|
|
} else {
|
|
|
|
d.Flash("Saved level: %s", filename)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case enum.DoodadDrawing:
|
|
|
|
saveFunc = func(filename string) {
|
|
|
|
if err := u.Scene.SaveDoodad(filename); err != nil {
|
|
|
|
d.Flash("Error: %s", err)
|
|
|
|
} else {
|
|
|
|
d.Flash("Saved doodad: %s", filename)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
d.Flash("Error: Scene.DrawingType is not a valid type")
|
|
|
|
}
|
|
|
|
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
if u.Scene.filename != "" {
|
2018-09-26 17:04:46 +00:00
|
|
|
saveFunc(u.Scene.filename)
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
} else {
|
|
|
|
d.Prompt("Save filename>", func(answer string) {
|
|
|
|
if answer != "" {
|
2018-09-26 17:04:46 +00:00
|
|
|
saveFunc(answer)
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
menuButton{
|
|
|
|
Text: "Save as...",
|
|
|
|
Click: func(render.Point) {
|
|
|
|
d.Prompt("Save as filename>", func(answer string) {
|
|
|
|
if answer != "" {
|
|
|
|
u.Scene.SaveLevel("./maps/" + answer) // TODO: maps path
|
|
|
|
d.Flash("Saved: %s", answer)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
menuButton{
|
|
|
|
Text: "Load",
|
|
|
|
Click: func(render.Point) {
|
|
|
|
d.Prompt("Open filename>", func(answer string) {
|
|
|
|
if answer != "" {
|
2018-09-26 17:04:46 +00:00
|
|
|
u.d.EditDrawing("./maps/" + answer) // TODO: maps path
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, btn := range buttons {
|
|
|
|
w := ui.NewButton(btn.Text, ui.NewLabel(ui.Label{
|
|
|
|
Text: btn.Text,
|
|
|
|
Font: balance.MenuFont,
|
|
|
|
}))
|
|
|
|
w.Configure(ui.Config{
|
|
|
|
BorderSize: 1,
|
|
|
|
OutlineSize: 0,
|
|
|
|
})
|
2018-08-17 03:37:19 +00:00
|
|
|
w.Handle(ui.MouseUp, btn.Click)
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
u.Supervisor.Add(w)
|
|
|
|
frame.Pack(w, ui.Pack{
|
|
|
|
Anchor: ui.W,
|
|
|
|
PadX: 1,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
frame.Compute(d.Engine)
|
|
|
|
return frame
|
|
|
|
}
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
// SetupPalette sets up the palette panel.
|
|
|
|
func (u *EditorUI) SetupPalette(d *Doodle) *ui.Window {
|
2018-10-08 20:06:42 +00:00
|
|
|
var paletteWidth int32 = 150
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
window := ui.NewWindow("Palette")
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
window.ConfigureTitle(balance.TitleConfig)
|
|
|
|
window.TitleBar().Font = balance.TitleFont
|
2018-08-11 00:19:47 +00:00
|
|
|
window.Configure(ui.Config{
|
2018-10-08 20:06:42 +00:00
|
|
|
Width: paletteWidth,
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
Height: u.d.height - u.StatusBar.Size().H,
|
|
|
|
Background: balance.WindowBackground,
|
|
|
|
BorderColor: balance.WindowBorder,
|
2018-08-11 00:19:47 +00:00
|
|
|
})
|
|
|
|
window.MoveTo(render.NewPoint(
|
|
|
|
u.d.width-window.BoxSize().W,
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
u.MenuBar.BoxSize().H,
|
2018-08-11 00:19:47 +00:00
|
|
|
))
|
|
|
|
|
2018-10-08 20:06:42 +00:00
|
|
|
// Frame that holds the tab buttons in Level Edit mode.
|
|
|
|
tabFrame := ui.NewFrame("Palette Tabs")
|
|
|
|
if u.Scene.DrawingType != enum.LevelDrawing {
|
|
|
|
// Don't show the tab bar except in Level Edit mode.
|
|
|
|
tabFrame.Hide()
|
|
|
|
}
|
|
|
|
for _, name := range []string{"Palette", "Doodads"} {
|
|
|
|
if u.paletteTab == "" {
|
|
|
|
u.paletteTab = name
|
2018-08-11 00:19:47 +00:00
|
|
|
}
|
2018-10-08 20:06:42 +00:00
|
|
|
|
|
|
|
tab := ui.NewRadioButton("Palette Tab", &u.paletteTab, name, ui.NewLabel(ui.Label{
|
|
|
|
Text: name,
|
|
|
|
}))
|
|
|
|
tab.Handle(ui.Click, func(p render.Point) {
|
|
|
|
if u.paletteTab == "Palette" {
|
|
|
|
u.PaletteTab.Show()
|
|
|
|
u.DoodadTab.Hide()
|
|
|
|
} else {
|
|
|
|
u.PaletteTab.Hide()
|
|
|
|
u.DoodadTab.Show()
|
|
|
|
}
|
|
|
|
window.Compute(d.Engine)
|
|
|
|
})
|
|
|
|
u.Supervisor.Add(tab)
|
|
|
|
tabFrame.Pack(tab, ui.Pack{
|
|
|
|
Anchor: ui.W,
|
|
|
|
Fill: true,
|
|
|
|
Expand: true,
|
|
|
|
})
|
2018-08-11 00:19:47 +00:00
|
|
|
}
|
2018-10-08 20:06:42 +00:00
|
|
|
window.Pack(tabFrame, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
Fill: true,
|
|
|
|
PadY: 4,
|
|
|
|
})
|
2018-08-11 00:19:47 +00:00
|
|
|
|
2018-10-08 20:06:42 +00:00
|
|
|
// Doodad frame.
|
|
|
|
{
|
|
|
|
u.DoodadTab = ui.NewFrame("Doodad Tab")
|
|
|
|
u.DoodadTab.Hide()
|
|
|
|
window.Pack(u.DoodadTab, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
Fill: true,
|
|
|
|
})
|
2018-10-08 17:38:49 +00:00
|
|
|
|
2018-10-08 20:06:42 +00:00
|
|
|
doodadsAvailable, err := ListDoodads()
|
|
|
|
if err != nil {
|
|
|
|
d.Flash("ListDoodads: %s", err)
|
|
|
|
}
|
2018-10-08 17:38:49 +00:00
|
|
|
|
2018-10-08 20:06:42 +00:00
|
|
|
var buttonSize = (paletteWidth - window.BoxThickness(2)) / 2
|
|
|
|
|
|
|
|
// Draw the doodad buttons in a grid 2 wide.
|
|
|
|
var row *ui.Frame
|
|
|
|
for i, filename := range doodadsAvailable {
|
|
|
|
si := fmt.Sprintf("%d", i)
|
|
|
|
if row == nil || i%2 == 0 {
|
|
|
|
row = ui.NewFrame("Doodad Row " + si)
|
|
|
|
row.SetBackground(balance.WindowBackground)
|
|
|
|
u.DoodadTab.Pack(row, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
Fill: true,
|
|
|
|
// Expand: true,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
doodad, err := doodads.LoadJSON(DoodadPath(filename))
|
|
|
|
if err != nil {
|
|
|
|
log.Error(err.Error())
|
|
|
|
doodad = doodads.New(balance.DoodadSize)
|
|
|
|
}
|
|
|
|
|
|
|
|
can := uix.NewCanvas(int(buttonSize), true)
|
|
|
|
can.LoadDoodad(doodad)
|
|
|
|
btn := ui.NewRadioButton(filename, &u.selectedDoodad, si, can)
|
|
|
|
btn.Resize(render.NewRect(
|
|
|
|
buttonSize-2, // TODO: without the -2 the button border
|
|
|
|
buttonSize-2, // rests on top of the window border.
|
|
|
|
))
|
|
|
|
u.Supervisor.Add(btn)
|
|
|
|
row.Pack(btn, ui.Pack{
|
|
|
|
Anchor: ui.W,
|
2018-10-08 17:38:49 +00:00
|
|
|
})
|
2018-10-08 20:06:42 +00:00
|
|
|
|
|
|
|
// Resize the canvas to fill the button interior.
|
|
|
|
btnSize := btn.Size()
|
|
|
|
can.Resize(render.NewRect(
|
|
|
|
btnSize.W-btn.BoxThickness(2),
|
|
|
|
btnSize.H-btn.BoxThickness(2),
|
|
|
|
))
|
|
|
|
|
|
|
|
btn.Compute(d.Engine)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Color Palette Frame.
|
|
|
|
{
|
|
|
|
u.PaletteTab = ui.NewFrame("Palette Tab")
|
|
|
|
u.PaletteTab.SetBackground(balance.WindowBackground)
|
|
|
|
window.Pack(u.PaletteTab, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
Fill: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
// 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 {
|
|
|
|
label := ui.NewLabel(ui.Label{
|
|
|
|
Text: swatch.Name,
|
|
|
|
Font: balance.StatusFont,
|
|
|
|
})
|
|
|
|
label.Font.Color = swatch.Color.Darken(40)
|
|
|
|
|
|
|
|
btn := ui.NewRadioButton("palette", &u.selectedSwatch, swatch.Name, label)
|
|
|
|
btn.Handle(ui.Click, onClick)
|
|
|
|
u.Supervisor.Add(btn)
|
|
|
|
|
|
|
|
u.PaletteTab.Pack(btn, ui.Pack{
|
|
|
|
Anchor: ui.N,
|
|
|
|
Fill: true,
|
|
|
|
PadY: 4,
|
|
|
|
})
|
|
|
|
}
|
2018-10-08 17:38:49 +00:00
|
|
|
}
|
2018-08-11 00:19:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return window
|
|
|
|
}
|
|
|
|
|
2018-08-05 19:54:57 +00:00
|
|
|
// SetupStatusBar sets up the status bar widget along the bottom of the window.
|
|
|
|
func (u *EditorUI) SetupStatusBar(d *Doodle) *ui.Frame {
|
|
|
|
frame := ui.NewFrame("Status Bar")
|
|
|
|
frame.Configure(ui.Config{
|
|
|
|
BorderStyle: ui.BorderRaised,
|
|
|
|
Background: render.Grey,
|
|
|
|
BorderSize: 2,
|
|
|
|
Width: d.width,
|
|
|
|
})
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
style := ui.Config{
|
2018-08-05 19:54:57 +00:00
|
|
|
Background: render.Grey,
|
|
|
|
BorderStyle: ui.BorderSunken,
|
|
|
|
BorderColor: render.Grey,
|
|
|
|
BorderSize: 1,
|
2018-08-11 00:19:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cursorLabel := ui.NewLabel(ui.Label{
|
|
|
|
TextVariable: &u.StatusMouseText,
|
|
|
|
Font: balance.StatusFont,
|
2018-08-05 19:54:57 +00:00
|
|
|
})
|
2018-08-11 00:19:47 +00:00
|
|
|
cursorLabel.Configure(style)
|
2018-08-05 19:54:57 +00:00
|
|
|
cursorLabel.Compute(d.Engine)
|
|
|
|
frame.Pack(cursorLabel, ui.Pack{
|
|
|
|
Anchor: ui.W,
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
PadX: 1,
|
2018-08-05 19:54:57 +00:00
|
|
|
})
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
paletteLabel := ui.NewLabel(ui.Label{
|
|
|
|
TextVariable: &u.StatusPaletteText,
|
|
|
|
Font: balance.StatusFont,
|
2018-08-05 19:54:57 +00:00
|
|
|
})
|
2018-08-11 00:19:47 +00:00
|
|
|
paletteLabel.Configure(style)
|
|
|
|
paletteLabel.Compute(d.Engine)
|
|
|
|
frame.Pack(paletteLabel, ui.Pack{
|
|
|
|
Anchor: ui.W,
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
PadX: 1,
|
2018-08-05 19:54:57 +00:00
|
|
|
})
|
2018-08-11 00:19:47 +00:00
|
|
|
|
|
|
|
filenameLabel := ui.NewLabel(ui.Label{
|
|
|
|
TextVariable: &u.StatusFilenameText,
|
|
|
|
Font: balance.StatusFont,
|
|
|
|
})
|
|
|
|
filenameLabel.Configure(style)
|
2018-08-05 19:54:57 +00:00
|
|
|
filenameLabel.Compute(d.Engine)
|
|
|
|
frame.Pack(filenameLabel, ui.Pack{
|
2018-10-08 17:38:49 +00:00
|
|
|
Anchor: ui.E,
|
Menu Toolbar for Editor + Shell Prompts + Theme
* Added a "menu toolbar" to the top of the Edit Mode with useful buttons
that work: New Level, New Doodad (same thing), Save, Save as, Open.
* Added ability for the dev console to prompt the user for a question,
which opens the console automatically. "Save", "Save as" and "Load"
ask for their filenames this way.
* Started groundwork for theming the app. The palette window is a light
brown with an orange title bar, the Menu Toolbar has a black
background, etc.
* Added support for multiple fonts instead of just monospace. DejaVu
Sans (normal and bold) are used now for most labels and window titles,
respectively. The dev console uses DejaVu Sans Mono as before.
* Update ui.Label to accept PadX and PadY separately instead of only
having the Padding option which did both.
* Improvements to Frame packing algorithm.
* Set the SDL draw mode to BLEND so we can use alpha colors properly,
so now the dev console is semi-translucent.
2018-08-12 00:30:00 +00:00
|
|
|
PadX: 1,
|
2018-08-05 19:54:57 +00:00
|
|
|
})
|
|
|
|
|
2018-08-11 00:19:47 +00:00
|
|
|
// TODO: right-aligned labels clip out of bounds
|
2018-10-08 17:38:49 +00:00
|
|
|
extraLabel := ui.NewLabel(ui.Label{
|
|
|
|
Text: "blah",
|
|
|
|
Font: balance.StatusFont,
|
|
|
|
})
|
|
|
|
extraLabel.Configure(ui.Config{
|
|
|
|
Background: render.Grey,
|
|
|
|
BorderStyle: ui.BorderSunken,
|
|
|
|
BorderColor: render.Grey,
|
|
|
|
BorderSize: 1,
|
|
|
|
})
|
|
|
|
extraLabel.Compute(d.Engine)
|
|
|
|
frame.Pack(extraLabel, ui.Pack{
|
|
|
|
Anchor: ui.E,
|
|
|
|
})
|
2018-08-05 19:54:57 +00:00
|
|
|
|
|
|
|
frame.Resize(render.Rect{
|
|
|
|
W: d.width,
|
|
|
|
H: cursorLabel.BoxSize().H + frame.BoxThickness(1),
|
|
|
|
})
|
|
|
|
frame.Compute(d.Engine)
|
|
|
|
frame.MoveTo(render.Point{
|
|
|
|
X: 0,
|
|
|
|
Y: d.height - frame.Size().H,
|
|
|
|
})
|
|
|
|
|
|
|
|
return frame
|
|
|
|
}
|