committed by
GitHub
10 changed files with 346 additions and 42 deletions
@ -0,0 +1,195 @@ |
|||||
|
using System; |
||||
|
using System.Globalization; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using Avalonia.Data.Converters; |
||||
|
using Avalonia.Input; |
||||
|
|
||||
|
namespace Avalonia.Controls.Converters |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Converts a <see cref="KeyGesture"/> to a string, formatting it according to the current
|
||||
|
/// platform's style guidelines.
|
||||
|
/// </summary>
|
||||
|
public class PlatformKeyGestureConverter : IValueConverter |
||||
|
{ |
||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) |
||||
|
{ |
||||
|
if (value is null) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
else if (value is KeyGesture gesture && targetType == typeof(string)) |
||||
|
{ |
||||
|
return ToPlatformString(gesture); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
throw new NotSupportedException(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) |
||||
|
{ |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Converts a <see cref="KeyGesture"/> to a string, formatting it according to the current
|
||||
|
/// platform's style guidelines.
|
||||
|
/// </summary>
|
||||
|
/// <param name="gesture">The gesture.</param>
|
||||
|
/// <returns>The gesture formatted according to the current platform.</returns>
|
||||
|
public static string ToPlatformString(KeyGesture gesture) |
||||
|
{ |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
||||
|
{ |
||||
|
return ToString(gesture, "Win"); |
||||
|
} |
||||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
||||
|
{ |
||||
|
return ToString(gesture, "Super"); |
||||
|
} |
||||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) |
||||
|
{ |
||||
|
return ToOSXString(gesture); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
return gesture.ToString(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static string ToString(KeyGesture gesture, string meta) |
||||
|
{ |
||||
|
var s = new StringBuilder(); |
||||
|
|
||||
|
static void Plus(StringBuilder s) |
||||
|
{ |
||||
|
if (s.Length > 0) |
||||
|
{ |
||||
|
s.Append("+"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Control)) |
||||
|
{ |
||||
|
s.Append("Ctrl"); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Shift)) |
||||
|
{ |
||||
|
Plus(s); |
||||
|
s.Append("Shift"); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Alt)) |
||||
|
{ |
||||
|
Plus(s); |
||||
|
s.Append("Alt"); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Meta)) |
||||
|
{ |
||||
|
Plus(s); |
||||
|
s.Append(meta); |
||||
|
} |
||||
|
|
||||
|
Plus(s); |
||||
|
s.Append(ToString(gesture.Key)); |
||||
|
|
||||
|
return s.ToString(); |
||||
|
} |
||||
|
|
||||
|
private static string ToOSXString(KeyGesture gesture) |
||||
|
{ |
||||
|
var s = new StringBuilder(); |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Control)) |
||||
|
{ |
||||
|
s.Append('⌃'); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Alt)) |
||||
|
{ |
||||
|
s.Append('⌥'); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Shift)) |
||||
|
{ |
||||
|
s.Append('⇧'); |
||||
|
} |
||||
|
|
||||
|
if (gesture.KeyModifiers.HasFlagCustom(KeyModifiers.Meta)) |
||||
|
{ |
||||
|
s.Append('⌘'); |
||||
|
} |
||||
|
|
||||
|
s.Append(ToOSXString(gesture.Key)); |
||||
|
|
||||
|
return s.ToString(); |
||||
|
} |
||||
|
|
||||
|
private static string ToString(Key key) |
||||
|
{ |
||||
|
return key switch |
||||
|
{ |
||||
|
Key.Add => "+", |
||||
|
Key.Back => "Backspace", |
||||
|
Key.D0 => "0", |
||||
|
Key.D1 => "1", |
||||
|
Key.D2 => "2", |
||||
|
Key.D3 => "3", |
||||
|
Key.D4 => "4", |
||||
|
Key.D5 => "5", |
||||
|
Key.D6 => "6", |
||||
|
Key.D7 => "7", |
||||
|
Key.D8 => "8", |
||||
|
Key.D9 => "9", |
||||
|
Key.Decimal => ".", |
||||
|
Key.Divide => "/", |
||||
|
Key.Down => "Down Arrow", |
||||
|
Key.Left => "Left Arrow", |
||||
|
Key.Multiply => "*", |
||||
|
Key.OemBackslash => "\\", |
||||
|
Key.OemCloseBrackets => "]", |
||||
|
Key.OemComma => ",", |
||||
|
Key.OemMinus => "-", |
||||
|
Key.OemOpenBrackets => "[", |
||||
|
Key.OemPeriod=> ".", |
||||
|
Key.OemPipe => "|", |
||||
|
Key.OemPlus => "+", |
||||
|
Key.OemQuestion => "/", |
||||
|
Key.OemQuotes => "\"", |
||||
|
Key.OemSemicolon => ";", |
||||
|
Key.OemTilde => "`", |
||||
|
Key.Right => "Right Arrow", |
||||
|
Key.Separator => "/", |
||||
|
Key.Subtract => "-", |
||||
|
Key.Up => "Up Arrow", |
||||
|
_ => key.ToString(), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
private static string ToOSXString(Key key) |
||||
|
{ |
||||
|
return key switch |
||||
|
{ |
||||
|
Key.Back => "⌫", |
||||
|
Key.Down => "↓", |
||||
|
Key.End => "↘", |
||||
|
Key.Escape => "⎋", |
||||
|
Key.Home => "↖", |
||||
|
Key.Left => "←", |
||||
|
Key.Return => "↩", |
||||
|
Key.PageDown => "⇞", |
||||
|
Key.PageUp => "⇟", |
||||
|
Key.Right => "→", |
||||
|
Key.Space => "␣", |
||||
|
Key.Tab => "⇥", |
||||
|
Key.Up => "↑", |
||||
|
_ => ToString(key), |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue