mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Add CollapsedWhen and VisibleWhen markup extensions
This commit is contained in:
parent
97b6e1f1f7
commit
4be61880dd
3 changed files with 155 additions and 0 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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) { }
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue