changed some behavior of how the presets worked

This commit is contained in:
grimsace
2026-03-11 14:00:49 -05:00
parent 8b6b728f73
commit b65bf2539f
+69
View File
@@ -426,6 +426,16 @@ func main() {
} }
var generateBtn *widget.Button var generateBtn *widget.Button
errorStates := make(map[string]bool) errorStates := make(map[string]bool)
var applyingPreset bool
var clearPresetSelection func()
markPresetDirty := func() {
if applyingPreset {
return
}
if clearPresetSelection != nil {
clearPresetSelection()
}
}
// ... (other code) // ... (other code)
@@ -455,6 +465,7 @@ func main() {
detailSlider.value.AddListener(binding.NewDataListener(func() { detailSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := detailSlider.value.Get() val, _ := detailSlider.value.Get()
settings.Detail = val settings.Detail = val
markPresetDirty()
})) }))
roughnessSlider := newNumericInputSlider(0, 100, settings.Roughness, "%.0f%%", "Roughness") roughnessSlider := newNumericInputSlider(0, 100, settings.Roughness, "%.0f%%", "Roughness")
@@ -467,6 +478,7 @@ func main() {
roughnessSlider.value.AddListener(binding.NewDataListener(func() { roughnessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := roughnessSlider.value.Get() val, _ := roughnessSlider.value.Get()
settings.Roughness = val settings.Roughness = val
markPresetDirty()
})) }))
// Create UI elements for controlling lake generation settings // Create UI elements for controlling lake generation settings
lakesSlider := newNumericInputSlider(0, 15, float64(settings.Lakes), "%.0f", "Lakes") lakesSlider := newNumericInputSlider(0, 15, float64(settings.Lakes), "%.0f", "Lakes")
@@ -479,6 +491,7 @@ func main() {
lakesSlider.value.AddListener(binding.NewDataListener(func() { lakesSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := lakesSlider.value.Get() val, _ := lakesSlider.value.Get()
settings.Lakes = int(val) settings.Lakes = int(val)
markPresetDirty()
})) }))
lakeSizeLowerSlider := newNumericInputSlider(1, 100, settings.LakeSizeLower, "%.0f%%", "Min Lake Size") lakeSizeLowerSlider := newNumericInputSlider(1, 100, settings.LakeSizeLower, "%.0f%%", "Min Lake Size")
@@ -491,6 +504,7 @@ func main() {
lakeSizeLowerSlider.value.AddListener(binding.NewDataListener(func() { lakeSizeLowerSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := lakeSizeLowerSlider.value.Get() val, _ := lakeSizeLowerSlider.value.Get()
settings.LakeSizeLower = val settings.LakeSizeLower = val
markPresetDirty()
})) }))
lakeSizeUpperSlider := newNumericInputSlider(1, 100, settings.LakeSizeUpper, "%.0f%%", "Max Lake Size") lakeSizeUpperSlider := newNumericInputSlider(1, 100, settings.LakeSizeUpper, "%.0f%%", "Max Lake Size")
@@ -503,6 +517,7 @@ func main() {
lakeSizeUpperSlider.value.AddListener(binding.NewDataListener(func() { lakeSizeUpperSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := lakeSizeUpperSlider.value.Get() val, _ := lakeSizeUpperSlider.value.Get()
settings.LakeSizeUpper = val settings.LakeSizeUpper = val
markPresetDirty()
})) }))
lakeEdgeRoughnessSlider := newNumericInputSlider(0, 100, settings.LakeEdgeRoughness, "%.0f%%", "Lake Edge Roughness") lakeEdgeRoughnessSlider := newNumericInputSlider(0, 100, settings.LakeEdgeRoughness, "%.0f%%", "Lake Edge Roughness")
@@ -515,11 +530,13 @@ func main() {
lakeEdgeRoughnessSlider.value.AddListener(binding.NewDataListener(func() { lakeEdgeRoughnessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := lakeEdgeRoughnessSlider.value.Get() val, _ := lakeEdgeRoughnessSlider.value.Get()
settings.LakeEdgeRoughness = val settings.LakeEdgeRoughness = val
markPresetDirty()
})) }))
lakeShapeLabel := widget.NewLabel("Lake Shape:") lakeShapeLabel := widget.NewLabel("Lake Shape:")
lakeShapeSelect := widget.NewSelect([]string{"circle", "oval", "procedural"}, func(s string) { lakeShapeSelect := widget.NewSelect([]string{"circle", "oval", "procedural"}, func(s string) {
settings.LakeShape = s settings.LakeShape = s
markPresetDirty()
}) })
lakeShapeSelect.SetSelected(settings.LakeShape) lakeShapeSelect.SetSelected(settings.LakeShape)
@@ -533,6 +550,7 @@ func main() {
riversSlider.value.AddListener(binding.NewDataListener(func() { riversSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := riversSlider.value.Get() val, _ := riversSlider.value.Get()
settings.Rivers = int(val) settings.Rivers = int(val)
markPresetDirty()
})) }))
minRiverWidthSlider := newNumericInputSlider(1, 100, settings.MinRiverWidth, "%.0f%%", "Min River Width") minRiverWidthSlider := newNumericInputSlider(1, 100, settings.MinRiverWidth, "%.0f%%", "Min River Width")
@@ -545,6 +563,7 @@ func main() {
minRiverWidthSlider.value.AddListener(binding.NewDataListener(func() { minRiverWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minRiverWidthSlider.value.Get() val, _ := minRiverWidthSlider.value.Get()
settings.MinRiverWidth = val settings.MinRiverWidth = val
markPresetDirty()
})) }))
maxRiverWidthSlider := newNumericInputSlider(1, 100, settings.MaxRiverWidth, "%.0f%%", "Max River Width") maxRiverWidthSlider := newNumericInputSlider(1, 100, settings.MaxRiverWidth, "%.0f%%", "Max River Width")
@@ -557,6 +576,7 @@ func main() {
maxRiverWidthSlider.value.AddListener(binding.NewDataListener(func() { maxRiverWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxRiverWidthSlider.value.Get() val, _ := maxRiverWidthSlider.value.Get()
settings.MaxRiverWidth = val settings.MaxRiverWidth = val
markPresetDirty()
})) }))
riverCurvynessSlider := newNumericInputSlider(0, 100, settings.RiverCurvyness, "%.0f%%", "River Curvyness") riverCurvynessSlider := newNumericInputSlider(0, 100, settings.RiverCurvyness, "%.0f%%", "River Curvyness")
@@ -569,6 +589,7 @@ func main() {
riverCurvynessSlider.value.AddListener(binding.NewDataListener(func() { riverCurvynessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := riverCurvynessSlider.value.Get() val, _ := riverCurvynessSlider.value.Get()
settings.RiverCurvyness = val settings.RiverCurvyness = val
markPresetDirty()
})) }))
riverWidthVariabilitySlider := newNumericInputSlider(0, 100, settings.RiverWidthVariability, "%.0f%%", "River Width Variability") riverWidthVariabilitySlider := newNumericInputSlider(0, 100, settings.RiverWidthVariability, "%.0f%%", "River Width Variability")
@@ -581,6 +602,7 @@ func main() {
riverWidthVariabilitySlider.value.AddListener(binding.NewDataListener(func() { riverWidthVariabilitySlider.value.AddListener(binding.NewDataListener(func() {
val, _ := riverWidthVariabilitySlider.value.Get() val, _ := riverWidthVariabilitySlider.value.Get()
settings.RiverWidthVariability = val settings.RiverWidthVariability = val
markPresetDirty()
})) }))
riverEdgeRoughnessSlider := newNumericInputSlider(0, 100, settings.RiverEdgeRoughness, "%.0f%%", "River Edge Roughness") riverEdgeRoughnessSlider := newNumericInputSlider(0, 100, settings.RiverEdgeRoughness, "%.0f%%", "River Edge Roughness")
@@ -593,6 +615,7 @@ func main() {
riverEdgeRoughnessSlider.value.AddListener(binding.NewDataListener(func() { riverEdgeRoughnessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := riverEdgeRoughnessSlider.value.Get() val, _ := riverEdgeRoughnessSlider.value.Get()
settings.RiverEdgeRoughness = val settings.RiverEdgeRoughness = val
markPresetDirty()
})) }))
minTreeSizeSlider := newNumericInputSliderWithStep(minTreeSizePercent, maxTreeSizePercent, settings.MinTreeSize, treeSizePercentStep, "%.1f%%", "Min Tree Size") minTreeSizeSlider := newNumericInputSliderWithStep(minTreeSizePercent, maxTreeSizePercent, settings.MinTreeSize, treeSizePercentStep, "%.1f%%", "Min Tree Size")
@@ -605,6 +628,7 @@ func main() {
minTreeSizeSlider.value.AddListener(binding.NewDataListener(func() { minTreeSizeSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minTreeSizeSlider.value.Get() val, _ := minTreeSizeSlider.value.Get()
settings.MinTreeSize = val settings.MinTreeSize = val
markPresetDirty()
})) }))
maxTreeSizeSlider := newNumericInputSliderWithStep(minTreeSizePercent, maxTreeSizePercent, settings.MaxTreeSize, treeSizePercentStep, "%.1f%%", "Max Tree Size") maxTreeSizeSlider := newNumericInputSliderWithStep(minTreeSizePercent, maxTreeSizePercent, settings.MaxTreeSize, treeSizePercentStep, "%.1f%%", "Max Tree Size")
@@ -617,6 +641,7 @@ func main() {
maxTreeSizeSlider.value.AddListener(binding.NewDataListener(func() { maxTreeSizeSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxTreeSizeSlider.value.Get() val, _ := maxTreeSizeSlider.value.Get()
settings.MaxTreeSize = val settings.MaxTreeSize = val
markPresetDirty()
})) }))
treeCoverageSlider := newNumericInputSlider(1, 100, settings.TreeCoverage, "%.0f%%", "Tree Coverage") treeCoverageSlider := newNumericInputSlider(1, 100, settings.TreeCoverage, "%.0f%%", "Tree Coverage")
@@ -629,6 +654,7 @@ func main() {
treeCoverageSlider.value.AddListener(binding.NewDataListener(func() { treeCoverageSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := treeCoverageSlider.value.Get() val, _ := treeCoverageSlider.value.Get()
settings.TreeCoverage = val settings.TreeCoverage = val
markPresetDirty()
})) }))
treeClumpinessSlider := newNumericInputSlider(0, 100, settings.TreeClumpiness, "%.0f%%", "Tree Clumpiness") treeClumpinessSlider := newNumericInputSlider(0, 100, settings.TreeClumpiness, "%.0f%%", "Tree Clumpiness")
@@ -641,6 +667,7 @@ func main() {
treeClumpinessSlider.value.AddListener(binding.NewDataListener(func() { treeClumpinessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := treeClumpinessSlider.value.Get() val, _ := treeClumpinessSlider.value.Get()
settings.TreeClumpiness = val settings.TreeClumpiness = val
markPresetDirty()
})) }))
minRoadWidthSlider := newNumericInputSliderWithStep(minRoadWidthPercent, maxRoadWidthPercent, settings.MinRoadWidth, roadWidthPercentStep, "%.1f%%", "Min Road Width") minRoadWidthSlider := newNumericInputSliderWithStep(minRoadWidthPercent, maxRoadWidthPercent, settings.MinRoadWidth, roadWidthPercentStep, "%.1f%%", "Min Road Width")
minRoadWidthSlider.entry.OnChanged = func(s string) { minRoadWidthSlider.entry.OnChanged = func(s string) {
@@ -652,6 +679,7 @@ func main() {
minRoadWidthSlider.value.AddListener(binding.NewDataListener(func() { minRoadWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minRoadWidthSlider.value.Get() val, _ := minRoadWidthSlider.value.Get()
settings.MinRoadWidth = val settings.MinRoadWidth = val
markPresetDirty()
})) }))
maxRoadWidthSlider := newNumericInputSliderWithStep(minRoadWidthPercent, maxRoadWidthPercent, settings.MaxRoadWidth, roadWidthPercentStep, "%.1f%%", "Max Road Width") maxRoadWidthSlider := newNumericInputSliderWithStep(minRoadWidthPercent, maxRoadWidthPercent, settings.MaxRoadWidth, roadWidthPercentStep, "%.1f%%", "Max Road Width")
@@ -664,6 +692,7 @@ func main() {
maxRoadWidthSlider.value.AddListener(binding.NewDataListener(func() { maxRoadWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxRoadWidthSlider.value.Get() val, _ := maxRoadWidthSlider.value.Get()
settings.MaxRoadWidth = val settings.MaxRoadWidth = val
markPresetDirty()
})) }))
buildingsPerRoadSlider := newNumericInputSlider(1, 20, float64(settings.BuildingsPerRoad), "%.0f", "Buildings Per Road") buildingsPerRoadSlider := newNumericInputSlider(1, 20, float64(settings.BuildingsPerRoad), "%.0f", "Buildings Per Road")
@@ -676,6 +705,7 @@ func main() {
buildingsPerRoadSlider.value.AddListener(binding.NewDataListener(func() { buildingsPerRoadSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := buildingsPerRoadSlider.value.Get() val, _ := buildingsPerRoadSlider.value.Get()
settings.BuildingsPerRoad = int(val) settings.BuildingsPerRoad = int(val)
markPresetDirty()
})) }))
roadExitsSlider := newNumericInputSlider(0, 100, float64(settings.RoadExits), "%.0f", "Road Exits") roadExitsSlider := newNumericInputSlider(0, 100, float64(settings.RoadExits), "%.0f", "Road Exits")
@@ -688,6 +718,7 @@ func main() {
roadExitsSlider.value.AddListener(binding.NewDataListener(func() { roadExitsSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := roadExitsSlider.value.Get() val, _ := roadExitsSlider.value.Get()
settings.RoadExits = int(val) settings.RoadExits = int(val)
markPresetDirty()
})) }))
roadCurvynessSlider := newNumericInputSlider(0, 100, settings.RoadCurvyness, "%.0f%%", "Road Curvyness") roadCurvynessSlider := newNumericInputSlider(0, 100, settings.RoadCurvyness, "%.0f%%", "Road Curvyness")
@@ -700,6 +731,7 @@ func main() {
roadCurvynessSlider.value.AddListener(binding.NewDataListener(func() { roadCurvynessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := roadCurvynessSlider.value.Get() val, _ := roadCurvynessSlider.value.Get()
settings.RoadCurvyness = val settings.RoadCurvyness = val
markPresetDirty()
})) }))
roadDistributionSlider := newNumericInputSlider(0, 100, settings.RoadDistribution, "%.0f%%", "Distribution") roadDistributionSlider := newNumericInputSlider(0, 100, settings.RoadDistribution, "%.0f%%", "Distribution")
@@ -712,6 +744,7 @@ func main() {
roadDistributionSlider.value.AddListener(binding.NewDataListener(func() { roadDistributionSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := roadDistributionSlider.value.Get() val, _ := roadDistributionSlider.value.Get()
settings.RoadDistribution = val settings.RoadDistribution = val
markPresetDirty()
})) }))
minRoadAngleSlider := newNumericInputSlider(0, 180, settings.MinRoadAngle, "%.0f°", "Minimum Road Angle") minRoadAngleSlider := newNumericInputSlider(0, 180, settings.MinRoadAngle, "%.0f°", "Minimum Road Angle")
@@ -724,6 +757,7 @@ func main() {
minRoadAngleSlider.value.AddListener(binding.NewDataListener(func() { minRoadAngleSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minRoadAngleSlider.value.Get() val, _ := minRoadAngleSlider.value.Get()
settings.MinRoadAngle = val settings.MinRoadAngle = val
markPresetDirty()
})) }))
minWallWidthSlider := newNumericInputSliderWithStep(minWallWidthPercent, maxWallWidthPercent, settings.MinWallWidth, wallWidthPercentStep, "%.1f%%", "Min Wall Width") minWallWidthSlider := newNumericInputSliderWithStep(minWallWidthPercent, maxWallWidthPercent, settings.MinWallWidth, wallWidthPercentStep, "%.1f%%", "Min Wall Width")
@@ -736,6 +770,7 @@ func main() {
minWallWidthSlider.value.AddListener(binding.NewDataListener(func() { minWallWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minWallWidthSlider.value.Get() val, _ := minWallWidthSlider.value.Get()
settings.MinWallWidth = val settings.MinWallWidth = val
markPresetDirty()
})) }))
maxWallWidthSlider := newNumericInputSliderWithStep(minWallWidthPercent, maxWallWidthPercent, settings.MaxWallWidth, wallWidthPercentStep, "%.1f%%", "Max Wall Width") maxWallWidthSlider := newNumericInputSliderWithStep(minWallWidthPercent, maxWallWidthPercent, settings.MaxWallWidth, wallWidthPercentStep, "%.1f%%", "Max Wall Width")
@@ -748,6 +783,7 @@ func main() {
maxWallWidthSlider.value.AddListener(binding.NewDataListener(func() { maxWallWidthSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxWallWidthSlider.value.Get() val, _ := maxWallWidthSlider.value.Get()
settings.MaxWallWidth = val settings.MaxWallWidth = val
markPresetDirty()
})) }))
numWallsSlider := newNumericInputSlider(0, 5, float64(settings.NumWalls), "%.0f", "Number of Walls") numWallsSlider := newNumericInputSlider(0, 5, float64(settings.NumWalls), "%.0f", "Number of Walls")
@@ -760,6 +796,7 @@ func main() {
numWallsSlider.value.AddListener(binding.NewDataListener(func() { numWallsSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := numWallsSlider.value.Get() val, _ := numWallsSlider.value.Get()
settings.NumWalls = int(val) settings.NumWalls = int(val)
markPresetDirty()
})) }))
cityCoverageSlider := newNumericInputSlider(1, 100, settings.CityCoverage, "%.0f%%", "City Coverage") cityCoverageSlider := newNumericInputSlider(1, 100, settings.CityCoverage, "%.0f%%", "City Coverage")
@@ -772,6 +809,7 @@ func main() {
cityCoverageSlider.value.AddListener(binding.NewDataListener(func() { cityCoverageSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := cityCoverageSlider.value.Get() val, _ := cityCoverageSlider.value.Get()
settings.CityCoverage = val settings.CityCoverage = val
markPresetDirty()
})) }))
wallCurvynessSlider := newNumericInputSlider(0, 100, settings.WallCurvyness, "%.0f%%", "Wall Curvyness") wallCurvynessSlider := newNumericInputSlider(0, 100, settings.WallCurvyness, "%.0f%%", "Wall Curvyness")
@@ -784,10 +822,12 @@ func main() {
wallCurvynessSlider.value.AddListener(binding.NewDataListener(func() { wallCurvynessSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := wallCurvynessSlider.value.Get() val, _ := wallCurvynessSlider.value.Get()
settings.WallCurvyness = val settings.WallCurvyness = val
markPresetDirty()
})) }))
showTurretsCheck := widget.NewCheck("Show Turrets", func(v bool) { showTurretsCheck := widget.NewCheck("Show Turrets", func(v bool) {
settings.ShowTurrets = v settings.ShowTurrets = v
markPresetDirty()
}) })
showTurretsCheck.SetChecked(settings.ShowTurrets) showTurretsCheck.SetChecked(settings.ShowTurrets)
@@ -801,11 +841,13 @@ func main() {
turretSizeSlider.value.AddListener(binding.NewDataListener(func() { turretSizeSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := turretSizeSlider.value.Get() val, _ := turretSizeSlider.value.Get()
settings.TurretSize = val settings.TurretSize = val
markPresetDirty()
})) }))
turretShapeLabel := widget.NewLabel("Turret Shape:") turretShapeLabel := widget.NewLabel("Turret Shape:")
turretShapeSelect := widget.NewSelect([]string{"circular", "square"}, func(s string) { turretShapeSelect := widget.NewSelect([]string{"circular", "square"}, func(s string) {
settings.TurretShape = s settings.TurretShape = s
markPresetDirty()
}) })
turretShapeSelect.SetSelected(settings.TurretShape) turretShapeSelect.SetSelected(settings.TurretShape)
@@ -819,6 +861,7 @@ func main() {
turretSpacingSlider.value.AddListener(binding.NewDataListener(func() { turretSpacingSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := turretSpacingSlider.value.Get() val, _ := turretSpacingSlider.value.Get()
settings.TurretSpacing = val settings.TurretSpacing = val
markPresetDirty()
})) }))
gateSpacingSlider := newNumericInputSlider(0, 100, settings.GateSpacing, "%.0f%%", "Gate Spacing") gateSpacingSlider := newNumericInputSlider(0, 100, settings.GateSpacing, "%.0f%%", "Gate Spacing")
@@ -831,6 +874,7 @@ func main() {
gateSpacingSlider.value.AddListener(binding.NewDataListener(func() { gateSpacingSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := gateSpacingSlider.value.Get() val, _ := gateSpacingSlider.value.Get()
settings.GateSpacing = val settings.GateSpacing = val
markPresetDirty()
})) }))
turretControls := container.NewVBox( turretControls := container.NewVBox(
@@ -849,6 +893,7 @@ func main() {
} else { } else {
turretControls.Hide() turretControls.Hide()
} }
markPresetDirty()
} }
// Create UI elements for error display and action buttons // Create UI elements for error display and action buttons
@@ -1284,6 +1329,7 @@ func main() {
numBuildingsSlider.value.AddListener(binding.NewDataListener(func() { numBuildingsSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := numBuildingsSlider.value.Get() val, _ := numBuildingsSlider.value.Get()
settings.NumBuildings = int(val) settings.NumBuildings = int(val)
markPresetDirty()
})) }))
minBuildingSizeSlider := newNumericInputSliderWithStep(minBuildingSizePercent, maxBuildingSizePercent, settings.MinBuildingSize, buildingSizePercentStep, "%.1f%%", "Min Building Size") minBuildingSizeSlider := newNumericInputSliderWithStep(minBuildingSizePercent, maxBuildingSizePercent, settings.MinBuildingSize, buildingSizePercentStep, "%.1f%%", "Min Building Size")
@@ -1296,6 +1342,7 @@ func main() {
minBuildingSizeSlider.value.AddListener(binding.NewDataListener(func() { minBuildingSizeSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minBuildingSizeSlider.value.Get() val, _ := minBuildingSizeSlider.value.Get()
settings.MinBuildingSize = val settings.MinBuildingSize = val
markPresetDirty()
})) }))
maxBuildingSizeSlider := newNumericInputSliderWithStep(minBuildingSizePercent, maxBuildingSizePercent, settings.MaxBuildingSize, buildingSizePercentStep, "%.1f%%", "Max Building Size") maxBuildingSizeSlider := newNumericInputSliderWithStep(minBuildingSizePercent, maxBuildingSizePercent, settings.MaxBuildingSize, buildingSizePercentStep, "%.1f%%", "Max Building Size")
@@ -1308,6 +1355,7 @@ func main() {
maxBuildingSizeSlider.value.AddListener(binding.NewDataListener(func() { maxBuildingSizeSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxBuildingSizeSlider.value.Get() val, _ := maxBuildingSizeSlider.value.Get()
settings.MaxBuildingSize = val settings.MaxBuildingSize = val
markPresetDirty()
})) }))
buildingDistributionSlider := newNumericInputSlider(0, 100, settings.BuildingDistribution, "%.0f%%", "Building Distribution") buildingDistributionSlider := newNumericInputSlider(0, 100, settings.BuildingDistribution, "%.0f%%", "Building Distribution")
@@ -1320,11 +1368,13 @@ func main() {
buildingDistributionSlider.value.AddListener(binding.NewDataListener(func() { buildingDistributionSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := buildingDistributionSlider.value.Get() val, _ := buildingDistributionSlider.value.Get()
settings.BuildingDistribution = val settings.BuildingDistribution = val
markPresetDirty()
})) }))
buildingShapeLabel := widget.NewLabel("Building Shape:") buildingShapeLabel := widget.NewLabel("Building Shape:")
buildingShapeSelect := widget.NewSelect([]string{"squares", "circles", "rectangles", "mixed", "procedural"}, func(s string) { buildingShapeSelect := widget.NewSelect([]string{"squares", "circles", "rectangles", "mixed", "procedural"}, func(s string) {
settings.BuildingShape = s settings.BuildingShape = s
markPresetDirty()
}) })
buildingShapeSelect.SetSelected(settings.BuildingShape) buildingShapeSelect.SetSelected(settings.BuildingShape)
@@ -1360,6 +1410,7 @@ func main() {
minBuildingComplexitySlider.value.AddListener(binding.NewDataListener(func() { minBuildingComplexitySlider.value.AddListener(binding.NewDataListener(func() {
val, _ := minBuildingComplexitySlider.value.Get() val, _ := minBuildingComplexitySlider.value.Get()
settings.MinBuildingComplexity = int(val) settings.MinBuildingComplexity = int(val)
markPresetDirty()
})) }))
maxBuildingComplexitySlider := newNumericInputSlider(1, 6, float64(settings.MaxBuildingComplexity), "%.0f", "Max Building Complexity") maxBuildingComplexitySlider := newNumericInputSlider(1, 6, float64(settings.MaxBuildingComplexity), "%.0f", "Max Building Complexity")
@@ -1372,6 +1423,7 @@ func main() {
maxBuildingComplexitySlider.value.AddListener(binding.NewDataListener(func() { maxBuildingComplexitySlider.value.AddListener(binding.NewDataListener(func() {
val, _ := maxBuildingComplexitySlider.value.Get() val, _ := maxBuildingComplexitySlider.value.Get()
settings.MaxBuildingComplexity = int(val) settings.MaxBuildingComplexity = int(val)
markPresetDirty()
})) }))
buildingComplexityRatioSlider := newNumericInputSlider(0, 100, settings.BuildingComplexityRatio, "%.0f%%", "Building Complexity Ratio") buildingComplexityRatioSlider := newNumericInputSlider(0, 100, settings.BuildingComplexityRatio, "%.0f%%", "Building Complexity Ratio")
@@ -1384,6 +1436,7 @@ func main() {
buildingComplexityRatioSlider.value.AddListener(binding.NewDataListener(func() { buildingComplexityRatioSlider.value.AddListener(binding.NewDataListener(func() {
val, _ := buildingComplexityRatioSlider.value.Get() val, _ := buildingComplexityRatioSlider.value.Get()
settings.BuildingComplexityRatio = val settings.BuildingComplexityRatio = val
markPresetDirty()
})) }))
proceduralContainer := container.NewVBox( proceduralContainer := container.NewVBox(
@@ -1430,6 +1483,7 @@ func main() {
} }
updateRatioSliders() updateRatioSliders()
markPresetDirty()
} }
circleRatioSlider.OnChanged = func(val float64) { circleRatioSlider.OnChanged = func(val float64) {
@@ -1460,6 +1514,7 @@ func main() {
} }
updateRatioSliders() updateRatioSliders()
markPresetDirty()
} }
rectangleRatioSlider.OnChanged = func(val float64) { rectangleRatioSlider.OnChanged = func(val float64) {
@@ -1491,6 +1546,7 @@ func main() {
} }
updateRatioSliders() updateRatioSliders()
markPresetDirty()
} }
buildingShapeSelect.OnChanged = func(s string) { buildingShapeSelect.OnChanged = func(s string) {
@@ -1505,6 +1561,7 @@ func main() {
proceduralContainer.Hide() proceduralContainer.Hide()
ratioContainer.Hide() ratioContainer.Hide()
} }
markPresetDirty()
} }
// Initial visibility check // Initial visibility check
if settings.BuildingShape == "mixed" { if settings.BuildingShape == "mixed" {
@@ -1612,15 +1669,27 @@ func main() {
if !ok { if !ok {
return return
} }
applyingPreset = true
imported, err := loadEmbeddedPreset(path) imported, err := loadEmbeddedPreset(path)
if err != nil { if err != nil {
applyingPreset = false
dialog.ShowError(err, w) dialog.ShowError(err, w)
return return
} }
imported.Seed = settings.Seed imported.Seed = settings.Seed
applySettingsToUI(imported) applySettingsToUI(imported)
time.AfterFunc(50*time.Millisecond, func() {
fyne.Do(func() {
applyingPreset = false
})
})
}) })
presetSelect.SetSelected("No Preset") presetSelect.SetSelected("No Preset")
clearPresetSelection = func() {
if presetSelect.Selected != "No Preset" {
presetSelect.SetSelected("No Preset")
}
}
buildingsTab := container.NewTabItem("Buildings", container.NewVBox( buildingsTab := container.NewTabItem("Buildings", container.NewVBox(
numBuildingsSlider, numBuildingsSlider,