Added Presets
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"archive/zip"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"embed"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"image"
|
||||
@@ -13,9 +14,11 @@ import (
|
||||
"image/jpeg"
|
||||
"image/png"
|
||||
"io"
|
||||
"io/fs"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -33,6 +36,9 @@ import (
|
||||
|
||||
const generationStepTimeout = time.Minute
|
||||
|
||||
//go:embed Presets/*.json
|
||||
var embeddedPresets embed.FS
|
||||
|
||||
func runWithTimeout[T any](timeout time.Duration, fn func() T) (T, bool) {
|
||||
ch := make(chan T, 1)
|
||||
go func() {
|
||||
@@ -61,6 +67,45 @@ func cloneToRGBA(src image.Image, width, height int) *image.RGBA {
|
||||
return out
|
||||
}
|
||||
|
||||
type presetEntry struct {
|
||||
Name string
|
||||
Path string
|
||||
}
|
||||
|
||||
func listEmbeddedPresets() ([]presetEntry, error) {
|
||||
entries, err := fs.ReadDir(embeddedPresets, "Presets")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var presets []presetEntry
|
||||
for _, entry := range entries {
|
||||
if entry.IsDir() {
|
||||
continue
|
||||
}
|
||||
name := entry.Name()
|
||||
if !strings.HasSuffix(strings.ToLower(name), ".json") {
|
||||
continue
|
||||
}
|
||||
displayName := strings.TrimSuffix(name, filepath.Ext(name))
|
||||
presets = append(presets, presetEntry{
|
||||
Name: displayName,
|
||||
Path: filepath.Join("Presets", name),
|
||||
})
|
||||
}
|
||||
sort.Slice(presets, func(i, j int) bool {
|
||||
return presets[i].Name < presets[j].Name
|
||||
})
|
||||
return presets, nil
|
||||
}
|
||||
|
||||
func loadEmbeddedPreset(path string) (*Settings, error) {
|
||||
raw, err := embeddedPresets.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return decodeSettingsJSON(raw)
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Initialize the Fyne application and window
|
||||
a := app.NewWithID("com.example.rpgcitymaker")
|
||||
@@ -1549,6 +1594,34 @@ func main() {
|
||||
updateGenerateBtnState()
|
||||
}
|
||||
|
||||
presetEntries, err := listEmbeddedPresets()
|
||||
if err != nil {
|
||||
log.Println("Error loading embedded presets:", err)
|
||||
}
|
||||
presetNames := []string{"No Preset"}
|
||||
presetPathByName := map[string]string{}
|
||||
for _, preset := range presetEntries {
|
||||
presetNames = append(presetNames, preset.Name)
|
||||
presetPathByName[preset.Name] = preset.Path
|
||||
}
|
||||
presetSelect := widget.NewSelect(presetNames, func(name string) {
|
||||
if name == "" || name == "No Preset" {
|
||||
return
|
||||
}
|
||||
path, ok := presetPathByName[name]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
imported, err := loadEmbeddedPreset(path)
|
||||
if err != nil {
|
||||
dialog.ShowError(err, w)
|
||||
return
|
||||
}
|
||||
imported.Seed = settings.Seed
|
||||
applySettingsToUI(imported)
|
||||
})
|
||||
presetSelect.SetSelected("No Preset")
|
||||
|
||||
buildingsTab := container.NewTabItem("Buildings", container.NewVBox(
|
||||
numBuildingsSlider,
|
||||
minBuildingSizeSlider,
|
||||
@@ -1561,6 +1634,9 @@ func main() {
|
||||
))
|
||||
|
||||
imageTab := container.NewTabItem("Image", container.NewVBox(
|
||||
widget.NewLabel("Preset:"),
|
||||
presetSelect,
|
||||
widget.NewSeparator(),
|
||||
widget.NewLabel("Width:"),
|
||||
widthEntry, widget.NewLabel("Height:"),
|
||||
heightEntry,
|
||||
|
||||
Reference in New Issue
Block a user