code cleanup mostly in the gui and serialization namespaces

This commit is contained in:
Dylan Wilson
2017-01-31 20:52:27 +10:00
parent 83c7015d21
commit 4365b1cec8
18 changed files with 251 additions and 252 deletions
@@ -1,44 +0,0 @@
using System;
using MonoGame.Extended.Gui.Controls;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiControlConverter : JsonConverter
{
public GuiControlConverter()
{
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(GuiControl);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(GuiControl))
{
var jObject = JObject.Load(reader);
var type = (string) jObject.Property("Type");
switch (type)
{
case "GuiPanel":
return jObject.ToObject<GuiPanel>(serializer);
case "GuiButton":
return jObject.ToObject<GuiButton>(serializer);
default:
throw new InvalidOperationException($"Unexpected type {type}");
}
}
return ReadJson(reader, objectType, existingValue, serializer);
}
}
}
@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using MonoGame.Extended.Gui.Controls;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiControlStyleJsonConverter : JsonConverter
{
private readonly Dictionary<string, Type> _controlTypes;
public GuiControlStyleJsonConverter()
{
_controlTypes = typeof(GuiControl)
.GetTypeInfo()
.Assembly
.ExportedTypes
.Where(t => t.GetTypeInfo().IsSubclassOf(typeof(GuiControl)))
.ToDictionary(t => t.Name);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var style = (GuiControlStyle)value;
var dictionary = new Dictionary<string, object> { { "TargetType", style.TargetType.Name } };
foreach (var keyValuePair in style)
dictionary.Add(keyValuePair.Key, keyValuePair.Value);
serializer.Serialize(writer, dictionary);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
const string targetTypeKey = "TargetType";
var dictionary = serializer.Deserialize<Dictionary<string, object>>(reader);
var typeName = (string)dictionary[targetTypeKey];
var targetType = _controlTypes[typeName];
var properties = targetType
.GetRuntimeProperties()
.ToDictionary(p => p.Name);
var style = new GuiControlStyle(targetType);
foreach (var keyValuePair in dictionary.Where(i => i.Key != targetTypeKey))
{
var property = properties[keyValuePair.Key];
var json = JsonConvert.SerializeObject(keyValuePair.Value);
using (var textReader = new StringReader(json))
using (var jsonReader = new JsonTextReader(textReader))
{
var value = serializer.Deserialize(jsonReader, property.PropertyType);
style.Add(keyValuePair.Key, value);
}
}
return style;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(GuiControlStyle);
}
}
}
@@ -0,0 +1,25 @@
using Microsoft.Xna.Framework.Content;
using MonoGame.Extended.BitmapFonts;
using MonoGame.Extended.Serialization;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public sealed class GuiJsonSerializer : JsonSerializer
{
public GuiJsonSerializer(ContentManager contentManager)
{
var textureRegionService = new GuiTextureRegionService();
Converters.Add(new Vector2JsonConverter());
Converters.Add(new Size2JsonConverter());
Converters.Add(new ColorJsonConverter());
Converters.Add(new ContentManagerJsonConverter<BitmapFont>(contentManager, font => font.Name));
Converters.Add(new GuiControlStyleJsonConverter());
Converters.Add(new GuiTextureAtlasJsonConverter(contentManager, textureRegionService));
Converters.Add(new GuiNinePatchRegion2DJsonConverter(textureRegionService));
Converters.Add(new TextureRegion2DJsonConverter(textureRegionService));
ContractResolver = new GuiJsonContractResolver();
Formatting = Formatting.Indented;
}
}
}
@@ -0,0 +1,28 @@
using System;
using MonoGame.Extended.Serialization;
using MonoGame.Extended.TextureAtlases;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiNinePatchRegion2DJsonConverter : NinePatchRegion2DJsonConverter
{
private readonly IGuiTextureRegionService _textureRegionService;
public GuiNinePatchRegion2DJsonConverter(IGuiTextureRegionService textureRegionService)
: base(textureRegionService)
{
_textureRegionService = textureRegionService;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var ninePatch = base.ReadJson(reader, objectType, existingValue, serializer) as NinePatchRegion2D;
if(ninePatch != null)
_textureRegionService.NinePatches.Add(ninePatch);
return ninePatch;
}
}
}
@@ -1,26 +0,0 @@
using System.IO;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiSkinSerializer
{
public void Serialize(TextWriter writer, GuiSkin skin)
{
using (var jsonWriter = new JsonTextWriter(writer))
{
var jsonSerializer = new JsonSerializer { Formatting = Formatting.Indented };
jsonSerializer.Serialize(jsonWriter, skin);
}
}
public GuiSkin Deserialize(TextReader reader)
{
using (var jsonReader = new JsonTextReader(reader))
{
var jsonSerializer = new JsonSerializer { Formatting = Formatting.Indented };
return jsonSerializer.Deserialize<GuiSkin>(jsonReader);
}
}
}
}
@@ -0,0 +1,29 @@
using System;
using Microsoft.Xna.Framework.Content;
using MonoGame.Extended.Serialization;
using MonoGame.Extended.TextureAtlases;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiTextureAtlasJsonConverter : ContentManagerJsonConverter<TextureAtlas>
{
private readonly IGuiTextureRegionService _textureRegionService;
public GuiTextureAtlasJsonConverter(ContentManager contentManager, IGuiTextureRegionService textureRegionService)
: base(contentManager, atlas => atlas.Name)
{
_textureRegionService = textureRegionService;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var textureAtlas = base.ReadJson(reader, objectType, existingValue, serializer) as TextureAtlas;
if (textureAtlas != null)
_textureRegionService.TextureAtlases.Add(textureAtlas);
return textureAtlas;
}
}
}
@@ -1,19 +1,19 @@
using System.Collections.Generic;
using System.Linq;
using MonoGame.Extended.Serialization;
using MonoGame.Extended.TextureAtlases;
namespace MonoGame.Extended.Gui.Serialization
{
public interface ITextureRegionService
public interface IGuiTextureRegionService : ITextureRegionService
{
IList<TextureAtlas> TextureAtlases { get; }
IList<NinePatchRegion2D> NinePatches { get; }
TextureRegion2D GetTextureRegion(string name);
}
public class TextureRegionService : ITextureRegionService
public class GuiTextureRegionService : IGuiTextureRegionService
{
public TextureRegionService()
public GuiTextureRegionService()
{
TextureAtlases = new List<TextureAtlas>();
NinePatches = new List<NinePatchRegion2D>();
@@ -1,24 +0,0 @@
using System;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class GuiThicknessConveter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var thickness = (GuiThickness)value;
writer.WriteValue($"{thickness.Left} {thickness.Top} {thickness.Right} {thickness.Bottom}");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return GuiThickness.Parse((string)reader.Value);
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(GuiThickness);
}
}
}
@@ -1,46 +0,0 @@
using System;
using MonoGame.Extended.TextureAtlases;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MonoGame.Extended.Gui.Serialization
{
public class NinePatchRegion2DConveter : JsonConverter
{
private readonly ITextureRegionService _textureRegionService;
public NinePatchRegion2DConveter(ITextureRegionService textureRegionService)
{
_textureRegionService = textureRegionService;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var region = (NinePatchRegion2D)value;
var jsonObject = new
{
TextureRegion = region.Name,
Padding = $"{region.LeftPadding} {region.TopPadding} {region.RightPadding} {region.BottomPadding}"
};
serializer.Serialize(writer, jsonObject);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jsonObject = serializer.Deserialize<JObject>(reader);
var paddingAsString = jsonObject.Value<string>("Padding");
var thickness = GuiThickness.Parse(paddingAsString);
var regionName = jsonObject.Value<string>("TextureRegion");
var region = _textureRegionService.GetTextureRegion(regionName);
var ninePatch = new NinePatchRegion2D(region, thickness.Left, thickness.Top, thickness.Right, thickness.Bottom);
_textureRegionService.NinePatches.Add(ninePatch);
return ninePatch;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(NinePatchRegion2D);
}
}
}
@@ -1,33 +0,0 @@
using System;
using MonoGame.Extended.TextureAtlases;
using Newtonsoft.Json;
namespace MonoGame.Extended.Gui.Serialization
{
public class TextureRegion2DConveter : JsonConverter
{
private readonly ITextureRegionService _textureRegionService;
public TextureRegion2DConveter(ITextureRegionService textureRegionService)
{
_textureRegionService = textureRegionService;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var region = (TextureRegion2D)value;
writer.WriteValue(region.Name);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var regionName = reader.Value as string;
return regionName == null ? null : _textureRegionService.GetTextureRegion(regionName);
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(TextureRegion2D);
}
}
}