private void RenderUI()
        {
            EditorGUILayout.Space();
            RenderDataBase();

            if (DataLoaded)
            {
                if (_data.CheckForOpenModelRequest())
                {
                    _previousModelID = _currentModelID;
                    _previousSelectedModelDataIndex = _selectedModelDataIndex;

                    _currentModelID         = _data.GetOpenModelRequestID();
                    _selectedModelDataIndex = _data.GetOpenModelRequestDataIndex();

                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _state = State.Edit;
                    }

                    _modelsViewScrollPos = _modelsListViewScrollPos = _editViewScrollPos = Vector2.zero;
                    _data.ResetOpenModelRequest();
                }

                _globalScrollPos = EditorGUILayout.BeginScrollView(_globalScrollPos, "box", GUILayout.ExpandHeight(true));

                EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                RenderModelsView();
                RenderModelsListView();
                RenderEditArea();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.EndScrollView();
            }
            else
            {
                _currentModelID         = 0;
                _selectedModelDataIndex = -1;
                _state = State.Blank;
            }
        }
        private void RenderDataBase()
        {
            EditorGUILayout.BeginVertical();
            if (!DataLoaded)
            {
                EditorGUILayout.LabelField("No database found. Please drag a database instance reference from Project view here");
            }

            EditorGUILayout.BeginHorizontal();
            _data = EditorGUILayout.ObjectField("Database", _data, typeof(GameData), false) as GameData;

            if (DataLoaded)
            {
                if (GUILayout.Button("Generate JSON", GUILayout.Width(120)))
                {
                    string json = JsonUtility.ToJson(_data, true);
                    EditorGUIUtility.systemCopyBuffer = json;
                    Debug.Log("Also copied to your clipboard: \n" + json);
                }

                if (GUILayout.Button("Back", GUILayout.Width(120)) && _previousModelID > 0)
                {
                    _currentModelID         = _previousModelID;
                    _selectedModelDataIndex = _previousSelectedModelDataIndex;

                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _state = State.Edit;
                    }

                    _modelsViewScrollPos = _modelsListViewScrollPos = _editViewScrollPos = Vector2.zero;
                    _previousModelID     = _previousSelectedModelDataIndex = -1;
                }
            }

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }
        private void RenderModelsListView()
        {
            if (_currentModelID > 0 && _data.IsModelDataAList(_currentModelID))
            {
                EditorGUILayout.BeginVertical(GUILayout.Width(250));
                EditorGUILayout.Space();
                EditorGUILayout.LabelField(_data.GetTableName(_currentModelID));

                _modelsListViewScrollPos = EditorGUILayout.BeginScrollView(_modelsListViewScrollPos, "box", GUILayout.ExpandHeight(true));
                int modelIndex = _data.RenderModelsDataListView(_currentModelID);
                EditorGUILayout.EndScrollView();

                if (modelIndex > -1)
                {
                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, modelIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _selectedModelDataIndex = modelIndex;
                        _editViewScrollPos      = Vector2.zero;
                        _state = State.Edit;
                    }
                }

                _data.RenderFilters(_currentModelID);

                if (GUILayout.Button("New"))
                {
                    GUI.FocusControl(null);
                    _model             = _data.CreateNewModel(_currentModelID);
                    _editViewScrollPos = Vector2.zero;
                    _state             = State.Add;
                }

                EditorGUILayout.Space();
                EditorGUILayout.EndVertical();
            }
        }
        private void RenderModelsView()
        {
            EditorGUILayout.BeginVertical(GUILayout.Width(250));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Tables");

            _modelsViewScrollPos = EditorGUILayout.BeginScrollView(_modelsViewScrollPos, "box", GUILayout.ExpandHeight(true));
            int modelID = _data.RenderModelsView();

            if (modelID > 0 && modelID != _currentModelID)
            {
                _currentModelID = modelID;
                if (_data.IsModelDataAList(_currentModelID))
                {
                    GUI.FocusControl(null);
                    _state = State.Blank;
                }
                else
                {
                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, 0);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _selectedModelDataIndex = 0;
                        _editViewScrollPos      = Vector2.zero;
                        _state = State.Edit;
                    }
                }
            }

            EditorGUILayout.EndScrollView();

            EditorGUILayout.Space();
            EditorGUILayout.EndVertical();
        }
        private void RenderModelEdit()
        {
            if (_model != null)
            {
                //EditorGUILayout.LabelField(_model.ListName);
                //EditorGUILayout.Space();

                _model.RenderForm(false);
                //EditorGUILayout.Space();
                EditorGUILayout.EndScrollView();

                EditorGUILayout.BeginHorizontal();

                GUILayout.FlexibleSpace();

                if (GUILayout.Button("Save", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);
                    IGameDataModel model = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);

                    bool idAlreadyInUse = model.ID != _model.ID && _data.IsModelIDAlreadyInUse(_currentModelID, _model.ID);

                    if (!idAlreadyInUse)
                    {
                        if (model != null)
                        {
                            model.CopyValuesFrom(_model, true);
                            EditorUtility.SetDirty(_data);
                        }
                        _model = null;
                        _state = State.Blank;

                        if (!_data.IsModelDataAList(_currentModelID))
                        {
                            _currentModelID = 0;
                        }
                    }
                    else
                    {
                        EditorUtility.DisplayDialog("Error", "Model data with this ID already exists", "OK");
                    }
                }
                else if (GUILayout.Button("Cancel", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);
                    _model = null;
                    _state = State.Blank;
                }

                if (_data.IsModelDataAList(_currentModelID))
                {
                    if (GUILayout.Button("Duplicate", GUILayout.Width(100)))
                    {
                        if (EditorUtility.DisplayDialog("Warning!", "Are you sure you want to create duplicate of " + _model.ListName + "? All unsaved changes will be lost", "Yes", "No"))
                        {
                            GUI.FocusControl(null);
                            IGameDataModel copy = _data.CreateNewModel(_currentModelID);
                            copy.CopyValuesFrom(_model, false);
                            _model             = copy;
                            _editViewScrollPos = Vector2.zero;
                            _state             = State.Add;
                        }
                    }
                    else if (GUILayout.Button("Delete", GUILayout.Width(100)))
                    {
                        GUI.FocusControl(null);

                        if (EditorUtility.DisplayDialog("Warning!", "Are you sure you want to delete " + _model.ListName + "?", "Yes", "No"))
                        {
                            _data.RemoveModelDataAt(_currentModelID, _selectedModelDataIndex);
                            EditorUtility.SetDirty(_data);
                            _model = null;
                            _state = State.Blank;
                        }
                    }
                }

                EditorGUILayout.EndHorizontal();
            }
        }