You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.9 KiB
118 lines
3.9 KiB
[Tool] |
|
public partial class TerrainEditingControls |
|
: VBoxContainer |
|
{ |
|
public (ToolMode , Button)[] ToolModeButtons { get; private set; } |
|
public (ToolShape, Button)[] ToolShapeButtons { get; private set; } |
|
public Slider DrawSizeSlider { get; private set; } |
|
public Button[] PaintTextureButtons { get; private set; } |
|
|
|
public Button RaiseLowerToggle { get; private set; } |
|
public Button ConnectedToggle { get; private set; } |
|
|
|
public ToolMode ToolMode { get => GetToolMode (); set => SetToolMode (value); } |
|
public ToolShape ToolShape { get => GetToolShape(); set => SetToolShape(value); } |
|
public int DrawSize { get => GetDrawSize (); set => SetDrawSize (value); } |
|
public int Texture { get => GetTexture (); set => SetTexture (value); } |
|
|
|
[Export] public Texture2D CornerTextureNormal { get; set; } |
|
[Export] public Texture2D CornerTexturePaint { get; set; } |
|
|
|
public override void _Ready() |
|
{ |
|
ToolModeButtons = [ |
|
(ToolMode.Height , GetNode<Button>("Height" )), |
|
(ToolMode.Flatten, GetNode<Button>("Flatten")), |
|
(ToolMode.Paint , GetNode<Button>("Paint" )), |
|
]; |
|
ToolShapeButtons = [ |
|
(ToolShape.Corner, GetNode<Button>("Corner")), |
|
(ToolShape.Circle, GetNode<Button>("Circle")), |
|
(ToolShape.Square, GetNode<Button>("Square")), |
|
]; |
|
PaintTextureButtons = [ |
|
GetNode<Button>("Grass"), |
|
GetNode<Button>("Dirt"), |
|
GetNode<Button>("Rock"), |
|
GetNode<Button>("Sand"), |
|
]; |
|
|
|
foreach (var (mode, button) in ToolModeButtons) |
|
button.Pressed += () => SetToolMode(mode); |
|
foreach (var (shape, button) in ToolShapeButtons) |
|
button.Pressed += () => SetToolShape(shape); |
|
foreach (var (i, button) in PaintTextureButtons.Select((b, i) => (i, b))) |
|
button.Pressed += () => SetTexture(i + 1); |
|
|
|
var drawSizeLabel = GetNode<Label> ("SizeLabel"); |
|
DrawSizeSlider = GetNode<Slider>("SizeSlider"); |
|
DrawSizeSlider.ValueChanged += (_) => drawSizeLabel.Text = $"{DrawSize}"; |
|
|
|
RaiseLowerToggle = GetNode<Button>("RaiseLower"); |
|
ConnectedToggle = GetNode<Button>("Connected"); |
|
} |
|
|
|
ToolMode GetToolMode() |
|
=> ToolModeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolMode.Height; |
|
void SetToolMode(ToolMode value) |
|
{ |
|
if (ToolModeButtons == null) return; |
|
foreach (var (mode, button) in ToolModeButtons) |
|
button.Flat = !(button.ButtonPressed = value == mode); |
|
foreach (var button in PaintTextureButtons) |
|
button.Disabled = value != ToolMode.Paint; |
|
|
|
// In paint mode, `ToolShape.Corner` affects a single tile regardless |
|
// of `DrawSize`. This changes the button's icon to communicate that. |
|
ToolShapeButtons[0].Item2.Icon = (value != ToolMode.Paint) |
|
? CornerTextureNormal : CornerTexturePaint; |
|
|
|
RaiseLowerToggle.Disabled = value is ToolMode.Flatten or ToolMode.Paint; |
|
ConnectedToggle.Disabled = value is ToolMode.Paint; |
|
} |
|
|
|
ToolShape GetToolShape() |
|
=> ToolShapeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolShape.Circle; |
|
void SetToolShape(ToolShape value) |
|
{ |
|
if (ToolShapeButtons == null) return; |
|
foreach (var (shape, button) in ToolShapeButtons) |
|
button.Flat = !(button.ButtonPressed = value == shape); |
|
DrawSizeSlider.Editable = value != ToolShape.Corner; |
|
} |
|
|
|
int GetDrawSize() |
|
=> RoundToInt(-DrawSizeSlider?.Value ?? 1); |
|
void SetDrawSize(int value) |
|
{ |
|
if (DrawSizeSlider == null) return; |
|
DrawSizeSlider.Value = -value; |
|
} |
|
|
|
int GetTexture() |
|
=> PaintTextureButtons? |
|
.Select((b, i) => (Index: i + 1, Button: b)) |
|
.First(x => x.Button.ButtonPressed).Index ?? 1; |
|
void SetTexture(int value) |
|
{ |
|
if (PaintTextureButtons == null) return; |
|
if ((value < 1) || (value > PaintTextureButtons.Length)) |
|
throw new ArgumentOutOfRangeException(nameof(value)); |
|
foreach (var (index, button) in PaintTextureButtons.Select((b, i) => (i, b))) |
|
button.Flat = !(button.ButtonPressed = value == index + 1); |
|
} |
|
} |
|
|
|
public enum ToolMode |
|
{ |
|
Height, |
|
Flatten, |
|
Paint, |
|
} |
|
|
|
public enum ToolShape |
|
{ |
|
Corner, |
|
Circle, |
|
Square, |
|
}
|
|
|