diff --git a/SCHALE.Toolbox/Forms/ExcelEditorForm.Designer.cs b/SCHALE.Toolbox/Forms/ExcelEditorForm.Designer.cs index 5b96ae1..6a7cbce 100644 --- a/SCHALE.Toolbox/Forms/ExcelEditorForm.Designer.cs +++ b/SCHALE.Toolbox/Forms/ExcelEditorForm.Designer.cs @@ -30,14 +30,14 @@ { downloadButton = new Button(); reloadButton = new Button(); - propertyGrid1 = new PropertyGrid(); + propGrid = new PropertyGrid(); splitContainer1 = new SplitContainer(); splitContainer2 = new SplitContainer(); tableListView = new ListView(); columnHeader1 = new ColumnHeader(); itemListView = new ListView(); - button1 = new Button(); columnHeader2 = new ColumnHeader(); + button1 = new Button(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); splitContainer1.Panel2.SuspendLayout(); @@ -68,13 +68,13 @@ reloadButton.UseVisualStyleBackColor = true; reloadButton.Click += reloadButton_Click; // - // propertyGrid1 + // propGrid // - propertyGrid1.Dock = DockStyle.Fill; - propertyGrid1.Location = new Point(0, 0); - propertyGrid1.Name = "propertyGrid1"; - propertyGrid1.Size = new Size(695, 831); - propertyGrid1.TabIndex = 4; + propGrid.Dock = DockStyle.Fill; + propGrid.Location = new Point(0, 0); + propGrid.Name = "propGrid"; + propGrid.Size = new Size(695, 831); + propGrid.TabIndex = 4; // // splitContainer1 // @@ -88,7 +88,7 @@ // // splitContainer1.Panel2 // - splitContainer1.Panel2.Controls.Add(propertyGrid1); + splitContainer1.Panel2.Controls.Add(propGrid); splitContainer1.Size = new Size(1048, 831); splitContainer1.SplitterDistance = 349; splitContainer1.TabIndex = 5; @@ -142,9 +142,12 @@ itemListView.TabIndex = 0; itemListView.UseCompatibleStateImageBehavior = false; itemListView.View = View.Details; + itemListView.SelectedIndexChanged += itemListView_SelectedIndexChanged; // // button1 // + button1.Anchor = AnchorStyles.Top | AnchorStyles.Right; + button1.Enabled = false; button1.Location = new Point(872, 12); button1.Name = "button1"; button1.Size = new Size(188, 44); @@ -179,7 +182,7 @@ private Button downloadButton; private Button reloadButton; - private PropertyGrid propertyGrid1; + private PropertyGrid propGrid; private SplitContainer splitContainer1; private SplitContainer splitContainer2; private ListView tableListView; diff --git a/SCHALE.Toolbox/Forms/ExcelEditorForm.cs b/SCHALE.Toolbox/Forms/ExcelEditorForm.cs index e32b373..23d962e 100644 --- a/SCHALE.Toolbox/Forms/ExcelEditorForm.cs +++ b/SCHALE.Toolbox/Forms/ExcelEditorForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -27,6 +28,7 @@ namespace SCHALE.Toolbox.Forms private readonly ExcelTableService _tableService; private readonly ILogger _logger; private string _excelDirectory; + private IList? _currentExcelTable = null; public ExcelEditorForm() { @@ -60,7 +62,63 @@ namespace SCHALE.Toolbox.Forms private void tableListView_SelectedIndexChanged(object sender, EventArgs e) { + var selectedItems = tableListView.SelectedItems; + if (selectedItems.Count < 1) return; + var type = selectedItems[0].Tag as Type; + if (type == null) return; + + var fbPath = Path.Join(_excelDirectory, $"{type.Name.ToLower()}.fb"); + if (!File.Exists(fbPath)) + { + _logger.LogError("Decrypted flatbuffer for {Type} not found", type); + return; + } + + var bytes = File.ReadAllBytes(fbPath); + var inst = type.GetMethod($"GetRootAs{type.Name}", BindingFlags.Static | BindingFlags.Public, + [typeof(ByteBuffer)])!.Invoke(null, [new ByteBuffer(bytes)]); + var obj = type.GetMethod("UnPack", BindingFlags.Instance | BindingFlags.Public)!.Invoke(inst, null); + var dataList = + obj!.GetType().GetProperty("DataList", BindingFlags.Instance | BindingFlags.Public)!.GetMethod!.Invoke(obj, null)!; + Type? itemType = null; + foreach (var iType in dataList!.GetType().GetInterfaces()) + { + if (iType.IsGenericType && iType.GetGenericTypeDefinition() == typeof(IList<>)) + { + itemType = iType.GetGenericArguments()[0]; + break; + } + } + if (itemType == null) + { + _logger.LogError("Unknown type error"); + return; + } + + _currentExcelTable = dataList as IList; + _logger.LogInformation("{Count} {TypeName} found", _currentExcelTable!.Count, itemType.Name); + + itemListView.Items.Clear(); + for (var i = 0; i < _currentExcelTable!.Count; i++) + { + var listItem = new ListViewItem($"{i}"); + listItem.Tag = _currentExcelTable[i]; + itemListView.Items.Add(listItem); + } + + itemListView.Columns[0].Width = -1; + } + + private void itemListView_SelectedIndexChanged(object sender, EventArgs e) + { + var selectedItems = itemListView.SelectedItems; + if (selectedItems.Count < 1) return; + + var obj = selectedItems[0].Tag; + if (obj == null) return; + + propGrid.SelectedObject = obj; } private void ReloadExcels() diff --git a/SCHALE.Toolbox/Forms/PlayableCharacterForm.Designer.cs b/SCHALE.Toolbox/Forms/PlayableCharacterForm.Designer.cs index b6bb70f..b0a04fa 100644 --- a/SCHALE.Toolbox/Forms/PlayableCharacterForm.Designer.cs +++ b/SCHALE.Toolbox/Forms/PlayableCharacterForm.Designer.cs @@ -94,6 +94,7 @@ // exportButton // exportButton.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + exportButton.Enabled = false; exportButton.Location = new Point(289, 3); exportButton.Name = "exportButton"; exportButton.Size = new Size(280, 59);