From 60ab62060845cb8d1a2a07013d6fa3ffbcda0f41 Mon Sep 17 00:00:00 2001 From: Exest Date: Thu, 13 Aug 2026 16:39:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=202.0.9:?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=20=D1=88=D1=80=D0=B8?= =?UTF-8?q?=D1=84=D1=82=D0=B0/=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20(?= =?UTF-8?q?=D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0)=20=D0=B2=20=D0=9D?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Настройки: выпадающий список «Размер шрифта / текста» (90/100/115/130/150%) - масштаб применяется ко всему главному окну (LayoutTransform), сохраняется и восстанавливается при старте Co-Authored-By: Claude Opus 4.8 --- installer/ElfisaPharmacy.iss | 2 +- src/Elfisa.Avalonia/App.axaml.cs | 8 ++++++++ src/Elfisa.Avalonia/Elfisa.Avalonia.csproj | 6 +++--- src/Elfisa.Avalonia/ViewModels/SettingsViewModel.cs | 12 ++++++++++++ src/Elfisa.Avalonia/Views/MainWindow.axaml | 5 ++++- src/Elfisa.Avalonia/Views/MainWindow.axaml.cs | 11 +++++++++++ src/Elfisa.Avalonia/Views/SettingsWindow.axaml | 7 ++++++- src/Elfisa.Avalonia/Views/SettingsWindow.axaml.cs | 4 +++- src/Elfisa.Core/SettingsStore.cs | 1 + 9 files changed, 49 insertions(+), 7 deletions(-) diff --git a/installer/ElfisaPharmacy.iss b/installer/ElfisaPharmacy.iss index 5a6c953..5d95e86 100644 --- a/installer/ElfisaPharmacy.iss +++ b/installer/ElfisaPharmacy.iss @@ -3,7 +3,7 @@ #define MyAppName "Электронная Фармация" #define MyAppBrand "ЭльФиСА" -#define MyAppVersion "2.0.8" +#define MyAppVersion "2.0.9" #define MyAppPublisher "PharmData" #define MyAppURL "https://cdn.24pharmdata.ru" #define MyAppSupportURL "https://24pharmdata.ru" diff --git a/src/Elfisa.Avalonia/App.axaml.cs b/src/Elfisa.Avalonia/App.axaml.cs index 52ec1c3..9b11541 100644 --- a/src/Elfisa.Avalonia/App.axaml.cs +++ b/src/Elfisa.Avalonia/App.axaml.cs @@ -28,6 +28,14 @@ public partial class App : Application app.Resources["AppFontFamily"] = new FontFamily(family); } + /// Применяет масштаб интерфейса (размер шрифта/текста) к главному окну. + public static void ApplyScale(double scale) + { + if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime d + && d.MainWindow is MainWindow mw) + mw.ApplyScale(scale); + } + public override void OnFrameworkInitializationCompleted() { RequestedThemeVariant = Elfisa.Core.SettingsStore.Current.Theme == "Dark" diff --git a/src/Elfisa.Avalonia/Elfisa.Avalonia.csproj b/src/Elfisa.Avalonia/Elfisa.Avalonia.csproj index 30e2be0..baf0393 100644 --- a/src/Elfisa.Avalonia/Elfisa.Avalonia.csproj +++ b/src/Elfisa.Avalonia/Elfisa.Avalonia.csproj @@ -5,9 +5,9 @@ enable app.manifest true - 2.0.8 - 2.0.8.0 - 2.0.8.0 + 2.0.9 + 2.0.9.0 + 2.0.9.0 ЭльФиСА — Электронная Фармация PharmData diff --git a/src/Elfisa.Avalonia/ViewModels/SettingsViewModel.cs b/src/Elfisa.Avalonia/ViewModels/SettingsViewModel.cs index 03ccaf9..b49b088 100644 --- a/src/Elfisa.Avalonia/ViewModels/SettingsViewModel.cs +++ b/src/Elfisa.Avalonia/ViewModels/SettingsViewModel.cs @@ -19,6 +19,12 @@ public partial class SettingsViewModel : ViewModelBase public string[] Themes { get; } = { "Светлая", "Тёмная" }; [ObservableProperty] private int _themeIndex; + /// Размер шрифта/текста — масштаб интерфейса. + public string[] FontSizes { get; } = { "Мелкий (90%)", "Обычный (100%)", "Крупный (115%)", "Очень крупный (130%)", "Огромный (150%)" }; + private static readonly double[] ScaleValues = { 0.9, 1.0, 1.15, 1.3, 1.5 }; + [ObservableProperty] private int _fontSizeIndex = 1; + public double SelectedScale => ScaleValues[Math.Clamp(FontSizeIndex, 0, ScaleValues.Length - 1)]; + /// Все системные шрифты + «По умолчанию» первым. public ObservableCollection Fonts { get; } = new(); [ObservableProperty] private string _selectedFont = DefaultFontLabel; @@ -32,6 +38,12 @@ public partial class SettingsViewModel : ViewModelBase ApiBaseUrl = SettingsStore.Current.ApiBaseUrl ?? AppConfig.DefaultApiBaseUrl; ThemeIndex = SettingsStore.Current.Theme == "Dark" ? 1 : 0; + var scale = SettingsStore.Current.UiScale; + var best = 1; + for (int i = 0; i < ScaleValues.Length; i++) + if (Math.Abs(ScaleValues[i] - scale) < Math.Abs(ScaleValues[best] - scale)) best = i; + FontSizeIndex = best; + Fonts.Add(DefaultFontLabel); foreach (var f in FontManager.Current.SystemFonts .Select(x => x.Name) diff --git a/src/Elfisa.Avalonia/Views/MainWindow.axaml b/src/Elfisa.Avalonia/Views/MainWindow.axaml index 8f476b8..07ab705 100644 --- a/src/Elfisa.Avalonia/Views/MainWindow.axaml +++ b/src/Elfisa.Avalonia/Views/MainWindow.axaml @@ -11,6 +11,9 @@ Background="{DynamicResource Bg}" Title="ЭльФиСА"> - + + + + diff --git a/src/Elfisa.Avalonia/Views/MainWindow.axaml.cs b/src/Elfisa.Avalonia/Views/MainWindow.axaml.cs index 8635b98..e83ff53 100644 --- a/src/Elfisa.Avalonia/Views/MainWindow.axaml.cs +++ b/src/Elfisa.Avalonia/Views/MainWindow.axaml.cs @@ -1,4 +1,6 @@ using Avalonia.Controls; +using Avalonia.Media; +using Elfisa.Core; namespace Elfisa.Avalonia.Views; @@ -7,5 +9,14 @@ public partial class MainWindow : Window public MainWindow() { InitializeComponent(); + ApplyScale(SettingsStore.Current.UiScale); + } + + /// Масштабирует всё содержимое окна (размер шрифта/текста и элементов). + public void ApplyScale(double scale) + { + var host = this.FindControl("ScaleHost"); + if (host is null) return; + host.LayoutTransform = scale == 1.0 ? null : new ScaleTransform(scale, scale); } } \ No newline at end of file diff --git a/src/Elfisa.Avalonia/Views/SettingsWindow.axaml b/src/Elfisa.Avalonia/Views/SettingsWindow.axaml index 243588a..0f5a906 100644 --- a/src/Elfisa.Avalonia/Views/SettingsWindow.axaml +++ b/src/Elfisa.Avalonia/Views/SettingsWindow.axaml @@ -3,7 +3,7 @@ xmlns:vm="using:Elfisa.Avalonia.ViewModels" x:Class="Elfisa.Avalonia.Views.SettingsWindow" x:DataType="vm:SettingsViewModel" - Width="460" Height="520" CanResize="False" + Width="460" Height="590" CanResize="False" WindowStartupLocation="CenterOwner" Background="{DynamicResource Bg}" Title="Настройки"> @@ -33,6 +33,11 @@ + + + + + diff --git a/src/Elfisa.Avalonia/Views/SettingsWindow.axaml.cs b/src/Elfisa.Avalonia/Views/SettingsWindow.axaml.cs index 05f1cf9..12ab652 100644 --- a/src/Elfisa.Avalonia/Views/SettingsWindow.axaml.cs +++ b/src/Elfisa.Avalonia/Views/SettingsWindow.axaml.cs @@ -44,12 +44,14 @@ public partial class SettingsWindow : Window SettingsStore.Current.Theme = vm.ThemeIndex == 1 ? "Dark" : "Light"; var font = vm.SelectedFont == SettingsViewModel.DefaultFontLabel ? null : vm.SelectedFont; SettingsStore.Current.FontFamily = font; + SettingsStore.Current.UiScale = vm.SelectedScale; SettingsStore.Current.DefaultLocationId = vm.SelectedLocation?.BuyerLocationId; SettingsStore.Save(); if (Application.Current is { } app) app.RequestedThemeVariant = vm.ThemeIndex == 1 ? ThemeVariant.Dark : ThemeVariant.Light; - App.ApplyFont(font); // применяем сразу ко всем окнам + App.ApplyFont(font); // шрифт — сразу ко всем окнам + App.ApplyScale(vm.SelectedScale); // масштаб — к главному окну } Close(); } diff --git a/src/Elfisa.Core/SettingsStore.cs b/src/Elfisa.Core/SettingsStore.cs index f504da1..18e6577 100644 --- a/src/Elfisa.Core/SettingsStore.cs +++ b/src/Elfisa.Core/SettingsStore.cs @@ -7,6 +7,7 @@ public sealed class AppSettings public string? ApiBaseUrl { get; set; } public string Theme { get; set; } = "Light"; // Light | Dark public string? FontFamily { get; set; } // шрифт интерфейса (null = по умолчанию) + public double UiScale { get; set; } = 1.0; // масштаб интерфейса (размер шрифта/текста) public string? DefaultLocationId { get; set; } public string? Token { get; set; } // сохранённая сессия public string? Role { get; set; }