public void SetTextEnteringMode(TextEnteringMode mode)
 {
     _textEnteringMode = mode;
 }
    void OnGUI()
    {
        float SPACING = 20;

        GUILayout.BeginHorizontal();
        GUILayout.Space(4);
        GUILayout.Label((_textEnteringMode == TextEnteringMode.AnimName) ? "\"" + _animNameTempString + "\"" : "\"" + _animName + "\"", (_textEnteringMode == TextEnteringMode.AnimName) ? _textStyleFocused : _textStyle);
        GUILayout.Space(SPACING);
        GUILayout.Label("SIZE: " + _pixelDimensionsString, (_textEnteringMode == TextEnteringMode.PixelDimensions) ? _textStyleFocused : _textStyle);
        GUILayout.Space(SPACING);
        GUILayout.Label("HITBOX: " + _hitboxString, (_textEnteringMode == TextEnteringMode.Hitbox) ? _textStyleFocused : (_showingHitbox) ? _textStyleRed : _textStyle);
        GUILayout.Space(SPACING * 5);
        GUILayout.Label("TIME: " + _currentFrameTimeString + ((_textEnteringMode == TextEnteringMode.CurrentFrameTime) ? "" : "s"), (_textEnteringMode == TextEnteringMode.CurrentFrameTime) ? _textStyleFocused : _textStyle);
        GUILayout.Space(SPACING * 3);
        GUILayout.Label(_loopTypeString, _textStyle);
        GUILayout.Space(SPACING * 3);
        GUILayout.Label(_onionSkinString, _textStyle);
        GUILayout.Space(SPACING * 3);
        GUILayout.Label(_mirroringString, _textStyle);
        GUILayout.EndHorizontal();

        if(Input.GetKey(KeyCode.T))
        {
            Vector2 pos = new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y); // gotta flip the y-position;
            float width = _textStyleFocused.CalcSize(new GUIContent(_gridIndexString)).x;
            GUI.TextField(new Rect(pos.x - 2, pos.y - 26, width, 20), _gridIndexString, _textStyleFocused);
        }

        if(_textEnteringMode == TextEnteringMode.LoadAnimation)
        {
            GUI.SetNextControlName("LoadAnim");

            float width = _textStyleFocused.CalcSize(new GUIContent(_loadAnimString)).x;
            _loadAnimString = GUI.TextField(new Rect(30, 30, width, 20), _loadAnimString, _textStyleFocused);

            GUI.FocusControl("LoadAnim");

            if(Event.current.keyCode == KeyCode.Tab)
            {
                _textEnteringMode = TextEnteringMode.None;
            }
            else if(Event.current.keyCode == KeyCode.Return)
            {
                if(_loadAnimString.Length > 0)
                    LoadAnimationString(_loadAnimString);

                _textEnteringMode = TextEnteringMode.None;
            }
        }
        else if(_textEnteringMode == TextEnteringMode.PaletteColor)
        {
            GUI.SetNextControlName("PaletteColor");

            float width = _textStyleFocused.CalcSize(new GUIContent(_paletteColorString)).x;
            _paletteColorString = _paletteColorString.Replace(System.Environment.NewLine, "*");
            _paletteColorString = _paletteColorString.Replace(" ", string.Empty);
            _paletteColorString = _paletteColorString.Replace("\t", string.Empty);
            _paletteColorString = GUI.TextField(new Rect(_paletteInputScreenPosition.x - 2, _paletteInputScreenPosition.y - 26, width, 20), _paletteColorString, _textStyleFocused);

            GUI.FocusControl("PaletteColor");

            if(Event.current.keyCode == KeyCode.Tab)
            {
                _textEnteringMode = TextEnteringMode.None;
            }
            else if(Event.current.keyCode == KeyCode.Return)
            {
                if(_paletteColorString == "x all" || _paletteColorString == "xall")
                {
                    _palette.ClearAllColors();
                    _textEnteringMode = TextEnteringMode.None;
                    return;
                }
                else if(_paletteColorString == "x")
                {
                    AddNewCommand(new DeletePaletteColorCommand(_palette.PaletteColorEditIndex));

                    _palette.RefreshPaletteTextureColors();
                    _textEnteringMode = TextEnteringMode.None;
                    return;
                }

                bool firstColor = true;
                bool replaceAllInstances = false;
                if(_paletteColorString.Length > 0 && _paletteColorString[0] == '=')
                {
                    _paletteColorString = _paletteColorString.Substring(1);
                    replaceAllInstances = true;
                }

                List<Color32> colorsToAdd = new List<Color32>();

                string[] colors = _paletteColorString.Split('*');
                for(int i = 0; i < colors.Length; i++)
                {
                    string[] vals = colors[i].Split(',');
                    if(vals.Length == 3 || vals.Length == 4)
                    {
                        byte r = 0;
                        bool rSet = byte.TryParse(vals[0], out r);
                        byte g = 0;
                        bool gSet = byte.TryParse(vals[1], out g);
                        byte b = 0;
                        bool bSet = byte.TryParse(vals[2], out b);
                        byte a = 0;
                        bool aSet = false;
                        if(vals.Length == 4)
                            aSet = byte.TryParse(vals[3], out a);

                        if(vals.Length == 3 && rSet && gSet && bSet)
                            colorsToAdd.Add(new Color32(r, g, b, 255));
                        else if(vals.Length == 4 && rSet && gSet && bSet && aSet)
                            colorsToAdd.Add(new Color32(r, g, b, a));
                    }
                }

                int currentIndex = _palette.PaletteColorEditIndex;
                foreach(Color32 color in colorsToAdd)
                {
                    if(currentIndex > _palette.GetNumPaletteColors() - 1)
                        break;

                    if(firstColor)
                    {
                        // set swatch to the new color
                        SetCurrentColor(color);
                        firstColor = false;
                    }

                    if(replaceAllInstances)
                    {
                        Color32 oldColor = _palette.GetColor(currentIndex);
                        AddNewCommand(new ReplaceColorCommand(oldColor, color));
                        replaceAllInstances = false;
                    }

                    AddNewCommand(new SetPaletteColorCommand(color, currentIndex));
                    currentIndex++;
                }

                _palette.RefreshPaletteTextureColors();
                _textEnteringMode = TextEnteringMode.None;
            }
        }
    }
    void Update()
    {
        // -------------------------------------------------
        // UNDO
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.Z) && !GetIsEditingPixels())
            UndoLastCommand();

        // -------------------------------------------------
        // REDO
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.Y) && !GetIsEditingPixels())
            RedoLastCommand();

        // -------------------------------------------------
        // TOGGLE SHOWING HITBOX
        // -------------------------------------------------
        if(Input.GetKeyDown(KeyCode.H) && _textEnteringMode == TextEnteringMode.None)
        {
            _showingHitbox = !_showingHitbox;
            _canvas.RefreshHitbox();
        }

        // -------------------------------------------------
        // LOADING ANIMATIONS
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.O) && !GetIsEditingPixels())
        {
            _loadAnimString = "***PASTE ANIM DATA***";
            _textEnteringMode = TextEnteringMode.LoadAnimation;
        }

        // -------------------------------------------------
        // SWITCHING TOOLS
        // -------------------------------------------------
        if(_textEnteringMode == TextEnteringMode.None)
        {
            if(Input.GetKeyDown(KeyCode.B))
                SetToolMode(ToolMode.Brush);
            else if(Input.GetKeyDown(KeyCode.E))
                SetToolMode(ToolMode.Eraser);
            else if(Input.GetKeyDown(KeyCode.G))
                SetToolMode(ToolMode.Bucket);
            else if(Input.GetKeyDown(KeyCode.F))
                SetToolMode(ToolMode.Dropper);
        }

        // -------------------------------------------------
        // CANVAS
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.N) && !GetIsEditingPixels() && _textEnteringMode == TextEnteringMode.None)
        {
            NewCanvas();
        }

        _canvas.UpdateCanvas();
        _swatch.UpdateSwatch();
        _palette.UpdatePalette();
        _framePreview.UpdateFramePreview();
        _patternViewer.UpdatePatternViewer();

        // -------------------------------------------------
        // COPYING FRAMES
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.C) && !GetIsEditingPixels())
        {
            _canvas.GetPixels(CurrentFrame).CopyTo(_copiedPixels, 0);
            _canvas.DirtyPixels = true;

            PlayCopyEffect();
        }

        // -------------------------------------------------
        // PASTING FRAMES
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.V) && !GetIsEditingPixels())
        {
            PlayPasteEffect();
        }

        // -------------------------------------------------
        // SAVING DATA
        // -------------------------------------------------
        if(GetModifierKey() && Input.GetKeyDown(KeyCode.S))
        {
            ClipboardHelper.clipBoard = GetAnimData();
            Debug.Log("clipboard: " + ClipboardHelper.clipBoard);
            ShowConsoleText(ClipboardHelper.clipBoard);
        }

        // -------------------------------------------------
        // CONSOLE TEXT
        // -------------------------------------------------
        if(_isShowingConsoleText && (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)))
        {
            _consoleTextWrap.SetText("");
            _isShowingConsoleText = false;
        }
        // -------------------------------------------------
        // TEXT INPUT
        // -------------------------------------------------
        if(_textEnteringMode == TextEnteringMode.None)
        {
            if(Input.GetKeyDown(KeyCode.Return))
            {
                _textEnteringMode = TextEnteringMode.CurrentFrameTime;
                _firstChar = true;
            }
        }
        else
        {
            HandleInputString(Input.inputString);

            // -------------------------------------------------------------------------------------
            // ENTERING ANIM NAME
            // -------------------------------------------------------------------------------------
            if(_textEnteringMode == TextEnteringMode.AnimName)
            {
                if(Input.GetKeyDown(KeyCode.Return))
                {
                    if(_animNameTempString != "")
                    {
                        AddNewCommand(new SetAnimNameCommand(_animNameTempString));
                        _textEnteringMode = TextEnteringMode.None;
                    }
                }
                else if(Input.GetKeyDown(KeyCode.Tab))
                {
                    if(GetModifierKey())
                    {
                        // edit frame time
                        _textEnteringMode = TextEnteringMode.CurrentFrameTime;
                    }
                    else
                    {
                        // edit dimensions
                        _textEnteringMode = TextEnteringMode.PixelDimensions;
                    }

                    _animNameTempString = _animName;
                    _firstChar = true;
                }
            }
            // -------------------------------------------------------------------------------------
            // ENTERING PIXEL DIMENSTIONS
            // -------------------------------------------------------------------------------------
            else if(_textEnteringMode == TextEnteringMode.PixelDimensions)
            {
                if(Input.GetKeyDown(KeyCode.Return))
                {
                    string[] vals = _pixelDimensionsString.Split(',');
                    if(vals.Length == 2)
                    {
                        int pw = 0;
                        int.TryParse(vals[0], out pw);
                        int ph = 0;
                        int.TryParse(vals[1], out ph);
                        if((pw != 0 && ph != 0) &&
                           !(pw == _canvas.pixelWidth && ph == _canvas.pixelHeight) &&
                           (pw <= MAX_CANVAS_WIDTH && ph <= MAX_CANVAS_HEIGHT))
                        {
                            _canvas.pixelWidth = pw;
                            _canvas.pixelHeight = ph;
                            NewCanvas();
                        }

                        _pixelDimensionsString = _canvas.pixelWidth.ToString() + "," + _canvas.pixelHeight.ToString();
                        _textEnteringMode = TextEnteringMode.None;
                    }
                }
                else if(Input.GetKeyDown(KeyCode.Tab))
                {
                    if(GetModifierKey())
                    {
                        // edit anim name
                        _textEnteringMode = TextEnteringMode.AnimName;
                    }
                    else
                    {
                        // edit hitbox
                        _textEnteringMode = TextEnteringMode.Hitbox;
                    }

                    _pixelDimensionsString = _canvas.pixelWidth.ToString() + "," + _canvas.pixelHeight.ToString();
                    _firstChar = true;
                }
            }
            // -------------------------------------------------------------------------------------
            // ENTERING HITBOX
            // -------------------------------------------------------------------------------------
            else if(_textEnteringMode == TextEnteringMode.Hitbox)
            {
                if(Input.GetKeyDown(KeyCode.Return))
                {
                    string[] vals = _hitboxString.Split(',');
                    if(vals.Length == 4)
                    {
                        int left = -1;
                        int.TryParse(vals[0], out left);
                        int bottom = -1;
                        int.TryParse(vals[1], out bottom);
                        int width = -1;
                        int.TryParse(vals[2], out width);
                        int height = -1;
                        int.TryParse(vals[3], out height);
                        if(left >= 0 && bottom >= 0 && width > 0 && height > 0 &&
                           width <= _canvas.pixelWidth && height <= _canvas.pixelHeight &&
                           left + width <= _canvas.pixelWidth && bottom + height <= _canvas.pixelHeight)
                        {
                            _hitbox = new PixelRect(left, bottom, width, height);
                            _canvas.RefreshHitbox();
                        }

                        RefreshHitboxString();
                        _textEnteringMode = TextEnteringMode.None;
                    }
                }
                else if(Input.GetKeyDown(KeyCode.Tab))
                {
                    if(GetModifierKey())
                    {
                        // edit dimensions
                        _textEnteringMode = TextEnteringMode.PixelDimensions;
                    }
                    else
                    {
                        // edit frame time
                        _textEnteringMode = TextEnteringMode.CurrentFrameTime;
                    }

                    RefreshHitboxString();
                    _firstChar = true;
                }
            }
            // -------------------------------------------------------------------------------------
            // ENTERING CURRENT FRAME TIME
            // -------------------------------------------------------------------------------------
            else if(_textEnteringMode == TextEnteringMode.CurrentFrameTime)
            {
                if(Input.GetKeyDown(KeyCode.Return))
                {
                    float time = 0.0f;
                    bool valid = float.TryParse(_currentFrameTimeString, out time);

                    if(valid && time > 0.0f)
                    {
                        AddNewCommand(new SetCurrentFrameTimeCommand(time));
                        _textEnteringMode = TextEnteringMode.None;
                    }
                    else
                    {
                        _currentFrameTimeString = _framePreview.GetCurrentFrameTime().ToString();
                        _textEnteringMode = TextEnteringMode.None;
                    }
                }
                else if(Input.GetKeyDown(KeyCode.Tab))
                {
                    if(GetModifierKey())
                    {
                        // edit hitbox
                        _textEnteringMode = TextEnteringMode.Hitbox;
                    }
                    else
                    {
                        // edit anim name
                        _textEnteringMode = TextEnteringMode.AnimName;
                    }

                    _currentFrameTimeString = _framePreview.GetCurrentFrameTime().ToString();
                    _firstChar = true;
                }
            }
        }
    }