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