201 lines
5.2 KiB
C#
201 lines
5.2 KiB
C#
using System.Windows.Forms;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Converters;
|
|
using Newtonsoft.Json.Serialization;
|
|
using Pf2eModel;
|
|
using Pf2eModel.Model;
|
|
using Pf2eModel.Model.Base;
|
|
using Pf2eModel.Model.Common.I18n;
|
|
using Pf2eModel.Model.Enum;
|
|
using Pf2eViewer.Converters;
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
|
|
|
namespace Pf2eViewer;
|
|
|
|
public partial class MainViewForm : Form
|
|
{
|
|
public Pf2eDbContext Context = new();
|
|
|
|
public readonly string JsonViewerHtml;
|
|
|
|
public readonly DatabaseViewer Viewer = new();
|
|
|
|
public MainViewForm()
|
|
{
|
|
InitializeComponent();
|
|
|
|
_ = new DarkModeCS(this) { ColorMode = DarkModeCS.DisplayMode.SystemDefault };
|
|
|
|
Reset();
|
|
|
|
EntityGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
|
|
|
using StreamReader reader = new("Resources/json-viewer.html");
|
|
JsonViewerHtml = reader.ReadToEnd();
|
|
|
|
Viewer.ViewUpdateStart += Viewer_ViewUpdateStart;
|
|
Viewer.ViewUpdate += Viewer_ViewUpdate;
|
|
Viewer.ViewSelect += Viewer_ViewSelect;
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
Context.Dispose();
|
|
Context = new();
|
|
|
|
TypesListBox.DataSource = Context.Entities.Select(e => e.Type).Distinct().ToList();
|
|
TypesListBox.SelectedIndex = 0;
|
|
}
|
|
|
|
private void ToggleFreeze(bool state)
|
|
{
|
|
EntityGridView.Visible = state;
|
|
JsonWebView.Visible = state;
|
|
|
|
FirstPageButton.Enabled = state;
|
|
PrevPageButton.Enabled = state;
|
|
NextPageButton.Enabled = state;
|
|
LastPageButton.Enabled = state;
|
|
|
|
PageTextBox.Enabled = state;
|
|
}
|
|
|
|
// Viewer events
|
|
|
|
private void Viewer_ViewUpdateStart()
|
|
{
|
|
ToggleFreeze(false);
|
|
}
|
|
|
|
private void Viewer_ViewUpdate()
|
|
{
|
|
EntityGridView.DataSource = Viewer.Entities.Select(e => new EntityGridRow(e));
|
|
|
|
PaginationLabel.Text = $@"Всего: {Viewer.Count} объектов, {Viewer.MaxPage} страниц";
|
|
|
|
FirstPageButton.Enabled = Viewer.Page > 1;
|
|
PrevPageButton.Enabled = Viewer.Page > 1;
|
|
NextPageButton.Enabled = Viewer.Page < Viewer.MaxPage;
|
|
LastPageButton.Enabled = Viewer.Page < Viewer.MaxPage;
|
|
|
|
ToggleFreeze(true);
|
|
}
|
|
|
|
private void Viewer_ViewSelect(Entity? entity, IEntity? subEntity)
|
|
{
|
|
JsonSerializerSettings settings = new()
|
|
{
|
|
Converters =
|
|
[
|
|
new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() },
|
|
new EntityConverter(),
|
|
new LocaleStringConverter(),
|
|
],
|
|
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
|
|
};
|
|
|
|
string result = JsonConvert.SerializeObject(entity, settings);
|
|
string subResult = JsonConvert.SerializeObject(subEntity, settings);
|
|
|
|
string json = result[..^1] + $",\"SubEntity\":{subResult}}}";
|
|
|
|
RenderJson(json);
|
|
}
|
|
|
|
// Form events
|
|
|
|
private void TypesListBox_SelectedIndexChanged(object sender, EventArgs _)
|
|
{
|
|
if (TypesListBox.SelectedItem is null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Viewer.Page = 1;
|
|
}
|
|
|
|
private void FirstPageButton_Click(object sender, EventArgs e)
|
|
{
|
|
Viewer.Page = 1;
|
|
}
|
|
|
|
private void PrevPageButton_Click(object sender, EventArgs e)
|
|
{
|
|
Viewer.Page--;
|
|
}
|
|
|
|
private void NextPageButton_Click(object sender, EventArgs e)
|
|
{
|
|
Viewer.Page++;
|
|
}
|
|
|
|
private void LastPageButton_Click(object sender, EventArgs e)
|
|
{
|
|
Viewer.Page = Viewer.MaxPage;
|
|
}
|
|
|
|
private void PageTextBox_KeyPress(object sender, KeyPressEventArgs e)
|
|
{
|
|
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
|
|
{
|
|
e.Handled = true;
|
|
}
|
|
|
|
if (e.KeyChar == (char)Keys.Return)
|
|
{
|
|
Viewer.Page = Convert.ToInt32(PageTextBox.Text);
|
|
}
|
|
}
|
|
|
|
private void EntityGridView_RowStateChanged(
|
|
object sender,
|
|
DataGridViewRowStateChangedEventArgs e
|
|
)
|
|
{
|
|
int rowsCount = EntityGridView.SelectedRows.Count;
|
|
if (rowsCount is 0 or > 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
DataGridViewRow row = EntityGridView.SelectedRows[0];
|
|
|
|
EntityGridRow data = (EntityGridRow)row.DataBoundItem;
|
|
|
|
Viewer.Select(data.GetEntity());
|
|
}
|
|
|
|
public void RenderJson(string json)
|
|
{
|
|
if (JsonWebView.CoreWebView2 == null)
|
|
{
|
|
JsonWebView.EnsureCoreWebView2Async();
|
|
return;
|
|
}
|
|
|
|
string html = JsonViewerHtml.Replace("{JSON}", json);
|
|
JsonWebView.CoreWebView2.NavigateToString(html);
|
|
}
|
|
|
|
private void JsonWebView_CoreWebView2InitializationCompleted(
|
|
object sender,
|
|
Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e
|
|
)
|
|
{
|
|
JsonWebView.Visible = true;
|
|
Viewer_ViewSelect(Viewer.LastEntity, Viewer.LastSubEntity);
|
|
}
|
|
}
|
|
|
|
internal class EntityGridRow(Entity e)
|
|
{
|
|
public int Id { get; set; } = e.Id;
|
|
public string Name { get; set; } = e.Name[LocaleType.English];
|
|
public EntityRarity Rarity { get; set; } = e.Rarity;
|
|
|
|
private readonly Entity _e = e;
|
|
|
|
public Entity GetEntity() => _e;
|
|
}
|