Material editor: Vector field spacing

This commit is contained in:
Exter-N 2023-09-01 18:46:40 +02:00
parent 686c53d919
commit 5899a59e06
2 changed files with 19 additions and 15 deletions

View file

@ -13,7 +13,7 @@ public partial class ModEditWindow
{ {
private interface IConstantEditor private interface IConstantEditor
{ {
bool Draw(Span<float> values, bool disabled, float editorWidth); bool Draw(Span<float> values, bool disabled);
} }
private sealed class FloatConstantEditor : IConstantEditor private sealed class FloatConstantEditor : IConstantEditor
@ -42,16 +42,18 @@ public partial class ModEditWindow
_format = $"{_format} {unit.Replace("%", "%%")}"; _format = $"{_format} {unit.Replace("%", "%%")}";
} }
public bool Draw(Span<float> values, bool disabled, float editorWidth) public bool Draw(Span<float> values, bool disabled)
{ {
var fieldWidth = (editorWidth - (values.Length - 1) * ImGui.GetStyle().ItemSpacing.X) / values.Length; var spacing = ImGui.GetStyle().ItemInnerSpacing.X;
var fieldWidth = (ImGui.CalcItemWidth() - (values.Length - 1) * spacing) / values.Length;
var ret = false; var ret = false;
// Not using DragScalarN because of _relativeSpeed and other points of lost flexibility.
for (var valueIdx = 0; valueIdx < values.Length; ++valueIdx) for (var valueIdx = 0; valueIdx < values.Length; ++valueIdx)
{ {
if (valueIdx > 0) if (valueIdx > 0)
ImGui.SameLine(); ImGui.SameLine(0.0f, spacing);
ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx)); ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx));
@ -101,16 +103,18 @@ public partial class ModEditWindow
_format = $"{_format} {unit.Replace("%", "%%")}"; _format = $"{_format} {unit.Replace("%", "%%")}";
} }
public bool Draw(Span<float> values, bool disabled, float editorWidth) public bool Draw(Span<float> values, bool disabled)
{ {
var fieldWidth = (editorWidth - (values.Length - 1) * ImGui.GetStyle().ItemSpacing.X) / values.Length; var spacing = ImGui.GetStyle().ItemInnerSpacing.X;
var fieldWidth = (ImGui.CalcItemWidth() - (values.Length - 1) * spacing) / values.Length;
var ret = false; var ret = false;
// Not using DragScalarN because of _relativeSpeed and other points of lost flexibility.
for (var valueIdx = 0; valueIdx < values.Length; ++valueIdx) for (var valueIdx = 0; valueIdx < values.Length; ++valueIdx)
{ {
if (valueIdx > 0) if (valueIdx > 0)
ImGui.SameLine(); ImGui.SameLine(0.0f, spacing);
ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx)); ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx));
@ -148,13 +152,12 @@ public partial class ModEditWindow
_clamped = clamped; _clamped = clamped;
} }
public bool Draw(Span<float> values, bool disabled, float editorWidth) public bool Draw(Span<float> values, bool disabled)
{ {
switch (values.Length) switch (values.Length)
{ {
case 3: case 3:
{ {
ImGui.SetNextItemWidth(editorWidth);
var value = new Vector3(values); var value = new Vector3(values);
if (_squaredRgb) if (_squaredRgb)
value = PseudoSqrtRgb(value); value = PseudoSqrtRgb(value);
@ -170,7 +173,6 @@ public partial class ModEditWindow
} }
case 4: case 4:
{ {
ImGui.SetNextItemWidth(editorWidth);
var value = new Vector4(values); var value = new Vector4(values);
if (_squaredRgb) if (_squaredRgb)
value = PseudoSqrtRgb(value); value = PseudoSqrtRgb(value);
@ -186,7 +188,7 @@ public partial class ModEditWindow
value.CopyTo(values); value.CopyTo(values);
return true; return true;
} }
default: return FloatConstantEditor.Default.Draw(values, disabled, editorWidth); default: return FloatConstantEditor.Default.Draw(values, disabled);
} }
} }
} }
@ -198,9 +200,10 @@ public partial class ModEditWindow
public EnumConstantEditor(IReadOnlyList<(string Label, float Value, string Description)> values) public EnumConstantEditor(IReadOnlyList<(string Label, float Value, string Description)> values)
=> _values = values; => _values = values;
public bool Draw(Span<float> values, bool disabled, float editorWidth) public bool Draw(Span<float> values, bool disabled)
{ {
var fieldWidth = (editorWidth - (values.Length - 1) * ImGui.GetStyle().ItemSpacing.X) / values.Length; var spacing = ImGui.GetStyle().ItemInnerSpacing.X;
var fieldWidth = (ImGui.CalcItemWidth() - (values.Length - 1) * spacing) / values.Length;
var ret = false; var ret = false;
@ -208,7 +211,7 @@ public partial class ModEditWindow
{ {
using var id = ImRaii.PushId(valueIdx); using var id = ImRaii.PushId(valueIdx);
if (valueIdx > 0) if (valueIdx > 0)
ImGui.SameLine(); ImGui.SameLine(0.0f, spacing);
ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx)); ImGui.SetNextItemWidth(MathF.Round(fieldWidth * (valueIdx + 1)) - MathF.Round(fieldWidth * valueIdx));

View file

@ -259,7 +259,8 @@ public partial class ModEditWindow
if (buffer.Length > 0) if (buffer.Length > 0)
{ {
using var id = ImRaii.PushId($"##{constant.Id:X8}:{slice.Start}"); using var id = ImRaii.PushId($"##{constant.Id:X8}:{slice.Start}");
if (editor.Draw(buffer[slice], disabled, 250.0f)) ImGui.SetNextItemWidth(250.0f);
if (editor.Draw(buffer[slice], disabled))
{ {
ret = true; ret = true;
tab.SetMaterialParameter(constant.Id, slice.Start, buffer[slice]); tab.SetMaterialParameter(constant.Id, slice.Start, buffer[slice]);