Beispiel #1
0
        protected override void Render()
        {
            _oldCursorColor = GUI.skin.settings.cursorColor;
            _oldSelectionColor = GUI.skin.settings.selectionColor;
            
            GUI.skin.settings.cursorColor = _cursorColor;
            GUI.skin.settings.selectionColor = _selectionColor;

            var hasFocus = FocusManager.Instance.FocusedComponent == this; // I am not focusable, but the parent is

            /*if (hasFocus)
                Debug.Log("Focused: " + Uid);*/

            var isMouseOvered = Contains(MouseEventDispatcher.MouseTarget, true);

            _shouldOptimize = Optimized && !isMouseOvered && !hasFocus && !PasswordMode; /* 20150402 Uncommented "&& !PasswordMode" - BUGFIX for http://forum.edrivengui.com/index.php?threads/textfield-passwordmode-property-bug.295/ */

            //if (_shouldOptimize)
            //    Debug.LogWarning("_shouldOptimize is true!?! " + _shouldOptimize);

            /**
             * NOTE (20120616)
             * While investigating for the reason why text field/area looses selection while optimized
             * I found out that it's not the metter of this text field, but of the other optimized text field which is mouse-overed
             * Until this other field hasn't been mouse-overed, it is being drawn as a bow
             * However, when mouse-overed, it is being drawn as a text field and then it steals unity focus immediatelly!
             * This demands the further investigation
             * */
            
            // draw 2 instances as text fields, others as boxes
            // also, if there is a password mode on, draw TextBox
            if (_shouldOptimize)
            {
                if (UnityEngine.Event.current.type == EventType.Repaint)
                {
                    GUI.Box(RenderingRect, _text, ActiveStyle);
                }
            }
            else
            {
                var shouldRender = hasFocus || UnityEngine.Event.current.type == EventType.Repaint;

                if (shouldRender)
                {
                    GUI.SetNextControlName(Uid);

                    /**
                        * TextField
                        * */
                    if (_passwordMode)
                    {
                        _currentText = MaxChars > -1 ?
                            GUI.PasswordField(RenderingRect, _text, PasswordCharMask, MaxChars, ActiveStyle) :
                            GUI.PasswordField(RenderingRect, _text, PasswordCharMask, ActiveStyle);
                    }

                    else
                    {
                        _currentText = GUI.TextField(RenderingRect, _text, ActiveStyle);
                        if (MaxChars > 0)
                            _currentText = _currentText.Substring(0, MaxChars);
                    }
                }
            }

            //Debug.Log(string.Format("hasFocus: {0}, Editable: {1}, Enabled: {2}", hasFocus, Editable, Enabled));
            if ((hasFocus || isMouseOvered) && Editable && Enabled)
            {
                if (_currentText != _text)
                {
                    // if a list has a length greater than 0:
                    if (_alowedCharsList.Count > 0)
                    {
                        char[] oldArr = _currentText.ToCharArray();
                        StringBuilder sb = new StringBuilder();
                        foreach (char c in oldArr)
                        {
                            if (_alowedCharsList.Contains(c))
                                sb.Append(c);
                        }

                        _currentText = sb.ToString();
                    }

                    // one more time
                    if (_currentText != _text)
                    {
                        //Debug.Log("Dispatching change");
                        if (HasEventListener(TextFieldEvent.TEXT_CHANGING))
                        {
                            _tfe = new TextFieldEvent(TextFieldEvent.TEXT_CHANGING, true)
                                       {
                                           OldText = _text,
                                           NewText = _currentText
                                       }; // bubbles
                            DispatchEvent(_tfe);
                        }

                        if (null != _tfe && _tfe.Canceled) // _tfe is null if nobody listens
                            return;

                        /**
                         * Checking if event is canceled from the outside
                         * */
                        _text = _currentText;
                        _textChanged = true;
                        InvalidateProperties();

                        if (HasEventListener(TextFieldEvent.TEXT_CHANGE))
                        {
                            _tfe = new TextFieldEvent(TextFieldEvent.TEXT_CHANGE, true)
                                       {
                                           OldText = _text,
                                           NewText = _currentText
                                       }; // bubbles
                            DispatchEvent(_tfe);
                        }
                    }
                }
            }

            GUI.skin.settings.cursorColor = _oldCursorColor;
            GUI.skin.settings.selectionColor = _oldSelectionColor;

            Rendered = true;
        }
