private Dictionary <int, string> GetGameModelListNamesForID(int id, bool useFilters) { IList list = GetListForTable(id); if (list != null) { Dictionary <int, string> names = new Dictionary <int, string>(); for (int i = 0; i < list.Count; i++) { IGameDataModel modelData = list[i] as IGameDataModel; if (modelData != null) { if (useFilters) { if (DoesModelPassFilters(id, modelData)) { names.Add(i, modelData.ListName); } } else { names.Add(i, modelData.ListName); } } } return(names); } else { return(null); } }
private void RenderIGameDataModelField(FieldInfo field, DataField attribute, int fieldCount) { if (fieldCount > 0) { EditorGUILayout.Space(); } //EditorGUILayout.Foldout(true, "hello"); EditorGUILayout.LabelField(attribute.EditorLabel, EditorStyles.boldLabel); IGameDataModel model = field.GetValue(this) as IGameDataModel; if (model == null) { model = System.Activator.CreateInstance(field.FieldType) as IGameDataModel; } if (model != null) { model.RenderForm(true); } //EditorGUILayout.EndToggleGroup(); }
public IGameDataModel GetModelDataAt(int tableID, int modelDataIndex) { IList list = GetListForTable(tableID); IGameDataModel model = null; if (list != null && modelDataIndex >= 0 && modelDataIndex < list.Count) { model = list[modelDataIndex] as IGameDataModel; } else if (list == null) { model = GetSingleModelForTable(tableID); } else { model = null; } if (model != null) { model.SetDataReference(this); } return(model); }
private IGameDataModel GetSingleModelForTable(int tableID) { if (_tables.ContainsKey(tableID)) { FieldInfo field = _tables[tableID]; IGameDataModel model = field.GetValue(this) as IGameDataModel; model.SetDataReference(this); return(model); } else { return(null); } }
public IGameDataModel CreateNewModel(int tableID) { if (_tables.ContainsKey(tableID)) { DataTable table = GetTableAttributeForField(_tables[tableID]); if (table != null) { IGameDataModel model = System.Activator.CreateInstance(table.Type, GetNextModelID(tableID)) as IGameDataModel; model.SetDataReference(this); return(model); } } return(null); }
/// <summary> /// Adds the model data. /// </summary> /// <returns>Returns <code>false</code> if model data with this ID already exists.</returns> /// <param name="tableID">Model identifier.</param> /// <param name="modelData">Model data.</param> public bool AddModelData(int tableID, IGameDataModel modelData) { if (IsModelIDAlreadyInUse(tableID, modelData.ID)) { return(false); } IList list = GetListForTable(tableID); if (list != null) { list.Add(modelData); modelData.SetDataReference(this); } return(true); }
public void SetDataReference(GameData dataReference) { _dataReference = dataReference; FieldInfo[] fields = GetFields(this); foreach (FieldInfo field in fields) { if (field.FieldType.GetInterface(typeof(IGameDataModel).Name) != null) { IGameDataModel model = field.GetValue(this) as IGameDataModel; if (model != null) { model.SetDataReference(dataReference); } } } }
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 RenderModelAdd() { if (_model != null) { //EditorGUILayout.LabelField(""); //EditorGUILayout.Space(); _model.RenderForm(false); //EditorGUILayout.Space(); EditorGUILayout.EndScrollView(); EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Add", GUILayout.Width(100))) { GUI.FocusControl(null); if (_data.AddModelData(_currentModelID, _model)) { EditorUtility.SetDirty(_data); _model = null; _state = State.Blank; } 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; } EditorGUILayout.EndHorizontal(); } }
public void CopyValuesFrom(IGameDataModel data, bool copyID) { FieldInfo[] fields = GetFields(data); foreach (FieldInfo field in fields) { if (field.Name.Equals("_id") && !copyID) { continue; } object[] attrs = field.GetCustomAttributes(typeof(DataField), true); foreach (object attr in attrs) { DataField fieldAttr = attr as DataField; if (fieldAttr != null) { ReplaceValueForFieldInCurrentInstance(field, data); } } } }
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(); } }
protected void RenderArrayField(FieldInfo field, DataField attribute, string[] options = null, int[] values = null, System.Type modelType = null) { System.Array array = field.GetValue(this) as System.Array; System.Type arrayElementType = field.FieldType.GetElementType(); if (array == null) { array = System.Array.CreateInstance(arrayElementType, 0); } var listType = typeof(List <>).MakeGenericType(arrayElementType); IList list = (IList)System.Activator.CreateInstance(listType); for (int i = 0; i < array.Length; i++) { list.Add(array.GetValue(i)); } if (list.Count == 0) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(attribute.EditorLabel + string.Format(" ({0:N0})", list.Count)); } int indexToRemove = -1; string label = ""; for (int i = 0; i < list.Count; i++) { label = string.Format("Element {0:D}", i); EditorGUILayout.BeginHorizontal(); if (i == 0) { EditorGUILayout.PrefixLabel(attribute.EditorLabel + string.Format(" ({0:N0})", list.Count)); } else { GUILayout.Space(EditorGUIUtility.labelWidth); } if (arrayElementType == typeof(string)) { list[i] = EditorGUILayout.TextField(label, list[i] as string); } else if (arrayElementType == typeof(Color)) { list[i] = EditorGUILayout.ColorField(label, (Color)list[i]); } else if (arrayElementType == typeof(int)) { if (options != null && values != null) { int newValue = EditorGUILayout.IntPopup(label, int.Parse(list[i].ToString()), options, values); list[i] = newValue; MethodInfo method = DataRererence.GetType().GetMethod("GetModels", BindingFlags.Instance | BindingFlags.Public); method = method.MakeGenericMethod(modelType); System.Array models = method.Invoke(DataRererence, new object[] { }) as System.Array; for (int index = 0; index < models.Length; index++) { IGameDataModel model = models.GetValue(index) as IGameDataModel; if (model != null && model.ID.Equals(newValue)) { model.RenderPreviewForForeignKey(); } } if (GUILayout.Button("Open", GUILayout.MaxWidth(40))) { method = DataRererence.GetType().GetMethod("RegisterOpenModelRequest", BindingFlags.Instance | BindingFlags.Public); method = method.MakeGenericMethod(modelType); method.Invoke(DataRererence, new object[] { newValue }); } } else { UnityEngine.RangeAttribute rangeAttr = GetAttribute <UnityEngine.RangeAttribute>(field); if (rangeAttr != null) { list[i] = EditorGUILayout.IntSlider(label, (int)list[i], Mathf.FloorToInt(rangeAttr.min), Mathf.FloorToInt(rangeAttr.max)); } else { list[i] = EditorGUILayout.IntField(label, (int)list[i]); } } } else if (arrayElementType == typeof(float)) { UnityEngine.RangeAttribute rangeAttr = GetAttribute <UnityEngine.RangeAttribute>(field); if (rangeAttr != null) { list[i] = EditorGUILayout.Slider(label, (float)list[i], rangeAttr.min, rangeAttr.max); } else { list[i] = EditorGUILayout.FloatField(label, (float)list[i]); } } else if (arrayElementType == typeof(bool)) { list[i] = EditorGUILayout.Toggle(label, (bool)list[i]); } else if (arrayElementType == typeof(AnimationCurve)) { list[i] = EditorGUILayout.CurveField(label, (AnimationCurve)list[i]); } else if (arrayElementType.IsEnum) { System.Enum newValue = EditorGUILayout.EnumPopup(label, (System.Enum)System.Enum.Parse(list[i].GetType(), list[i].ToString())); list[i] = System.Convert.ChangeType(newValue, System.Enum.GetUnderlyingType(list[i].GetType())); } else if (arrayElementType.GetInterface(typeof(IGameDataModel).Name) != null) { EditorGUILayout.LabelField(label, EditorStyles.boldLabel); IGameDataModel model = list[i] as IGameDataModel; model.SetDataReference(DataRererence); EditorGUILayout.BeginVertical(); model.RenderForm(true); EditorGUILayout.EndVertical(); } else { EditorGUILayout.LabelField(label, "Field type is not supported"); } if (GUILayout.Button("-", GUILayout.MaxWidth(20))) { if (EditorUtility.DisplayDialog("Warning!", "Are you sure?", "Yes", "No")) { indexToRemove = i; } } EditorGUILayout.EndHorizontal(); } if (indexToRemove >= 0) { list.RemoveAt(indexToRemove); } if (list.Count == 0) { if (GUILayout.Button("+", GUILayout.MaxWidth(20))) { list.Add(System.Activator.CreateInstance(arrayElementType)); } EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.BeginHorizontal(); EditorGUILayout.Space(); if (GUILayout.Button("+", GUILayout.MaxWidth(20))) { list.Add(System.Activator.CreateInstance(arrayElementType)); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.Space(); System.Array newArray = System.Array.CreateInstance(arrayElementType, list.Count); for (int i = 0; i < list.Count; i++) { newArray.SetValue(list[i], i); } field.SetValue(this, newArray); }
public void Init(TypeDataModel type, IGameDataModel gameData) { gameData.Init(); _data.Add(type, gameData.GetData()); }
protected virtual void OverrideField(object target, FieldInfo[] fields, string fieldname, JsonData value) { foreach (FieldInfo field in fields) { if (field.Name.Equals(fieldname)) { try { if (value.IsInt || value.IsLong) { field.SetValue(target, int.Parse(value.ToString())); } else if (value.IsBoolean) { field.SetValue(target, bool.Parse(value.ToString())); } else if (value.IsDouble) { field.SetValue(target, float.Parse(value.ToString())); } else if (value.IsString) { field.SetValue(target, value.ToString()); } else if (value.IsArray) { System.Array array = System.Array.CreateInstance(field.FieldType.GetElementType(), value.Count); for (int i = 0; i < value.Count; i++) { object newObject = System.Activator.CreateInstance(field.FieldType.GetElementType()); FieldInfo[] subobjectFields = GetFields(newObject as IGameDataModel); JsonData subobjectData = JsonMapper.ToObject(value[i].ToJson()); foreach (string key in subobjectData.Keys) { OverrideField(newObject, subobjectFields, key, subobjectData[key]); } array.SetValue(newObject, i); } field.SetValue(target, array); } else if (value.IsObject) { if (field.FieldType.GetInterface(typeof(IGameDataModel).Name) != null) { IGameDataModel newObject = System.Activator.CreateInstance(field.FieldType) as IGameDataModel; newObject.OverrideValuesFrom(value.ToJson()); field.SetValue(target, newObject); } else if (value.Keys.Contains("m_Curve")) { AnimationCurve curve = new AnimationCurve(); JsonData keys = value["m_Curve"]; for (int i = 0; i < keys.Count; i++) { Keyframe frame = new Keyframe(); frame.time = float.Parse(keys[i]["time"].ToString()); frame.value = float.Parse(keys[i]["value"].ToString()); frame.inTangent = float.Parse(keys[i]["inSlope"].ToString()); frame.outTangent = float.Parse(keys[i]["outSlope"].ToString()); frame.tangentMode = int.Parse(keys[i]["tangentMode"].ToString()); curve.AddKey(frame); } field.SetValue(target, curve); } } } catch (System.Exception e) { Debug.Log(e.ToString()); } break; } } }
private bool DoesModelPassFilters(int modelID, IGameDataModel modelData) { List <GameDataModelFilter> filters = null; if (_filters.ContainsKey(modelID)) { filters = _filters[modelID]; } else { return(true); } FieldInfo[] fields = GameDataModel.GetFields(modelData.GetType()); object[] attrs = null; foreach (FieldInfo field in fields) { attrs = field.GetCustomAttributes(typeof(DataField), true); foreach (object attr in attrs) { DataField fieldAttr = attr as DataField; if (fieldAttr != null && fieldAttr.useForFiltering) { object value = field.GetValue(modelData); foreach (GameDataModelFilter filter in filters) { if (filter.PropertyName != null && filter.PropertyName.Equals(field.Name)) { if (field.FieldType == typeof(string)) { if (!filter.CompareToString(value)) { return(false); } } else if (field.FieldType == typeof(int)) { if (!filter.CompareToInt(value)) { return(false); } } else if (field.FieldType == typeof(float)) { if (!filter.CompareToFloat(value)) { return(false); } } else if (field.FieldType == typeof(bool)) { if (!filter.CompareToBool(value)) { return(false); } } } } } } } return(true); }
// We need this method because since 5.3.0 unity no longer // supports JsonUtility.FromJson() for ScriptableObjects public void ApplyRemoteData(string json) { float t = Time.realtimeSinceStartup; JsonData jasonData = JsonMapper.ToObject(json); FieldInfo[] fields = GetFields(this); foreach (FieldInfo field in fields) { if (jasonData.Keys.Contains(field.Name)) { if (field.FieldType.GetInterface("IList") != null) { DataTable dataField = GetTableAttributeForField(field); if (dataField != null) { IList list = field.GetValue(this) as IList; if (list != null) { for (int i = 0; i < jasonData[field.Name].Count; i++) { try { IGameDataModel model = JsonUtility.FromJson(jasonData[field.Name][i].ToJson(), dataField.Type) as IGameDataModel; if (model != null) { bool modelFound = false; foreach (IGameDataModel currentModel in list) { if (currentModel.ID.Equals(model.ID)) { modelFound = true; currentModel.OverrideValuesFrom(jasonData[field.Name][i].ToJson()); break; } } if (!modelFound) { list.Add(model); } #if UNITY_EDITOR model.SetDataReference(this); #endif } } catch (System.Exception e) { Debug.Log(e.ToString()); } } } } } else { try { IGameDataModel currentModel = field.GetValue(this) as IGameDataModel; currentModel.OverrideValuesFrom(jasonData[field.Name].ToJson()); #if UNITY_EDITOR currentModel.SetDataReference(this); #endif } catch (System.Exception e) { Debug.Log(e.ToString()); } } } } Debug.Log("Merge Time Elapsed: " + (Time.realtimeSinceStartup - t)); }
private FieldInfo[] GetFields(IGameDataModel target) { return(GetFields(target.GetType())); }