From 4497f85e683877d3871aba5a1733fe64b75fabe3 Mon Sep 17 00:00:00 2001 From: Harry Hodgson Date: Fri, 19 Jul 2019 20:13:08 +0100 Subject: [PATCH 1/4] Assembly definitions added --- Editor/Tests/Validation.meta => Scripts.meta | 4 +--- .../DateOfBirthUtils.cs | 0 .../DateOfBirthUtils.cs.meta | 0 Scripts/Duck.Forms.asmdef | 3 +++ Scripts/Duck.Forms.asmdef.meta | 7 +++++++ Editor.meta => Scripts/Editor.meta | 0 Scripts/Editor/Duck.Forms.Editor.asmdef | 17 +++++++++++++++++ Scripts/Editor/Duck.Forms.Editor.asmdef.meta | 7 +++++++ {Editor => Scripts/Editor}/FormInspector.cs | 0 .../Editor}/FormInspector.cs.meta | 0 FieldConfig.cs => Scripts/FieldConfig.cs | 0 .../FieldConfig.cs.meta | 0 Fields.meta => Scripts/Fields.meta | 0 .../Fields}/AbstractFormField.cs | 0 .../Fields}/AbstractFormField.cs.meta | 0 {Fields => Scripts/Fields}/CheckboxField.cs | 0 .../Fields}/CheckboxField.cs.meta | 0 {Fields => Scripts/Fields}/DateOfBirth.cs | 0 .../Fields}/DateOfBirth.cs.meta | 0 .../Fields}/DateOfBirthDropdownField.cs | 0 .../Fields}/DateOfBirthDropdownField.cs.meta | 0 {Fields => Scripts/Fields}/DropdownField.cs | 0 .../Fields}/DropdownField.cs.meta | 0 {Fields => Scripts/Fields}/RadioButton.cs | 0 .../Fields}/RadioButton.cs.meta | 0 {Fields => Scripts/Fields}/RadioField.cs | 0 {Fields => Scripts/Fields}/RadioField.cs.meta | 0 {Fields => Scripts/Fields}/TextField.cs | 0 {Fields => Scripts/Fields}/TextField.cs.meta | 0 Form.cs => Scripts/Form.cs | 0 Form.cs.meta => Scripts/Form.cs.meta | 0 Validation.meta => Scripts/Validation.meta | 0 .../Validation}/AbstractValidator.cs | 0 .../Validation}/AbstractValidator.cs.meta | 0 .../Validation}/BlackListValidator.cs | 0 .../Validation}/BlackListValidator.cs.meta | 0 .../Validation}/CheckboxIsOnValidator.cs | 0 .../Validation}/CheckboxIsOnValidator.cs.meta | 0 .../Validation}/CheckboxValidator.cs | 0 .../Validation}/CheckboxValidator.cs.meta | 0 .../Validation}/DateOfBirthValidator.cs | 0 .../Validation}/DateOfBirthValidator.cs.meta | 0 .../Validation}/NullOrEmptyValidator.cs | 0 .../Validation}/NullOrEmptyValidator.cs.meta | 0 .../Validation}/RegexValidator.cs | 0 .../Validation}/RegexValidator.cs.meta | 0 .../Validation}/TextLengthValidator.cs | 0 .../Validation}/TextLengthValidator.cs.meta | 0 .../Validation}/TextMatchValidator.cs | 0 .../Validation}/TextMatchValidator.cs.meta | 0 .../Validation}/TextValidator.cs | 0 .../Validation}/TextValidator.cs.meta | 0 Editor/Tests.meta => Tests.meta | 0 Tests/Duck.Forms.Tests.asmdef | 19 +++++++++++++++++++ Tests/Duck.Forms.Tests.asmdef.meta | 7 +++++++ .../FieldValidationTests.cs | 0 .../FieldValidationTests.cs.meta | 0 57 files changed, 61 insertions(+), 3 deletions(-) rename Editor/Tests/Validation.meta => Scripts.meta (62%) rename DateOfBirthUtils.cs => Scripts/DateOfBirthUtils.cs (100%) rename DateOfBirthUtils.cs.meta => Scripts/DateOfBirthUtils.cs.meta (100%) create mode 100644 Scripts/Duck.Forms.asmdef create mode 100644 Scripts/Duck.Forms.asmdef.meta rename Editor.meta => Scripts/Editor.meta (100%) create mode 100644 Scripts/Editor/Duck.Forms.Editor.asmdef create mode 100644 Scripts/Editor/Duck.Forms.Editor.asmdef.meta rename {Editor => Scripts/Editor}/FormInspector.cs (100%) rename {Editor => Scripts/Editor}/FormInspector.cs.meta (100%) rename FieldConfig.cs => Scripts/FieldConfig.cs (100%) rename FieldConfig.cs.meta => Scripts/FieldConfig.cs.meta (100%) rename Fields.meta => Scripts/Fields.meta (100%) rename {Fields => Scripts/Fields}/AbstractFormField.cs (100%) rename {Fields => Scripts/Fields}/AbstractFormField.cs.meta (100%) rename {Fields => Scripts/Fields}/CheckboxField.cs (100%) rename {Fields => Scripts/Fields}/CheckboxField.cs.meta (100%) rename {Fields => Scripts/Fields}/DateOfBirth.cs (100%) rename {Fields => Scripts/Fields}/DateOfBirth.cs.meta (100%) rename {Fields => Scripts/Fields}/DateOfBirthDropdownField.cs (100%) rename {Fields => Scripts/Fields}/DateOfBirthDropdownField.cs.meta (100%) rename {Fields => Scripts/Fields}/DropdownField.cs (100%) rename {Fields => Scripts/Fields}/DropdownField.cs.meta (100%) rename {Fields => Scripts/Fields}/RadioButton.cs (100%) rename {Fields => Scripts/Fields}/RadioButton.cs.meta (100%) rename {Fields => Scripts/Fields}/RadioField.cs (100%) rename {Fields => Scripts/Fields}/RadioField.cs.meta (100%) rename {Fields => Scripts/Fields}/TextField.cs (100%) rename {Fields => Scripts/Fields}/TextField.cs.meta (100%) rename Form.cs => Scripts/Form.cs (100%) rename Form.cs.meta => Scripts/Form.cs.meta (100%) rename Validation.meta => Scripts/Validation.meta (100%) rename {Validation => Scripts/Validation}/AbstractValidator.cs (100%) rename {Validation => Scripts/Validation}/AbstractValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/BlackListValidator.cs (100%) rename {Validation => Scripts/Validation}/BlackListValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/CheckboxIsOnValidator.cs (100%) rename {Validation => Scripts/Validation}/CheckboxIsOnValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/CheckboxValidator.cs (100%) rename {Validation => Scripts/Validation}/CheckboxValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/DateOfBirthValidator.cs (100%) rename {Validation => Scripts/Validation}/DateOfBirthValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/NullOrEmptyValidator.cs (100%) rename {Validation => Scripts/Validation}/NullOrEmptyValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/RegexValidator.cs (100%) rename {Validation => Scripts/Validation}/RegexValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/TextLengthValidator.cs (100%) rename {Validation => Scripts/Validation}/TextLengthValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/TextMatchValidator.cs (100%) rename {Validation => Scripts/Validation}/TextMatchValidator.cs.meta (100%) rename {Validation => Scripts/Validation}/TextValidator.cs (100%) rename {Validation => Scripts/Validation}/TextValidator.cs.meta (100%) rename Editor/Tests.meta => Tests.meta (100%) create mode 100644 Tests/Duck.Forms.Tests.asmdef create mode 100644 Tests/Duck.Forms.Tests.asmdef.meta rename {Editor/Tests/Validation => Tests}/FieldValidationTests.cs (100%) rename {Editor/Tests/Validation => Tests}/FieldValidationTests.cs.meta (100%) diff --git a/Editor/Tests/Validation.meta b/Scripts.meta similarity index 62% rename from Editor/Tests/Validation.meta rename to Scripts.meta index f48e163..ef3c5e5 100644 --- a/Editor/Tests/Validation.meta +++ b/Scripts.meta @@ -1,8 +1,6 @@ fileFormatVersion: 2 -guid: 655a7952097a84160b633e4f15d2e778 +guid: fcb5967cba180474b9fb4cf3756a8740 folderAsset: yes -timeCreated: 1512145153 -licenseType: Free DefaultImporter: externalObjects: {} userData: diff --git a/DateOfBirthUtils.cs b/Scripts/DateOfBirthUtils.cs similarity index 100% rename from DateOfBirthUtils.cs rename to Scripts/DateOfBirthUtils.cs diff --git a/DateOfBirthUtils.cs.meta b/Scripts/DateOfBirthUtils.cs.meta similarity index 100% rename from DateOfBirthUtils.cs.meta rename to Scripts/DateOfBirthUtils.cs.meta diff --git a/Scripts/Duck.Forms.asmdef b/Scripts/Duck.Forms.asmdef new file mode 100644 index 0000000..d276020 --- /dev/null +++ b/Scripts/Duck.Forms.asmdef @@ -0,0 +1,3 @@ +{ + "name": "Duck.Forms" +} diff --git a/Scripts/Duck.Forms.asmdef.meta b/Scripts/Duck.Forms.asmdef.meta new file mode 100644 index 0000000..22d01d0 --- /dev/null +++ b/Scripts/Duck.Forms.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ccb158d1f7a14482916322a7272767a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor.meta b/Scripts/Editor.meta similarity index 100% rename from Editor.meta rename to Scripts/Editor.meta diff --git a/Scripts/Editor/Duck.Forms.Editor.asmdef b/Scripts/Editor/Duck.Forms.Editor.asmdef new file mode 100644 index 0000000..77a9e4b --- /dev/null +++ b/Scripts/Editor/Duck.Forms.Editor.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Duck.Forms.Editor", + "references": [ + "GUID:3ccb158d1f7a14482916322a7272767a" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Scripts/Editor/Duck.Forms.Editor.asmdef.meta b/Scripts/Editor/Duck.Forms.Editor.asmdef.meta new file mode 100644 index 0000000..c9f0562 --- /dev/null +++ b/Scripts/Editor/Duck.Forms.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b7dfc1dd0029414d9720edbf5a47d14 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/FormInspector.cs b/Scripts/Editor/FormInspector.cs similarity index 100% rename from Editor/FormInspector.cs rename to Scripts/Editor/FormInspector.cs diff --git a/Editor/FormInspector.cs.meta b/Scripts/Editor/FormInspector.cs.meta similarity index 100% rename from Editor/FormInspector.cs.meta rename to Scripts/Editor/FormInspector.cs.meta diff --git a/FieldConfig.cs b/Scripts/FieldConfig.cs similarity index 100% rename from FieldConfig.cs rename to Scripts/FieldConfig.cs diff --git a/FieldConfig.cs.meta b/Scripts/FieldConfig.cs.meta similarity index 100% rename from FieldConfig.cs.meta rename to Scripts/FieldConfig.cs.meta diff --git a/Fields.meta b/Scripts/Fields.meta similarity index 100% rename from Fields.meta rename to Scripts/Fields.meta diff --git a/Fields/AbstractFormField.cs b/Scripts/Fields/AbstractFormField.cs similarity index 100% rename from Fields/AbstractFormField.cs rename to Scripts/Fields/AbstractFormField.cs diff --git a/Fields/AbstractFormField.cs.meta b/Scripts/Fields/AbstractFormField.cs.meta similarity index 100% rename from Fields/AbstractFormField.cs.meta rename to Scripts/Fields/AbstractFormField.cs.meta diff --git a/Fields/CheckboxField.cs b/Scripts/Fields/CheckboxField.cs similarity index 100% rename from Fields/CheckboxField.cs rename to Scripts/Fields/CheckboxField.cs diff --git a/Fields/CheckboxField.cs.meta b/Scripts/Fields/CheckboxField.cs.meta similarity index 100% rename from Fields/CheckboxField.cs.meta rename to Scripts/Fields/CheckboxField.cs.meta diff --git a/Fields/DateOfBirth.cs b/Scripts/Fields/DateOfBirth.cs similarity index 100% rename from Fields/DateOfBirth.cs rename to Scripts/Fields/DateOfBirth.cs diff --git a/Fields/DateOfBirth.cs.meta b/Scripts/Fields/DateOfBirth.cs.meta similarity index 100% rename from Fields/DateOfBirth.cs.meta rename to Scripts/Fields/DateOfBirth.cs.meta diff --git a/Fields/DateOfBirthDropdownField.cs b/Scripts/Fields/DateOfBirthDropdownField.cs similarity index 100% rename from Fields/DateOfBirthDropdownField.cs rename to Scripts/Fields/DateOfBirthDropdownField.cs diff --git a/Fields/DateOfBirthDropdownField.cs.meta b/Scripts/Fields/DateOfBirthDropdownField.cs.meta similarity index 100% rename from Fields/DateOfBirthDropdownField.cs.meta rename to Scripts/Fields/DateOfBirthDropdownField.cs.meta diff --git a/Fields/DropdownField.cs b/Scripts/Fields/DropdownField.cs similarity index 100% rename from Fields/DropdownField.cs rename to Scripts/Fields/DropdownField.cs diff --git a/Fields/DropdownField.cs.meta b/Scripts/Fields/DropdownField.cs.meta similarity index 100% rename from Fields/DropdownField.cs.meta rename to Scripts/Fields/DropdownField.cs.meta diff --git a/Fields/RadioButton.cs b/Scripts/Fields/RadioButton.cs similarity index 100% rename from Fields/RadioButton.cs rename to Scripts/Fields/RadioButton.cs diff --git a/Fields/RadioButton.cs.meta b/Scripts/Fields/RadioButton.cs.meta similarity index 100% rename from Fields/RadioButton.cs.meta rename to Scripts/Fields/RadioButton.cs.meta diff --git a/Fields/RadioField.cs b/Scripts/Fields/RadioField.cs similarity index 100% rename from Fields/RadioField.cs rename to Scripts/Fields/RadioField.cs diff --git a/Fields/RadioField.cs.meta b/Scripts/Fields/RadioField.cs.meta similarity index 100% rename from Fields/RadioField.cs.meta rename to Scripts/Fields/RadioField.cs.meta diff --git a/Fields/TextField.cs b/Scripts/Fields/TextField.cs similarity index 100% rename from Fields/TextField.cs rename to Scripts/Fields/TextField.cs diff --git a/Fields/TextField.cs.meta b/Scripts/Fields/TextField.cs.meta similarity index 100% rename from Fields/TextField.cs.meta rename to Scripts/Fields/TextField.cs.meta diff --git a/Form.cs b/Scripts/Form.cs similarity index 100% rename from Form.cs rename to Scripts/Form.cs diff --git a/Form.cs.meta b/Scripts/Form.cs.meta similarity index 100% rename from Form.cs.meta rename to Scripts/Form.cs.meta diff --git a/Validation.meta b/Scripts/Validation.meta similarity index 100% rename from Validation.meta rename to Scripts/Validation.meta diff --git a/Validation/AbstractValidator.cs b/Scripts/Validation/AbstractValidator.cs similarity index 100% rename from Validation/AbstractValidator.cs rename to Scripts/Validation/AbstractValidator.cs diff --git a/Validation/AbstractValidator.cs.meta b/Scripts/Validation/AbstractValidator.cs.meta similarity index 100% rename from Validation/AbstractValidator.cs.meta rename to Scripts/Validation/AbstractValidator.cs.meta diff --git a/Validation/BlackListValidator.cs b/Scripts/Validation/BlackListValidator.cs similarity index 100% rename from Validation/BlackListValidator.cs rename to Scripts/Validation/BlackListValidator.cs diff --git a/Validation/BlackListValidator.cs.meta b/Scripts/Validation/BlackListValidator.cs.meta similarity index 100% rename from Validation/BlackListValidator.cs.meta rename to Scripts/Validation/BlackListValidator.cs.meta diff --git a/Validation/CheckboxIsOnValidator.cs b/Scripts/Validation/CheckboxIsOnValidator.cs similarity index 100% rename from Validation/CheckboxIsOnValidator.cs rename to Scripts/Validation/CheckboxIsOnValidator.cs diff --git a/Validation/CheckboxIsOnValidator.cs.meta b/Scripts/Validation/CheckboxIsOnValidator.cs.meta similarity index 100% rename from Validation/CheckboxIsOnValidator.cs.meta rename to Scripts/Validation/CheckboxIsOnValidator.cs.meta diff --git a/Validation/CheckboxValidator.cs b/Scripts/Validation/CheckboxValidator.cs similarity index 100% rename from Validation/CheckboxValidator.cs rename to Scripts/Validation/CheckboxValidator.cs diff --git a/Validation/CheckboxValidator.cs.meta b/Scripts/Validation/CheckboxValidator.cs.meta similarity index 100% rename from Validation/CheckboxValidator.cs.meta rename to Scripts/Validation/CheckboxValidator.cs.meta diff --git a/Validation/DateOfBirthValidator.cs b/Scripts/Validation/DateOfBirthValidator.cs similarity index 100% rename from Validation/DateOfBirthValidator.cs rename to Scripts/Validation/DateOfBirthValidator.cs diff --git a/Validation/DateOfBirthValidator.cs.meta b/Scripts/Validation/DateOfBirthValidator.cs.meta similarity index 100% rename from Validation/DateOfBirthValidator.cs.meta rename to Scripts/Validation/DateOfBirthValidator.cs.meta diff --git a/Validation/NullOrEmptyValidator.cs b/Scripts/Validation/NullOrEmptyValidator.cs similarity index 100% rename from Validation/NullOrEmptyValidator.cs rename to Scripts/Validation/NullOrEmptyValidator.cs diff --git a/Validation/NullOrEmptyValidator.cs.meta b/Scripts/Validation/NullOrEmptyValidator.cs.meta similarity index 100% rename from Validation/NullOrEmptyValidator.cs.meta rename to Scripts/Validation/NullOrEmptyValidator.cs.meta diff --git a/Validation/RegexValidator.cs b/Scripts/Validation/RegexValidator.cs similarity index 100% rename from Validation/RegexValidator.cs rename to Scripts/Validation/RegexValidator.cs diff --git a/Validation/RegexValidator.cs.meta b/Scripts/Validation/RegexValidator.cs.meta similarity index 100% rename from Validation/RegexValidator.cs.meta rename to Scripts/Validation/RegexValidator.cs.meta diff --git a/Validation/TextLengthValidator.cs b/Scripts/Validation/TextLengthValidator.cs similarity index 100% rename from Validation/TextLengthValidator.cs rename to Scripts/Validation/TextLengthValidator.cs diff --git a/Validation/TextLengthValidator.cs.meta b/Scripts/Validation/TextLengthValidator.cs.meta similarity index 100% rename from Validation/TextLengthValidator.cs.meta rename to Scripts/Validation/TextLengthValidator.cs.meta diff --git a/Validation/TextMatchValidator.cs b/Scripts/Validation/TextMatchValidator.cs similarity index 100% rename from Validation/TextMatchValidator.cs rename to Scripts/Validation/TextMatchValidator.cs diff --git a/Validation/TextMatchValidator.cs.meta b/Scripts/Validation/TextMatchValidator.cs.meta similarity index 100% rename from Validation/TextMatchValidator.cs.meta rename to Scripts/Validation/TextMatchValidator.cs.meta diff --git a/Validation/TextValidator.cs b/Scripts/Validation/TextValidator.cs similarity index 100% rename from Validation/TextValidator.cs rename to Scripts/Validation/TextValidator.cs diff --git a/Validation/TextValidator.cs.meta b/Scripts/Validation/TextValidator.cs.meta similarity index 100% rename from Validation/TextValidator.cs.meta rename to Scripts/Validation/TextValidator.cs.meta diff --git a/Editor/Tests.meta b/Tests.meta similarity index 100% rename from Editor/Tests.meta rename to Tests.meta diff --git a/Tests/Duck.Forms.Tests.asmdef b/Tests/Duck.Forms.Tests.asmdef new file mode 100644 index 0000000..b3c4aa4 --- /dev/null +++ b/Tests/Duck.Forms.Tests.asmdef @@ -0,0 +1,19 @@ +{ + "name": "Duck.Forms.Tests", + "references": [ + "GUID:3ccb158d1f7a14482916322a7272767a" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Tests/Duck.Forms.Tests.asmdef.meta b/Tests/Duck.Forms.Tests.asmdef.meta new file mode 100644 index 0000000..5d6d04a --- /dev/null +++ b/Tests/Duck.Forms.Tests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 653aed1a39022447881d0e7378adb3e4 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Tests/Validation/FieldValidationTests.cs b/Tests/FieldValidationTests.cs similarity index 100% rename from Editor/Tests/Validation/FieldValidationTests.cs rename to Tests/FieldValidationTests.cs diff --git a/Editor/Tests/Validation/FieldValidationTests.cs.meta b/Tests/FieldValidationTests.cs.meta similarity index 100% rename from Editor/Tests/Validation/FieldValidationTests.cs.meta rename to Tests/FieldValidationTests.cs.meta From 5edf6d70ecf21ed3a299d4ef854078f1dc8e8948 Mon Sep 17 00:00:00 2001 From: tlittleworthdubit Date: Fri, 21 May 2021 15:10:35 +0100 Subject: [PATCH 2/4] Added a focus manager to serialize selectable objects, order them in the inspector to allow selectables focus to be switched with the tab input. --- Scripts/Editor/FocusManagerEditor.cs | 61 ++++++++++++ Scripts/Editor/FocusManagerEditor.cs.meta | 11 +++ Scripts/FocusManager.cs | 110 ++++++++++++++++++++++ Scripts/FocusManager.cs.meta | 11 +++ Scripts/FocusMarkedSelectable.cs | 26 +++++ Scripts/FocusMarkedSelectable.cs.meta | 3 + 6 files changed, 222 insertions(+) create mode 100644 Scripts/Editor/FocusManagerEditor.cs create mode 100644 Scripts/Editor/FocusManagerEditor.cs.meta create mode 100644 Scripts/FocusManager.cs create mode 100644 Scripts/FocusManager.cs.meta create mode 100644 Scripts/FocusMarkedSelectable.cs create mode 100644 Scripts/FocusMarkedSelectable.cs.meta diff --git a/Scripts/Editor/FocusManagerEditor.cs b/Scripts/Editor/FocusManagerEditor.cs new file mode 100644 index 0000000..b48360b --- /dev/null +++ b/Scripts/Editor/FocusManagerEditor.cs @@ -0,0 +1,61 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace DUCK.Forms.Editor +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(FocusManager))] + public class FocusManagerEditor : UnityEditor.Editor + { + + private SerializedProperty autoDetectSelectables; + private SerializedProperty selectables; + ReorderableList list; + + void OnEnable() + { + + selectables = serializedObject.FindProperty("selectables"); + list = new ReorderableList(serializedObject, selectables, true, true, true, true); + autoDetectSelectables = serializedObject.FindProperty("autoDetectSelectables"); + list.drawElementCallback = DrawListItems; // Delegate to draw the elements on the list + list.drawHeaderCallback = + DrawHeader; // Skip this line if you set displayHeader to 'false' in your ReorderableList constructor. + + } + + public override void OnInspectorGUI() + { + + serializedObject.Update(); + autoDetectSelectables.boolValue = EditorGUILayout.Toggle("Auto Detect", autoDetectSelectables.boolValue); + list.DoLayoutList(); + serializedObject.ApplyModifiedProperties(); + + FocusManager myScript = (FocusManager) target; + if (!autoDetectSelectables.boolValue) + { + if (GUILayout.Button("Detect Selectables")) + { + myScript.FindSelectablesInScene(); + } + } + } + + void DrawListItems(Rect rect, int index, bool isActive, bool isFocused) + { + SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index); + EditorGUI.PropertyField(new Rect(20, + rect.y, rect.width, EditorGUIUtility.singleLineHeight), + element); + + } + + void DrawHeader(Rect rect) + { + string name = "Selectables"; + EditorGUI.LabelField(rect, name); + } + } +} \ No newline at end of file diff --git a/Scripts/Editor/FocusManagerEditor.cs.meta b/Scripts/Editor/FocusManagerEditor.cs.meta new file mode 100644 index 0000000..4277c47 --- /dev/null +++ b/Scripts/Editor/FocusManagerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c36421a7965ef52409beaff7e184b949 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/FocusManager.cs b/Scripts/FocusManager.cs new file mode 100644 index 0000000..82d04bf --- /dev/null +++ b/Scripts/FocusManager.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; + using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + + namespace DUCK.Forms + { + public class FocusManager : MonoBehaviour + { + [Tooltip("Will add all active selectable UI elements to the list on awake, you cannot decide the order.")] + [SerializeField] + public bool autoDetectSelectables = false; + + [Tooltip("Customise the order of which selectables will be focused on pressing tab.")] [SerializeField] + private List selectables; + + private EventSystem eventSystem; + + void Awake() + { + selectables = new List(); + eventSystem = FindObjectOfType(); + if (FindObjectsOfType().Length > 0) + { + Debug.LogWarning("More than one focus manager present in scene"); + } + + if (autoDetectSelectables) + { + FindActiveSelectionIndex(); + } + } + + public void FindSelectablesInScene() + { + Selectable[] sceneSelectables = FindObjectsOfType(); + for (int i = 0; i < sceneSelectables.Length; i++) + { + if (!selectables.Contains(sceneSelectables[i])) + { + AddSelectable(sceneSelectables[i]); + } + } + } + + public void AddSelectable(Selectable selectable) + { + selectables.Add(selectable); + } + + void Update() + { + if (Input.GetKeyDown(KeyCode.Tab)) + { + Debug.Log("Tab key down"); + OnTab(); + } + } + + private void OnTab() + { + int selectionIndex = FindActiveSelectionIndex(); + CleanDestroyedObjects(); + if (autoDetectSelectables) + { + FindSelectablesInScene(); + } + + if (selectionIndex < selectables.Count - 1) + { + selectionIndex++; + } + else + { + selectionIndex = 0; + } + + if (selectables.Count > 0) + { + SwitchSelectableFocus(selectionIndex); + } + } + + private void SwitchSelectableFocus(int index) + { + eventSystem.SetSelectedGameObject(selectables[index].gameObject); + } + + private int FindActiveSelectionIndex() + { + GameObject highlightedObject = eventSystem.currentSelectedGameObject; + for (int i = 0; i < selectables.Count; i++) + { + if (highlightedObject == selectables[i].gameObject) + return i; + } + + return -1; + } + + private void CleanDestroyedObjects() + { + for (int i = selectables.Count - 1; i >= 0; i--) + { + if (selectables[i] == null || selectables[i].gameObject == null) + selectables.Remove(selectables[i]); + } + } + } + } \ No newline at end of file diff --git a/Scripts/FocusManager.cs.meta b/Scripts/FocusManager.cs.meta new file mode 100644 index 0000000..c8997fc --- /dev/null +++ b/Scripts/FocusManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ac50db0d07758a45aff1400f526cf13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/FocusMarkedSelectable.cs b/Scripts/FocusMarkedSelectable.cs new file mode 100644 index 0000000..ba7e1da --- /dev/null +++ b/Scripts/FocusMarkedSelectable.cs @@ -0,0 +1,26 @@ +using UnityEngine; +using UnityEngine.UI; + + namespace DUCK.Forms + { + /// + /// A component to dynamically add a selectable to the focus manager. If a focus manager does not exist in scene, + /// a new one will be created on Awake. + /// + + [RequireComponent(typeof(Selectable))] + public class FocusMarkedSelectable : MonoBehaviour + { + private void Awake() + { + FocusManager focusManager = FindObjectOfType(); + if (focusManager == null) + { + GameObject obj = new GameObject("Focus Manager"); + focusManager = obj.AddComponent(); + } + + focusManager.AddSelectable(this.GetComponent()); + } + } + } diff --git a/Scripts/FocusMarkedSelectable.cs.meta b/Scripts/FocusMarkedSelectable.cs.meta new file mode 100644 index 0000000..6547dbb --- /dev/null +++ b/Scripts/FocusMarkedSelectable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 29a57b107dfe7f64b9b41c12c66ce33e +timeCreated: 1621263536 \ No newline at end of file From b7cc053576feec4012036363b86d1ac43a72c4d3 Mon Sep 17 00:00:00 2001 From: tlittleworthdubit Date: Mon, 7 Jun 2021 11:43:57 +0100 Subject: [PATCH 3/4] =?UTF-8?q?=E2=98=82=20Mostly=20formatting=20changes?= =?UTF-8?q?=20and=20renames=20for=20PR.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Scripts/Editor/FocusManagerEditor.cs.meta | 11 -------- ...or.cs => SelectableFocusSwitcherEditor.cs} | 22 +++++---------- Scripts/FocusManager.cs.meta | 11 -------- Scripts/FocusMarkedSelectable.cs | 26 ------------------ Scripts/FocusMarkedSelectable.cs.meta | 3 --- ...sManager.cs => SelectableFocusSwitcher.cs} | 27 +++++++------------ 6 files changed, 17 insertions(+), 83 deletions(-) delete mode 100644 Scripts/Editor/FocusManagerEditor.cs.meta rename Scripts/Editor/{FocusManagerEditor.cs => SelectableFocusSwitcherEditor.cs} (70%) delete mode 100644 Scripts/FocusManager.cs.meta delete mode 100644 Scripts/FocusMarkedSelectable.cs delete mode 100644 Scripts/FocusMarkedSelectable.cs.meta rename Scripts/{FocusManager.cs => SelectableFocusSwitcher.cs} (83%) diff --git a/Scripts/Editor/FocusManagerEditor.cs.meta b/Scripts/Editor/FocusManagerEditor.cs.meta deleted file mode 100644 index 4277c47..0000000 --- a/Scripts/Editor/FocusManagerEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c36421a7965ef52409beaff7e184b949 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Scripts/Editor/FocusManagerEditor.cs b/Scripts/Editor/SelectableFocusSwitcherEditor.cs similarity index 70% rename from Scripts/Editor/FocusManagerEditor.cs rename to Scripts/Editor/SelectableFocusSwitcherEditor.cs index b48360b..d59b1ee 100644 --- a/Scripts/Editor/FocusManagerEditor.cs +++ b/Scripts/Editor/SelectableFocusSwitcherEditor.cs @@ -5,35 +5,30 @@ namespace DUCK.Forms.Editor { [CanEditMultipleObjects] - [CustomEditor(typeof(FocusManager))] - public class FocusManagerEditor : UnityEditor.Editor + [CustomEditor(typeof(SelectableFocusSwitcher))] + public class SelectableFocusSwitcherEditor : UnityEditor.Editor { - private SerializedProperty autoDetectSelectables; private SerializedProperty selectables; - ReorderableList list; + private ReorderableList list; void OnEnable() { - selectables = serializedObject.FindProperty("selectables"); list = new ReorderableList(serializedObject, selectables, true, true, true, true); autoDetectSelectables = serializedObject.FindProperty("autoDetectSelectables"); - list.drawElementCallback = DrawListItems; // Delegate to draw the elements on the list - list.drawHeaderCallback = - DrawHeader; // Skip this line if you set displayHeader to 'false' in your ReorderableList constructor. - + list.drawElementCallback = DrawListItems; + list.drawHeaderCallback = DrawHeader; } public override void OnInspectorGUI() { - serializedObject.Update(); autoDetectSelectables.boolValue = EditorGUILayout.Toggle("Auto Detect", autoDetectSelectables.boolValue); list.DoLayoutList(); serializedObject.ApplyModifiedProperties(); - FocusManager myScript = (FocusManager) target; + SelectableFocusSwitcher myScript = (SelectableFocusSwitcher) target; if (!autoDetectSelectables.boolValue) { if (GUILayout.Button("Detect Selectables")) @@ -46,10 +41,7 @@ public override void OnInspectorGUI() void DrawListItems(Rect rect, int index, bool isActive, bool isFocused) { SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index); - EditorGUI.PropertyField(new Rect(20, - rect.y, rect.width, EditorGUIUtility.singleLineHeight), - element); - + EditorGUI.PropertyField(new Rect(20, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element); } void DrawHeader(Rect rect) diff --git a/Scripts/FocusManager.cs.meta b/Scripts/FocusManager.cs.meta deleted file mode 100644 index c8997fc..0000000 --- a/Scripts/FocusManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6ac50db0d07758a45aff1400f526cf13 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Scripts/FocusMarkedSelectable.cs b/Scripts/FocusMarkedSelectable.cs deleted file mode 100644 index ba7e1da..0000000 --- a/Scripts/FocusMarkedSelectable.cs +++ /dev/null @@ -1,26 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - - namespace DUCK.Forms - { - /// - /// A component to dynamically add a selectable to the focus manager. If a focus manager does not exist in scene, - /// a new one will be created on Awake. - /// - - [RequireComponent(typeof(Selectable))] - public class FocusMarkedSelectable : MonoBehaviour - { - private void Awake() - { - FocusManager focusManager = FindObjectOfType(); - if (focusManager == null) - { - GameObject obj = new GameObject("Focus Manager"); - focusManager = obj.AddComponent(); - } - - focusManager.AddSelectable(this.GetComponent()); - } - } - } diff --git a/Scripts/FocusMarkedSelectable.cs.meta b/Scripts/FocusMarkedSelectable.cs.meta deleted file mode 100644 index 6547dbb..0000000 --- a/Scripts/FocusMarkedSelectable.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 29a57b107dfe7f64b9b41c12c66ce33e -timeCreated: 1621263536 \ No newline at end of file diff --git a/Scripts/FocusManager.cs b/Scripts/SelectableFocusSwitcher.cs similarity index 83% rename from Scripts/FocusManager.cs rename to Scripts/SelectableFocusSwitcher.cs index 82d04bf..9bf6806 100644 --- a/Scripts/FocusManager.cs +++ b/Scripts/SelectableFocusSwitcher.cs @@ -1,11 +1,11 @@ -using System.Collections.Generic; - using UnityEngine; +using System.Collections.Generic; +using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace DUCK.Forms { - public class FocusManager : MonoBehaviour + public class SelectableFocusSwitcher : MonoBehaviour { [Tooltip("Will add all active selectable UI elements to the list on awake, you cannot decide the order.")] [SerializeField] @@ -13,18 +13,13 @@ public class FocusManager : MonoBehaviour [Tooltip("Customise the order of which selectables will be focused on pressing tab.")] [SerializeField] private List selectables; - private EventSystem eventSystem; void Awake() { selectables = new List(); eventSystem = FindObjectOfType(); - if (FindObjectsOfType().Length > 0) - { - Debug.LogWarning("More than one focus manager present in scene"); - } - + if (autoDetectSelectables) { FindActiveSelectionIndex(); @@ -36,23 +31,22 @@ public void FindSelectablesInScene() Selectable[] sceneSelectables = FindObjectsOfType(); for (int i = 0; i < sceneSelectables.Length; i++) { - if (!selectables.Contains(sceneSelectables[i])) - { - AddSelectable(sceneSelectables[i]); - } + AddSelectable(sceneSelectables[i]); } } public void AddSelectable(Selectable selectable) { - selectables.Add(selectable); + if (!selectables.Contains(sceneSelectables[i])) + { + selectables.Add(selectable); + } } void Update() { if (Input.GetKeyDown(KeyCode.Tab)) { - Debug.Log("Tab key down"); OnTab(); } } @@ -91,8 +85,7 @@ private int FindActiveSelectionIndex() GameObject highlightedObject = eventSystem.currentSelectedGameObject; for (int i = 0; i < selectables.Count; i++) { - if (highlightedObject == selectables[i].gameObject) - return i; + if (highlightedObject == selectables[i].gameObject) return i; } return -1; From e63b73a5109549fb660e9b8d9660094409b0fe0e Mon Sep 17 00:00:00 2001 From: tlittleworthdubit Date: Fri, 11 Jun 2021 11:16:59 +0100 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20null=20reference=20a?= =?UTF-8?q?nd=20selectables=20being=20deslected.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Scripts/SelectableFocusSwitcher.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Scripts/SelectableFocusSwitcher.cs b/Scripts/SelectableFocusSwitcher.cs index 9bf6806..2f28cb2 100644 --- a/Scripts/SelectableFocusSwitcher.cs +++ b/Scripts/SelectableFocusSwitcher.cs @@ -17,7 +17,9 @@ public class SelectableFocusSwitcher : MonoBehaviour void Awake() { + if(selectables == null){ selectables = new List(); + } eventSystem = FindObjectOfType(); if (autoDetectSelectables) @@ -37,7 +39,7 @@ public void FindSelectablesInScene() public void AddSelectable(Selectable selectable) { - if (!selectables.Contains(sceneSelectables[i])) + if (!selectables.Contains(selectable)) { selectables.Add(selectable); }