unify handlers

This commit is contained in:
bluepilledgreat 2024-10-20 21:36:30 +01:00
parent 81e2095c87
commit cb70e8ec0c

View File

@ -14,6 +14,8 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
{ {
public partial class CustomDialog public partial class CustomDialog
{ {
private class DummyFrameworkElement : FrameworkElement { }
private const int MaxElements = 100; private const int MaxElements = 100;
private bool _initialised = false; private bool _initialised = false;
@ -23,35 +25,29 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
private string ThemeDir { get; set; } = ""; private string ThemeDir { get; set; } = "";
delegate UIElement? HandleXmlElementDelegate(CustomDialog dialog, XElement xmlElement); delegate object HandleXmlElementDelegate(CustomDialog dialog, XElement xmlElement);
delegate Brush HandleXmlBrushElementDelegate(CustomDialog dialog, XElement xmlElement);
delegate void HandleXmlTransformationElementDelegate(TransformGroup group, XElement xmlElement);
private static Dictionary<string, HandleXmlElementDelegate> _elementHandlerMap = new Dictionary<string, HandleXmlElementDelegate>() private static Dictionary<string, HandleXmlElementDelegate> _elementHandlerMap = new Dictionary<string, HandleXmlElementDelegate>()
{ {
//["BloxstrapCustomBootstrapper"] = HandleXmlElement_BloxstrapCustomBootstrapper,
["TitleBar"] = HandleXmlElement_TitleBar, ["TitleBar"] = HandleXmlElement_TitleBar,
["Button"] = HandleXmlElement_Button, ["Button"] = HandleXmlElement_Button,
["ProgressBar"] = HandleXmlElement_ProgressBar, ["ProgressBar"] = HandleXmlElement_ProgressBar,
["TextBlock"] = HandleXmlElement_TextBlock, ["TextBlock"] = HandleXmlElement_TextBlock,
["MarkdownTextBlock"] = HandleXmlElement_MarkdownTextBlock, ["MarkdownTextBlock"] = HandleXmlElement_MarkdownTextBlock,
["Image"] = HandleXmlElement_Image ["Image"] = HandleXmlElement_Image,
["SolidColorBrush"] = HandleXml_SolidColorBrush,
["ImageBrush"] = HandleXml_ImageBrush,
["LinearGradientBrush"] = HandleXml_LinearGradientBrush,
["GradientStop"] = HandleXml_GradientStop,
["ScaleTransform"] = HandleXml_ScaleTransform,
["SkewTransform"] = HandleXml_SkewTransform,
["RotateTransform"] = HandleXml_RotateTransform,
["TranslateTransform"] = HandleXml_TranslateTransform
}; };
private static Dictionary<string, HandleXmlBrushElementDelegate> _brushHandlerMap = new Dictionary<string, HandleXmlBrushElementDelegate>()
{
["SolidColorBrush"] = HandleXmlBrush_SolidColorBrush,
["ImageBrush"] = HandleXmlBrush_ImageBrush,
["LinearGradientBrush"] = HandleXmlBrush_LinearGradientBrush
};
private static Dictionary<string, HandleXmlTransformationElementDelegate> _transformationHandlerMap = new Dictionary<string, HandleXmlTransformationElementDelegate>()
{
["ScaleTransform"] = HandleXmlTransformationElement_ScaleTransform,
["SkewTransform"] = HandleXmlTransformationElement_SkewTransform,
["RotateTransform"] = HandleXmlTransformationElement_RotateTransform,
["TranslateTransform"] = HandleXmlTransformationElement_TranslateTransform
};
#region Utilities #region Utilities
private static string GetXmlAttribute(XElement element, string attributeName, string? defaultValue = null) private static string GetXmlAttribute(XElement element, string attributeName, string? defaultValue = null)
@ -233,7 +229,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
#endregion #endregion
#region Transformation Elements #region Transformation Elements
private static void HandleXmlTransformationElement_ScaleTransform(TransformGroup group, XElement xmlElement) private static Transform HandleXml_ScaleTransform(CustomDialog dialog, XElement xmlElement)
{ {
var st = new ScaleTransform(); var st = new ScaleTransform();
@ -242,10 +238,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
st.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0); st.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0);
st.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0); st.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0);
group.Children.Add(st); return st;
} }
private static void HandleXmlTransformationElement_SkewTransform(TransformGroup group, XElement xmlElement) private static Transform HandleXml_SkewTransform(CustomDialog dialog, XElement xmlElement)
{ {
var st = new SkewTransform(); var st = new SkewTransform();
@ -254,10 +250,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
st.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0); st.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0);
st.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0); st.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0);
group.Children.Add(st); return st;
} }
private static void HandleXmlTransformationElement_RotateTransform(TransformGroup group, XElement xmlElement) private static Transform HandleXml_RotateTransform(CustomDialog dialog, XElement xmlElement)
{ {
var rt = new RotateTransform(); var rt = new RotateTransform();
@ -265,28 +261,20 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
rt.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0); rt.CenterX = ParseXmlAttribute<double>(xmlElement, "CenterX", 0);
rt.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0); rt.CenterY = ParseXmlAttribute<double>(xmlElement, "CenterY", 0);
group.Children.Add(rt); return rt;
} }
private static void HandleXmlTransformationElement_TranslateTransform(TransformGroup group, XElement xmlElement) private static Transform HandleXml_TranslateTransform(CustomDialog dialog, XElement xmlElement)
{ {
var tt = new TranslateTransform(); var tt = new TranslateTransform();
tt.X = ParseXmlAttribute<double>(xmlElement, "X", 0); tt.X = ParseXmlAttribute<double>(xmlElement, "X", 0);
tt.Y = ParseXmlAttribute<double>(xmlElement, "Y", 0); tt.Y = ParseXmlAttribute<double>(xmlElement, "Y", 0);
group.Children.Add(tt); return tt;
} }
private static void HandleXmlTransformation(TransformGroup group, XElement xmlElement) private static void ApplyTransformations_UIElement(CustomDialog dialog, UIElement uiElement, XElement xmlElement)
{
if (!_transformationHandlerMap.ContainsKey(xmlElement.Name.ToString()))
throw new Exception($"Unknown transformation {xmlElement.Name}");
_transformationHandlerMap[xmlElement.Name.ToString()](group, xmlElement);
}
private static void ApplyTransformations_UIElement(UIElement uiElement, XElement xmlElement)
{ {
var renderTransform = xmlElement.Element($"{xmlElement.Name}.RenderTransform"); var renderTransform = xmlElement.Element($"{xmlElement.Name}.RenderTransform");
@ -295,24 +283,26 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
var tg = new TransformGroup(); var tg = new TransformGroup();
foreach (var child in renderTransform.Elements()) foreach (var child in renderTransform.Elements())
HandleXmlTransformation(tg, child); {
Transform element = HandleXml<Transform>(dialog, child);
tg.Children.Add(element);
}
if (tg.Children.Any())
uiElement.RenderTransform = tg; uiElement.RenderTransform = tg;
} }
} }
#endregion #endregion
#region Brushes #region Brushes
private static void HandleXmlBrush_Brush(Brush brush, XElement xmlElement) private static void HandleXml_Brush(Brush brush, XElement xmlElement)
{ {
brush.Opacity = ParseXmlAttribute<double>(xmlElement, "Opacity", 1.0); brush.Opacity = ParseXmlAttribute<double>(xmlElement, "Opacity", 1.0);
} }
private static Brush HandleXmlBrush_SolidColorBrush(CustomDialog dialog, XElement xmlElement) private static Brush HandleXml_SolidColorBrush(CustomDialog dialog, XElement xmlElement)
{ {
var brush = new SolidColorBrush(); var brush = new SolidColorBrush();
HandleXmlBrush_Brush(brush, xmlElement); HandleXml_Brush(brush, xmlElement);
object? color = GetColorFromXElement(xmlElement, "Color"); object? color = GetColorFromXElement(xmlElement, "Color");
if (color is Color) if (color is Color)
@ -321,10 +311,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
return brush; return brush;
} }
private static Brush HandleXmlBrush_ImageBrush(CustomDialog dialog, XElement xmlElement) private static Brush HandleXml_ImageBrush(CustomDialog dialog, XElement xmlElement)
{ {
var imageBrush = new ImageBrush(); var imageBrush = new ImageBrush();
HandleXmlBrush_Brush(imageBrush, xmlElement); HandleXml_Brush(imageBrush, xmlElement);
imageBrush.AlignmentX = ParseXmlAttribute<AlignmentX>(xmlElement, "AlignmentX", AlignmentX.Center); imageBrush.AlignmentX = ParseXmlAttribute<AlignmentX>(xmlElement, "AlignmentX", AlignmentX.Center);
imageBrush.AlignmentY = ParseXmlAttribute<AlignmentY>(xmlElement, "AlignmentY", AlignmentY.Center); imageBrush.AlignmentY = ParseXmlAttribute<AlignmentY>(xmlElement, "AlignmentY", AlignmentY.Center);
@ -376,7 +366,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
return imageBrush; return imageBrush;
} }
private static GradientStop HandleGradientStop(XElement xmlElement) private static GradientStop HandleXml_GradientStop(CustomDialog dialog, XElement xmlElement)
{ {
var gs = new GradientStop(); var gs = new GradientStop();
@ -389,10 +379,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
return gs; return gs;
} }
private static Brush HandleXmlBrush_LinearGradientBrush(CustomDialog dialog, XElement xmlElement) private static Brush HandleXml_LinearGradientBrush(CustomDialog dialog, XElement xmlElement)
{ {
var brush = new LinearGradientBrush(); var brush = new LinearGradientBrush();
HandleXmlBrush_Brush(brush, xmlElement); HandleXml_Brush(brush, xmlElement);
object? startPoint = GetPointFromXElement(xmlElement, "StartPoint"); object? startPoint = GetPointFromXElement(xmlElement, "StartPoint");
if (startPoint is Point) if (startPoint is Point)
@ -407,24 +397,11 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
brush.SpreadMethod = ParseXmlAttribute<GradientSpreadMethod>(xmlElement, "SpreadMethod", GradientSpreadMethod.Pad); brush.SpreadMethod = ParseXmlAttribute<GradientSpreadMethod>(xmlElement, "SpreadMethod", GradientSpreadMethod.Pad);
foreach (var child in xmlElement.Elements()) foreach (var child in xmlElement.Elements())
{ brush.GradientStops.Add(HandleXml<GradientStop>(dialog, child));
if (child.Name != "GradientStop")
throw new Exception($"{child.Name} can not be a child of LinearGradientBrush");
brush.GradientStops.Add(HandleGradientStop(child));
}
return brush; return brush;
} }
private static Brush HandleXmlBrush(CustomDialog dialog, XElement xmlElement)
{
if (!_brushHandlerMap.ContainsKey(xmlElement.Name.ToString()))
throw new Exception($"Unknown brush {xmlElement.Name}");
return _brushHandlerMap[xmlElement.Name.ToString()](dialog, xmlElement);
}
private static void ApplyBrush_UIElement(CustomDialog dialog, FrameworkElement uiElement, string name, DependencyProperty dependencyProperty, XElement xmlElement) private static void ApplyBrush_UIElement(CustomDialog dialog, FrameworkElement uiElement, string name, DependencyProperty dependencyProperty, XElement xmlElement)
{ {
// check if attribute exists // check if attribute exists
@ -449,7 +426,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
if (first == null) if (first == null)
throw new Exception($"{xmlElement.Name} {name} is missing the brush"); throw new Exception($"{xmlElement.Name} {name} is missing the brush");
var brush = HandleXmlBrush(dialog, first); var brush = HandleXml<Brush>(dialog, first);
uiElement.SetValue(dependencyProperty, brush); uiElement.SetValue(dependencyProperty, brush);
} }
#endregion #endregion
@ -506,7 +483,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
ApplyBrush_UIElement(dialog, uiElement, "BorderBrush", Control.BorderBrushProperty, xmlElement); ApplyBrush_UIElement(dialog, uiElement, "BorderBrush", Control.BorderBrushProperty, xmlElement);
} }
private static UIElement? HandleXmlElement_BloxstrapCustomBootstrapper(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_BloxstrapCustomBootstrapper(CustomDialog dialog, XElement xmlElement)
{ {
xmlElement.SetAttributeValue("Visibility", "Collapsed"); // don't show the bootstrapper yet!!! xmlElement.SetAttributeValue("Visibility", "Collapsed"); // don't show the bootstrapper yet!!!
xmlElement.SetAttributeValue("IsEnabled", "True"); xmlElement.SetAttributeValue("IsEnabled", "True");
@ -523,10 +500,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
dialog.Margin = new Thickness(0, 0, 0, 0); dialog.Margin = new Thickness(0, 0, 0, 0);
dialog.Padding = new Thickness(0, 0, 0, 0); dialog.Padding = new Thickness(0, 0, 0, 0);
return null; // dont add anything return new DummyFrameworkElement();
} }
private static UIElement? HandleXmlElement_TitleBar(CustomDialog dialog, XElement xmlElement) private static DummyFrameworkElement HandleXmlElement_TitleBar(CustomDialog dialog, XElement xmlElement)
{ {
xmlElement.SetAttributeValue("Name", "TitleBar"); // prevent two titlebars from existing xmlElement.SetAttributeValue("Name", "TitleBar"); // prevent two titlebars from existing
xmlElement.SetAttributeValue("IsEnabled", "True"); xmlElement.SetAttributeValue("IsEnabled", "True");
@ -547,7 +524,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
dialog.Title = title; dialog.Title = title;
dialog.RootTitleBar.Title = title; dialog.RootTitleBar.Title = title;
return null; // dont add anything return new DummyFrameworkElement(); // dont add anything
} }
private static object? GetContentFromXElement(CustomDialog dialog, XElement xmlElement) private static object? GetContentFromXElement(CustomDialog dialog, XElement xmlElement)
@ -563,14 +540,14 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
if (first == null) if (first == null)
throw new Exception($"{xmlElement.Name} Content is missing the content"); throw new Exception($"{xmlElement.Name} Content is missing the content");
var uiElement = HandleXml(dialog, first); var uiElement = HandleXml<UIElement>(dialog, first);
return uiElement; return uiElement;
} }
return null; return null;
} }
private static UIElement? HandleXmlElement_Button(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_Button(CustomDialog dialog, XElement xmlElement)
{ {
var button = new Button(); var button = new Button();
HandleXmlElement_Control(dialog, button, xmlElement); HandleXmlElement_Control(dialog, button, xmlElement);
@ -586,12 +563,12 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
BindingOperations.SetBinding(button, Button.CommandProperty, cancelCommandBinding); BindingOperations.SetBinding(button, Button.CommandProperty, cancelCommandBinding);
} }
ApplyTransformations_UIElement(button, xmlElement); ApplyTransformations_UIElement(dialog, button, xmlElement);
return button; return button;
} }
private static UIElement? HandleXmlElement_ProgressBar(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_ProgressBar(CustomDialog dialog, XElement xmlElement)
{ {
var progressBar = new ProgressBar(); var progressBar = new ProgressBar();
HandleXmlElement_Control(dialog, progressBar, xmlElement); HandleXmlElement_Control(dialog, progressBar, xmlElement);
@ -613,7 +590,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
BindingOperations.SetBinding(progressBar, ProgressBar.ValueProperty, valueBinding); BindingOperations.SetBinding(progressBar, ProgressBar.ValueProperty, valueBinding);
} }
ApplyTransformations_UIElement(progressBar, xmlElement); ApplyTransformations_UIElement(dialog, progressBar, xmlElement);
return progressBar; return progressBar;
} }
@ -655,10 +632,10 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, textBinding); BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, textBinding);
} }
ApplyTransformations_UIElement(textBlock, xmlElement); ApplyTransformations_UIElement(dialog, textBlock, xmlElement);
} }
private static UIElement? HandleXmlElement_TextBlock(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_TextBlock(CustomDialog dialog, XElement xmlElement)
{ {
var textBlock = new TextBlock(); var textBlock = new TextBlock();
HandleXmlElement_TextBlock_Base(dialog, textBlock, xmlElement); HandleXmlElement_TextBlock_Base(dialog, textBlock, xmlElement);
@ -666,7 +643,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
return textBlock; return textBlock;
} }
private static UIElement? HandleXmlElement_MarkdownTextBlock(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_MarkdownTextBlock(CustomDialog dialog, XElement xmlElement)
{ {
var textBlock = new MarkdownTextBlock(); var textBlock = new MarkdownTextBlock();
HandleXmlElement_TextBlock_Base(dialog, textBlock, xmlElement); HandleXmlElement_TextBlock_Base(dialog, textBlock, xmlElement);
@ -678,7 +655,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
return textBlock; return textBlock;
} }
private static UIElement? HandleXmlElement_Image(CustomDialog dialog, XElement xmlElement) private static UIElement HandleXmlElement_Image(CustomDialog dialog, XElement xmlElement)
{ {
var image = new Image(); var image = new Image();
HandleXmlElement_FrameworkElement(dialog, image, xmlElement); HandleXmlElement_FrameworkElement(dialog, image, xmlElement);
@ -726,27 +703,30 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
} }
} }
ApplyTransformations_UIElement(image, xmlElement); ApplyTransformations_UIElement(dialog, image, xmlElement);
return image; return image;
} }
private static UIElement? HandleXml(CustomDialog dialog, XElement xmlElement) private static T HandleXml<T>(CustomDialog dialog, XElement xmlElement) where T : class
{ {
if (!_elementHandlerMap.ContainsKey(xmlElement.Name.ToString())) if (!_elementHandlerMap.ContainsKey(xmlElement.Name.ToString()))
throw new Exception($"Unknown element {xmlElement.Name}"); throw new Exception($"Unknown element {xmlElement.Name}");
var uiElement = _elementHandlerMap[xmlElement.Name.ToString()](dialog, xmlElement); var element = _elementHandlerMap[xmlElement.Name.ToString()](dialog, xmlElement);
return uiElement; if (element is not T)
throw new Exception($"{xmlElement.Parent!.Name} cannot have a child of {xmlElement.Name}");
return (T)element;
} }
private static void HandleAndAddXml(CustomDialog dialog, XElement xmlElement) private static void AddXml(CustomDialog dialog, XElement xmlElement)
{ {
if (xmlElement.Name.ToString().StartsWith($"{xmlElement.Parent!.Name}.")) if (xmlElement.Name.ToString().StartsWith($"{xmlElement.Parent!.Name}."))
return; // not an xml element return; // not an xml element
var uiElement = HandleXml(dialog, xmlElement); var uiElement = HandleXml<UIElement>(dialog, xmlElement);
if (uiElement != null) if (uiElement is not DummyFrameworkElement)
dialog.ElementGrid.Children.Add(uiElement); dialog.ElementGrid.Children.Add(uiElement);
} }
@ -771,7 +751,7 @@ namespace Bloxstrap.UI.Elements.Bootstrapper
// handle everything else // handle everything else
foreach (var child in xml.Elements()) foreach (var child in xml.Elements())
HandleAndAddXml(this, child); AddXml(this, child);
} }
#endregion #endregion