diff --git a/Elwig/Controls/IntegerUpDown.cs b/Elwig/Controls/IntegerUpDown.cs new file mode 100644 index 0000000..523b740 --- /dev/null +++ b/Elwig/Controls/IntegerUpDown.cs @@ -0,0 +1,106 @@ +using System; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; + +namespace Elwig.Controls { + public class IntegerUpDown : TextBox { + + public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Miminum", typeof(int?), typeof(IntegerUpDown), new FrameworkPropertyMetadata(null)); + public int? Minimum { + get => (int?)GetValue(MinimumProperty); + set => SetValue(MinimumProperty, value); + } + + public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(int?), typeof(IntegerUpDown), new FrameworkPropertyMetadata(null)); + public int? Maximum { + get => (int?)GetValue(MaximumProperty); + set => SetValue(MaximumProperty, value); + } + + public int? Value { + get => int.TryParse(Text, out var res) ? res : null; + set => Text = $"{value}"; + } + + static IntegerUpDown() { + DefaultStyleKeyProperty.OverrideMetadata(typeof(IntegerUpDown), new FrameworkPropertyMetadata(typeof(IntegerUpDown))); + } + + public IntegerUpDown() { + TextChanged += IntegerUpDown_TextChanged; + LostFocus += IntegerUpDown_LostFocus; + KeyUp += IntegerUpDown_KeyUp; + } + + public override void OnApplyTemplate() { + var incButton = GetTemplateChild("IncrementButton") as RepeatButton; + var decButton = GetTemplateChild("DecrementButton") as RepeatButton; + incButton!.Click += IncrementButton_Click; + decButton!.Click += DecrementButton_Click; + base.OnApplyTemplate(); + } + + private void IntegerUpDown_TextChanged(object sender, TextChangedEventArgs evt) { + var idx = CaretIndex; + Text = new string(Text.Where(char.IsAsciiDigit).Take(4).ToArray()); + CaretIndex = idx; + evt.Handled = !(Value >= Minimum && Value <= Maximum); + if (idx >= 4) { + if (Value < Minimum) { + Value = Minimum; + } else if (Value > Maximum) { + Value = Maximum; + } + CaretIndex = 4; + } + } + + private void IntegerUpDown_LostFocus(object sender, RoutedEventArgs evt) { + if (Value < Minimum) { + Value = Minimum; + } else if (Value > Maximum) { + Value = Maximum; + } + } + + private void IncrementButton_Click(object sender, RoutedEventArgs evt) { + Value = Math.Min((Value ?? 0) + 1, Maximum ?? int.MaxValue); + } + + private void DecrementButton_Click(object sender, RoutedEventArgs evt) { + Value = Math.Max((Value ?? 0) - 1, Minimum ?? int.MinValue); + } + + private void IntegerUpDown_KeyUp(object sender, KeyEventArgs evt) { + switch (evt.Key) { + case Key.Up: + case Key.Add: + case Key.OemPlus: + Value = Math.Min((Value ?? 0) + 1, Maximum ?? int.MaxValue); + evt.Handled = true; + CaretIndex = 4; + break; + case Key.Down: + case Key.Subtract: + case Key.OemMinus: + Value = Math.Max((Value ?? 0) - 1, Minimum ?? int.MinValue); + evt.Handled = true; + CaretIndex = 4; + break; + case Key.PageUp: + Value = Math.Min((Value ?? 0) + 10, Maximum ?? int.MaxValue); + evt.Handled = true; + CaretIndex = 4; + break; + case Key.PageDown: + Value = Math.Max((Value ?? 0) - 10, Minimum ?? int.MinValue); + evt.Handled = true; + CaretIndex = 4; + break; + } + } + } +} diff --git a/Elwig/Controls/IntegerUpDown.xaml b/Elwig/Controls/IntegerUpDown.xaml new file mode 100644 index 0000000..bda2c84 --- /dev/null +++ b/Elwig/Controls/IntegerUpDown.xaml @@ -0,0 +1,52 @@ + + + diff --git a/Elwig/Themes/Generic.xaml b/Elwig/Themes/Generic.xaml index 061707b..4b3354d 100644 --- a/Elwig/Themes/Generic.xaml +++ b/Elwig/Themes/Generic.xaml @@ -1,5 +1,6 @@  + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 25427f6..a30994c 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -175,9 +175,9 @@ - + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 1a7eca1..058ccd2 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -1344,8 +1344,8 @@ namespace Elwig.Windows { await RefreshDeliveryListQuery(true); } - private async void SeasonInput_ValueChanged(object sender, RoutedEventArgs evt) { - if (SeasonInput.Value == null) return; + private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) { + if (SeasonInput.Value == null || TodayOnlyInput == null || AllSeasonsInput == null) return; TodayOnlyInput.IsChecked = false; AllSeasonsInput.IsChecked = false; await RefreshDeliveryListQuery(); diff --git a/Elwig/Windows/MainWindow.xaml b/Elwig/Windows/MainWindow.xaml index 4d0af8e..7fec366 100644 --- a/Elwig/Windows/MainWindow.xaml +++ b/Elwig/Windows/MainWindow.xaml @@ -3,7 +3,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Elwig.Windows" - xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" + xmlns:ctrl="clr-namespace:Elwig.Controls" Title="Elwig" Height="390" Width="520" ResizeMode="CanMinimize" Loaded="Window_Loaded" Closing="Window_Closing"> @@ -71,9 +71,9 @@