// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Linq; using FlaxEditor.Content.Settings; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.CustomEditors.Dedicated { /// /// Custom editor for . /// /// [CustomEditor(typeof(NavAgentMask)), DefaultEditor] internal class NavAgentMaskEditor : CustomEditor { private CheckBox[] _checkBoxes; /// public override void Initialize(LayoutElementsContainer layout) { var settings = GameSettings.Load(); if (settings.NavMeshes == null || settings.NavMeshes.Length == 0) { layout.Label("Missing navmesh settings"); return; } _checkBoxes = new CheckBox[settings.NavMeshes.Length]; for (int i = 0; i < settings.NavMeshes.Length; i++) { ref var navmesh = ref settings.NavMeshes[i]; var property = layout.AddPropertyItem(navmesh.Name, navmesh.Agent.ToString()); property.Labels.Last().TextColorHighlighted = navmesh.Color; var checkbox = property.Checkbox().CheckBox; UpdateCheckbox(checkbox, i); checkbox.Tag = i; checkbox.StateChanged += OnCheckboxStateChanged; _checkBoxes[i] = checkbox; } } /// protected override void Deinitialize() { _checkBoxes = null; base.Deinitialize(); } /// public override void Refresh() { if (_checkBoxes != null) { for (int i = 0; i < _checkBoxes.Length; i++) { UpdateCheckbox(_checkBoxes[i], i); } } base.Refresh(); } private void OnCheckboxStateChanged(CheckBox checkBox) { var i = (int)checkBox.Tag; var value = (NavAgentMask)Values[0]; var mask = 1u << i; value.Mask &= ~mask; value.Mask |= checkBox.Checked ? mask : 0; SetValue(value); } private void UpdateCheckbox(CheckBox checkbox, int i) { for (var j = 0; j < Values.Count; j++) { var value = (((NavAgentMask)Values[j]).Mask & (1 << i)) != 0; if (j == 0) { checkbox.Checked = value; } else if (checkbox.State != CheckBoxState.Intermediate) { if (checkbox.Checked != value) checkbox.State = CheckBoxState.Intermediate; } } } } }