Exemple #1
0
        /// <summary>
        /// Makes sure that all text is always selected and exactly one character long when editing.
        /// </summary>
        private void TruncateAndSelectAllTextIfEditing()
        {
                        #if DEV_MODE
            Debug.Log(StringUtils.ToColorizedString(ToString(), ".SelectAllTextIfEditingText with EditingTextField=", DrawGUI.EditingTextField, ", Selected=", Selected, ", ReadOnly=", ReadOnly));
                        #endif

                        #if UNITY_EDITOR
            //not supported at runtime
            if (Selected && DrawGUI.EditingTextField && !ReadOnly)
            {
                TextEditorUtility.SetText(new string(new char[] { Value }));
                TextEditorUtility.SelectAllText();

                GUI.changed = true;
            }
                        #endif
        }
        /// <inheritdoc cref="IDrawer.OnKeyboardInputGiven" />
        public override bool OnKeyboardInputGiven(Event inputEvent, KeyConfigs keys)
        {
                        #if DEV_MODE && DEBUG_KEYBOARD_INPUT
            Debug.Log(ToString() + ".OnKeyboardInputGiven(" + StringUtils.ToString(inputEvent) + ")");
                        #endif

            if (DrawGUI.EditingTextField)
            {
                switch (inputEvent.keyCode)
                {
                case KeyCode.Escape:
                {
                    GUI.changed = true;
                    StopEditingField();
                    DrawGUI.Use(inputEvent);
                    return(true);
                }

                case KeyCode.Return:
                case KeyCode.KeypadEnter:
                {
                    if (inputEvent.modifiers == EventModifiers.None)
                    {
                        GUI.changed = true;
                        StopEditingField();
                        DrawGUI.Use(inputEvent);
                        return(true);
                    }
                    return(false);
                }
                }

                if (keys.DetectTextFieldReservedInput(inputEvent, TextFieldType.Numeric))
                {
                    return(false);
                }
                return(base.OnKeyboardInputGiven(inputEvent, keys));
            }

            switch (inputEvent.keyCode)
            {
            case KeyCode.Alpha0:
            case KeyCode.Alpha1:
            case KeyCode.Alpha2:
            case KeyCode.Alpha3:
            case KeyCode.Alpha4:
            case KeyCode.Alpha5:
            case KeyCode.Alpha6:
            case KeyCode.Alpha7:
            case KeyCode.Alpha8:
            case KeyCode.Alpha9:
            case KeyCode.Keypad0:
            case KeyCode.Keypad1:
            case KeyCode.Keypad2:
            case KeyCode.Keypad3:
            case KeyCode.Keypad4:
            case KeyCode.Keypad5:
            case KeyCode.Keypad6:
            case KeyCode.Keypad7:
            case KeyCode.Keypad8:
            case KeyCode.Keypad9:
                if (inputEvent.modifiers == EventModifiers.None)
                {
                    GUI.changed = true;
                    string valueString = inputEvent.ToString();

                    char valueChar    = valueString[valueString.Length - 1];
                    var  valueNumeric = char.GetNumericValue(valueChar);
                    var  setValue     = (TValue)Convert.ChangeType(valueNumeric, typeof(TValue));

                                                #if DEV_MODE
                    Debug.Log("valueString=" + valueString + ", valueChar=" + valueChar + ", valueNumeric=" + valueNumeric + ", setValue=" + setValue);
                                                #endif

                    Value = setValue;
                    DrawGUI.Use(inputEvent);
                    StartEditingField();

                                                #if UNITY_EDITOR
                    TextEditorUtility.MoveCursorToTextEditorEnd();
                                                #endif
                    return(true);
                }
                break;

            case KeyCode.Return:
            case KeyCode.KeypadEnter:
            {
                if (inputEvent.modifiers == EventModifiers.None && !ReadOnly)
                {
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    StartEditingField();
                    return(true);
                }
                return(false);
            }

            case KeyCode.Comma:
            case KeyCode.Period:
            case KeyCode.KeypadPeriod:
                if (!ReadOnly)
                {
                                                #if UNITY_EDITOR
                    InspectorUtility.ActiveInspector.OnNextLayout(() => TextEditorUtility.Insert('.'));
                                                #endif
                    return(true);
                }
                return(false);

            case KeyCode.Plus:
            case KeyCode.KeypadPlus:
                if (!ReadOnly)
                {
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    double valueNumeric = (double)Convert.ChangeType(Value, Types.Double) + 1d;
                    Value = (TValue)Convert.ChangeType(valueNumeric, typeof(TValue));
                    return(true);
                }
                return(false);

            case KeyCode.Minus:
            case KeyCode.KeypadMinus:
                if (!ReadOnly)
                {
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    double valueNumeric = (double)Convert.ChangeType(Value, Types.Double) - 1d;
                    Value = (TValue)Convert.ChangeType(valueNumeric, typeof(TValue));
                    return(true);
                }
                return(false);

            case KeyCode.F2:
                if (!ReadOnly)
                {
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    StartEditingField();
                    return(true);
                }
                return(false);
            }

            return(base.OnKeyboardInputGiven(inputEvent, keys));
        }
        /// <inheritdoc cref="IDrawer.OnKeyboardInputGiven" />
        public override bool OnKeyboardInputGiven(Event inputEvent, KeyConfigs keys)
        {
                        #if DEV_MODE && DEBUG_KEYBOARD_INPUT
            Debug.Log(StringUtils.ToColorizedString(ToString(), ".OnKeyboardInputGiven(", inputEvent, ") with DrawGUI.EditingTextField=", DrawGUI.EditingTextField, ")"));
                        #endif

            if (DrawGUI.EditingTextField)
            {
                switch (inputEvent.keyCode)
                {
                case KeyCode.Escape:
                    if (!ReadOnly)
                    {
                        DrawGUI.Use(inputEvent);
                        StopEditingField();
                        return(true);
                    }
                    return(false);

                case KeyCode.Return:
                case KeyCode.KeypadEnter:
                {
                    if (inputEvent.modifiers == EventModifiers.None)
                    {
                        if (!textArea)
                        {
                            DrawGUI.Use(inputEvent);
                            StopEditingField();
                            return(true);
                        }
                        return(false);
                    }

                    var textEditor  = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
                    int cursorIndex = textEditor.cursorIndex;
                    textEditor.text         = string.Concat(textEditor.text.Substring(0, cursorIndex), Environment.NewLine, textEditor.text.Substring(cursorIndex));
                    textEditor.cursorIndex += Environment.NewLine.Length;
                    return(true);
                }
                }

                if (keys.DetectTextFieldReservedInput(inputEvent, lastDrawPosition.height > DrawGUI.SingleLineHeight ? TextFieldType.TextArea : TextFieldType.TextRow))
                {
                                        #if DEV_MODE
                    Debug.Log(GetType().Name + ".OnKeyboardInputGiven aborting because detected text field reserved input\ntextArea=" + textArea + "\nInput=" + StringUtils.ToString(inputEvent));
                                        #endif

                    return(false);
                }
                return(base.OnKeyboardInputGiven(inputEvent, keys));
            }

            switch (inputEvent.keyCode)
            {
            case KeyCode.Return:
            case KeyCode.KeypadEnter:
                if (inputEvent.modifiers == EventModifiers.None && !ReadOnly)
                {
                    DrawGUI.Use(inputEvent);
                    //this needs to be delayed or the text field's content can get replaced by a new line character
                    InspectorUtility.ActiveInspector.OnNextLayout(() => InspectorUtility.ActiveInspector.OnNextLayout(StartEditingField));
                    DrawGUI.Use(inputEvent);
                    return(true);
                }
                return(false);

            case KeyCode.F2:
                if (!ReadOnly)
                {
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    StartEditingField();
                    return(true);
                }
                return(false);

                                #if DEV_MODE
            case KeyCode.U:
                if (Event.current.modifiers == EventModifiers.Control && !ReadOnly)
                {
                    if (MixedContent)
                    {
                        Debug.LogWarning("Converting mixed content to upper case not yet supported...");
                        return(true);
                    }

                    if (string.IsNullOrEmpty(Value))
                    {
                        return(true);
                    }

                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    Value = Value.ToUpper();
                    return(true);
                }
                return(false);

            case KeyCode.L:
                if (Event.current.modifiers == EventModifiers.Control && !ReadOnly)
                {
                    if (MixedContent)
                    {
                        Debug.LogWarning("Converting mixed content to lower case not yet supported...");
                        return(true);
                    }

                    if (string.IsNullOrEmpty(Value))
                    {
                        return(true);
                    }

                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    Value = Value.ToLower();
                    ApplyValueToField();
                    return(true);
                }
                return(false);
                                #endif
            default:
                if (inputEvent.character != 0 && inputEvent.modifiers == EventModifiers.None && !ReadOnly)
                {
                    switch (inputEvent.character)
                    {
                    //TO DO: Don't append tab, return etc. at the end of a field
                    case '\t':
                    case '\n':
                    case '\r':
                        //break;
                        //UPDATE: with only a break here,
                        //it was causing the field to get selected again
                        //immediately after being deselected
                        //via the return or enter keys
                        return(false);

                    default:
                        Value = string.Concat(Value, inputEvent.character.ToString());
                        break;
                    }
                    GUI.changed = true;
                    DrawGUI.Use(inputEvent);
                    StartEditingField();

                                                #if UNITY_EDITOR
                    TextEditorUtility.MoveCursorToTextEditorEnd();
                                                #endif

                    return(true);
                }
                break;
            }

            return(base.OnKeyboardInputGiven(inputEvent, keys));
        }