diff --git a/Output/Themes/Ambient/Screens/ScreenSong.xml b/Output/Themes/Ambient/Screens/ScreenSong.xml
index 559c0d2d..62dba236 100644
--- a/Output/Themes/Ambient/Screens/ScreenSong.xml
+++ b/Output/Themes/Ambient/Screens/ScreenSong.xml
@@ -1232,7 +1232,7 @@
-
+
Button
SelectSlideArrowLeft
SelectSlideArrowRight
diff --git a/VocaluxeLib/Menu/CMenu.cs b/VocaluxeLib/Menu/CMenu.cs
index dfc66cce..7bb87d13 100644
--- a/VocaluxeLib/Menu/CMenu.cs
+++ b/VocaluxeLib/Menu/CMenu.cs
@@ -137,6 +137,26 @@ namespace VocaluxeLib.Menu
}
}
+ private class CLoadThemeErrorHandler : CXmlDeserializer.CXmlDefaultErrorHandler
+ {
+ private static readonly string[] _AllowedMissing = new string[]
+ {
+ "Backgrounds", "Statics", "Texts", "Buttons", "SongMenus", "Lyrics", "SelectSlides", "SingNotes",
+ "NameSelections", "Equalizers", "Playlists", "ParticleEffects", "ScreenSettings"
+ };
+
+ public override void HandleError(CXmlException e)
+ {
+ CXmlMissingElementException missingEx = e as CXmlMissingElementException;
+ if (missingEx != null)
+ {
+ if (_AllowedMissing.Contains(missingEx.Field.Name))
+ return;
+ }
+ base.HandleError(e);
+ }
+ }
+
public virtual void LoadTheme(string xmlPath)
{
if (CBase.Config.GetLoadOldThemeFiles())
@@ -149,26 +169,10 @@ namespace VocaluxeLib.Menu
string file = Path.Combine(xmlPath, ThemeName + ".xml");
- Theme.Informations = new SScreenInformation();
- Theme.Backgrounds = new List();
- Theme.Statics = new List();
- Theme.Texts = new List();
- Theme.Buttons = new List();
- Theme.SongMenus = new List();
- Theme.Lyrics = new List();
- Theme.SelectSlides = new List();
- Theme.SingNotes = new List();
- Theme.NameSelections = new List();
- Theme.Equalizers = new List();
- Theme.Playlists = new List();
- Theme.ParticleEffects = new List();
- Theme.ScreenSettings = new List();
-
try
{
- TextReader textReader = new StreamReader(file);
- XmlSerializer deserializer = new XmlSerializer(typeof(SThemeScreen));
- Theme = (SThemeScreen)deserializer.Deserialize(textReader);
+ CXmlDeserializer deserializer = new CXmlDeserializer(new CLoadThemeErrorHandler());
+ Theme = deserializer.Deserialize(file);
foreach (SThemeBackground bg in Theme.Backgrounds)
_AddBackground(new CBackground(bg, PartyModeID), bg.Name);
@@ -227,6 +231,10 @@ namespace VocaluxeLib.Menu
{
CBase.Log.LogError("Error while reading " + ThemeName + ".xml", true, true);
}
+ catch (CXmlException e)
+ {
+ CBase.Log.LogError("Error while reading " + ThemeName + ".xml: " + e, true, true);
+ }
catch (Exception e)
{
CBase.Log.LogError(e.Message + e.StackTrace, true, true);
@@ -308,12 +316,8 @@ namespace VocaluxeLib.Menu
try
{
- TextWriter textWriter = new StreamWriter(Path.Combine(ThemePath, ThemeName + ".xml"));
-
- XmlSerializer serializer = new XmlSerializer(typeof(SThemeScreen));
- serializer.Serialize(textWriter, Theme);
-
- textWriter.Close();
+ CXmlSerializer serializer = new CXmlSerializer();
+ serializer.Serialize(Path.Combine(ThemePath, ThemeName + ".xml"), Theme);
}
catch (Exception e)
{
diff --git a/VocaluxeLib/Menu/CSelectSlide.cs b/VocaluxeLib/Menu/CSelectSlide.cs
index be8a8ad9..64f39b08 100644
--- a/VocaluxeLib/Menu/CSelectSlide.cs
+++ b/VocaluxeLib/Menu/CSelectSlide.cs
@@ -17,6 +17,7 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Xml.Serialization;
@@ -52,8 +53,8 @@ namespace VocaluxeLib.Menu
public SThemeColor TextSelColor;
public float TextH;
- public float TextRelativeX;
- public float TextRelativeY;
+ [DefaultValue(0.0f)] public float TextRelativeX;
+ [DefaultValue(0.0f)] public float TextRelativeY;
public float TextMaxW;
public string TextFont;
diff --git a/VocaluxeLib/Structs.cs b/VocaluxeLib/Structs.cs
index d59163a3..09a1b960 100644
--- a/VocaluxeLib/Structs.cs
+++ b/VocaluxeLib/Structs.cs
@@ -186,6 +186,7 @@ namespace VocaluxeLib
public float Z;
[XmlIgnore] public float Rotation; //0..360°
+ [XmlIgnore]
public float Right
{
get { return X + W; }
@@ -195,6 +196,8 @@ namespace VocaluxeLib
Debug.Assert(W >= 0);
}
}
+
+ [XmlIgnore]
public float Bottom
{
get { return Y + H; }
@@ -204,10 +207,14 @@ namespace VocaluxeLib
Debug.Assert(H >= 0);
}
}
+
+ [XmlIgnore]
public Size SizeI
{
get { return new Size((int)W, (int)H); }
}
+
+ [XmlIgnore]
public SizeF Size
{
get { return new SizeF(W, H); }
diff --git a/VocaluxeLib/Xml/CXmlDeserializer.cs b/VocaluxeLib/Xml/CXmlDeserializer.cs
index cc51c26f..df8c7879 100644
--- a/VocaluxeLib/Xml/CXmlDeserializer.cs
+++ b/VocaluxeLib/Xml/CXmlDeserializer.cs
@@ -86,14 +86,14 @@ namespace VocaluxeLib.Xml
}
#endregion Debug Helpers
- private readonly XmlNode _Node;
+ public readonly XmlNode Node;
public readonly bool IsError;
public CXmlException(string msg, XmlNode node, bool isError = true)
: base(msg)
{
IsError = isError;
- _Node = node;
+ Node = node;
}
public override string Message
@@ -103,12 +103,22 @@ namespace VocaluxeLib.Xml
public override String ToString()
{
- string xPath = _Node == null ? "" : _GetXPath(_Node);
+ string xPath = Node == null ? "" : _GetXPath(Node);
string type = IsError ? "Error" : "Warning";
return type + ": " + base.Message.Replace("%n", xPath);
}
}
+ public class CXmlMissingElementException : CXmlException
+ {
+ public readonly SFieldInfo Field;
+
+ public CXmlMissingElementException(XmlNode parent, SFieldInfo field, bool isError = true) : base("Element: " + field.Name + " is missing in %n", parent, isError)
+ {
+ Field = field;
+ }
+ }
+
public class CXmlInvalidValueException : CXmlException
{
private readonly string _Value;
@@ -157,9 +167,9 @@ namespace VocaluxeLib.Xml
public class CXmlDeserializer
{
- private class CXmlDefaultErrorHandler : IXmlErrorHandler
+ public class CXmlDefaultErrorHandler : IXmlErrorHandler
{
- public void HandleError(CXmlException e)
+ public virtual void HandleError(CXmlException e)
{
if (e.IsError)
throw e;
@@ -421,7 +431,7 @@ namespace VocaluxeLib.Xml
Dictionary>> embLists = new Dictionary>>();
foreach (XmlNode node in nodes)
{
- if (node is XmlComment)
+ if (node is XmlComment || node.LocalName == "xsd" || node.LocalName == "xsi")
continue;
SFieldInfo field = new SFieldInfo();
@@ -505,7 +515,7 @@ namespace VocaluxeLib.Xml
if (!_CheckAndSetDefaultValue(o, field))
{
if (parent != null)
- _ErrorHandler.HandleError(new CXmlException("element: " + field.Name + " is missing in %n", parent));
+ _ErrorHandler.HandleError(new CXmlMissingElementException(parent, field));
object value = _GetValue(null, field.Type, field.ArrayItemName, field.GetValue(o));
if (value != null)
field.SetValue(o, value);