223 lines
7.8 KiB
C#
223 lines
7.8 KiB
C#
using C4IT.FASD.Base;
|
|
using F4SD_AdaptableIcon.Enums;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices.WindowsRuntime;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Animation;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Navigation;
|
|
using System.Windows.Shapes;
|
|
using static C4IT.Logging.cLogManager;
|
|
|
|
namespace FasdDesktopUi.Basics.UserControls
|
|
{
|
|
public partial class SelectionPill : UserControl
|
|
{
|
|
#region PillText
|
|
|
|
public string PillText
|
|
{
|
|
get { return (string)GetValue(PillTextProperty); }
|
|
set { SetValue(PillTextProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty PillTextProperty =
|
|
DependencyProperty.Register("PillText", typeof(string), typeof(SelectionPill), new PropertyMetadata(string.Empty));
|
|
|
|
#endregion
|
|
|
|
#region Icons
|
|
|
|
private static void SelectedIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (!(d is SelectionPill me))
|
|
return;
|
|
|
|
if (e.NewValue is null)
|
|
return;
|
|
|
|
switch (e.NewValue)
|
|
{
|
|
case enumInternIcons _:
|
|
me.SelectedMaterialIcon = null;
|
|
me.SelectedGif = null;
|
|
break;
|
|
case MaterialIcons.MaterialIconType _:
|
|
me.SelectedInternIcon = null;
|
|
me.SelectedGif = null;
|
|
break;
|
|
case enumInternGif _:
|
|
me.SelectedInternIcon = null;
|
|
me.SelectedMaterialIcon = null;
|
|
break;
|
|
}
|
|
|
|
if (me.SelectedInternIcon is null && me.SelectedMaterialIcon is null && me.SelectedGif is null)
|
|
me.PillIcon.Visibility = Visibility.Collapsed;
|
|
else
|
|
me.PillIcon.Visibility = Visibility.Visible;
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
public enumInternIcons? SelectedInternIcon
|
|
{
|
|
get { return (enumInternIcons?)GetValue(SelectedInternIconProperty); }
|
|
set { SetValue(SelectedInternIconProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty SelectedInternIconProperty =
|
|
DependencyProperty.Register("SelectedInternIcon", typeof(enumInternIcons?), typeof(SelectionPill), new PropertyMetadata(null, new PropertyChangedCallback(SelectedIconChanged)));
|
|
|
|
|
|
public MaterialIcons.MaterialIconType? SelectedMaterialIcon
|
|
{
|
|
get { return (MaterialIcons.MaterialIconType?)GetValue(SelectedMaterialIconProperty); }
|
|
set { SetValue(SelectedMaterialIconProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty SelectedMaterialIconProperty =
|
|
DependencyProperty.Register("SelectedMaterialIcon", typeof(MaterialIcons.MaterialIconType?), typeof(SelectionPill), new PropertyMetadata(null, new PropertyChangedCallback(SelectedIconChanged)));
|
|
|
|
|
|
public enumInternGif? SelectedGif
|
|
{
|
|
get { return (enumInternGif?)GetValue(SelectedGifProperty); }
|
|
set { SetValue(SelectedGifProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty SelectedGifProperty =
|
|
DependencyProperty.Register("SelectedGif", typeof(enumInternGif?), typeof(SelectionPill), new PropertyMetadata(null, new PropertyChangedCallback(SelectedIconChanged)));
|
|
|
|
#endregion
|
|
|
|
private static List<SelectionPill> allPills = new List<SelectionPill>();
|
|
// Dependency Property für die Gruppenzugehörigkeit
|
|
public static readonly DependencyProperty GroupNameProperty =
|
|
DependencyProperty.Register("GroupName", typeof(string), typeof(SelectionPill), new PropertyMetadata(""));
|
|
|
|
public string GroupName
|
|
{
|
|
get { return (string)GetValue(GroupNameProperty); }
|
|
set { SetValue(GroupNameProperty, value); }
|
|
}
|
|
|
|
// Dependency Property für den Schalter "selectOne"
|
|
public static readonly DependencyProperty SelectOneProperty =
|
|
DependencyProperty.Register("SelectOne", typeof(bool), typeof(SelectionPill), new PropertyMetadata(false));
|
|
|
|
public bool SelectOne
|
|
{
|
|
get { return (bool)GetValue(SelectOneProperty); }
|
|
set { SetValue(SelectOneProperty, value); }
|
|
}
|
|
|
|
#region IsSelected
|
|
public event EventHandler IsSelectedChanged;
|
|
|
|
private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (d is SelectionPill pill)
|
|
{
|
|
pill.IsSelectedChanged?.Invoke(pill, EventArgs.Empty);
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
public bool IsSelected
|
|
{
|
|
get { return (bool)GetValue(IsSelectedProperty); }
|
|
set { SetValue(IsSelectedProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty IsSelectedProperty =
|
|
DependencyProperty.Register("IsSelected", typeof(bool), typeof(SelectionPill), new PropertyMetadata(false, new PropertyChangedCallback(OnIsSelectedChanged)));
|
|
|
|
#endregion
|
|
|
|
|
|
public SelectionPill()
|
|
{
|
|
InitializeComponent();
|
|
allPills.Add(this);
|
|
}
|
|
public static void RemovePill(SelectionPill pill)
|
|
{
|
|
if (allPills.Contains(pill))
|
|
{
|
|
allPills.Remove(pill);
|
|
}
|
|
}
|
|
private void DeselectOtherPillsInGroup()
|
|
{
|
|
if (!string.IsNullOrEmpty(GroupName) && SelectOne && IsSelected)
|
|
{
|
|
var pillsInGroup = allPills.Where(pill => pill.GroupName == this.GroupName && pill != this);
|
|
foreach (var pill in pillsInGroup)
|
|
{
|
|
pill.IsSelected = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
#region PillBorder_Click
|
|
|
|
private void PillBorder_Click()
|
|
{
|
|
if (!SelectOne || string.IsNullOrEmpty(GroupName))
|
|
{
|
|
IsSelected = !IsSelected;
|
|
}
|
|
else if (!IsSelected) // Nur den Zustand ändern und andere deselektieren, wenn nicht bereits ausgewählt
|
|
{
|
|
IsSelected = true;
|
|
DeselectOtherPillsInGroup(); // Deselect other pills in the group
|
|
}
|
|
var _h = Dispatcher.Invoke(async () =>
|
|
{
|
|
DoubleAnimation doubleAnimation = new DoubleAnimation(0.7, TimeSpan.FromSeconds(0.1)) { AutoReverse = true };
|
|
PillBorder.BeginAnimation(OpacityProperty, doubleAnimation);
|
|
await Task.Delay(205);
|
|
PillBorder.BeginAnimation(OpacityProperty, null);
|
|
});
|
|
|
|
}
|
|
|
|
private void PillBorder_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
PillBorder_Click();
|
|
}
|
|
|
|
private void PillBorder_TouchDown(object sender, TouchEventArgs e)
|
|
{
|
|
PillBorder_Click();
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|