This commit is contained in:
Meik
2025-11-11 11:03:42 +01:00
commit dc3e8a2e4c
582 changed files with 191465 additions and 0 deletions

View File

@@ -0,0 +1,645 @@
using F4SD_AdaptableIcon.Enums;
using FasdDesktopUi.Basics.Enums;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.UiActions;
using FasdDesktopUi.Basics.UserControls;
using FasdDesktopUi.Pages.DetailsPage.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Pages.DetailsPage.UserControls
{
public partial class DetailsPageWidget : UserControl
{
#region Properties
#region WidgetGeometry DependencyProperty
private static bool DidGeometryDataChange(DependencyPropertyChangedEventArgs e)
{
bool didGeometryChange = false;
if (e.OldValue != null && e.NewValue != null)
{
var oldGeometry = e.OldValue as DetailsPageWidgetGeometryModel;
var newGeometry = e.NewValue as DetailsPageWidgetGeometryModel;
didGeometryChange = newGeometry.WidgetTitleCount != oldGeometry.WidgetTitleCount || didGeometryChange;
didGeometryChange = newGeometry.WidgetDetailCount != oldGeometry.WidgetDetailCount || didGeometryChange;
}
else
{
didGeometryChange = true;
}
return didGeometryChange;
}
private static void GeometryChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (DidGeometryDataChange(e) is false)
return;
var _me = d as DetailsPageWidget;
_me.ClearControls();
_me.InitializeWidgetGeometry();
}
public static readonly DependencyProperty WidgetGeometryProperty =
DependencyProperty.Register("WidgetGeometry", typeof(DetailsPageWidgetGeometryModel), typeof(DetailsPageWidget), new PropertyMetadata(new DetailsPageWidgetGeometryModel(), new PropertyChangedCallback(GeometryChangedCallback)));
public DetailsPageWidgetGeometryModel WidgetGeometry
{
get { return (DetailsPageWidgetGeometryModel)GetValue(WidgetGeometryProperty); }
set { SetValue(WidgetGeometryProperty, value); }
}
#endregion
#region WidgetData DependencyProperty
private static void RefreshDataCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is DetailsPageWidget _me)
{
_me.UpdateWidgetControls();
_me.RefreshData();
}
}
public static readonly DependencyProperty WidgetDataProperty =
DependencyProperty.Register("WidgetData", typeof(List<cWidgetValueModel>), typeof(DetailsPageWidget), new PropertyMetadata(new List<cWidgetValueModel>(), new PropertyChangedCallback(RefreshDataCallback)));
public List<cWidgetValueModel> WidgetData
{
get { return (List<cWidgetValueModel>)GetValue(WidgetDataProperty); }
set { SetValue(WidgetDataProperty, value); }
}
#endregion
#region WidgetHeight DependencyProperty
public static readonly DependencyProperty WidgetHeightProperty =
DependencyProperty.Register("WidgetHeight", typeof(double), typeof(DetailsPageWidget), new PropertyMetadata(50.0, new PropertyChangedCallback(RefreshWidgetHeightCallback)));
public double WidgetHeight
{
get { return (double)GetValue(WidgetHeightProperty); }
set { SetValue(WidgetHeightProperty, value); }
}
#endregion
#endregion
public DetailsPageWidget()
{
InitializeComponent();
}
#region SetUpControls
#region Control Lists
private readonly List<FrameworkElement> TitleControls = new List<FrameworkElement>();
private readonly List<FunctionMarker> TitleFunctionMarkerControls = new List<FunctionMarker>();
private readonly List<FrameworkElement> ValueControls = new List<FrameworkElement>();
private readonly List<FunctionMarker> ValueFunctionMarkerControls = new List<FunctionMarker>();
private readonly List<EditWidgetValueControl> EditControls = new List<EditWidgetValueControl>();
#endregion
#region Clear Controls and ControlLists
private void ClearControls()
{
TitleControls.Clear();
TitleFunctionMarkerControls.Clear();
ValueControls.Clear();
ValueFunctionMarkerControls.Clear();
EditControls.Clear();
WidgetGrid.RowDefinitions.Clear();
}
#endregion
#region SetUp Functions
private void InitializeWidgetGeometry()
{
try
{
SetUpTitleRows(WidgetGeometry.WidgetTitleCount);
SetUpValueRows(WidgetGeometry.WidgetDetailCount);
}
catch (Exception E)
{
LogException(E);
}
}
private void SetUpTitleRows(int rowsToAdd)
{
try
{
if (TitleControls.Count == 0)
WidgetGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
for (int i = 0; i < rowsToAdd; i++)
{
WidgetGrid.RowDefinitions.Insert(TitleControls.Count, new RowDefinition { Height = GridLength.Auto });
StackPanel titleStackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
TitleFunctionMarkerControls.Add(FunctionMarker.SetUpFunctionMarker(titleStackPanel, new FunctionMarker.FunctionMarkerClick(WidgetDetailsTitleFunctionMarker_Click)));
TextBlock title = new TextBlock() { Style = widgetTitleStyle };
title.Margin = new Thickness(0, 0, 0, 0);
titleStackPanel.Children.Add(title);
TitleControls.Add(title);
Grid.SetRow(titleStackPanel, TitleControls.Count - 1);
Grid.SetColumn(titleStackPanel, 0);
WidgetGrid.Children.Add(titleStackPanel);
}
}
catch (Exception E)
{
LogException(E);
}
}
private void SetUpValueRows(int rowsToAdd)
{
try
{
for (int i = 0; i < rowsToAdd; i++)
{
StackPanel valueDockPanel = new StackPanel() { Orientation = Orientation.Horizontal };
var valueFunctionMarker = FunctionMarker.SetUpFunctionMarker(valueDockPanel, new FunctionMarker.FunctionMarkerClick(WidgetDetailsValueFunctionMarker_Click));
ValueFunctionMarkerControls.Add(valueFunctionMarker);
valueFunctionMarker.Margin = new Thickness(-8, 0, -15, 0);
TextBlock valueTextBlock = new TextBlock() { Style = widgetValueStyle };
ValueControls.Add(valueTextBlock);
valueDockPanel.Children.Add(valueTextBlock);
Grid.SetRow(valueDockPanel, ValueControls.Count - 1);
Grid.SetColumn(valueDockPanel, 1);
WidgetGrid.Children.Add(valueDockPanel);
EditWidgetValueControl editControl = new EditWidgetValueControl() { Visibility = Visibility.Collapsed, Margin = new Thickness(10, 0, 10, 0), ParentElement = WidgetGrid };
var maxWidthValue = FindResource("DetailsPage.Widget.Value.MaxWidth");
if (maxWidthValue != null && maxWidthValue is double maxWidth)
editControl.MaxWidth = maxWidth - 7.5 - 7.5;
EditControls.Add(editControl);
Grid.SetRow(editControl, EditControls.Count - 1);
Grid.SetColumn(editControl, 1);
WidgetGrid.Children.Add(editControl);
}
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
#region Update Controls Functions
private void UpdateWidgetControls()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
if (WidgetData == null)
return;
UpdateWidgetTitleControls();
UpdateWidgetValueControls();
UpdateEditControls();
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
}
private void UpdateWidgetTitleControls()
{
try
{
if (TitleControls.Count < WidgetData.Count)
{
SetUpTitleRows(WidgetData.Count - TitleControls.Count);
}
foreach (var titleControl in TitleControls)
{
if (titleControl.Parent is FrameworkElement titleControlParent)
{
titleControlParent.Margin = new Thickness(0, 0, 10, 0);
}
}
if (TitleControls.First().Parent is FrameworkElement firstTitleControlParent)
{
firstTitleControlParent.Margin = new Thickness(0, 15, 10, 0);
}
}
catch (Exception E)
{
LogException(E);
}
}
private void UpdateWidgetValueControls()
{
try
{
if (ValueControls.Count < WidgetData.Count)
{
SetUpValueRows(WidgetData.Count - ValueControls.Count);
}
if (ValueControls.First().Parent is FrameworkElement firstControlParent)
{
firstControlParent.Margin = new Thickness(0, 15, 10, 0);
}
}
catch (Exception E)
{
LogException(E);
}
}
private void UpdateEditControls()
{
try
{
for (int i = 0; i < EditControls.Count; i++)
{
var currentEditControl = EditControls[i];
if (WidgetData.Count <= i)
continue;
if (i == 0)
currentEditControl.Margin = new Thickness(10, 15, 10, 0);
else
currentEditControl.Margin = new Thickness(10, 0, 10, 0);
var currentWidgetData = WidgetData[i];
currentEditControl.Visibility = Visibility.Collapsed;
if (currentWidgetData.EditValueInformation is null)
continue;
currentEditControl.EditableValueInformation = currentWidgetData.EditValueInformation;
}
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
#endregion
#region Refresh Data
private delegate void RefreshDelegate();
private void RefreshData()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
if (WidgetData == null)
return;
RefreshWidgetTitles();
RefreshWidgetTitleFunctionMarkers();
RefreshWidgetValues();
RefreshWidgetValueFunctionMarkers();
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
}
private void RefreshWidgetTitles()
{
try
{
var widgetTitleEnumerator = WidgetData.GetEnumerator();
for (int i = 0; i < TitleControls.Count; i++)
{
if (widgetTitleEnumerator.MoveNext())
{
var Data = widgetTitleEnumerator.Current;
if (TitleControls[i] is TextBlock titleEntry)
{
titleEntry.Text = Data.Title;
titleEntry.Visibility = Visibility.Visible;
}
}
else
{
if (TitleControls[i] is TextBlock titleEntry)
{
titleEntry.Text = null;
titleEntry.Visibility = Visibility.Collapsed;
}
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private void RefreshWidgetTitleFunctionMarkers()
{
try
{
var titleFunctionMarkerEnumerator = WidgetData.GetEnumerator();
for (int i = 0; i < TitleFunctionMarkerControls.Count; i++)
{
if (titleFunctionMarkerEnumerator.MoveNext())
{
var Data = titleFunctionMarkerEnumerator.Current;
var functionMarkerEntry = TitleFunctionMarkerControls[i];
if (Data.UiActionTitle != null && Data.UiActionTitle.DisplayType == enumActionDisplayType.enabled)
{
functionMarkerEntry.Tag = Data;
var tempToolTip = Data.UiActionTitle.Name;
if (!string.IsNullOrEmpty(Data.UiActionTitle.Description))
tempToolTip += ": \n" + Data.UiActionTitle.Description;
functionMarkerEntry.ToolTip = tempToolTip;
functionMarkerEntry.Visibility = Visibility.Visible;
if (Data.UiActionTitle is cShowDetailedDataAction)
functionMarkerEntry.SelectedIcon = enumInternIcons.misc_dot;
else if (Data.UiActionTitle is cUiQuickAction || Data.UiActionTitle is cSubMenuAction)
functionMarkerEntry.SelectedIcon = enumInternIcons.misc_functionBolt;
}
else
{
functionMarkerEntry.Tag = null;
functionMarkerEntry.ToolTip = null;
functionMarkerEntry.Visibility = Visibility.Hidden;
}
}
else
{
var functionMarkerEntry = TitleFunctionMarkerControls[i];
functionMarkerEntry.Tag = null;
functionMarkerEntry.ToolTip = null;
functionMarkerEntry.Visibility = Visibility.Collapsed;
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private void RefreshWidgetValueFunctionMarkers()
{
try
{
var valueFunctionMarkerEnumerator = WidgetData.GetEnumerator();
for (int i = 0; i < ValueFunctionMarkerControls.Count; i++)
{
if (valueFunctionMarkerEnumerator.MoveNext())
{
var Data = valueFunctionMarkerEnumerator.Current;
var functionMarkerEntry = ValueFunctionMarkerControls[i];
if (Data.UiActionValue != null && Data.UiActionValue.DisplayType == enumActionDisplayType.enabled && !string.IsNullOrEmpty(Data.Value))
{
functionMarkerEntry.Visibility = Visibility.Visible;
functionMarkerEntry.Tag = Data;
var tempToolTip = Data.UiActionValue.Name;
if (!string.IsNullOrEmpty(Data.UiActionValue.Description))
tempToolTip += ": \n" + Data.UiActionValue.Description;
functionMarkerEntry.ToolTip = tempToolTip;
}
else
{
functionMarkerEntry.Tag = null;
functionMarkerEntry.ToolTip = null;
functionMarkerEntry.Visibility = Visibility.Hidden;
}
}
else
{
var functionMarkerEntry = ValueFunctionMarkerControls[i];
functionMarkerEntry.Tag = null;
functionMarkerEntry.ToolTip = null;
functionMarkerEntry.Visibility = Visibility.Collapsed;
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private void RefreshWidgetValues()
{
try
{
var widgetDataEnumerator = WidgetData.GetEnumerator();
for (int i = 0; i < ValueControls.Count; i++)
{
if (widgetDataEnumerator.MoveNext())
{
var Data = widgetDataEnumerator.Current;
if (ValueControls[i] is TextBlock valueEntry)
{
valueEntry.Text = Data.IsLoading ? "..." : Data.Value;
valueEntry.Visibility = Visibility.Visible;
valueEntry.IsHitTestVisible = !string.IsNullOrWhiteSpace(Data.Value);
switch (Data.HighlightIn)
{
case enumHighlightColor.none:
valueEntry.ClearValue(ForegroundProperty);
break;
case enumHighlightColor.blue:
valueEntry.Foreground = (SolidColorBrush)FindResource("Color.Blue");
break;
case enumHighlightColor.green:
valueEntry.Foreground = (SolidColorBrush)FindResource("Color.Green");
break;
case enumHighlightColor.orange:
valueEntry.Foreground = (SolidColorBrush)FindResource("Color.Orange");
break;
case enumHighlightColor.red:
valueEntry.Foreground = (SolidColorBrush)FindResource("Color.Red");
break;
default:
valueEntry.ClearValue(ForegroundProperty);
break;
}
}
}
else
{
if (ValueControls[i] is TextBlock valueEntry)
{
valueEntry.Text = null;
valueEntry.Visibility = Visibility.Collapsed;
valueEntry.Foreground = null;
}
}
}
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
#region Refresh Widget Height
static void RefreshWidgetHeightCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is DetailsPageWidget _me)
_me.WidgetHeight = (double)e.NewValue;
}
#endregion
#region Style Definitions
private Style widgetTitleStyle;
private Style widgetValueStyle;
private void SetStyles()
{
widgetTitleStyle = (Style)FindResource("DetailsPage.Widget.Title");
widgetValueStyle = (Style)FindResource("DetailsPage.Widget.Value");
}
#endregion
#region Event Methods
#region UserControl
private void UserControl_Initialized(object sender, EventArgs e)
{
SetStyles();
}
#endregion
#region FunctionMarker
private void WidgetDetailsTitleFunctionMarker_Click(object sender)
{
if (!(sender is FrameworkElement FE))
return;
if (!(FE.Tag is cWidgetValueModel widgetData))
return;
if (widgetData.UiActionTitle == null)
return;
cUiActionBase.RaiseEvent(widgetData.UiActionTitle, this, this);
}
private void WidgetDetailsValueFunctionMarker_Click(object sender)
{
if (!(sender is FrameworkElement FE))
return;
if (!(FE.Tag is cWidgetValueModel widgetData))
return;
if (widgetData.UiActionValue == null)
return;
cUiActionBase.RaiseEvent(widgetData.UiActionValue, this, this);
}
#endregion
#endregion
public void SetEditMode(bool isActive)
{
try
{
if (WidgetData is null)
return;
for (int i = 0; i < WidgetData.Count; i++)
{
var currentWidgetData = WidgetData[i];
if (currentWidgetData.EditValueInformation is null)
continue;
if (EditControls.Count > i)
EditControls[i].Visibility = isActive ? Visibility.Visible : Visibility.Collapsed;
if (ValueControls.Count > i)
ValueControls[i].Visibility = isActive ? Visibility.Collapsed : Visibility.Visible;
}
}
catch (Exception E)
{
LogException(E);
}
}
}
}