Example #1
0
    public void Init(ActionBarRow row)
    {
        if (mesh == null)
        {
            this.row         = row;
            gameObject.layer = row.Layer;

            BoxCollider collider = gameObject.AddComponent <BoxCollider>();
            collider.center = new Vector3(0.5f, -0.5f, 0f);
            collider.size   = new Vector3(1f, 1f, 0.1f);

            renderer.castShadows    = false;
            renderer.receiveShadows = false;
            renderer.useLightProbes = false;
            renderer.sharedMaterial = ActionBarSettings.Instance.GetAtlasMaterial(0);

            mesh = GetComponent <MeshFilter>().mesh;
            mesh.Clear();
            mesh.vertices  = row.Quad.vertices;
            mesh.triangles = row.Quad.triangles;
            mesh.uv        = row.Quad.uv;
            mesh.uv1       = uv1;
            mesh.colors    = colors;
            mesh.normals   = normals;
        }
    }
Example #2
0
        protected override void HandleEvent(ActionBarButtonStateChangedEventArgs args)
        {
            //TODO: Check actionbar index and handle multiple rows.
            if (ActionBarRow.ContainsKey(args.Index))
            {
                IUIActionBarButton barButton = ActionBarRow[args.Index];

                if (args.ActionType == ActionBarIndexType.Empty)
                {
                    barButton.SetElementActive(false);
                }
                else
                {
                    barButton.SetElementActive(true);

                    //TODO: Refactor for spell/item
                    if (args.ActionType == ActionBarIndexType.Spell)
                    {
                        //TODO: Abstract the icon content loading
                        //TODO: Don't assume we have the content icon. Throw/log better exception
                        SpellDefinitionDataModel definition = SpellDataCollection.GetSpellDefinition(args.ActionId);
                        ContentIconInstanceModel icon       = ContentIconCollection[definition.SpellIconId];

                        ProjectVersionStage.AssertAlpha();
                        //TODO: Load async
                        Texture2D iconTexture = Resources.Load <Texture2D>(Path.Combine("Icon", Path.GetFileNameWithoutExtension(icon.IconPathName)));
                        barButton.ActionBarImageIcon.SetSpriteTexture(iconTexture);
                    }
                    else
                    {
                        throw new InvalidOperationException($"TODO: Implement empty/item action bar support");
                    }
                }
            }
        }
Example #3
0
 void InitPotion(ActionBarRow row, int b, int n)
 {
     row.SetButton(b, new ActionBarDescriptor
     {
         Atlas     = 3,
         Icon      = n,
         ItemGroup = 1,
         ItemType  = n,
         Stackable = true,
         Stack     = 1,
         Callback  = PotionClick
     });
 }
