using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace SharepointToolbox.Views.Converters;
/// Converts IndentLevel (int) to WPF Thickness for DataGrid indent.
[ValueConversion(typeof(int), typeof(Thickness))]
public class IndentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int level = value is int i ? i : 0;
return new Thickness(level * 16, 0, 0, 0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}
/// Converts byte count (long) to human-readable size string.
[ValueConversion(typeof(long), typeof(string))]
public class BytesConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
long bytes = value is long l ? l : 0L;
if (bytes >= 1_073_741_824L) return $"{bytes / 1_073_741_824.0:F2} GB";
if (bytes >= 1_048_576L) return $"{bytes / 1_048_576.0:F2} MB";
if (bytes >= 1024L) return $"{bytes / 1024.0:F2} KB";
return $"{bytes} B";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}
/// Inverts a bool binding — used to disable controls while an operation is running.
[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> value is bool b && !b;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> value is bool b && !b;
}
///
/// Converts a string to Visibility: Visible when non-empty, Collapsed when null or empty.
///
[ValueConversion(typeof(string), typeof(Visibility))]
public class StringToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> value is string s && !string.IsNullOrEmpty(s) ? Visibility.Visible : Visibility.Collapsed;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}
///
/// Converts an enum value to bool by comparing it with the ConverterParameter.
/// Used for RadioButton IsChecked bindings to enum properties.
///
public class EnumBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null) return false;
return value.ToString() == parameter.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool b && b && parameter != null)
return Enum.Parse(targetType, parameter.ToString()!);
return System.Windows.DependencyProperty.UnsetValue;
}
}
///
/// Converts a List<string> to a single semicolon-separated string for display in DataGrid cells.
///
public class ListToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is IEnumerable list)
return string.Join("; ", list);
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}