From 3c47549fde0f4121b405999d8ba33ae1ef314766 Mon Sep 17 00:00:00 2001 From: bird_egop Date: Fri, 15 Nov 2024 20:29:02 +0300 Subject: [PATCH] add export --- NResLib/NResExporter.cs | 38 ++++++++++++++++++++++++++ NResLib/NResParser.cs | 6 ++-- NResUI/ImGuiUI/ImGuiModalPanel.cs | 4 ++- NResUI/ImGuiUI/MainMenuBar.cs | 10 +++++-- NResUI/ImGuiUI/MessageBoxModalPanel.cs | 33 ++++++++++++++++++++++ 5 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 NResLib/NResExporter.cs create mode 100644 NResUI/ImGuiUI/MessageBoxModalPanel.cs diff --git a/NResLib/NResExporter.cs b/NResLib/NResExporter.cs new file mode 100644 index 0000000..4cc08b7 --- /dev/null +++ b/NResLib/NResExporter.cs @@ -0,0 +1,38 @@ +namespace NResLib; + +public class NResExporter +{ + public static void Export(NResArchive archive, string directory, string nResPath) + { + var openedFileName = Path.GetFileName(nResPath)!; + var targetDirectoryPath = Path.Combine(directory, openedFileName); + + if (!Directory.Exists(targetDirectoryPath)) + { + Directory.CreateDirectory(targetDirectoryPath); + } + + using var fs = new FileStream(nResPath, FileMode.Open); + + foreach (var archiveFile in archive.Files) + { + fs.Seek(archiveFile.OffsetInFile, SeekOrigin.Begin); + + var buffer = new byte[archiveFile.FileLength]; + + fs.ReadExactly(buffer, 0, archiveFile.FileLength); + + var extension = Path.GetExtension(archiveFile.FileName); + var fileName = Path.GetFileNameWithoutExtension(archiveFile.FileName); + + if (extension == "") + { + extension = ".bin"; + } + + var targetFilePath = Path.Combine(targetDirectoryPath, $"{archiveFile.Index}_{fileName}{extension}"); + + File.WriteAllBytes(targetFilePath, buffer); + } + } +} \ No newline at end of file diff --git a/NResLib/NResParser.cs b/NResLib/NResParser.cs index 7054565..cb079ab 100644 --- a/NResLib/NResParser.cs +++ b/NResLib/NResParser.cs @@ -24,7 +24,7 @@ public static class NResParser } var header = new NResArchiveHeader( - NRes: Encoding.ASCII.GetString(buffer[0..4]), + NRes: Encoding.ASCII.GetString(buffer[0..4]).TrimEnd('\0'), Version: BinaryPrimitives.ReadInt32LittleEndian(buffer[4..8]), FileCount: BinaryPrimitives.ReadInt32LittleEndian(buffer[8..12]), TotalFileLengthBytes: BinaryPrimitives.ReadInt32LittleEndian(buffer[12..16]) @@ -51,11 +51,11 @@ public static class NResParser elements.Add( new ListMetadataItem( - FileType: Encoding.ASCII.GetString(metaDataBuffer[..8]), + FileType: Encoding.ASCII.GetString(metaDataBuffer[..8]).TrimEnd('\0'), Magic1: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[8..12]), FileLength: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[12..16]), Magic2: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[16..20]), - FileName: Encoding.ASCII.GetString(metaDataBuffer[20..40]), + FileName: Encoding.ASCII.GetString(metaDataBuffer[20..40]).TrimEnd('\0'), Magic3: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[40..44]), Magic4: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[44..48]), Magic5: BinaryPrimitives.ReadInt32LittleEndian(metaDataBuffer[48..52]), diff --git a/NResUI/ImGuiUI/ImGuiModalPanel.cs b/NResUI/ImGuiUI/ImGuiModalPanel.cs index a772b04..f5bc087 100644 --- a/NResUI/ImGuiUI/ImGuiModalPanel.cs +++ b/NResUI/ImGuiUI/ImGuiModalPanel.cs @@ -8,6 +8,8 @@ public abstract class ImGuiModalPanel : IImGuiPanel { protected abstract string ImGuiId { get; } + protected Vector2 WindowSize { get; set; } = new Vector2(600, 400); + private bool _shouldOpen = false; public virtual void Open() @@ -27,7 +29,7 @@ public abstract class ImGuiModalPanel : IImGuiPanel _shouldOpen = false; } - ImGui.SetNextWindowSize(new Vector2(600, 400)); + ImGui.SetNextWindowSize(WindowSize); if (ImGui.BeginPopup(ImGuiId, ImGuiWindowFlags.NoResize)) { diff --git a/NResUI/ImGuiUI/MainMenuBar.cs b/NResUI/ImGuiUI/MainMenuBar.cs index 462a9e2..2b845d6 100644 --- a/NResUI/ImGuiUI/MainMenuBar.cs +++ b/NResUI/ImGuiUI/MainMenuBar.cs @@ -11,9 +11,11 @@ namespace NResUI.ImGuiUI { private readonly ExplorerViewModel _explorerViewModel; - public MainMenuBar(ExplorerViewModel explorerViewModel) + private readonly MessageBoxModalPanel _messageBox; + public MainMenuBar(ExplorerViewModel explorerViewModel, MessageBoxModalPanel messageBox) { _explorerViewModel = explorerViewModel; + _messageBox = messageBox; } public void OnImGuiRender() @@ -45,8 +47,10 @@ namespace NResUI.ImGuiUI if (result.IsOk) { var path = result.Path; - - Console.WriteLine(path); + + NResExporter.Export(_explorerViewModel.Archive!, path, _explorerViewModel.Path!); + + _messageBox.Show("Успешно экспортировано"); } } } diff --git a/NResUI/ImGuiUI/MessageBoxModalPanel.cs b/NResUI/ImGuiUI/MessageBoxModalPanel.cs new file mode 100644 index 0000000..0c690b9 --- /dev/null +++ b/NResUI/ImGuiUI/MessageBoxModalPanel.cs @@ -0,0 +1,33 @@ +using System.Numerics; +using ImGuiNET; +using NResUI.Abstractions; + +namespace NResUI.ImGuiUI; + +public class MessageBoxModalPanel : ImGuiModalPanel +{ + private string? _text; + protected override string ImGuiId { get; } = "#message-box"; + + public MessageBoxModalPanel() + { + WindowSize = new Vector2(300, 150); + } + + public void Show(string? text) + { + _text = text; + base.Open(); + } + + protected override void OnImGuiRenderContent() + { + ImGui.Text(_text); + ImGui.Spacing(); + + if (ImGui.Button("Ок")) + { + ImGui.CloseCurrentPopup(); + } + } +} \ No newline at end of file