From fa59e9d280bf5973f5494c573ec755f0bf35ad2c Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Mon, 30 Oct 2023 23:32:26 +0300 Subject: [PATCH] Adding PlateView fromm UWP project --- AutoCat/App.axaml | 8 ++-- AutoCat/Assets/Fonts/RoadNumbers.otf | Bin 0 -> 9520 bytes AutoCat/Assets/Fonts/RoadNumbers2.0.otf | Bin 0 -> 5944 bytes AutoCat/Pages/HistoryListPage.axaml | 3 +- AutoCat/Views/PlateNumber.cs | 45 +++++++++++++++++ AutoCat/Views/PlateView.axaml | 35 ++++++++++++++ AutoCat/Views/PlateView.axaml.cs | 61 ++++++++++++++++++++++++ 7 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 AutoCat/Assets/Fonts/RoadNumbers.otf create mode 100644 AutoCat/Assets/Fonts/RoadNumbers2.0.otf create mode 100644 AutoCat/Views/PlateNumber.cs create mode 100644 AutoCat/Views/PlateView.axaml create mode 100644 AutoCat/Views/PlateView.axaml.cs diff --git a/AutoCat/App.axaml b/AutoCat/App.axaml index 1c01ea2..227d3f2 100644 --- a/AutoCat/App.axaml +++ b/AutoCat/App.axaml @@ -6,9 +6,11 @@ RequestedThemeVariant="Default"> - + + + avares://Assets/Fonts/RoadNumbers2.0.otf + + \ No newline at end of file diff --git a/AutoCat/Assets/Fonts/RoadNumbers.otf b/AutoCat/Assets/Fonts/RoadNumbers.otf new file mode 100644 index 0000000000000000000000000000000000000000..7f40a38651f2cd257411960af245d38c7696d130 GIT binary patch literal 9520 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 W@vrp#`9e%p|B8JQR$$LS!+!!$iEZ`( literal 0 HcmV?d00001 diff --git a/AutoCat/Pages/HistoryListPage.axaml b/AutoCat/Pages/HistoryListPage.axaml index f161a09..913852c 100644 --- a/AutoCat/Pages/HistoryListPage.axaml +++ b/AutoCat/Pages/HistoryListPage.axaml @@ -5,6 +5,7 @@ xmlns:utils="using:AutoCat.Utils" xmlns:vm="using:AutoCat.ViewModels" xmlns:mocks="using:AutoCat.Mocks" + xmlns:views="using:AutoCat.Views" mc:Ignorable="d" d:DesignWidth="350" d:DesignHeight="550" x:Class="AutoCat.Pages.HistoryListPage" x:DataType="vm:HistoryListViewModel" @@ -20,7 +21,7 @@ - + diff --git a/AutoCat/Views/PlateNumber.cs b/AutoCat/Views/PlateNumber.cs new file mode 100644 index 0000000..40061ee --- /dev/null +++ b/AutoCat/Views/PlateNumber.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AutoCat.Views; + +//[CreateFromString(MethodName = "AutoCat.Controls.PlateNumber.ConvertFromString")] +public class PlateNumber +{ + private readonly string _number; + private readonly string _numberEnglish; + + private readonly Dictionary _lettersMap = new() + { + { 'А', 'A' }, { 'В', 'B' }, { 'Е', 'E' }, { 'К', 'K' }, + { 'М', 'M' }, { 'Н', 'H' }, { 'О', 'O' }, { 'Р', 'P' }, + { 'С', 'C' }, { 'Т', 'T' }, { 'У', 'Y' }, { 'Х', 'X' } + }; + + private PlateNumber(string number) + { + this._number = number; + this._numberEnglish = string.Concat(number.Select(c => _lettersMap.TryGetValue(c, out var eng) ? eng : c)); + } + + public string AsString() + { + return _number; + } + + public string MainPart() + { + return _numberEnglish[..6]; + } + + public string Region() + { + return _numberEnglish[6..]; + } + + public static PlateNumber ConvertFromString(string number) + { + return new PlateNumber(number); + } +} \ No newline at end of file diff --git a/AutoCat/Views/PlateView.axaml b/AutoCat/Views/PlateView.axaml new file mode 100644 index 0000000..61acf13 --- /dev/null +++ b/AutoCat/Views/PlateView.axaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutoCat/Views/PlateView.axaml.cs b/AutoCat/Views/PlateView.axaml.cs new file mode 100644 index 0000000..b1eff0a --- /dev/null +++ b/AutoCat/Views/PlateView.axaml.cs @@ -0,0 +1,61 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace AutoCat.Views; + +public partial class PlateView : UserControl +{ + #region Dependency properties + + public static readonly StyledProperty NumberProperty = + AvaloniaProperty.Register(nameof(Number), inherits: true); + + #endregion + + #region Properties + + public PlateNumber Number + { + get => (PlateNumber)GetValue(NumberProperty); + set => SetValue(NumberProperty, value); + } + + #endregion + + private const double AspectRatio = 112.0 / 520.0; + + public PlateView() + { + InitializeComponent(); + } + + /* + private static void OnNumberChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not PlateView plateNumber || e.NewValue is not PlateNumber number) + return; + + plateNumber.NumberBox.Text = number.MainPart(); + plateNumber.RegionBox.Text = number.Region(); + } + */ + + protected override Size MeasureOverride(Size availableSize) + { + var newAspect = availableSize.Height / availableSize.Width; + + return newAspect >= AspectRatio + ? new Size(availableSize.Width, availableSize.Width * AspectRatio) + : new Size(availableSize.Height / AspectRatio, availableSize.Height); + } + + private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) + { + NumberBox.Margin = new Thickness(0, -e.NewSize.Height * 0.35, 0, 0); + RegionBox.FontSize = e.NewSize.Height * 0.65; + RegionBox.Margin = new Thickness(0, -RegionBox.FontSize * 0.3, 0, 0); + FlagGrid.Width = FlagGrid.Height * 1.5; + CountryName.FontSize = CountryRow.Height; + } +} \ No newline at end of file