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