From 6a087767a168eccbc392497d32b505c2d5c8fb97 Mon Sep 17 00:00:00 2001 From: Timerix Date: Sun, 1 Sep 2024 15:41:01 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B2=D1=81=D1=8F=D0=BA=D0=BE?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Млаумчерб.Клиент/Config.cs | 46 --------------- Млаумчерб.Клиент/Главне.cs | 2 +- Млаумчерб.Клиент/Млаумчерб.Клиент.csproj | 4 +- Млаумчерб.Клиент/Настройки.cs | 42 ++++++++++++++ Млаумчерб.Клиент/Окне.axaml | 54 ++++++++++++------ Млаумчерб.Клиент/Окне.axaml.cs | 22 +++---- Млаумчерб.Клиент/{Errors.cs => Ошибки.cs} | 8 +-- Млаумчерб.Клиент/Приложение.axaml | 13 +++++ Млаумчерб.Клиент/Приложение.axaml.cs | 2 + Млаумчерб.Клиент/капитал/button.png | Bin 22533 -> 0 bytes .../капитал/{icon.ico => кубе.ico} | Bin .../капитал/{background.png => фоне.png} | Bin 12 files changed, 113 insertions(+), 80 deletions(-) delete mode 100644 Млаумчерб.Клиент/Config.cs create mode 100644 Млаумчерб.Клиент/Настройки.cs rename Млаумчерб.Клиент/{Errors.cs => Ошибки.cs} (76%) delete mode 100644 Млаумчерб.Клиент/капитал/button.png rename Млаумчерб.Клиент/капитал/{icon.ico => кубе.ico} (100%) rename Млаумчерб.Клиент/капитал/{background.png => фоне.png} (100%) diff --git a/Млаумчерб.Клиент/Config.cs b/Млаумчерб.Клиент/Config.cs deleted file mode 100644 index ef5448e..0000000 --- a/Млаумчерб.Клиент/Config.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Newtonsoft.Json; - -namespace Млаумчерб.Клиент; - -public class Config -{ - public string username { get; set; } = ""; - public int memory { get; set; } = 4096; - public bool fullscreen { get; set; } - - [JsonIgnore] public static Config Instance { get; private set; } = new(); - - public const string FileName = "млаумчерб.конфиг"; - public const string BackupFileName = "млаумчерб.конфиг.старый"; - public static readonly Encoding UTF8WithoutBom = new UTF8Encoding(false); - - public static void LoadFromFile() - { - //TODO: log - if(!File.Exists(FileName)) - { - SaveToFile(); - return; - } - - string text = File.ReadAllText(FileName); - Config? c = JsonConvert.DeserializeObject(text); - if (c is not null) - Instance = c; - else - { - File.Move(FileName, BackupFileName, true); - SaveToFile(); - Errors.ShowMessageBox($"Не удалось прочитать конфиг.\n" + - $"Сломанный конфиг переименован в '{BackupFileName}'.\n" + - $"Создан новый файл '{FileName}'."); - } - } - - public static void SaveToFile() - { - //TODO: log - var text = JsonConvert.SerializeObject(Instance, Formatting.Indented); - File.WriteAllText(FileName, text, UTF8WithoutBom); - } -} \ No newline at end of file diff --git a/Млаумчерб.Клиент/Главне.cs b/Млаумчерб.Клиент/Главне.cs index 3d24583..9ad4dc6 100644 --- a/Млаумчерб.Клиент/Главне.cs +++ b/Млаумчерб.Клиент/Главне.cs @@ -7,7 +7,7 @@ using Avalonia; namespace Млаумчерб.Клиент; -class Главне +public class Главне { [STAThread] public static void Main(string[] args) diff --git a/Млаумчерб.Клиент/Млаумчерб.Клиент.csproj b/Млаумчерб.Клиент/Млаумчерб.Клиент.csproj index 1adb1df..1c11a44 100644 --- a/Млаумчерб.Клиент/Млаумчерб.Клиент.csproj +++ b/Млаумчерб.Клиент/Млаумчерб.Клиент.csproj @@ -8,7 +8,7 @@ true гойда.manifest true - капитал\icon.ico + капитал\кубе.ico млаумчерб @@ -17,7 +17,9 @@ + + diff --git a/Млаумчерб.Клиент/Настройки.cs b/Млаумчерб.Клиент/Настройки.cs new file mode 100644 index 0000000..28ba930 --- /dev/null +++ b/Млаумчерб.Клиент/Настройки.cs @@ -0,0 +1,42 @@ +using Newtonsoft.Json; + +namespace Млаумчерб.Клиент; + +public class Настройки +{ + public string имя_пользователя { get; set; } = ""; + public int выделенная_память_мб { get; set; } = 4096; + public bool открывать_на_весь_экран { get; set; } + + public static readonly Encoding UTF8WithoutBom = new UTF8Encoding(false); + + public static Настройки ЗагрузитьИзФайла(string имя_файла = "млаумчерб.настройки") + { + //TODO: лог + if(!File.Exists(имя_файла)) + { + return new Настройки(); + } + + string текст = File.ReadAllText(имя_файла); + Настройки? н = JsonConvert.DeserializeObject<Настройки>(текст); + if (н == null) + { + File.Move(имя_файла, имя_файла + ".старые", true); + н = new Настройки(); + н.СохранитьВФайл(); + Ошибки.ПоказатьСообщение($"Не удалось прочитать настройки.\n" + + $"Сломанный файл настроек переименован в '{имя_файла}.старые'.\n" + + $"Создан новый файл '{имя_файла}'."); + } + + return н; + } + + public void СохранитьВФайл(string имя_файла = "млаумчерб.настройки") + { + //TODO: log + var текст = JsonConvert.SerializeObject(this, Formatting.Indented); + File.WriteAllText(имя_файла, текст, UTF8WithoutBom); + } +} \ No newline at end of file diff --git a/Млаумчерб.Клиент/Окне.axaml b/Млаумчерб.Клиент/Окне.axaml index afd68d1..f4d22e4 100644 --- a/Млаумчерб.Клиент/Окне.axaml +++ b/Млаумчерб.Клиент/Окне.axaml @@ -1,22 +1,32 @@ + Icon="avares://млаумчерб/капитал/кубе.ico" + FontFamily="{StaticResource PlexMono}" FontSize="18" + MinWidth="800" MinHeight="500" + Width="800" Height="500" + WindowStartupLocation="CenterScreen"> - 40 * - + 30 * 30 + - - * 400 * + + * 300 * + + + 30 * + 30 + + + + Classes="dark_box white_border" + Margin="5 5"> * 60 @@ -35,17 +45,27 @@ Foreground="Blue" Value="{Binding #window.MemoryLimit}"> - Fullscreen - Update game files + + Fullscreen + + + Update game files + - + + + + diff --git a/Млаумчерб.Клиент/Окне.axaml.cs b/Млаумчерб.Клиент/Окне.axaml.cs index 9ede669..0675045 100644 --- a/Млаумчерб.Клиент/Окне.axaml.cs +++ b/Млаумчерб.Клиент/Окне.axaml.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using Avalonia; using Avalonia.Controls; using Avalonia.Data; @@ -52,14 +53,14 @@ public partial class Окне : Window { try { - Config.LoadFromFile(); - Username = Config.Instance.username; - MemoryLimit = Config.Instance.memory; - Fullscreen = Config.Instance.fullscreen; + Приложение.Настройки = Настройки.ЗагрузитьИзФайла(); + Username = Приложение.Настройки.имя_пользователя; + MemoryLimit = Приложение.Настройки.выделенная_память_мб; + Fullscreen = Приложение.Настройки.открывать_на_весь_экран; } catch (Exception ex) { - Errors.ShowMessageBox(ex); + Ошибки.ПоказатьСообщение(ex); } } @@ -67,16 +68,15 @@ public partial class Окне : Window { try { - Config.Instance.username = Username; - Config.Instance.memory = MemoryLimit; - Config.Instance.fullscreen = Fullscreen; - Config.SaveToFile(); - + Приложение.Настройки.имя_пользователя = Username; + Приложение.Настройки.выделенная_память_мб = MemoryLimit; + Приложение.Настройки.открывать_на_весь_экран = Fullscreen; + Приложение.Настройки.СохранитьВФайл(); } catch (Exception ex) { - Errors.ShowMessageBox(ex); + Ошибки.ПоказатьСообщение(ex); } } } \ No newline at end of file diff --git a/Млаумчерб.Клиент/Errors.cs b/Млаумчерб.Клиент/Ошибки.cs similarity index 76% rename from Млаумчерб.Клиент/Errors.cs rename to Млаумчерб.Клиент/Ошибки.cs index 780a5c8..263cfc0 100644 --- a/Млаумчерб.Клиент/Errors.cs +++ b/Млаумчерб.Клиент/Ошибки.cs @@ -6,12 +6,12 @@ using MsBox.Avalonia.Models; namespace Млаумчерб.Клиент; -public static class Errors +public static class Ошибки { - internal static void ShowMessageBox(Exception err) - => ShowMessageBox(err.ToStringDemystified()); + internal static void ПоказатьСообщение(Exception err) + => ПоказатьСообщение(err.ToStringDemystified()); - internal static async void ShowMessageBox(string err) + internal static async void ПоказатьСообщение(string err) { var box = MessageBoxManager.GetMessageBoxCustom(new MessageBoxCustomParams { diff --git a/Млаумчерб.Клиент/Приложение.axaml b/Млаумчерб.Клиент/Приложение.axaml index 78bbfe3..56a234e 100644 --- a/Млаумчерб.Клиент/Приложение.axaml +++ b/Млаумчерб.Клиент/Приложение.axaml @@ -4,6 +4,19 @@ RequestedThemeVariant="Dark"> + + + + + diff --git a/Млаумчерб.Клиент/Приложение.axaml.cs b/Млаумчерб.Клиент/Приложение.axaml.cs index 679bf36..5ca0861 100644 --- a/Млаумчерб.Клиент/Приложение.axaml.cs +++ b/Млаумчерб.Клиент/Приложение.axaml.cs @@ -20,4 +20,6 @@ public partial class Приложение : Application base.OnFrameworkInitializationCompleted(); } + + public static Настройки Настройки = new(); } \ No newline at end of file diff --git a/Млаумчерб.Клиент/капитал/button.png b/Млаумчерб.Клиент/капитал/button.png deleted file mode 100644 index c4c41c0c710dbc3e4129a137ff0d37ffaaf34f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22533 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 z

;FPcZk$V*FN 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 p+B%z%+~F2tb?P#-fcZ!GcCiK?i^^xm|K68Cs