0
mirror of https://github.com/sampletext32/ParkanPlayground.git synced 2025-06-18 23:59:46 +03:00

create NResUI

This commit is contained in:
bird_egop
2024-11-15 19:06:44 +03:00
parent 0c39485188
commit 1091605e2d
22 changed files with 869 additions and 100 deletions

View File

@ -0,0 +1,127 @@
using ImGuiNET;
using NResUI.Abstractions;
using NResUI.Models;
namespace NResUI.ImGuiUI;
public class ExplorerPanel : IImGuiPanel
{
private readonly ExplorerViewModel _viewModel;
public ExplorerPanel(ExplorerViewModel viewModel)
{
_viewModel = viewModel;
}
public void OnImGuiRender()
{
if (ImGui.Begin("Explorer"))
{
if (!_viewModel.HasFile)
{
ImGui.Text("No NRes is opened");
}
else
{
if (_viewModel.Error != null)
{
ImGui.Text(_viewModel.Error);
}
if (_viewModel.Archive is not null)
{
ImGui.Text(_viewModel.Path);
ImGui.Text("Header: ");
ImGui.SameLine();
ImGui.Text(_viewModel.Archive.Header.NRes);
ImGui.Text("Version: ");
ImGui.SameLine();
ImGui.Text(_viewModel.Archive.Header.Version.ToString());
ImGui.Text("File Count: ");
ImGui.SameLine();
ImGui.Text(_viewModel.Archive.Header.FileCount.ToString());
ImGui.Text("Total File Length: ");
ImGui.SameLine();
ImGui.Text(_viewModel.Archive.Header.TotalFileLengthBytes.ToString());
if (ImGui.BeginTable("content", 11))
{
ImGui.TableSetupColumn("Тип файла");
ImGui.TableSetupColumn("Magic1");
ImGui.TableSetupColumn("Длина файла в байтах");
ImGui.TableSetupColumn("Magic2");
ImGui.TableSetupColumn("Имя файла");
ImGui.TableSetupColumn("Magic3");
ImGui.TableSetupColumn("Magic4");
ImGui.TableSetupColumn("Magic5");
ImGui.TableSetupColumn("Magic6");
ImGui.TableSetupColumn("Смещение в байтах");
ImGui.TableSetupColumn("Индекс в файле");
ImGui.TableHeadersRow();
for (int i = 0; i < _viewModel.Archive.Files.Count; i++)
{
ImGui.TableNextRow();
ImGui.TableNextColumn();
ImGui.Text(_viewModel.Archive.Files[i].FileType);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic1.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.FileLength.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic2.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(_viewModel.Archive.Files[i].FileName);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic3.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic4.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic5.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Magic6.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.OffsetInFile.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.Archive.Files[i]
.Index.ToString()
);
}
ImGui.EndTable();
}
}
}
ImGui.End();
}
}
}

View File

@ -0,0 +1,39 @@
using System.Numerics;
using ImGuiNET;
using NResUI.Abstractions;
namespace NResUI.ImGuiUI;
public abstract class ImGuiModalPanel : IImGuiPanel
{
protected abstract string ImGuiId { get; }
private bool _shouldOpen = false;
public virtual void Open()
{
_shouldOpen = true;
}
protected abstract void OnImGuiRenderContent();
public void OnImGuiRender()
{
// this is a ImGui stack fix. Because menubars and some other controls use their separate stack context,
// The panel gets rendered on it's own, at the root of the stack, and with _shouldOpen we control, if the panel should open this frame.
if (_shouldOpen)
{
ImGui.OpenPopup(ImGuiId, ImGuiPopupFlags.AnyPopupLevel);
_shouldOpen = false;
}
ImGui.SetNextWindowSize(new Vector2(600, 400));
if (ImGui.BeginPopup(ImGuiId, ImGuiWindowFlags.NoResize))
{
OnImGuiRenderContent();
ImGui.EndPopup();
}
}
}

View File

@ -0,0 +1,108 @@
using System.Numerics;
using ImGuiNET;
using NativeFileDialogSharp;
using NResLib;
using NResUI.Abstractions;
using NResUI.Models;
namespace NResUI.ImGuiUI
{
public class MainMenuBar : IImGuiPanel
{
private readonly ExplorerViewModel _explorerViewModel;
public MainMenuBar(ExplorerViewModel explorerViewModel)
{
_explorerViewModel = explorerViewModel;
}
public void OnImGuiRender()
{
if (ImGui.BeginMenuBar())
{
if (ImGui.BeginMenu("File"))
{
if (ImGui.MenuItem("Open NRes"))
{
var result = Dialog.FileOpen();
if (result.IsOk)
{
var path = result.Path;
var parseResult = NResParser.ReadFile(path);
_explorerViewModel.SetParseResult(parseResult, path);
}
}
if (_explorerViewModel.HasFile)
{
if (ImGui.MenuItem("Экспортировать"))
{
var result = Dialog.FolderPicker();
if (result.IsOk)
{
var path = result.Path;
Console.WriteLine(path);
}
}
}
if (ImGui.BeginMenu("Open Recent"))
{
ImGui.EndMenu();
}
if (ImGui.MenuItem("Exit"))
{
App.Instance.Exit();
}
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Windows"))
{
if (ImGui.MenuItem("Settings"))
{
}
ImGui.EndMenu();
}
ImGui.EndMenuBar();
}
}
// This is a direct port of imgui_demo.cpp HelpMarker function
// https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp#L190
private void ShowHint(string message)
{
// ImGui.TextDisabled("(?)");
if (ImGui.IsItemHovered())
{
// Change background transparency
ImGui.PushStyleColor(
ImGuiCol.PopupBg,
new Vector4(
1,
1,
1,
0.8f
)
);
ImGui.BeginTooltip();
ImGui.PushTextWrapPos(ImGui.GetFontSize() * 35.0f);
ImGui.TextUnformatted(message);
ImGui.PopTextWrapPos();
ImGui.EndTooltip();
ImGui.PopStyleColor();
}
}
}
}