mirror of
https://github.com/AlexMacocian/MonoGame.Extended.git
synced 2026-07-25 08:22:15 +00:00
code cleanup mostly in the gui and serialization namespaces
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user