Example #4
0
    public override void OnInspectorGUI()
    {
        BarRow = target as ActionBarRow;
        BarRow.ActionBarButtonPrefab = (GameObject)EditorGUILayout.ObjectField("ActionBar Button", BarRow.ActionBarButtonPrefab, typeof(GameObject), false);
        BarRow.ButtonSize            = EditorGUILayout.Vector2Field("Button Size", BarRow.ButtonSize);
        BarRow.Columns           = EditorGUILayout.IntField("Columns", BarRow.Columns);
        BarRow.ColumnPadding     = EditorGUILayout.IntField("Column Padding", BarRow.ColumnPadding);
        BarRow.Rows              = EditorGUILayout.IntField("Rows", BarRow.Rows);
        BarRow.RowPadding        = EditorGUILayout.IntField("Row Padding", BarRow.RowPadding);
        BarRow.Arrangement       = (ActionBarRow.RowArrangement)EditorGUILayout.EnumPopup("Arrangement", BarRow.Arrangement);
        BarRow.MultipleInstances = EditorGUILayout.Toggle(new GUIContent("Multiple Instances", "If Multiple Instances of the same object is allowed per Row"), BarRow.MultipleInstances);

        BarRow.numGroups = EditorGUILayout.IntField("Number of Groups", BarRow.numGroups);
        if (BarRow.numGroups > BarRow.GroupID.Length)
        {
            BarRow.GroupID = new int[BarRow.numGroups];
        }
        else if (BarRow.numGroups < BarRow.GroupID.Length)
        {
            BarRow.GroupID = new int[BarRow.numGroups];
        }
        for (int i = 0; i < BarRow.GroupID.Length; i++)
        {
            BarRow.GroupID[i] = EditorGUILayout.IntField("ID", BarRow.GroupID[i]);
        }
        if (BarRow.Editor_ButtonInformation != null)
        {
            System.Array.Resize(ref ButtonFolds, BarRow.Editor_ButtonInformation.Count);
        }
        if (BarRow.Editor_ButtonInformation.Count > (BarRow.Columns * BarRow.Rows))
        {
            for (int i = 0; i < BarRow.Editor_ButtonInformation.Count; i++)
            {
                if (i < (BarRow.Columns * BarRow.Rows))
                {
                    if (BarRow.Editor_ButtonInformation[i] == null)
                    {
                        BarRow.Editor_ButtonInformation[i] = new ActionBarInitialization();
                    }
                }
                else
                {
                    BarRow.Editor_ButtonInformation.RemoveAt(i);
                }
            }
            ButtonFolds = new bool[BarRow.Editor_ButtonInformation.Count];
        }
        else if (BarRow.Editor_ButtonInformation.Count < (BarRow.Columns * BarRow.Rows))
        {
            for (int i = 0; i < BarRow.Columns * BarRow.Rows; i++)
            {
                if (i < BarRow.Editor_ButtonInformation.Count)
                {
                    if (BarRow.Editor_ButtonInformation[i] == null)
                    {
                        BarRow.Editor_ButtonInformation[i] = new ActionBarInitialization();
                    }
                }
                else
                {
                    BarRow.Editor_ButtonInformation.Add(new ActionBarInitialization());
                }
            }
            ButtonFolds = new bool[BarRow.Editor_ButtonInformation.Count];
        }

        EditorGUILayout.LabelField("Assign ButtonInformation", EditorStyles.boldLabel);
        //Error Checking******************
        for (int i = 0; i < BarRow.Editor_ButtonInformation.Count; i++)
        {
            if (BarRow.Editor_ButtonInformation[i].InfoNumber > ActionBarItem.Instance.ItemList.Count)
            {
                Debug.LogWarning(BarRow.name + " Button: " + (i + 1) + "  Attempting to Access Item/Spell that no longer exists!");
            }
        }
        if (ActionBarItem.Instance.ItemList.Count == 0)
        {
            Debug.LogWarning("No Item(s)  have been created.  Assign items in the ActionBar Controller");
        }
        //Error Checking ******************
        for (int i = 0; i < BarRow.Editor_ButtonInformation.Count; i++)
        {
            ButtonFolds[i] = EditorGUILayout.Foldout(ButtonFolds[i], "Button: " + (i + 1).ToString());
            if (ButtonFolds[i] == true)
            {
                BarRow.Editor_ButtonInformation[i].HotKey   = (KeyCode)EditorGUILayout.EnumPopup(new GUIContent("Hotkey", "Hotkey for this Button"), BarRow.Editor_ButtonInformation[i].HotKey);
                BarRow.Editor_ButtonInformation[i].isLocked = EditorGUILayout.Toggle(new GUIContent("Locked", "If you can pickup Items placed inside this button"), BarRow.Editor_ButtonInformation[i].isLocked);
                if (BarRow.Editor_ButtonInformation[i].isLocked == true)
                {
                    BarRow.Editor_ButtonInformation[i].isCloneOnPickup = EditorGUILayout.Toggle(new GUIContent("Clone on Pickup", "Creates a new object on Pickup instead of replacing it"), BarRow.Editor_ButtonInformation[i].isCloneOnPickup);
                }
                else
                {
                    BarRow.Editor_ButtonInformation[i].isCloneOnPickup = false;
                }
                BarRow.Editor_ButtonInformation[i].isEmpty = EditorGUILayout.Toggle(new GUIContent("Empty Button", "If Button should start empty"), BarRow.Editor_ButtonInformation[i].isEmpty);
                if (BarRow.Editor_ButtonInformation[i].isEmpty == false)
                {
                    EditorGUILayout.LabelField("Button Content", EditorStyles.boldLabel);


                    BarRow.Editor_ButtonInformation[i].InfoNumber = EditorGUILayout.Popup(BarRow.Editor_ButtonInformation[i].InfoNumber, ActionBarItem.Instance.ItemNames, EditorStyles.popup);
                    if (ActionBarItem.Instance.ItemList.Count != 0)
                    {
                        if (BarRow.Editor_ButtonInformation[i].InfoNumber < ActionBarItem.Instance.ItemList.Count)
                        {
                            if (ActionBarItem.Instance.ItemList[BarRow.Editor_ButtonInformation[i].InfoNumber].Stackable == true)
                            {
                                BarRow.Editor_ButtonInformation[i].Info.SeperateInstance = EditorGUILayout.Toggle(new GUIContent("Seperate Instance", "Is this item it's own instance of stacks?"), BarRow.Editor_ButtonInformation[i].Info.SeperateInstance);
                                if (BarRow.Editor_ButtonInformation[i].Info.SeperateInstance == true)
                                {
                                    BarRow.Editor_ButtonInformation[i].Stacks = EditorGUILayout.IntField(new GUIContent("Stacks", "Starting Stacks on Spell/Item.                           Set to Zero for Infinite"), BarRow.Editor_ButtonInformation[i].Stacks);
                                }
                                else
                                {
                                    BarRow.Editor_ButtonInformation[i].Stacks = ActionBarItem.Instance.ItemList[BarRow.Editor_ButtonInformation[i].InfoNumber].Stack;
                                }
                            }
                        }
                    }
                }
                else                 //is empty
                {
                    BarRow.Editor_ButtonInformation[i].InfoNumber            = 0;
                    BarRow.Editor_ButtonInformation[i].Info.SeperateInstance = false;
                    BarRow.Editor_ButtonInformation[i].Stacks = 0;
                }
            }
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(BarRow);
        }
    }
    public override void OnInspectorGUI()
    {
        ActionBarRow row = target as ActionBarRow;

        if (row == null)
        {
            return;
        }

        var buttonSize = ActionBarUtils.GetField<int>(row, "buttonSize");
        var buttonRows = ActionBarUtils.GetField<int>(row, "buttonRows");
        var buttonColumns = ActionBarUtils.GetField<int>(row, "buttonColumns");
        var buttonRowSpacing = ActionBarUtils.GetField<int>(row, "buttonRowSpacing");
        var buttonColumnSpacing = ActionBarUtils.GetField<int>(row, "buttonColumnSpacing");
        var buttonSettings = ActionBarUtils.GetField<ActionBarButtonSettings[]>(row, "buttonSettings");
        var isLocked = ActionBarUtils.GetField<bool>(row, "isLocked");
        var cloneOnPickup = ActionBarUtils.GetField<bool>(row, "cloneOnPickup");
        var removeCloneWithinGroup = ActionBarUtils.GetField<bool>(row, "removeCloneWithinGroup");
        var itemGroup = ActionBarUtils.GetField<int>(row, "itemGroup");
        var excludeGroups = ActionBarUtils.GetField<int[]>(row, "excludeGroups");
        var labelOverrideFont = ActionBarUtils.GetField<bool>(row, "labelOverrideFont");
        var labelFontSize = ActionBarUtils.GetField<float>(row, "labelFontSize");
        var labelFontPosition = ActionBarUtils.GetField<Vector2>(row, "labelFontPosition");
        var stackOverrideFont = ActionBarUtils.GetField<bool>(row, "stackOverrideFont");
        var stackFontSize = ActionBarUtils.GetField<float>(row, "stackFontSize");
        var stackFontPosition = ActionBarUtils.GetField<Vector2>(row, "stackFontPosition");
        var anchor = ActionBarUtils.GetField<bool>(row, "anchor");
        var anchorPoint = ActionBarUtils.GetField<ActionBarRowAnchorPoint>(row, "anchorPoint");
        var anchorOffset = ActionBarUtils.GetField<Vector2>(row, "anchorOffset");

        /*
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Buttons");
        int buttonSettingsLength = EditorGUILayout.IntField(buttonSettings.Value.Length);
        EditorGUILayout.EndHorizontal();
        */

        buttonRows.Value = Mathf.Clamp(EditorGUILayout.IntField("Rows", buttonRows.Value), 0, 64);
        buttonColumns.Value = Mathf.Clamp(EditorGUILayout.IntField("Columns", buttonColumns.Value), 0, 64);
        int buttonSettingsLength = buttonRows.Value * buttonColumns.Value;

        // If we're playing, don't allow editing button settings length
        if (Application.isPlaying)
        {
            if (buttonSettingsLength != buttonSettings.Value.Length)
            {
                Debug.LogWarning("Can't edit button count while playing");
            }

            buttonSettingsLength = buttonSettings.Value.Length;
        }

        isLocked.Value = EditorGUILayout.Toggle("Locked", isLocked.Value);
        cloneOnPickup.Value = EditorGUILayout.Toggle("Clone on pickup", cloneOnPickup.Value);

        if (cloneOnPickup.Value)
        {
            removeCloneWithinGroup.Value = EditorGUILayout.Toggle("De-Clone Within Group", removeCloneWithinGroup.Value);
        }

        itemGroup.Value = EditorGUILayout.IntField("Item Group", itemGroup.Value);
        buttonSize.Value = EditorGUILayout.IntField("Size", buttonSize.Value);
        buttonRowSpacing.Value = EditorGUILayout.IntField("Row Spacing", buttonRowSpacing.Value);
        buttonColumnSpacing.Value = EditorGUILayout.IntField("Column Spacing", buttonColumnSpacing.Value);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Exclude Groups");
        int excludeGroupsLength = EditorGUILayout.IntField(excludeGroups.Value.Length);
        EditorGUILayout.EndHorizontal();

        if (excludeGroups.Value.Length != excludeGroupsLength)
        {
            int[] excludeArray = new int[excludeGroupsLength];
            System.Array.Copy(excludeGroups.Value, excludeArray, Mathf.Min(excludeGroups.Value.Length, excludeArray.Length));

            if (excludeArray.Length > excludeGroups.Value.Length)
            {
                for (int i = excludeGroups.Value.Length; i < excludeArray.Length; ++i)
                {
                    excludeArray[i] = -1;
                }
            }

            excludeGroups.Value = excludeArray;
        }

        for (int i = 0; i < excludeGroups.Value.Length; ++i)
        {
            excludeGroups.Value[i] = EditorGUILayout.IntField(excludeGroups.Value[i]);
        }

        // Button settings

        if (buttonSettingsLength != buttonSettings.Value.Length)
        {
            var settingsArray = buttonSettings.Value;

            // Resize array
            System.Array.Resize(ref settingsArray, buttonSettingsLength);

            // Initialize all values
            for (int i = 0; i < buttonSettingsLength; ++i)
            {
                if (settingsArray[i] == null)
                {
                    settingsArray[i] = new ActionBarButtonSettings();
                }
            }

            // Set new array
            buttonSettings.Value = settingsArray;

            // Modify toggled array
            System.Array.Resize(ref keysToggled, buttonSettingsLength);
        }

        if (row != previous)
        {
            previous = row;
            keysToggled = new bool[buttonSettingsLength];
        }

        for (int i = 0; i < buttonSettingsLength; ++i)
        {
            var keyCombo = buttonSettings.Value[i];

            if (keysToggled[i] = EditorGUILayout.Foldout(keysToggled[i], "Button " + i + " key bindings"))
            {
                //EditorGUILayout.LabelField("Button #" + i, EditorStyles.boldLabel);
                EditorGUILayout.LabelField("Primary", EditorStyles.miniBoldLabel);
                keyCombo.PrimaryKey = (KeyCode)EditorGUILayout.EnumPopup("Key", keyCombo.PrimaryKey);
                keyCombo.PrimaryModifiers = (ActionBarModifierKeys)EditorGUILayout.EnumMaskField("Modifiers", keyCombo.PrimaryModifiers);

                EditorGUILayout.LabelField("Secondary", EditorStyles.miniBoldLabel);
                keyCombo.SecondaryKey = (KeyCode)EditorGUILayout.EnumPopup("Key", keyCombo.SecondaryKey);
                keyCombo.SecondaryModifiers = (ActionBarModifierKeys)EditorGUILayout.EnumMaskField("Modifiers", keyCombo.SecondaryModifiers);
            }
        }

        // Override label font settings

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Override Label Font");
        labelOverrideFont.Value = EditorGUILayout.Toggle(labelOverrideFont.Value);
        EditorGUILayout.EndHorizontal();

        if (labelOverrideFont.Value)
        {
            labelFontSize.Value = EditorGUILayout.FloatField("Label Font Size", labelFontSize.Value);
            labelFontPosition.Value = EditorGUILayout.Vector2Field("Label Font Position", labelFontPosition.Value);
        }

        // Override stack font settings

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Override Stack Font");
        stackOverrideFont.Value = EditorGUILayout.Toggle(stackOverrideFont.Value);
        EditorGUILayout.EndHorizontal();

        if (stackOverrideFont.Value)
        {
            stackFontSize.Value = EditorGUILayout.FloatField("Stack Font Size", stackFontSize.Value);
            stackFontPosition.Value = EditorGUILayout.Vector2Field("Stack Font Position", stackFontPosition.Value);
        }

        // Anchor

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Anchor");
        anchor.Value = EditorGUILayout.Toggle(anchor.Value);
        EditorGUILayout.EndHorizontal();

        if (anchor.Value)
        {
            anchorPoint.Value = (ActionBarRowAnchorPoint)EditorGUILayout.EnumPopup("Point", anchorPoint.Value);
            anchorOffset.Value = EditorGUILayout.Vector2Field("Offset", anchorOffset.Value);
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(row);
        }
    }
