/// <summary> /// Creates value converter context from element settings. /// </summary> private static ValueConverterContext GetValueConverterContext(ValueConverterContext parentContext, XElement element, string viewName) { var elementContext = new ValueConverterContext(parentContext); var baseDirectoryAttr = element.Attribute("BaseDirectory"); var unitSizeAttr = element.Attribute("UnitSize"); if (baseDirectoryAttr != null) { elementContext.BaseDirectory = baseDirectoryAttr.Value; } if (unitSizeAttr != null) { var unitSizeString = unitSizeAttr.Value; var converter = new Vector3ValueConverter(); var result = converter.Convert(unitSizeString); if (result.Success) { elementContext.UnitSize = (Vector3)result.ConvertedValue; } else { Utils.LogError("[MarkLight] {0}: Error parsing XUML. Unable to parse UnitSize attribute value \"{1}\".", viewName, unitSizeString); elementContext.UnitSize = ViewPresenter.Instance.UnitSize; } } return(elementContext); }
/// <summary> /// Loads XUML to theme database. /// </summary> private static void LoadThemeXuml(XElement xumlElement, string xuml, string xumlAssetName) { var viewPresenter = ViewPresenter.Instance; var themeNameAttr = xumlElement.Attribute("Name"); if (themeNameAttr == null) { Utils.LogError("[MarkLight] {0}: Error parsing theme XUML. Name attribute missing.", xumlAssetName); } viewPresenter.ThemeData.RemoveAll(x => String.Equals(x.ThemeName, themeNameAttr.Value, StringComparison.OrdinalIgnoreCase)); var themeData = new ThemeData(); viewPresenter.ThemeData.Add(themeData); themeData.Xuml = xuml; themeData.XumlElement = xumlElement; themeData.ThemeName = themeNameAttr.Value; var baseDirectoryAttr = xumlElement.Attribute("BaseDirectory"); themeData.BaseDirectorySet = baseDirectoryAttr != null; if (themeData.BaseDirectorySet) { themeData.BaseDirectory = baseDirectoryAttr.Value; } var unitSizeAttr = xumlElement.Attribute("UnitSize"); themeData.UnitSizeSet = unitSizeAttr != null; if (themeData.UnitSizeSet) { if (String.IsNullOrEmpty(unitSizeAttr.Value)) { // use default unit size themeData.UnitSize = ViewPresenter.Instance.UnitSize; } else { var converter = new Vector3ValueConverter(); var result = converter.Convert(unitSizeAttr.Value); if (result.Success) { themeData.UnitSize = (Vector3)result.ConvertedValue; } else { Utils.LogError("[MarkLight] {0}: Error parsing theme XUML. Unable to parse UnitSize attribute value \"{1}\".", xumlAssetName, unitSizeAttr.Value); themeData.UnitSize = ViewPresenter.Instance.UnitSize; } } } // load theme elements foreach (var childElement in xumlElement.Elements()) { var themeElement = new ThemeElementData(); themeElement.ViewName = childElement.Name.LocalName; var idAttr = childElement.Attribute("Id"); if (idAttr != null) { themeElement.Id = idAttr.Value; } var styleAttr = childElement.Attribute("Style"); if (styleAttr != null) { themeElement.Style = styleAttr.Value; } var basedOnAttr = childElement.Attribute("BasedOn"); if (basedOnAttr != null) { themeElement.BasedOn = basedOnAttr.Value; } themeElement.XumlElement = childElement; themeElement.Xuml = childElement.ToString(); themeData.ThemeElementData.Add(themeElement); } }