using ImGuiNET; using System.Numerics; using SzCore; using SzCore.DataObjects; namespace SzGui.Windows; public class SzDataObjectEditorWindow : SzGuiWindowBase { private readonly SzDataset _dataset; private readonly SzDataObject _dataObject; private bool _isDirty = false; public SzDataObjectEditorWindow(SzDataset dataset, SzDataObject dataObject) { _dataset = dataset; _dataObject = dataObject; WindowName = $"Editing: {dataObject.Name} ({dataset.Name})"; } protected override void RenderContent() { ImGui.TextDisabled($"ID: {_dataObject.Id}"); ImGui.SeparatorText("Fields"); foreach (var field in _dataObject.Fields.Values) { DrawFieldInput(field); } ImGui.Separator(); if (ImGui.Button("Save Object", new Vector2(120, 30))) { Save(); } if (_isDirty) { ImGui.SameLine(); ImGui.TextColored(new Vector4(1, 0.5f, 0, 1), "Unsaved changes..."); } } private void DrawFieldInput(SzField field) { string label = $"{field.Id}##{field.Id}"; string val = field.Value ?? ""; switch (field.FieldType) { case SzFieldType.Text: if (ImGui.InputText(label, ref val, 1024)) { field.Value = val; _isDirty = true; } break; case SzFieldType.Bool: bool bVal = val.ToLower() == "true"; if (ImGui.Checkbox(label, ref bVal)) { field.Value = bVal.ToString().ToLower(); _isDirty = true; } break; case SzFieldType.Number: // Handling numbers as strings in the DataObject, but using DragFloat for UX float.TryParse(val, out float fVal); if (ImGui.DragFloat(label, ref fVal)) { field.Value = fVal.ToString(); _isDirty = true; } break; default: ImGui.Text($"{field.Id}: {val} (Unsupported Type: {field.FieldType})"); break; } } private async void Save() { var result = await SZ.DataHandler.SaveDatasetAsync(_dataset); if (result.IsSuccess) { _isDirty = false; } } }