Example #6
0
    public void Init(ActionBarRow row)
    {
        if (mesh == null)
        {
            this.row = row;
            gameObject.layer = row.Layer;

            BoxCollider collider = gameObject.AddComponent<BoxCollider>();
            collider.center = new Vector3(0.5f, -0.5f, 0f);
            collider.size = new Vector3(1f, 1f, 0.1f);

            renderer.castShadows = false;
            renderer.receiveShadows = false;
            renderer.useLightProbes = false;
            renderer.sharedMaterial = ActionBarSettings.Instance.GetAtlasMaterial(0);

            mesh = GetComponent<MeshFilter>().mesh;
            mesh.Clear();
            mesh.vertices = row.Quad.vertices;
            mesh.triangles = row.Quad.triangles;
            mesh.uv = row.Quad.uv;
            mesh.uv1 = uv1;
            mesh.colors = colors;
            mesh.normals = normals;
        }
    }
Example #7
0
 void InitPotion(ActionBarRow row, int b, int n)
 {
     row.SetButton(b, new ActionBarDescriptor
     {
         Atlas = 3,
         Icon = n,
         ItemGroup = 1,
         ItemType = n,
         Stackable = true,
         Stack = 1,
         Callback = PotionClick
     });
 }
Example #8
0
    public override void OnInspectorGUI()
    {
        ActionBarRow row = target as ActionBarRow;

        if (row == null)
        {
            return;
        }

        var buttonSize             = ActionBarUtils.GetField <int>(row, "buttonSize");
        var buttonRows             = ActionBarUtils.GetField <int>(row, "buttonRows");
        var buttonColumns          = ActionBarUtils.GetField <int>(row, "buttonColumns");
        var buttonRowSpacing       = ActionBarUtils.GetField <int>(row, "buttonRowSpacing");
        var buttonColumnSpacing    = ActionBarUtils.GetField <int>(row, "buttonColumnSpacing");
        var buttonSettings         = ActionBarUtils.GetField <ActionBarButtonSettings[]>(row, "buttonSettings");
        var isLocked               = ActionBarUtils.GetField <bool>(row, "isLocked");
        var cloneOnPickup          = ActionBarUtils.GetField <bool>(row, "cloneOnPickup");
        var removeCloneWithinGroup = ActionBarUtils.GetField <bool>(row, "removeCloneWithinGroup");
        var itemGroup              = ActionBarUtils.GetField <int>(row, "itemGroup");
        var excludeGroups          = ActionBarUtils.GetField <int[]>(row, "excludeGroups");
        var labelOverrideFont      = ActionBarUtils.GetField <bool>(row, "labelOverrideFont");
        var labelFontSize          = ActionBarUtils.GetField <float>(row, "labelFontSize");
        var labelFontPosition      = ActionBarUtils.GetField <Vector2>(row, "labelFontPosition");
        var stackOverrideFont      = ActionBarUtils.GetField <bool>(row, "stackOverrideFont");
        var stackFontSize          = ActionBarUtils.GetField <float>(row, "stackFontSize");
        var stackFontPosition      = ActionBarUtils.GetField <Vector2>(row, "stackFontPosition");
        var anchor       = ActionBarUtils.GetField <bool>(row, "anchor");
        var anchorPoint  = ActionBarUtils.GetField <ActionBarRowAnchorPoint>(row, "anchorPoint");
        var anchorOffset = ActionBarUtils.GetField <Vector2>(row, "anchorOffset");

        /*
         * EditorGUILayout.BeginHorizontal();
         * EditorGUILayout.PrefixLabel("Buttons");
         * int buttonSettingsLength = EditorGUILayout.IntField(buttonSettings.Value.Length);
         * EditorGUILayout.EndHorizontal();
         */

        buttonRows.Value    = Mathf.Clamp(EditorGUILayout.IntField("Rows", buttonRows.Value), 0, 64);
        buttonColumns.Value = Mathf.Clamp(EditorGUILayout.IntField("Columns", buttonColumns.Value), 0, 64);
        int buttonSettingsLength = buttonRows.Value * buttonColumns.Value;

        // If we're playing, don't allow editing button settings length
        if (Application.isPlaying)
        {
            if (buttonSettingsLength != buttonSettings.Value.Length)
            {
                Debug.LogWarning("Can't edit button count while playing");
            }

            buttonSettingsLength = buttonSettings.Value.Length;
        }

        isLocked.Value      = EditorGUILayout.Toggle("Locked", isLocked.Value);
        cloneOnPickup.Value = EditorGUILayout.Toggle("Clone on pickup", cloneOnPickup.Value);

        if (cloneOnPickup.Value)
        {
            removeCloneWithinGroup.Value = EditorGUILayout.Toggle("De-Clone Within Group", removeCloneWithinGroup.Value);
        }

        itemGroup.Value           = EditorGUILayout.IntField("Item Group", itemGroup.Value);
        buttonSize.Value          = EditorGUILayout.IntField("Size", buttonSize.Value);
        buttonRowSpacing.Value    = EditorGUILayout.IntField("Row Spacing", buttonRowSpacing.Value);
        buttonColumnSpacing.Value = EditorGUILayout.IntField("Column Spacing", buttonColumnSpacing.Value);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Exclude Groups");
        int excludeGroupsLength = EditorGUILayout.IntField(excludeGroups.Value.Length);

        EditorGUILayout.EndHorizontal();

        if (excludeGroups.Value.Length != excludeGroupsLength)
        {
            int[] excludeArray = new int[excludeGroupsLength];
            System.Array.Copy(excludeGroups.Value, excludeArray, Mathf.Min(excludeGroups.Value.Length, excludeArray.Length));

            if (excludeArray.Length > excludeGroups.Value.Length)
            {
                for (int i = excludeGroups.Value.Length; i < excludeArray.Length; ++i)
                {
                    excludeArray[i] = -1;
                }
            }

            excludeGroups.Value = excludeArray;
        }

        for (int i = 0; i < excludeGroups.Value.Length; ++i)
        {
            excludeGroups.Value[i] = EditorGUILayout.IntField(excludeGroups.Value[i]);
        }

        // Button settings

        if (buttonSettingsLength != buttonSettings.Value.Length)
        {
            var settingsArray = buttonSettings.Value;

            // Resize array
            System.Array.Resize(ref settingsArray, buttonSettingsLength);

            // Initialize all values
            for (int i = 0; i < buttonSettingsLength; ++i)
            {
                if (settingsArray[i] == null)
                {
                    settingsArray[i] = new ActionBarButtonSettings();
                }
            }

            // Set new array
            buttonSettings.Value = settingsArray;

            // Modify toggled array
            System.Array.Resize(ref keysToggled, buttonSettingsLength);
        }

        if (row != previous)
        {
            previous    = row;
            keysToggled = new bool[buttonSettingsLength];
        }

        for (int i = 0; i < buttonSettingsLength; ++i)
        {
            var keyCombo = buttonSettings.Value[i];

            if (keysToggled[i] = EditorGUILayout.Foldout(keysToggled[i], "Button " + i + " key bindings"))
            {
                //EditorGUILayout.LabelField("Button #" + i, EditorStyles.boldLabel);
                EditorGUILayout.LabelField("Primary", EditorStyles.miniBoldLabel);
                keyCombo.PrimaryKey       = (KeyCode)EditorGUILayout.EnumPopup("Key", keyCombo.PrimaryKey);
                keyCombo.PrimaryModifiers = (ActionBarModifierKeys)EditorGUILayout.EnumMaskField("Modifiers", keyCombo.PrimaryModifiers);

                EditorGUILayout.LabelField("Secondary", EditorStyles.miniBoldLabel);
                keyCombo.SecondaryKey       = (KeyCode)EditorGUILayout.EnumPopup("Key", keyCombo.SecondaryKey);
                keyCombo.SecondaryModifiers = (ActionBarModifierKeys)EditorGUILayout.EnumMaskField("Modifiers", keyCombo.SecondaryModifiers);
            }
        }

        // Override label font settings

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Override Label Font");
        labelOverrideFont.Value = EditorGUILayout.Toggle(labelOverrideFont.Value);
        EditorGUILayout.EndHorizontal();

        if (labelOverrideFont.Value)
        {
            labelFontSize.Value     = EditorGUILayout.FloatField("Label Font Size", labelFontSize.Value);
            labelFontPosition.Value = EditorGUILayout.Vector2Field("Label Font Position", labelFontPosition.Value);
        }

        // Override stack font settings

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Override Stack Font");
        stackOverrideFont.Value = EditorGUILayout.Toggle(stackOverrideFont.Value);
        EditorGUILayout.EndHorizontal();

        if (stackOverrideFont.Value)
        {
            stackFontSize.Value     = EditorGUILayout.FloatField("Stack Font Size", stackFontSize.Value);
            stackFontPosition.Value = EditorGUILayout.Vector2Field("Stack Font Position", stackFontPosition.Value);
        }

        // Anchor

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Anchor");
        anchor.Value = EditorGUILayout.Toggle(anchor.Value);
        EditorGUILayout.EndHorizontal();

        if (anchor.Value)
        {
            anchorPoint.Value  = (ActionBarRowAnchorPoint)EditorGUILayout.EnumPopup("Point", anchorPoint.Value);
            anchorOffset.Value = EditorGUILayout.Vector2Field("Offset", anchorOffset.Value);
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(row);
        }
    }