Add CollapsedWhen and VisibleWhen markup extensions

This commit is contained in:
Yusyuriv 2024-05-16 22:57:10 +06:00
parent 97b6e1f1f7
commit 4be61880dd
No known key found for this signature in database
GPG key ID: A91C52E6F73148E0
3 changed files with 155 additions and 0 deletions

View file

@ -0,0 +1,91 @@
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace Flow.Launcher.Resources.MarkupExtensions;
#nullable enable
public class CollapsedWhenExtension : MarkupExtension {
private Binding? When { get; set; }
public object? IsEqualTo { get; set; }
public bool? IsEqualToBool
{
get => IsEqualTo switch
{
bool b => b,
_ => null
};
set => IsEqualTo = value;
}
public string? IsEqualToString
{
get => IsEqualTo switch
{
string s => s,
_ => null
};
set => IsEqualTo = value;
}
public int? IsEqualToInt
{
get => IsEqualTo switch
{
int i => i,
_ => null
};
set => IsEqualTo = value;
}
protected virtual Visibility DefaultVisibility => Visibility.Visible;
protected virtual Visibility InvertedVisibility => Visibility.Collapsed;
public CollapsedWhenExtension(Binding when)
{
When = when;
}
public CollapsedWhenExtension(Binding when, object? isEqualTo)
{
When = when;
IsEqualTo = isEqualTo;
}
public override object ProvideValue(IServiceProvider serviceProvider) {
if (serviceProvider.GetService(typeof(IProvideValueTarget)) is not IProvideValueTarget provideValueTarget)
return DependencyProperty.UnsetValue;
if (provideValueTarget is not { TargetObject: not null, TargetProperty: not null })
return DependencyProperty.UnsetValue;
if (When is null)
return DependencyProperty.UnsetValue;
if (IsEqualTo is Binding isEqualToBinding)
{
var multiBinding = new MultiBinding
{
Converter = new HideableVisibilityConverter
{
DefaultVisibility = DefaultVisibility,
InvertedVisibility = InvertedVisibility
},
Bindings = { When, isEqualToBinding }
};
return multiBinding.ProvideValue(serviceProvider);
}
When.Converter = new HideableVisibilityConverter
{
DefaultVisibility = DefaultVisibility,
InvertedVisibility = InvertedVisibility,
IsEqualTo = IsEqualTo
};
return When.ProvideValue(serviceProvider);
}
}

View file

@ -0,0 +1,48 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Flow.Launcher.Resources.MarkupExtensions;
#nullable enable
public class HideableVisibilityConverter : IMultiValueConverter, IValueConverter {
public Visibility DefaultVisibility { get; init; } = Visibility.Visible;
public Visibility InvertedVisibility { get; init; } = Visibility.Collapsed;
public object? IsEqualTo { get; set; }
public object Convert(object?[] values, Type targetType, object? parameter, CultureInfo culture) {
if (values is not { Length: 2 })
return DependencyProperty.UnsetValue;
var value1 = values[0];
var value2 = values[1];
if (value1 is Enum enum1 && value2 is Enum enum2)
{
value1 = System.Convert.ToInt32(enum1);
value2 = System.Convert.ToInt32(enum2);
}
Debug.WriteLine($"HideableConverter: {value1} == {value2}");
return Equals(value1, value2) ? InvertedVisibility : DefaultVisibility;
}
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
Debug.WriteLine($"HideableConverter: {value} ({value?.GetType()}) == {IsEqualTo} ({IsEqualTo?.GetType()})");
return Equals(value, IsEqualTo) ? InvertedVisibility : DefaultVisibility;
}
public object[] ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) {
throw new NotSupportedException();
}
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

View file

@ -0,0 +1,16 @@
using System.Windows;
using System.Windows.Data;
namespace Flow.Launcher.Resources.MarkupExtensions;
#nullable enable
public class VisibleWhenExtension : CollapsedWhenExtension
{
protected override Visibility DefaultVisibility => Visibility.Collapsed;
protected override Visibility InvertedVisibility => Visibility.Visible;
public VisibleWhenExtension(Binding when) : base(when) { }
public VisibleWhenExtension(Binding when, object? isEqualTo) : base(when, isEqualTo) { }
}