From 848dd3c52a707b7266a032aff3a199d8c210d7d5 Mon Sep 17 00:00:00 2001 From: Anthony Marmont Date: Sat, 7 Mar 2020 18:27:02 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Improving=20the=20content=20edit?= =?UTF-8?q?or=20editing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allowed EditorSession editing of properties. --- .../Manifest/FieldInformation.cs | 80 ++++++++++++++++-- .../Manifest/TypeInformation.cs | 24 ++++++ src/RPGCore.Demo.BoardGame/GamePlayer.cs | 1 - src/RPGCore.Demo.BoardGame/GameView.cs | 1 - .../Models/BuildingTemplate.cs | 20 +++-- .../Models/ResourceTemplate.cs | 3 +- .../Models/VoxelColour.cs | 9 ++ src/RPGCore.Demo.BoardGame/SpecialCardSlot.cs | 2 +- .../Plugins/RPGCore.Demo.BoardGame.dll | Bin 23552 -> 25088 bytes .../Plugins/RPGCore.Demo.BoardGame.pdb | Bin 8912 -> 9580 bytes .../RPGCore/Plugins/RPGCore.Behaviour.dll | Bin 51200 -> 52224 bytes .../RPGCore/Plugins/RPGCore.Behaviour.pdb | Bin 23496 -> 23976 bytes .../Editors/Behaviour/RPGCoreEditor.cs | 60 ++++++++----- .../Editors/Packages/EditorSessionFrame.cs | 8 ++ .../Packages/Frames/JsonTextWindowFrame.cs | 11 +++ .../Packages/Frames/RawTextWindowFrame.cs | 7 +- .../Scripts/Editors/Packages/GenericWindow.cs | 45 ++++++++++ .../Editors/Packages/GenericWindow.cs.meta | 11 +++ .../BoardGame/buildings/greenhouse.json | 23 ++--- .../Content/BoardGame/resources/glass.json | 7 +- .../Content/BoardGame/resources/wood.json | 7 +- 21 files changed, 264 insertions(+), 55 deletions(-) create mode 100644 src/RPGCore.Demo.BoardGame/Models/VoxelColour.cs create mode 100644 src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs create mode 100644 src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs.meta diff --git a/src/RPGCore.Behaviour/Manifest/FieldInformation.cs b/src/RPGCore.Behaviour/Manifest/FieldInformation.cs index 4de0d76c..bf091920 100644 --- a/src/RPGCore.Behaviour/Manifest/FieldInformation.cs +++ b/src/RPGCore.Behaviour/Manifest/FieldInformation.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json.Linq; +using System; using System.Collections; using System.Reflection; @@ -13,9 +14,70 @@ public sealed class FieldInformation public FieldFormat Format; public FieldInformation ValueFormat; + public abstract class ModelMember + { + public abstract Type ValueType { get; } + public abstract object[] GetCustomAttributes(bool inherit); + public abstract object GetValue(object instance); + } + + public class ModelField : ModelMember + { + public FieldInfo Field { get; } + + public override Type ValueType => Field.FieldType; + + public ModelField(FieldInfo field) + { + Field = field; + } + + public override object[] GetCustomAttributes(bool inherit) + { + return Field.GetCustomAttributes(inherit); + } + + public override object GetValue(object instance) + { + return Field.GetValue(instance); + } + } + + public class ModelProperty : ModelMember + { + public PropertyInfo Property { get; } + + public override Type ValueType => Property.PropertyType; + + public ModelProperty(PropertyInfo property) + { + Property = property; + } + + public override object[] GetCustomAttributes(bool inherit) + { + return Property.GetCustomAttributes(inherit); + } + + public override object GetValue(object instance) + { + return Property.GetValue(instance); + } + } + public static FieldInformation ConstructFieldInformation(FieldInfo field, object defaultInstance) { - object[] attributes = field.GetCustomAttributes(false); + return ConstructFieldInformation(new ModelField(field), defaultInstance); + } + + public static FieldInformation ConstructFieldInformation(PropertyInfo property, object defaultInstance) + { + return ConstructFieldInformation(new ModelProperty(property), defaultInstance); + } + + public static FieldInformation ConstructFieldInformation(ModelMember member, object defaultInstance) + { + object[] attributes = member.GetCustomAttributes(false); string[] attributeIds = new string[attributes.Length]; for (int i = 0; i < attributes.Length; i++) { @@ -23,7 +85,7 @@ public static FieldInformation ConstructFieldInformation(FieldInfo field, object } FieldInformation fieldInformation; - if (typeof(InputSocket).IsAssignableFrom(field.FieldType)) + if (typeof(InputSocket).IsAssignableFrom(member.ValueType)) { fieldInformation = new FieldInformation() { @@ -39,10 +101,10 @@ public static FieldInformation ConstructFieldInformation(FieldInfo field, object if (defaultInstance != null) { - defaultValue = field.GetValue(defaultInstance); + defaultValue = member.GetValue(defaultInstance); } - string typeName = field.FieldType.Name; + string typeName = member.ValueType.Name; try { @@ -65,20 +127,20 @@ public static FieldInformation ConstructFieldInformation(FieldInfo field, object }; } - if (typeof(IDictionary).IsAssignableFrom(field.FieldType)) + if (typeof(IDictionary).IsAssignableFrom(member.ValueType)) { fieldInformation.Format = FieldFormat.Dictionary; - fieldInformation.Type = field.FieldType.GetGenericArguments()[1].Name; + fieldInformation.Type = member.ValueType.GetGenericArguments()[1].Name; fieldInformation.ValueFormat = new FieldInformation() { - Type = field.FieldType.GetGenericArguments()[1].Name, + Type = member.ValueType.GetGenericArguments()[1].Name, Format = FieldFormat.Object }; } - else if (field.FieldType.IsArray) + else if (member.ValueType.IsArray) { - var elementType = field.FieldType.GetElementType(); + var elementType = member.ValueType.GetElementType(); fieldInformation.Format = FieldFormat.List; fieldInformation.Type = elementType.Name; diff --git a/src/RPGCore.Behaviour/Manifest/TypeInformation.cs b/src/RPGCore.Behaviour/Manifest/TypeInformation.cs index 571db6f9..7ca338e9 100644 --- a/src/RPGCore.Behaviour/Manifest/TypeInformation.cs +++ b/src/RPGCore.Behaviour/Manifest/TypeInformation.cs @@ -75,6 +75,30 @@ protected static void ConstructTypeInformation(Type type, TypeInformation typeIn fieldInfos.Add(field.Name, FieldInformation.ConstructFieldInformation(field, defaultInstance)); } + foreach (var field in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + { + if (field.PropertyType == typeof(OutputSocket)) + { + continue; + } + + if (field.GetCustomAttribute() != null) + { + continue; + } + + var getter = field.GetGetMethod(); + var setter = field.GetSetMethod(); + + if (getter == null + || getter.IsPrivate + || setter == null) + { + continue; + } + + fieldInfos.Add(field.Name, FieldInformation.ConstructFieldInformation(field, defaultInstance)); + } typeInformation.Fields = fieldInfos; } } diff --git a/src/RPGCore.Demo.BoardGame/GamePlayer.cs b/src/RPGCore.Demo.BoardGame/GamePlayer.cs index df85eef1..63474400 100644 --- a/src/RPGCore.Demo.BoardGame/GamePlayer.cs +++ b/src/RPGCore.Demo.BoardGame/GamePlayer.cs @@ -4,7 +4,6 @@ namespace RPGCore.Demo.BoardGame { - public class GamePlayer { public LocalId OwnerId; diff --git a/src/RPGCore.Demo.BoardGame/GameView.cs b/src/RPGCore.Demo.BoardGame/GameView.cs index 38729c48..9a48b2ca 100644 --- a/src/RPGCore.Demo.BoardGame/GameView.cs +++ b/src/RPGCore.Demo.BoardGame/GameView.cs @@ -1,5 +1,4 @@ using RPGCore.Behaviour; -using RPGCore.Demo.BoardGame.Models; using RPGCore.Packages; using RPGCore.Traits; using System.Collections.Generic; diff --git a/src/RPGCore.Demo.BoardGame/Models/BuildingTemplate.cs b/src/RPGCore.Demo.BoardGame/Models/BuildingTemplate.cs index f867e2ca..1c21fbb3 100644 --- a/src/RPGCore.Demo.BoardGame/Models/BuildingTemplate.cs +++ b/src/RPGCore.Demo.BoardGame/Models/BuildingTemplate.cs @@ -1,20 +1,26 @@ -using RPGCore.Behaviour; +using Newtonsoft.Json; +using RPGCore.Behaviour; using System.Collections.Generic; namespace RPGCore.Demo.BoardGame.Models { public class BuildingTemplate { - public string DisplayName; + public string DisplayName { get; set; } + public string BodyText { get; set; } - public string[,] Recipe; + public string[,] Recipe { get; set; } - public SerializedGraph GlobalEffectGraph; - public SerializedGraph LocalEffectGraph; + public SerializedGraph GlobalEffectGraph { get; set; } + public SerializedGraph LocalEffectGraph { get; set; } + [JsonIgnore] public int Width => Recipe?.GetLength(0) ?? 0; + + [JsonIgnore] public int Height => Recipe?.GetLength(1) ?? 0; + [JsonIgnore] public bool IsHorizontallySymmetric { get @@ -42,6 +48,7 @@ public bool IsHorizontallySymmetric } } + [JsonIgnore] public bool IsVerticallySymmetric { get @@ -69,6 +76,7 @@ public bool IsVerticallySymmetric } } + [JsonIgnore] public bool IsRotating { get @@ -85,6 +93,7 @@ public bool IsRotating } } + [JsonIgnore] private bool IsTheSameWhenRotated { get @@ -116,6 +125,7 @@ private bool IsTheSameWhenRotated } } + [JsonIgnore] private bool IsRotatedSameAsMirror { get diff --git a/src/RPGCore.Demo.BoardGame/Models/ResourceTemplate.cs b/src/RPGCore.Demo.BoardGame/Models/ResourceTemplate.cs index cade5508..d8e6ad12 100644 --- a/src/RPGCore.Demo.BoardGame/Models/ResourceTemplate.cs +++ b/src/RPGCore.Demo.BoardGame/Models/ResourceTemplate.cs @@ -2,6 +2,7 @@ { public class ResourceTemplate { - public string DisplayName; + public string DisplayName { get; set; } + public VoxelColour Colour { get; set; } } } diff --git a/src/RPGCore.Demo.BoardGame/Models/VoxelColour.cs b/src/RPGCore.Demo.BoardGame/Models/VoxelColour.cs new file mode 100644 index 00000000..61ca2075 --- /dev/null +++ b/src/RPGCore.Demo.BoardGame/Models/VoxelColour.cs @@ -0,0 +1,9 @@ +namespace RPGCore.Demo.BoardGame.Models +{ + public struct VoxelColour + { + public float Red { get; set; } + public float Green { get; set; } + public float Blue { get; set; } + } +} diff --git a/src/RPGCore.Demo.BoardGame/SpecialCardSlot.cs b/src/RPGCore.Demo.BoardGame/SpecialCardSlot.cs index f9f1e355..79909afd 100644 --- a/src/RPGCore.Demo.BoardGame/SpecialCardSlot.cs +++ b/src/RPGCore.Demo.BoardGame/SpecialCardSlot.cs @@ -2,7 +2,7 @@ { public class SpecialCardSlot { - public string BuildingIdentifier; + public string BuildingIdentifier { get; set; } } } diff --git a/src/RPGCoreUnity/Assets/Demos/BoardGame/Plugins/RPGCore.Demo.BoardGame.dll b/src/RPGCoreUnity/Assets/Demos/BoardGame/Plugins/RPGCore.Demo.BoardGame.dll index b177acd3709b4eb803f79c8714ff8f83e89b178e..2e3d0f01a1211d242ac9eea14d30a6aaad0e9a3e 100644 GIT binary patch delta 11043 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 delta 9396 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 HrRRSEEx}hm diff --git a/src/RPGCoreUnity/Assets/Demos/BoardGame/Plugins/RPGCore.Demo.BoardGame.pdb b/src/RPGCoreUnity/Assets/Demos/BoardGame/Plugins/RPGCore.Demo.BoardGame.pdb index aa775c470e36f08880dbaa5186f0e8732a3cd44f..53d88f549bfc99f5f29225c719b4d294e8b1fc6d 100644 GIT binary patch delta 2513 zcmZ9N3s6*57{|Y}EW3O6z02}ud5X$IkVl}V@zMa%tW?ZFYeLBwQ4GPiu8N`}+QP|l z)XG<;W|}V=N+qXDPYIWxKMHVoNsOWBGvO^DiVl8i)XO@$x^%mn*E6;UKv5R?L;4ImJp zFFgf{o4?PH!V!qkySRmwd6wuHHR?2U4*C<+t!I>=*U)9?P3R#5qZ0-V?UooFku;QT zWK>|(&{Aj<^a}JAw8O-x+oYjbGoyiK4Fy{n#alJ>2Gj%n&(274Xeh_QXcTk>)a%gL zs2#x>BvPD=a-IAScG@#SCs8RV*I}7tq>pq)IwZ%!o9K}on`xxpOl6=PR00oZ0PDb8 zU^Cbb_JB|H7Lp7WiUNJX08j+RfKo6SOa;>o77x`Rm~XJs6>uH=4h)i&Y#<1@!7wmf zvQZbfEQy8LX)10Ek%K-qI_L=a+~_2;$w`YeP6~jAff&#qq=GC^3Z|I?=pR64G2i2& z7tAht3A_Sc12aG^SO}JbHNXqDf!*K$xDWCyE}8@mh`TR;0_j<6AdLp&K$%q}gJ`QY zh&}}S!BKDwd@0vZ_9s1kYvn)th3An(O*Rv8uo>(Cd%;1QXk((kY<7AG{OxwK02dzq z#~&Ak+tI~!_<3!o&Qpy-fBCT`^e397@&?2;Dlh8d7t=Fd)N55<)az7U)aR(YsLxe- z)IBs$l@J5wtGsBiK;=b!p~{Q;BFgGr5N;JMe!?$N`H83tpNI{+5EtP3av}+d5G1mJ z2LqCo6A=@HPwAcD^Qo%wOHm)Fj1R*2Why^e@#)I^Ld9n&^Pk4`rQ35wTGkN1cpT%}5g0jpJB)EiY^ z)Yq!Ks5hy+sIOCbQD3j}qWI*(UqkME1xPQ^ci9pRls#mH@LHAdLQ(7v3rr&b2!hErYUXHiRJeL{pEs1p9oC?$+BM{r9j0)BL1Wp zy<<*?ikqGZ#D7T(X70fwkn8lL0$X&TA8oWBK5d(-A8@iIuByAMEi$n4VQy#b>!F$c zegECl5!8M~Z_li&yt-G1*;+@G5VM0%4DOR+h-PB{PORsGh88Cj+g?l++IT>HK733bdF*LF9R_T_e=j09f_w`8< zH@V|IP5LHlbohe_`d=G|UcLBL{A6u)QNO`S^^@7q^7`zBccxf7W_aZZl6(+asgLZ8 z5k85L#q9P;tSr_PpJd2l8{m_4iLEIS=eKO5NQ63rAw~)f3@O5I(iy=k-9>B=KZNgb z{DC`+Rq)ElWS$=xqaTZNb}d~AKbm*PL}JnF{i26_cP}b!PF>v!Tk55K&W8yl{;9X` zbe0S()MoFSdHqJ0d{uwnqWyh~*7=;SkF~UVUPV zKD`jtJ@V*h&21I89GBYDcWpWU<5|Bi;v*X0PV}`7@=3TXx)7iE4ni;XMp}IYZ;d>~ z()g077PgH$qAwe~ZQhgKQ{E1KFFH@toX7{oTyb+sx#z`( u>wkx)ezSIQUFuyaVfDJ{2eroG#$R}N>?lL??dCt5@3-iAb!?0uF7rPof`x(r delta 1849 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 delta 19120 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 delta 3004 zcmYk83vg7`8OOhK_GXif0fhttBw>?%?R7f?>pc5 z?mhROd(S;`T6{br_TCq{=pk}$B|7gV>eS#ju3xue?eZrGM^z3HLgZ{}q&oOB*e`FI zUkcj^t_XqWtbS}MIB#n1`TJjARDISny8W%o|NraLmf%H%X`%g{yKK{m1pLj=Ly&@c z5vUV1lS%;n04wYuG#8SF+^}^JpJ1|KxsU~l@B4eUjjOOuN3%q^h}75xwb>=*WeO_F zl=M`Vpq?yAPC-|lk`B8Bz3q}z;S<#Clk|Q-&~F2hZot~I zC6#3(4!aw65cUG>RoJ8)LDO<1Zj_*Kj;x_QaP}eaDeRwNQ*#Bmb0xLGu7n+g9fJKF z_Fu4>K|#Twq+ZxpU@yad20JAr$Q8}EWW+_b*fCl1Q%5G-03FE+&~?b`V9uruj%@03 zrJ?&}V)p{SCSW*#b_Q6yTf?Wd%aygC2kuL=W5cB}ZPvLoF8%(rPT62}nwZnAd>U z!^Z>A`7v-a{9?rBi`n!zm=6t0hqWoIBeo^;8qha0=Jp?TRbx67f?S^g3d}K;Y9>0 z;PYpP6J7%U8a{tUm|q5e4Zp?ULGVA}^OuABUjhFK7yFID`@w$!|JUFH;1EvEcc~ru zhe+`J$38n8cpVA+{2UPT8{jPXe1{f;4}~xBKYP-|#PSm)Ub0mF&91C5>7>%N66sb&*x&2^ zWWBv1Rh2tk{@bD+cRN(4+p7BA6YWJflO*iQ7+;K5qZ@kl4vfJbu72sRw&%l7pmMY} z>PMSMXK^3zqA3tE7<6(2t?k)nR=Nws(Dbq<0x+JH7ruMm&@h>sNY zp2s{+TId1)xuAvm{L$OKn=%@ovr|L|ay#srP4xDwn^j)_%*?dY>kgz``|8V=pItV+ zWMXZab>QgJ|2grilii;;4X&>Aoa)?kWC6UbwdI-118k#BWX%ZkpCu^5jPi_h2>o zk~J&guPmODC3WsmarFzaK-=p>(&bSf)H~$Cv+Aq*L!v|NXqaK?JM^>YnTBl^U{Q0r zrSC{VbaC?qp?Ve#CJa3_v~8$os8?mT6w0A%YE?^>2&i{kO69SQ>UK+!Ja$GEg=fiQ zx7Frwk(j0450}W}o7A`A3VHk&YJTf%k)V27OGTMF-&!c&+^Le(); - EditorGUI.indentLevel--; - fieldFeature.Expanded = EditorGUILayout.Foldout(fieldFeature.Expanded, field.Name, true); - EditorGUI.indentLevel++; + var fieldRect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight, GUILayout.ExpandWidth(true)); + GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + fieldRect.xMin += FoldoutIndent; + + fieldFeature.Expanded = EditorGUI.Foldout(fieldRect, fieldFeature.Expanded, field.Name, true); if (fieldFeature.Expanded) { @@ -64,6 +68,26 @@ public static void DrawField(EditorField field) field.ApplyModifiedProperties(); } } + else if (field.Field.Type == "Single") + { + EditorGUI.BeginChangeCheck(); + float newValue = EditorGUILayout.FloatField(field.Name, field.GetValue()); + if (EditorGUI.EndChangeCheck()) + { + field.SetValue(newValue); + field.ApplyModifiedProperties(); + } + } + else if(field.Field.Type == "Double") + { + EditorGUI.BeginChangeCheck(); + double newValue = EditorGUILayout.DoubleField(field.Name, field.GetValue()); + if (EditorGUI.EndChangeCheck()) + { + field.SetValue(newValue); + field.ApplyModifiedProperties(); + } + } else if (field.Field.Type == "String") { EditorGUI.BeginChangeCheck(); @@ -110,12 +134,13 @@ public static void DrawField(EditorField field) } var fieldRect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight, GUILayout.ExpandWidth(true)); - PrefixLable(fieldRect, out var lable, out var content); - content.width = 140; + GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + fieldRect.xMin += 4; + var buttonRect = EditorGUI.PrefixLabel(fieldRect, new GUIContent(field.Name)); - EditorGUI.LabelField(lable, field.Name); + buttonRect.width = 160; - if (GUI.Button(content, $"Edit Graph")) + if (GUI.Button(buttonRect, $"Edit Graph")) { BehaviourEditor.Open(field.Session, field); } @@ -138,9 +163,11 @@ public static void DrawField(EditorField field) { var fieldFeature = field.GetOrCreateFeature(); - EditorGUI.indentLevel--; - fieldFeature.Expanded = EditorGUILayout.Foldout(fieldFeature.Expanded, field.Name, true); - EditorGUI.indentLevel++; + var fieldRect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight, GUILayout.ExpandWidth(true)); + fieldRect.xMin += FoldoutIndent; + GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + + fieldFeature.Expanded = EditorGUI.Foldout(fieldRect, fieldFeature.Expanded, field.Name, true); if (fieldFeature.Expanded) { @@ -158,18 +185,5 @@ public static void DrawField(EditorField field) EditorGUILayout.LabelField(field.Name, "Unknown Type"); } } - - public static void PrefixLable (Rect position, out Rect lable, out Rect content) - { - content = EditorGUI.PrefixLabel (position, new GUIContent (" ")); - - float indent = EditorGUI.indentLevel * 15.0f; - position.xMin += indent; - - lable = new Rect (position) - { - xMax = content.xMin - }; - } } } diff --git a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/EditorSessionFrame.cs b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/EditorSessionFrame.cs index b38aaca0..bc66e6c9 100644 --- a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/EditorSessionFrame.cs +++ b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/EditorSessionFrame.cs @@ -76,6 +76,7 @@ public EditorSessionFrame(IResource resource) typeof(PackageNodeEditor), typeof(PackageNodePosition), typeof(ExtraData), + typeof(VoxelColour), typeof(ResourceTemplate), typeof(BuildingTemplate), @@ -109,6 +110,7 @@ public override void OnGUI() { if (Resource is ProjectResource projectResource) { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); if (GUILayout.Button("Save", EditorStyles.toolbarButton, GUILayout.Width(100))) { using (var file = projectResource.WriteStream()) @@ -122,6 +124,12 @@ public override void OnGUI() ); } } + + if (GUILayout.Button("View Manifest", EditorStyles.toolbarButton, GUILayout.Width(120))) + { + GenericWindow.Open(new GUIContent("Manifest"), new JsonTextWindowFrame(EditorSession.Manifest.ToString())); + } + EditorGUILayout.EndHorizontal(); } RPGCoreEditor.DrawEditor(EditorSession); diff --git a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/JsonTextWindowFrame.cs b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/JsonTextWindowFrame.cs index fe2bded6..4362c65e 100644 --- a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/JsonTextWindowFrame.cs +++ b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/JsonTextWindowFrame.cs @@ -26,7 +26,13 @@ protected override string[] BuildLines(IResource resource) } string allLines = jobject.ToString(Formatting.Indented); + string[] builtLines = HighlightSyntax(allLines); + return builtLines; + } + + private static string[] HighlightSyntax(string allLines) + { string[] builtLines = allLines.Split(new char[] { '\n' }, System.StringSplitOptions.None); var sb = new StringBuilder(); @@ -101,5 +107,10 @@ public JsonTextWindowFrame(IResource resource) : base(resource) { } + + public JsonTextWindowFrame(string text) + : base(HighlightSyntax(text)) + { + } } } diff --git a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/RawTextWindowFrame.cs b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/RawTextWindowFrame.cs index daadcb23..499d3378 100644 --- a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/RawTextWindowFrame.cs +++ b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/Frames/RawTextWindowFrame.cs @@ -27,6 +27,11 @@ public RawTextWindowFrame(IResource resource) } } + public RawTextWindowFrame(string[] lines) + { + this.lines = lines; + } + protected virtual string[] BuildLines(IResource resource) { var linesList = new List(); @@ -87,7 +92,7 @@ public override void OnGUI() new GUIContent(guideString), out _, out float maxWidth); - var rect = GUILayoutUtility.GetRect(0, 480, GUILayout.ExpandWidth(true)); + var rect = GUILayoutUtility.GetRect(0, 480, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); var lineNumberBackgroundRect = new Rect( rect.x, rect.y, diff --git a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs new file mode 100644 index 00000000..1bc45960 --- /dev/null +++ b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs @@ -0,0 +1,45 @@ +using RPGCore.Behaviour.Editor; +using UnityEditor; +using UnityEngine; + +namespace RPGCore.Unity.Editors +{ + public class GenericWindow : EditorWindow + { + public GUIContent WindowTitle; + private WindowFrame Frame; + + public static void Open(GUIContent title, WindowFrame frame) + { + var window = CreateWindow(); + + window.Show(); + + window.WindowTitle = title; + window.Frame = frame; + window.Frame.Window = window; + window.Frame.OnEnable(); + } + + private void OnEnable() + { + if (Frame != null) + { + Frame.Window = this; + Frame.OnEnable(); + } + titleContent = WindowTitle; + } + + private void OnGUI() + { + if (Frame == null) + { + Close(); + return; + } + + Frame.OnGUI(); + } + } +} diff --git a/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs.meta b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs.meta new file mode 100644 index 00000000..baa17e00 --- /dev/null +++ b/src/RPGCoreUnity/Assets/RPGCore/Scripts/Editors/Packages/GenericWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f117a6ffba5a964ab4d7c4d9735a2fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/RPGCoreUnity/Content/BoardGame/buildings/greenhouse.json b/src/RPGCoreUnity/Content/BoardGame/buildings/greenhouse.json index c44c9d95..ea30008f 100644 --- a/src/RPGCoreUnity/Content/BoardGame/buildings/greenhouse.json +++ b/src/RPGCoreUnity/Content/BoardGame/buildings/greenhouse.json @@ -11,8 +11,8 @@ }, "Editor": { "Position": { - "x": -112, - "y": 51 + "x": 20, + "y": 178 } } }, @@ -24,8 +24,8 @@ }, "Editor": { "Position": { - "x": 188, - "y": -27 + "x": 344, + "y": 95 } } }, @@ -37,8 +37,8 @@ }, "Editor": { "Position": { - "x": -111, - "y": -81 + "x": 20, + "y": 51 } } }, @@ -50,8 +50,8 @@ }, "Editor": { "Position": { - "x": -103, - "y": 169 + "x": 190, + "y": 291 } } }, @@ -63,8 +63,8 @@ }, "Editor": { "Position": { - "x": 475, - "y": 33 + "x": 652, + "y": 161 } } } @@ -74,5 +74,6 @@ "LocalEffectGraph": { "Nodes": null, "SubGraphs": null - } + }, + "BodyText": null } \ No newline at end of file diff --git a/src/RPGCoreUnity/Content/BoardGame/resources/glass.json b/src/RPGCoreUnity/Content/BoardGame/resources/glass.json index 510ba1c6..61f3711f 100644 --- a/src/RPGCoreUnity/Content/BoardGame/resources/glass.json +++ b/src/RPGCoreUnity/Content/BoardGame/resources/glass.json @@ -1,3 +1,8 @@ { - "DisplayName": "Glass" + "DisplayName": "Glass", + "Colour": { + "Red": 0.0, + "Green": 0.0, + "Blue": 0.0 + } } \ No newline at end of file diff --git a/src/RPGCoreUnity/Content/BoardGame/resources/wood.json b/src/RPGCoreUnity/Content/BoardGame/resources/wood.json index a9b02187..29a7ac8f 100644 --- a/src/RPGCoreUnity/Content/BoardGame/resources/wood.json +++ b/src/RPGCoreUnity/Content/BoardGame/resources/wood.json @@ -1,3 +1,8 @@ { - "DisplayName": "Wood" + "DisplayName": "Wood", + "Colour": { + "Red": 1111.0, + "Green": 11.0, + "Blue": 1111.0 + } } \ No newline at end of file