Files
Pf2eDataScrapper/Pf2eViewer/MainViewForm.cs
T

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;
}