private void AddButton_OnClick(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(NewCategoryName))
            {
                return;
            }

            // Ensure that no char in the string is an invalid filename char
            if (NewCategoryName.Any(chr => Path.GetInvalidFileNameChars().Contains(chr)))
            {
                return;
            }

            if (!_categories.Contains(NewCategoryName))
            {
                _categories.Add(NewCategoryName);
            }
        }
        void DrawNewCategoryAndSearch(float width, TargetDatabase targetDatabase)
        {
            QUI.BeginHorizontal(width);
            {
                #region New Category
                if (SearchPatternAnimBool.faded < 0.2f)
                {
                    if (QUI.GhostButton("New Category", QColors.Color.Green, 100 * (1 - SearchPatternAnimBool.faded), 20, NewCategoryAnimBool.value) ||
                        DetectKeyCombo_Alt_N())
                    {
                        NewCategoryAnimBool.target = !NewCategoryAnimBool.target;
                        if (NewCategoryAnimBool.target)
                        {
                            NewCategoryName = "";
                            SearchPatternAnimBool.target = false;
                            ExpandOrCollapseAllDatabaseCategories(targetDatabase, false);
                        }
                    }
                }

                if (NewCategoryAnimBool.target)
                {
                    SearchPatternAnimBool.target = false;
                    QUI.SetGUIBackgroundColor(QColors.GreenLight.Color);
                    QUI.SetNextControlName("NewCategoryName" + targetDatabase.ToString());
                    NewCategoryName = EditorGUILayout.TextField(NewCategoryName, GUILayout.Width((width - 149) * NewCategoryAnimBool.faded));
                    QUI.ResetColors();

                    if (!NewCategoryAnimBool.value && Event.current.type == EventType.Layout) //if NewCategoryAnimBool.target is true and NewCategoryAnimBool.value is false -> in transition -> select the text in the control
                    {
                        QUI.FocusControl("NewCategoryName" + targetDatabase.ToString());
                        QUI.FocusTextInControl("NewCategoryName" + targetDatabase.ToString());
                    }

                    if (QUI.ButtonOk() ||
                        (DetectKey_Return() && QUI.GetNameOfFocusedControl().Equals("NewCategoryName" + targetDatabase.ToString())))
                    {
                        if (NewCategoryName.IsNullOrEmpty())
                        {
                            EditorUtility.DisplayDialog("Info", "Cannot create an unnamed category. Try again.", "Ok");
                        }
                        else
                        {
                            switch (targetDatabase)
                            {
                            case TargetDatabase.UIElements:
                                if (DUIData.Instance.DatabaseUIElements.ContainsCategoryName(NewCategoryName))
                                {
                                    EditorUtility.DisplayDialog("Info", "A category named '" + NewCategoryName + "' already exists in the database. Try again.", "Ok");
                                }
                                else
                                {
                                    DUIData.Instance.DatabaseUIElements.AddCategory(NewCategoryName, true);
                                    NewCategoryAnimBool.target = false;
                                }
                                break;

                            case TargetDatabase.UIButtons:
                                if (DUIData.Instance.DatabaseUIButtons.ContainsCategoryName(NewCategoryName))
                                {
                                    EditorUtility.DisplayDialog("Info", "A category named '" + NewCategoryName + "' already exists in the database. Try again.", "Ok");
                                }
                                else
                                {
                                    DUIData.Instance.DatabaseUIButtons.AddCategory(NewCategoryName, true);
                                    NewCategoryAnimBool.target = false;
                                }
                                break;
                            }
                        }
                    }
                    QUI.Space(1);
                    if (QUI.ButtonCancel() ||
                        QUI.DetectKeyDown(Event.current, KeyCode.Escape))
                    {
                        NewCategoryName            = string.Empty;
                        NewCategoryAnimBool.target = false;
                    }
                }
                #endregion
                QUI.FlexibleSpace();
                #region Search
                if (SearchPatternAnimBool.value)
                {
                    NewCategoryAnimBool.target = false;
                    QUI.SetGUIBackgroundColor(QColors.OrangeLight.Color);
                    QUI.SetNextControlName("SearchPattern" + targetDatabase.ToString());
                    SearchPattern = EditorGUILayout.TextField(SearchPattern, GUILayout.Width((width - 104) * SearchPatternAnimBool.faded));
                    QUI.ResetColors();

                    if (SearchPatternAnimBool.target && Event.current.type == EventType.Layout) //if SearchPatternAnimBool.target is true and SearchPatternAnimBool.value is false -> in transition -> select the text in the control
                    {
                        QUI.FocusControl("SearchPattern" + targetDatabase.ToString());
                        QUI.FocusTextInControl("SearchPattern" + targetDatabase.ToString());
                    }
                }


                if (NewCategoryAnimBool.faded < 0.2f)
                {
                    if (QUI.GhostButton(SearchPatternAnimBool.value ? "Clear Search" : "Search", QColors.Color.Orange, 100 * (1 - NewCategoryAnimBool.faded), 20, SearchPatternAnimBool.value) ||
                        DetectKeyCombo_Alt_S() || //Toggle Search
                        (DetectKey_Escape() && SearchPatternAnimBool.target))   //Clear Search
                    {
                        SearchPatternAnimBool.target = !SearchPatternAnimBool.target;
                        if (SearchPatternAnimBool.target)
                        {
                            SearchPattern = string.Empty;
                            NewCategoryAnimBool.target = false;
                            ExpandOrCollapseAllDatabaseCategories(targetDatabase, true);
                        }
                    }
                }
                #endregion
            }
            QUI.EndHorizontal();
        }