Beispiel #2
0
        protected override void Render()
        {
            _oldCursorColor = GUI.skin.settings.cursorColor;
            _oldSelectionColor = GUI.skin.settings.selectionColor;

            GUI.skin.settings.cursorColor = _cursorColor;
            GUI.skin.settings.selectionColor = _selectionColor;

            //var owner = Owner ?? this;

            var hasFocus = FocusManager.Instance.FocusedComponent == this; // I am not focusable, but the parent is

            //var ownerCmp = owner as Component;
            var isMouseOvered = Contains(MouseEventDispatcher.MouseTarget, true);

            //Debug.Log("MouseEventDispatcher.MouseTarget: " + MouseEventDispatcher.MouseTarget);

            _shouldOptimize = Optimized && !isMouseOvered && !hasFocus;

            if (_shouldOptimize)
            {
                //if (Uid == "TextField2")
                //    Debug.Log("Drawing box");
                if (UnityEngine.Event.current.type == EventType.Repaint)
                {
                    GUI.Box(RenderingRect, _text, ActiveStyle);
                }
                _activeMode = false;
            }
            else
            {
                if (hasFocus)
                {
                    //TextFieldFocusHelper.BlurUnityFocus();
                    //Debug.Log(Uid);
                    GUI.SetNextControlName(Uid);
                }

                _currentText = MaxChars > -1 ?
                                                    GUI.TextArea(RenderingRect, _text, MaxChars, ActiveStyle) :
                                                                                                                GUI.TextArea(RenderingRect, _text, ActiveStyle);
                //ActiveStyle.DrawCursor(RenderingRect, new GUIContent(_currentText), 1, 40);

                TextEditor editor = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
                //Debug.Log("editor.scrollOffset: " + editor.scrollOffset);
                //Debug.Log("editor.graphicalCursorPos: " + editor.graphicalCursorPos);

                if (null != _newCursorPos)
                {
                    //Debug.Log("Handling text");

                    Vector2 v = _newCursorPos.ToVector2();
                    //Debug.Log("   LocalRenderingRect: " + LocalRenderingRect);
                    //Debug.Log("index: " + index);

                    //Debug.Log("   v: " + v);

                    //int index = ActiveStyle.GetCursorStringIndex(editor.position, new GUIContent(_text), v);

                    //editor.MoveCursorToPosition(v);
                    //editor.SelectNone();
                    //editor.selectPos = -1;
                    //editor.selectPos = index;
                    //editor.pos = index;

                    //editor.DrawCursor("*****************");
                    //editor.selectPos = 10;
                    if (UnityEngine.Event.current.type == EventType.repaint)
                    {
                        //ActiveStyle.DrawCursor(RenderingRect, new GUIContent(_text), 111, index);
                        //ActiveStyle.DrawWithTextSelection(RenderingRect, new GUIContent(_text), 111, 0, 5);
                    }

                    _newCursorPos = null;
                }

                if (!_activeMode)
                {
                    // just switched
                    //Debug.Log("Loading: " + _selectPos + ", " + _pos);
                    editor.pos = _pos;
                    editor.selectPos = _selectPos;
                    _activeMode = true;
                }
                else
                {
                    //Debug.Log("Saving: " + _selectPos + ", " + _pos);
                    _pos = editor.pos;
                    _selectPos = editor.selectPos;
                }

                if (hasFocus)
                {
                    //Debug.Log("Has focus: " + Uid);
                    GUI.FocusControl(Uid);
                }
            }

            //Debug.Log(string.Format("hasFocus: {0}, Editable: {1}, Enabled: {2}", hasFocus, Editable, Enabled));
            if ((hasFocus || isMouseOvered) && Editable && Enabled)
            {
                //Debug.Log("miki " + _text + " -> " + _currentText);
                if (_currentText != _text)
                {
                    // if a list has a length greater than 0:
                    if (_alowedCharsList.Count > 0)
                    {
                        char[] oldArr = _currentText.ToCharArray();
                        StringBuilder sb = new StringBuilder();
                        foreach (char c in oldArr)
                        {
                            if (_alowedCharsList.Contains(c))
                                sb.Append(c);
                        }

                        _currentText = sb.ToString();
                    }

                    // one more time
                    if (_currentText != _text)
                    {
                        //Debug.Log("Dispatching change");

                        if (HasEventListener(TextFieldEvent.TEXT_CHANGING))
                        {
                            _tfe = new TextFieldEvent(TextFieldEvent.TEXT_CHANGING, true)
                            {
                                OldText = _text,
                                NewText = _currentText
                            }; // bubbles
                            DispatchEvent(_tfe);
                        }

                        if (null != _tfe && _tfe.Canceled) // _tfe is null if nobody listens
                            return;

                        /**
                         * Checking if event is canceled from the outside
                         * */
                        //if (null == _tfe || !_tfe.Canceled) {
                        _text = _currentText;
                        _textChanged = true;
                        InvalidateProperties();

                        if (HasEventListener(TextFieldEvent.TEXT_CHANGE))
                        {
                            _tfe = new TextFieldEvent(TextFieldEvent.TEXT_CHANGE, true)
                            {
                                OldText = _text,
                                NewText = _currentText
                            }; // bubbles
                            DispatchEvent(_tfe);
                        }
                    }
                }
            }

            GUI.skin.settings.cursorColor = _oldCursorColor;
            GUI.skin.settings.selectionColor = _oldSelectionColor;
        }