From b845b3de1dfb2eb5223662962e45d94ba44b1450 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:08:31 +0100 Subject: [PATCH] PckStudio - Add ViewPanels --- PCK-Studio/Controls/DefaultPanel.Designer.cs | 339 +++++++++++++ PCK-Studio/Controls/DefaultPanel.cs | 300 +++++++++++ PCK-Studio/Controls/DefaultPanel.resx | 132 +++++ PCK-Studio/Controls/ModelsPanel.Designer.cs | 139 ++++++ PCK-Studio/Controls/ModelsPanel.cs | 103 ++++ PCK-Studio/Controls/ModelsPanel.resx | 120 +++++ .../PckAssetBrowserEditor.Designer.cs | 244 ++------- PCK-Studio/Controls/PckAssetBrowserEditor.cs | 353 +++---------- .../Controls/PckAssetBrowserEditor.resx | 465 ++++-------------- PCK-Studio/Controls/ViewPanel.cs | 17 + PCK-Studio/Forms/Editor/CustomSkinEditor.cs | 1 - PCK-Studio/PckStudio.csproj | 21 + 12 files changed, 1360 insertions(+), 874 deletions(-) create mode 100644 PCK-Studio/Controls/DefaultPanel.Designer.cs create mode 100644 PCK-Studio/Controls/DefaultPanel.cs create mode 100644 PCK-Studio/Controls/DefaultPanel.resx create mode 100644 PCK-Studio/Controls/ModelsPanel.Designer.cs create mode 100644 PCK-Studio/Controls/ModelsPanel.cs create mode 100644 PCK-Studio/Controls/ModelsPanel.resx create mode 100644 PCK-Studio/Controls/ViewPanel.cs diff --git a/PCK-Studio/Controls/DefaultPanel.Designer.cs b/PCK-Studio/Controls/DefaultPanel.Designer.cs new file mode 100644 index 00000000..757d2a11 --- /dev/null +++ b/PCK-Studio/Controls/DefaultPanel.Designer.cs @@ -0,0 +1,339 @@ +namespace PckStudio.Controls +{ + partial class DefaultPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DefaultPanel)); + this.PropertiesTabControl = new MetroFramework.Controls.MetroTabControl(); + this.MetaTab = new MetroFramework.Controls.MetroTabPage(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.buttonEdit = new MetroFramework.Controls.MetroButton(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.treeMeta = new System.Windows.Forms.TreeView(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.displayNameLabel = new System.Windows.Forms.Label(); + this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); + this.skinRenderer = new PckStudio.Rendering.SkinRenderer(); + this.themeNameLabel = new System.Windows.Forms.Label(); + this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addBOXEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addANIMEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addMultipleEntriesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editAllEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PropertiesTabControl.SuspendLayout(); + this.MetaTab.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).BeginInit(); + this.contextMenuMetaTree.SuspendLayout(); + this.SuspendLayout(); + // + // PropertiesTabControl + // + this.tableLayoutPanel1.SetColumnSpan(this.PropertiesTabControl, 2); + this.PropertiesTabControl.Controls.Add(this.MetaTab); + this.PropertiesTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.PropertiesTabControl.Location = new System.Drawing.Point(3, 369); + this.PropertiesTabControl.Name = "PropertiesTabControl"; + this.PropertiesTabControl.SelectedIndex = 0; + this.PropertiesTabControl.Size = new System.Drawing.Size(907, 322); + this.PropertiesTabControl.Style = MetroFramework.MetroColorStyle.Silver; + this.PropertiesTabControl.TabIndex = 13; + this.PropertiesTabControl.Theme = MetroFramework.MetroThemeStyle.Dark; + this.PropertiesTabControl.UseSelectable = true; + // + // MetaTab + // + this.MetaTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.MetaTab.Controls.Add(this.metroLabel2); + this.MetaTab.Controls.Add(this.buttonEdit); + this.MetaTab.Controls.Add(this.metroLabel1); + this.MetaTab.Controls.Add(this.treeMeta); + this.MetaTab.HorizontalScrollbarBarColor = true; + this.MetaTab.HorizontalScrollbarHighlightOnWheel = false; + this.MetaTab.HorizontalScrollbarSize = 10; + this.MetaTab.Location = new System.Drawing.Point(4, 38); + this.MetaTab.Name = "MetaTab"; + this.MetaTab.Padding = new System.Windows.Forms.Padding(5); + this.MetaTab.Size = new System.Drawing.Size(899, 280); + this.MetaTab.TabIndex = 0; + this.MetaTab.Text = "Properties"; + this.MetaTab.Theme = MetroFramework.MetroThemeStyle.Dark; + this.MetaTab.VerticalScrollbarBarColor = true; + this.MetaTab.VerticalScrollbarHighlightOnWheel = false; + this.MetaTab.VerticalScrollbarSize = 10; + // + // metroLabel2 + // + this.metroLabel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(379, 146); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(0, 0); + this.metroLabel2.TabIndex = 15; + this.metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // buttonEdit + // + this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonEdit.Location = new System.Drawing.Point(3, 248); + this.buttonEdit.Name = "buttonEdit"; + this.buttonEdit.Size = new System.Drawing.Size(201, 31); + this.buttonEdit.TabIndex = 20; + this.buttonEdit.Text = "buttonEdit"; + this.buttonEdit.Theme = MetroFramework.MetroThemeStyle.Dark; + this.buttonEdit.UseSelectable = true; + // + // metroLabel1 + // + this.metroLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(441, 39); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(0, 0); + this.metroLabel1.TabIndex = 13; + this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // treeMeta + // + this.treeMeta.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.treeMeta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.treeMeta.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeMeta.ForeColor = System.Drawing.SystemColors.Window; + this.treeMeta.Location = new System.Drawing.Point(3, 4); + this.treeMeta.Name = "treeMeta"; + this.treeMeta.PathSeparator = "/"; + this.treeMeta.Size = new System.Drawing.Size(888, 238); + this.treeMeta.TabIndex = 0; + this.treeMeta.DoubleClick += new System.EventHandler(this.treeMeta_DoubleClick); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.displayNameLabel, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.PropertiesTabControl, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.previewPictureBox, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.skinRenderer, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.themeNameLabel, 0, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 3F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 3F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 47F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 47F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(913, 694); + this.tableLayoutPanel1.TabIndex = 14; + // + // displayNameLabel + // + this.displayNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.displayNameLabel.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(this.displayNameLabel, 2); + this.displayNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.displayNameLabel.ForeColor = System.Drawing.Color.White; + this.displayNameLabel.Location = new System.Drawing.Point(3, 0); + this.displayNameLabel.Name = "displayNameLabel"; + this.displayNameLabel.Size = new System.Drawing.Size(907, 20); + this.displayNameLabel.TabIndex = 15; + this.displayNameLabel.Text = "name"; + this.displayNameLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // previewPictureBox + // + this.previewPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; + this.previewPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.previewPictureBox.Image = global::PckStudio.Properties.Resources.NoImageFound; + this.previewPictureBox.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.previewPictureBox.Location = new System.Drawing.Point(3, 43); + this.previewPictureBox.Name = "previewPictureBox"; + this.previewPictureBox.Size = new System.Drawing.Size(450, 320); + this.previewPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.previewPictureBox.TabIndex = 12; + this.previewPictureBox.TabStop = false; + // + // skinRenderer + // + this.skinRenderer.AllowCameraMovement = false; + this.skinRenderer.Animate = true; + this.skinRenderer.ArmorTexture = null; + this.skinRenderer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.skinRenderer.CapeTexture = null; + this.skinRenderer.CenterOnSelect = false; + this.skinRenderer.Dock = System.Windows.Forms.DockStyle.Fill; + this.skinRenderer.ForeColor = System.Drawing.Color.CornflowerBlue; + this.skinRenderer.GuideLineColor = System.Drawing.Color.Empty; + this.skinRenderer.HighlightlingColor = System.Drawing.Color.Aqua; + this.skinRenderer.Location = new System.Drawing.Point(459, 43); + this.skinRenderer.MouseSensetivity = 0.01F; + this.skinRenderer.Name = "skinRenderer"; + this.skinRenderer.RefreshRate = 60; + this.skinRenderer.RenderGroundPlane = false; + this.skinRenderer.RenderSkyBox = false; + this.skinRenderer.SelectedIndex = -1; + this.skinRenderer.SelectedIndices = new int[0]; + this.skinRenderer.ShowArmor = false; + this.skinRenderer.ShowBoundingBox = false; + this.skinRenderer.ShowGuideLines = false; + this.skinRenderer.Size = new System.Drawing.Size(451, 320); + this.skinRenderer.TabIndex = 14; + this.skinRenderer.Texture = null; + this.skinRenderer.Visible = false; + this.skinRenderer.VSync = true; + // + // themeNameLabel + // + this.themeNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.themeNameLabel.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(this.themeNameLabel, 2); + this.themeNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.themeNameLabel.ForeColor = System.Drawing.Color.White; + this.themeNameLabel.Location = new System.Drawing.Point(3, 20); + this.themeNameLabel.Name = "themeNameLabel"; + this.themeNameLabel.Size = new System.Drawing.Size(907, 20); + this.themeNameLabel.TabIndex = 16; + this.themeNameLabel.Text = "theme"; + this.themeNameLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // contextMenuMetaTree + // + this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addEntryToolStripMenuItem, + this.addMultipleEntriesToolStripMenuItem1, + this.deleteEntryToolStripMenuItem, + this.editAllEntriesToolStripMenuItem}); + this.contextMenuMetaTree.Name = "contextMenuStrip1"; + this.contextMenuMetaTree.Size = new System.Drawing.Size(182, 92); + // + // addEntryToolStripMenuItem + // + this.addEntryToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addEntryToolStripMenuItem1, + this.addBOXEntryToolStripMenuItem1, + this.addANIMEntryToolStripMenuItem1}); + this.addEntryToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("addEntryToolStripMenuItem.Image"))); + this.addEntryToolStripMenuItem.Name = "addEntryToolStripMenuItem"; + this.addEntryToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.addEntryToolStripMenuItem.Text = "Add Entry"; + // + // addEntryToolStripMenuItem1 + // + this.addEntryToolStripMenuItem1.Name = "addEntryToolStripMenuItem1"; + this.addEntryToolStripMenuItem1.Size = new System.Drawing.Size(160, 22); + this.addEntryToolStripMenuItem1.Text = "Add Entry"; + this.addEntryToolStripMenuItem1.Click += new System.EventHandler(this.addEntryToolStripMenuItem_Click); + // + // addBOXEntryToolStripMenuItem1 + // + this.addBOXEntryToolStripMenuItem1.Name = "addBOXEntryToolStripMenuItem1"; + this.addBOXEntryToolStripMenuItem1.Size = new System.Drawing.Size(160, 22); + this.addBOXEntryToolStripMenuItem1.Text = "Add BOX Entry"; + this.addBOXEntryToolStripMenuItem1.Click += new System.EventHandler(this.addBOXEntryToolStripMenuItem1_Click); + // + // addANIMEntryToolStripMenuItem1 + // + this.addANIMEntryToolStripMenuItem1.Name = "addANIMEntryToolStripMenuItem1"; + this.addANIMEntryToolStripMenuItem1.Size = new System.Drawing.Size(160, 22); + this.addANIMEntryToolStripMenuItem1.Text = "Add ANIM Entry"; + this.addANIMEntryToolStripMenuItem1.Click += new System.EventHandler(this.addANIMEntryToolStripMenuItem1_Click); + // + // addMultipleEntriesToolStripMenuItem1 + // + this.addMultipleEntriesToolStripMenuItem1.Name = "addMultipleEntriesToolStripMenuItem1"; + this.addMultipleEntriesToolStripMenuItem1.Size = new System.Drawing.Size(181, 22); + this.addMultipleEntriesToolStripMenuItem1.Text = "Add Multiple Entries"; + this.addMultipleEntriesToolStripMenuItem1.Click += new System.EventHandler(this.addMultipleEntriesToolStripMenuItem1_Click); + // + // deleteEntryToolStripMenuItem + // + this.deleteEntryToolStripMenuItem.Image = global::PckStudio.Properties.Resources.file_delete; + this.deleteEntryToolStripMenuItem.Name = "deleteEntryToolStripMenuItem"; + this.deleteEntryToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.deleteEntryToolStripMenuItem.Text = "Delete Entry"; + // + // editAllEntriesToolStripMenuItem + // + this.editAllEntriesToolStripMenuItem.Name = "editAllEntriesToolStripMenuItem"; + this.editAllEntriesToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.editAllEntriesToolStripMenuItem.Click += new System.EventHandler(this.editAllEntriesToolStripMenuItem_Click); + // + // DefaultPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "DefaultPanel"; + this.Size = new System.Drawing.Size(913, 694); + this.PropertiesTabControl.ResumeLayout(false); + this.MetaTab.ResumeLayout(false); + this.MetaTab.PerformLayout(); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).EndInit(); + this.contextMenuMetaTree.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private PckStudio.ToolboxItems.InterpolationPictureBox previewPictureBox; + private MetroFramework.Controls.MetroTabControl PropertiesTabControl; + private MetroFramework.Controls.MetroTabPage MetaTab; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroButton buttonEdit; + private MetroFramework.Controls.MetroLabel metroLabel1; + private System.Windows.Forms.TreeView treeMeta; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.ContextMenuStrip contextMenuMetaTree; + private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addBOXEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addANIMEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addMultipleEntriesToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem deleteEntryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editAllEntriesToolStripMenuItem; + private Rendering.SkinRenderer skinRenderer; + private System.Windows.Forms.Label displayNameLabel; + private System.Windows.Forms.Label themeNameLabel; + } +} diff --git a/PCK-Studio/Controls/DefaultPanel.cs b/PCK-Studio/Controls/DefaultPanel.cs new file mode 100644 index 00000000..e01520fe --- /dev/null +++ b/PCK-Studio/Controls/DefaultPanel.cs @@ -0,0 +1,300 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using OMI.Formats.Pck; +using PckStudio.Core; +using PckStudio.Core.Extensions; +using PckStudio.Core.Skin; +using PckStudio.Forms.Additional_Popups; +using PckStudio.Forms.Editor; +using PckStudio.Properties; + +namespace PckStudio.Controls +{ + public partial class DefaultPanel : ViewPanel + { + private PckAsset _currentAsset; + private Action _onModified; + + private static readonly Skin _defaultSkin = new Skin("default", Resources.classic_template); + + private string ButtonText + { + get => buttonEdit.Text; + set + { + buttonEdit.Visible = !string.IsNullOrWhiteSpace(value); + buttonEdit.Text = value; + } + } + + public DefaultPanel() + { + InitializeComponent(); + } + + + private void ReloadMetaTreeView() + { + treeMeta.Nodes.Clear(); + if (_currentAsset is not null) + { + foreach (KeyValuePair property in _currentAsset.GetProperties()) + { + treeMeta.Nodes.CreateNode($"{property.Key}: {property.Value}", property); + } + } + } + + private void treeMeta_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Delete) + deleteEntryToolStripMenuItem_Click(sender, e); + } + + private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_currentAsset is not null) + { + IEnumerable props = _currentAsset.SerializeProperties(seperater: " "); + using (var input = new MultiTextPrompt(props)) + { + if (input.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.ClearProperties(); + _currentAsset.DeserializeProperties(input.TextOutput); + ReloadMetaTreeView(); + _onModified(); + } + } + } + } + + private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (_currentAsset is not null) + { + using var input = new MultiTextPrompt(); + if (input.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.DeserializeProperties(input.TextOutput); + ReloadMetaTreeView(); + _onModified(); + } + } + } + + private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (_currentAsset is not null) + { + using BoxEditor diag = new BoxEditor(SkinBOX.DefaultHead, false); + if (diag.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.AddProperty("BOX", diag.Result); + ReloadMetaTreeView(); + _onModified(); + } + return; + } + } + + private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (_currentAsset is not null) + { + using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); + if (diag.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.AddProperty("ANIM", diag.ResultAnim); + ReloadMetaTreeView(); + _onModified(); + } + return; + } + } + + private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair property && + _currentAsset.RemoveProperty(property)) + { + treeMeta.SelectedNode.Remove(); + _onModified(); + } + } + + private void addEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_currentAsset is not null) + { + using AddPropertyPrompt addProperty = new AddPropertyPrompt(); + if (addProperty.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.AddProperty(addProperty.Property); + ReloadMetaTreeView(); + _onModified(); + } + } + } + + private void treeMeta_DoubleClick(object sender, EventArgs e) + { + if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair property && + _currentAsset is not null) + { + if (_currentAsset.HasProperty(property.Key)) + { + switch (property.Key) + { + case "ANIM" when _currentAsset.Type == PckAssetType.SkinFile: + try + { + using ANIMEditor diag = new ANIMEditor(SkinANIM.FromString(property.Value)); + if (diag.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.SetProperty(_currentAsset.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); + ReloadMetaTreeView(); + _onModified(); + } + return; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid ANIM value: " + property.Value); + MessageBox.Show(this, "Failed to parse ANIM value, aborting to normal functionality. Please make sure the value only includes hexadecimal characters (0-9,A-F) and has no more than 8 characters."); + } + break; + + case "BOX" when _currentAsset.Type == PckAssetType.SkinFile: + try + { + using BoxEditor diag = new BoxEditor(property.Value, false); + if (diag.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.SetProperty(_currentAsset.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); + ReloadMetaTreeView(); + _onModified(); + } + return; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid BOX value: " + property.Value); + MessageBox.Show(this, "Failed to parse BOX value, aborting to normal functionality."); + } + break; + + default: + break; + } + + using (AddPropertyPrompt addProperty = new AddPropertyPrompt(property)) + { + if (addProperty.ShowDialog(this) == DialogResult.OK) + { + _currentAsset.SetProperty(_currentAsset.GetPropertyIndex(property), addProperty.Property); + ReloadMetaTreeView(); + _onModified(); + } + } + } + } + } + + public override void Reset() + { + treeMeta.Nodes.Clear(); + previewPictureBox.Image = Resources.NoImageFound; + skinRenderer.Visible = false; + displayNameLabel.Visible = false; + themeNameLabel.Visible = false; + ButtonText = null; + _currentAsset = null; + _onModified = null; + } + + public override void LoadAsset(PckAsset asset, Action onModified) + { + Reset(); + _currentAsset = asset; + _onModified = onModified; + switch (asset.Type) + { + case PckAssetType.SkinFile: + case PckAssetType.CapeFile: + case PckAssetType.TextureFile: + { + previewPictureBox.Image = asset.GetTexture(); + + if (skinRenderer.IsInitialized) + { + + if (asset.Type == PckAssetType.SkinFile || asset.Type == PckAssetType.CapeFile) + { + skinRenderer.Visible = true; + Skin skin = _defaultSkin; + if (asset.Type == PckAssetType.SkinFile) + { + skin = asset.GetSkin(); + displayNameLabel.Visible = true; + themeNameLabel.Visible = true; + displayNameLabel.Text = skin.MetaData.Name; + themeNameLabel.Text = skin.MetaData.Theme; + } + skinRenderer.LoadSkin(skin); + if (asset.Type == PckAssetType.CapeFile) + skinRenderer.CapeTexture = previewPictureBox.Image; + break; + } + } + + if (asset.Type != PckAssetType.TextureFile) + break; + + ResourceLocation resourceLocation = ResourceLocations.GetFromPath(asset.Filename); + if (resourceLocation is null || resourceLocation.Category == ResourceCategory.Unknown) + break; + + if ((resourceLocation.Category & ResourceCategory.Animation) != 0 && !asset.IsMipmappedFile()) + ButtonText = "EDIT TILE ANIMATION"; + + if ((resourceLocation.Category & ResourceCategory.Atlas) != 0) + ButtonText = "EDIT TEXTURE ATLAS"; + + if ((resourceLocation.Category & ResourceCategory.Textures) != 0) + ButtonText = "EDIT TEXTURE"; + } + break; + + case PckAssetType.LocalisationFile: + ButtonText = "EDIT LOC"; + break; + + case PckAssetType.AudioFile: + ButtonText = "EDIT MUSIC CUES"; + break; + + case PckAssetType.ColourTableFile when asset.Filename == "colours.col": + ButtonText = "EDIT COLORS"; + break; + + case PckAssetType.BehavioursFile when asset.Filename == "behaviours.bin": + ButtonText = "EDIT BEHAVIOURS"; + break; + default: + break; + } + ReloadMetaTreeView(); + } + } +} diff --git a/PCK-Studio/Controls/DefaultPanel.resx b/PCK-Studio/Controls/DefaultPanel.resx new file mode 100644 index 00000000..e09455b3 --- /dev/null +++ b/PCK-Studio/Controls/DefaultPanel.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/PCK-Studio/Controls/ModelsPanel.Designer.cs b/PCK-Studio/Controls/ModelsPanel.Designer.cs new file mode 100644 index 00000000..67b1c4cc --- /dev/null +++ b/PCK-Studio/Controls/ModelsPanel.Designer.cs @@ -0,0 +1,139 @@ +namespace PckStudio.Controls +{ + partial class ModelsPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.modelTreeView = new System.Windows.Forms.TreeView(); + this.modelRenderer = new PckStudio.Rendering.ModelRenderer(); + this.textureTreeView = new System.Windows.Forms.TreeView(); + this.showBoundsCheckBox = new System.Windows.Forms.CheckBox(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F)); + this.tableLayoutPanel1.Controls.Add(this.modelTreeView, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.modelRenderer, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.textureTreeView, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.showBoundsCheckBox, 1, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 5F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 45F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(732, 612); + this.tableLayoutPanel1.TabIndex = 0; + // + // modelTreeView + // + this.modelTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.modelTreeView.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.modelTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.modelTreeView.ForeColor = System.Drawing.SystemColors.Window; + this.modelTreeView.Location = new System.Drawing.Point(3, 3); + this.modelTreeView.Name = "modelTreeView"; + this.tableLayoutPanel1.SetRowSpan(this.modelTreeView, 3); + this.modelTreeView.Size = new System.Drawing.Size(250, 606); + this.modelTreeView.TabIndex = 0; + this.modelTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); + // + // modelRenderer + // + this.modelRenderer.AllowCameraMovement = false; + this.modelRenderer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(21)))), ((int)(((byte)(21))))); + this.modelRenderer.Dock = System.Windows.Forms.DockStyle.Fill; + this.modelRenderer.ForeColor = System.Drawing.Color.White; + this.modelRenderer.Location = new System.Drawing.Point(259, 3); + this.modelRenderer.MouseSensetivity = 0.01F; + this.modelRenderer.Name = "modelRenderer"; + this.modelRenderer.RefreshRate = 60; + this.modelRenderer.RenderModelBounds = false; + this.modelRenderer.Size = new System.Drawing.Size(470, 300); + this.modelRenderer.TabIndex = 1; + this.modelRenderer.VSync = true; + // + // textureTreeView + // + this.textureTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.textureTreeView.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textureTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.textureTreeView.ForeColor = System.Drawing.SystemColors.Window; + this.textureTreeView.Location = new System.Drawing.Point(259, 339); + this.textureTreeView.Name = "textureTreeView"; + this.textureTreeView.ShowLines = false; + this.textureTreeView.Size = new System.Drawing.Size(470, 270); + this.textureTreeView.TabIndex = 2; + this.textureTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.textureTreeView_AfterSelect); + // + // showBoundsCheckBox + // + this.showBoundsCheckBox.AutoSize = true; + this.showBoundsCheckBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(28)))), ((int)(((byte)(28))))); + this.showBoundsCheckBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.showBoundsCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.showBoundsCheckBox.Dock = System.Windows.Forms.DockStyle.Right; + this.showBoundsCheckBox.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.showBoundsCheckBox.ForeColor = System.Drawing.Color.White; + this.showBoundsCheckBox.Location = new System.Drawing.Point(610, 309); + this.showBoundsCheckBox.Name = "showBoundsCheckBox"; + this.showBoundsCheckBox.Size = new System.Drawing.Size(119, 24); + this.showBoundsCheckBox.TabIndex = 3; + this.showBoundsCheckBox.Text = "Show Bounding box"; + this.showBoundsCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.showBoundsCheckBox.UseVisualStyleBackColor = false; + this.showBoundsCheckBox.CheckedChanged += new System.EventHandler(this.showBoundsCheckBox1_CheckedChanged); + // + // ModelsPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "ModelsPanel"; + this.Size = new System.Drawing.Size(732, 612); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TreeView modelTreeView; + private Rendering.ModelRenderer modelRenderer; + private System.Windows.Forms.TreeView textureTreeView; + private System.Windows.Forms.CheckBox showBoundsCheckBox; + } +} diff --git a/PCK-Studio/Controls/ModelsPanel.cs b/PCK-Studio/Controls/ModelsPanel.cs new file mode 100644 index 00000000..6ce6d126 --- /dev/null +++ b/PCK-Studio/Controls/ModelsPanel.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using OMI.Formats.Model; +using OMI.Formats.Pck; +using OMI.Workers.Model; +using PckStudio.Core; +using PckStudio.Core.Extensions; +using PckStudio.Interfaces; +using PckStudio.ModelSupport; +using PckStudio.Rendering.Texture; + +namespace PckStudio.Controls +{ + public partial class ModelsPanel : ViewPanel + { + private readonly ITryGet _textures; + private readonly ImageList _imageList = new ImageList() + { + ColorDepth = ColorDepth.Depth32Bit, + ImageSize = new Size(32, 32) + }; + private ModelContainer _models; + + public ModelsPanel(ITryGet tryGetTexture) + { + InitializeComponent(); + _textures = tryGetTexture; + textureTreeView.ImageList = _imageList; + } + + public override void LoadAsset(PckAsset asset, Action onChange) + { + _models = asset.GetData(new ModelFileReader()); + modelTreeView.Nodes.AddRange(_models.Select(m => new TreeNode(m.Name)).ToArray()); + if (modelTreeView.Nodes.Count > 0) + modelTreeView.SelectedNode = modelTreeView.Nodes[0]; + modelRenderer.MakeCurrent(); + } + + public override void Reset() + { + modelTreeView.Nodes.Clear(); + textureTreeView.Nodes.Clear(); + _models = null; + } + + private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) + { + string modelName = e?.Node?.Text; + modelRenderer.Visible = _models.ContainsModel(modelName); + if (!modelRenderer.Visible) + return; + + NamedData[] textures = GetModelTextures(modelName, _textures).ToArray(); + + _imageList.Images.Clear(); + textureTreeView.Nodes.Clear(); + + foreach ((int i, NamedData item) in textures.enumerate()) + { + _imageList.Images.Add(item.Value); + textureTreeView.Nodes.Add(new NamedTextureTreeNode(item) { ImageIndex = i, SelectedImageIndex = i }); + } + if (textures.Length > 0) + { + modelRenderer.Texture = textures[0].Value; + modelRenderer.LoadModel(_models.GetModelByName(modelName)); + } + } + + private static IEnumerable> GetModelTextures(string modelName, ITryGet tryGet) + { + if (!GameModelImporter.ModelMetaData.ContainsKey(modelName) || GameModelImporter.ModelMetaData[modelName]?.TextureLocations?.Length <= 0) + yield break; + foreach (var textureLocation in GameModelImporter.ModelMetaData[modelName].TextureLocations) + { + if (tryGet.TryGet(textureLocation, out Image img)) + yield return new NamedData(Path.GetFileName(textureLocation), img); + } + yield break; + } + + private void textureTreeView_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node is NamedTextureTreeNode namedTextureNode) + modelRenderer.Texture = namedTextureNode.GetTexture(); + } + + private void showBoundsCheckBox1_CheckedChanged(object sender, EventArgs e) + { + modelRenderer.RenderModelBounds = showBoundsCheckBox.Checked; + } + } +} diff --git a/PCK-Studio/Controls/ModelsPanel.resx b/PCK-Studio/Controls/ModelsPanel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/PCK-Studio/Controls/ModelsPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/PCK-Studio/Controls/PckAssetBrowserEditor.Designer.cs b/PCK-Studio/Controls/PckAssetBrowserEditor.Designer.cs index 221b9c09..3522a26c 100644 --- a/PCK-Studio/Controls/PckAssetBrowserEditor.Designer.cs +++ b/PCK-Studio/Controls/PckAssetBrowserEditor.Designer.cs @@ -34,16 +34,9 @@ namespace PckStudio.Controls System.Windows.Forms.PictureBox logoPictureBox; System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PckAssetBrowserEditor)); this.pckFileLabel = new MetroFramework.Controls.MetroLabel(); - this.labelImageSize = new MetroFramework.Controls.MetroLabel(); this.fileEntryCountLabel = new MetroFramework.Controls.MetroLabel(); - this.PropertiesTabControl = new MetroFramework.Controls.MetroTabControl(); - this.MetaTab = new MetroFramework.Controls.MetroTabPage(); this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); - this.entryTypeTextBox = new MetroFramework.Controls.MetroTextBox(); - this.entryDataTextBox = new MetroFramework.Controls.MetroTextBox(); - this.buttonEdit = new MetroFramework.Controls.MetroButton(); this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); - this.treeMeta = new System.Windows.Forms.TreeView(); this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components); this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); @@ -53,7 +46,6 @@ namespace PckStudio.Controls this.deleteEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.editAllEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.label11 = new MetroFramework.Controls.MetroLabel(); - this.treeViewMain = new System.Windows.Forms.TreeView(); this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components); this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -104,15 +96,12 @@ namespace PckStudio.Controls this.deleteFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.imageList = new System.Windows.Forms.ImageList(this.components); this.addMultipleEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); - this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.treeViewMain = new System.Windows.Forms.TreeView(); logoPictureBox = new System.Windows.Forms.PictureBox(); ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit(); - this.PropertiesTabControl.SuspendLayout(); - this.MetaTab.SuspendLayout(); - this.contextMenuMetaTree.SuspendLayout(); this.contextMenuPCKEntries.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).BeginInit(); + this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // // logoPictureBox @@ -128,223 +117,70 @@ namespace PckStudio.Controls this.pckFileLabel.Name = "pckFileLabel"; this.pckFileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; // - // labelImageSize - // - resources.ApplyResources(this.labelImageSize, "labelImageSize"); - this.labelImageSize.Name = "labelImageSize"; - this.labelImageSize.Theme = MetroFramework.MetroThemeStyle.Dark; - // // fileEntryCountLabel // resources.ApplyResources(this.fileEntryCountLabel, "fileEntryCountLabel"); this.fileEntryCountLabel.Name = "fileEntryCountLabel"; this.fileEntryCountLabel.Theme = MetroFramework.MetroThemeStyle.Dark; // - // PropertiesTabControl - // - this.PropertiesTabControl.Controls.Add(this.MetaTab); - resources.ApplyResources(this.PropertiesTabControl, "PropertiesTabControl"); - this.PropertiesTabControl.Name = "PropertiesTabControl"; - this.PropertiesTabControl.SelectedIndex = 0; - this.PropertiesTabControl.Style = MetroFramework.MetroColorStyle.Silver; - this.PropertiesTabControl.Theme = MetroFramework.MetroThemeStyle.Dark; - this.PropertiesTabControl.UseSelectable = true; - // - // MetaTab - // - this.MetaTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.MetaTab.Controls.Add(this.metroLabel2); - this.MetaTab.Controls.Add(this.entryTypeTextBox); - this.MetaTab.Controls.Add(this.entryDataTextBox); - this.MetaTab.Controls.Add(this.buttonEdit); - this.MetaTab.Controls.Add(this.metroLabel1); - this.MetaTab.Controls.Add(this.treeMeta); - this.MetaTab.HorizontalScrollbarBarColor = true; - this.MetaTab.HorizontalScrollbarHighlightOnWheel = false; - this.MetaTab.HorizontalScrollbarSize = 10; - resources.ApplyResources(this.MetaTab, "MetaTab"); - this.MetaTab.Name = "MetaTab"; - this.MetaTab.Theme = MetroFramework.MetroThemeStyle.Dark; - this.MetaTab.VerticalScrollbarBarColor = true; - this.MetaTab.VerticalScrollbarHighlightOnWheel = false; - this.MetaTab.VerticalScrollbarSize = 10; - // // metroLabel2 // resources.ApplyResources(this.metroLabel2, "metroLabel2"); this.metroLabel2.Name = "metroLabel2"; this.metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; // - // entryTypeTextBox - // - resources.ApplyResources(this.entryTypeTextBox, "entryTypeTextBox"); - // - // - // - this.entryTypeTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image"))); - this.entryTypeTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode"))); - this.entryTypeTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location"))); - this.entryTypeTextBox.CustomButton.Name = ""; - this.entryTypeTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size"))); - this.entryTypeTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; - this.entryTypeTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex"))); - this.entryTypeTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; - this.entryTypeTextBox.CustomButton.UseSelectable = true; - this.entryTypeTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible"))); - this.entryTypeTextBox.Lines = new string[0]; - this.entryTypeTextBox.MaxLength = 32767; - this.entryTypeTextBox.Name = "entryTypeTextBox"; - this.entryTypeTextBox.PasswordChar = '\0'; - this.entryTypeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; - this.entryTypeTextBox.SelectedText = ""; - this.entryTypeTextBox.SelectionLength = 0; - this.entryTypeTextBox.SelectionStart = 0; - this.entryTypeTextBox.ShortcutsEnabled = true; - this.entryTypeTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.entryTypeTextBox.UseSelectable = true; - this.entryTypeTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); - this.entryTypeTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); - // - // entryDataTextBox - // - resources.ApplyResources(this.entryDataTextBox, "entryDataTextBox"); - // - // - // - this.entryDataTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image1"))); - this.entryDataTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode1"))); - this.entryDataTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location1"))); - this.entryDataTextBox.CustomButton.Name = ""; - this.entryDataTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size1"))); - this.entryDataTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; - this.entryDataTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex1"))); - this.entryDataTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; - this.entryDataTextBox.CustomButton.UseSelectable = true; - this.entryDataTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible1"))); - this.entryDataTextBox.Lines = new string[0]; - this.entryDataTextBox.MaxLength = 32767; - this.entryDataTextBox.Name = "entryDataTextBox"; - this.entryDataTextBox.PasswordChar = '\0'; - this.entryDataTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; - this.entryDataTextBox.SelectedText = ""; - this.entryDataTextBox.SelectionLength = 0; - this.entryDataTextBox.SelectionStart = 0; - this.entryDataTextBox.ShortcutsEnabled = true; - this.entryDataTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.entryDataTextBox.UseSelectable = true; - this.entryDataTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); - this.entryDataTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); - // - // buttonEdit - // - resources.ApplyResources(this.buttonEdit, "buttonEdit"); - this.buttonEdit.Name = "buttonEdit"; - this.buttonEdit.Theme = MetroFramework.MetroThemeStyle.Dark; - this.buttonEdit.UseSelectable = true; - this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); - // // metroLabel1 // resources.ApplyResources(this.metroLabel1, "metroLabel1"); this.metroLabel1.Name = "metroLabel1"; this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; // - // treeMeta - // - this.treeMeta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); - this.treeMeta.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.treeMeta.ContextMenuStrip = this.contextMenuMetaTree; - resources.ApplyResources(this.treeMeta, "treeMeta"); - this.treeMeta.ForeColor = System.Drawing.SystemColors.Window; - this.treeMeta.Name = "treeMeta"; - this.treeMeta.PathSeparator = "/"; - this.treeMeta.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMeta_AfterSelect); - this.treeMeta.DoubleClick += new System.EventHandler(this.treeMeta_DoubleClick); - this.treeMeta.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeMeta_KeyDown); - // // contextMenuMetaTree // - this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addEntryToolStripMenuItem, - this.addMultipleEntriesToolStripMenuItem1, - this.deleteEntryToolStripMenuItem, - this.editAllEntriesToolStripMenuItem}); - this.contextMenuMetaTree.Name = "contextMenuStrip1"; + this.contextMenuMetaTree.Name = "contextMenuMetaTree"; resources.ApplyResources(this.contextMenuMetaTree, "contextMenuMetaTree"); // // addEntryToolStripMenuItem // - this.addEntryToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addEntryToolStripMenuItem1, - this.addBOXEntryToolStripMenuItem1, - this.addANIMEntryToolStripMenuItem1}); - resources.ApplyResources(this.addEntryToolStripMenuItem, "addEntryToolStripMenuItem"); this.addEntryToolStripMenuItem.Name = "addEntryToolStripMenuItem"; + resources.ApplyResources(this.addEntryToolStripMenuItem, "addEntryToolStripMenuItem"); // // addEntryToolStripMenuItem1 // this.addEntryToolStripMenuItem1.Name = "addEntryToolStripMenuItem1"; resources.ApplyResources(this.addEntryToolStripMenuItem1, "addEntryToolStripMenuItem1"); - this.addEntryToolStripMenuItem1.Click += new System.EventHandler(this.addEntryToolStripMenuItem_Click); // // addBOXEntryToolStripMenuItem1 // this.addBOXEntryToolStripMenuItem1.Name = "addBOXEntryToolStripMenuItem1"; resources.ApplyResources(this.addBOXEntryToolStripMenuItem1, "addBOXEntryToolStripMenuItem1"); - this.addBOXEntryToolStripMenuItem1.Click += new System.EventHandler(this.addBOXEntryToolStripMenuItem1_Click); // // addANIMEntryToolStripMenuItem1 // this.addANIMEntryToolStripMenuItem1.Name = "addANIMEntryToolStripMenuItem1"; resources.ApplyResources(this.addANIMEntryToolStripMenuItem1, "addANIMEntryToolStripMenuItem1"); - this.addANIMEntryToolStripMenuItem1.Click += new System.EventHandler(this.addANIMEntryToolStripMenuItem1_Click); // // addMultipleEntriesToolStripMenuItem1 // this.addMultipleEntriesToolStripMenuItem1.Name = "addMultipleEntriesToolStripMenuItem1"; resources.ApplyResources(this.addMultipleEntriesToolStripMenuItem1, "addMultipleEntriesToolStripMenuItem1"); - this.addMultipleEntriesToolStripMenuItem1.Click += new System.EventHandler(this.addMultipleEntriesToolStripMenuItem1_Click); // // deleteEntryToolStripMenuItem // this.deleteEntryToolStripMenuItem.Image = global::PckStudio.Properties.Resources.file_delete; this.deleteEntryToolStripMenuItem.Name = "deleteEntryToolStripMenuItem"; resources.ApplyResources(this.deleteEntryToolStripMenuItem, "deleteEntryToolStripMenuItem"); - this.deleteEntryToolStripMenuItem.Click += new System.EventHandler(this.deleteEntryToolStripMenuItem_Click); // // editAllEntriesToolStripMenuItem // this.editAllEntriesToolStripMenuItem.Name = "editAllEntriesToolStripMenuItem"; resources.ApplyResources(this.editAllEntriesToolStripMenuItem, "editAllEntriesToolStripMenuItem"); - this.editAllEntriesToolStripMenuItem.Click += new System.EventHandler(this.editAllEntriesToolStripMenuItem_Click); // // label11 // resources.ApplyResources(this.label11, "label11"); this.label11.Name = "label11"; // - // treeViewMain - // - this.treeViewMain.AllowDrop = true; - this.treeViewMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(12)))), ((int)(((byte)(12))))); - this.treeViewMain.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.treeViewMain.ContextMenuStrip = this.contextMenuPCKEntries; - resources.ApplyResources(this.treeViewMain, "treeViewMain"); - this.treeViewMain.ForeColor = System.Drawing.Color.White; - this.treeViewMain.ImageList = this.imageList; - this.treeViewMain.LabelEdit = true; - this.treeViewMain.Name = "treeViewMain"; - this.treeViewMain.PathSeparator = "/"; - this.treeViewMain.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewMain_BeforeLabelEdit); - this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag); - this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewMain_AfterSelect); - this.treeViewMain.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewMain_NodeMouseClick); - this.treeViewMain.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragDrop); - this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter); - this.treeViewMain.DragOver += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragOver); - this.treeViewMain.DoubleClick += new System.EventHandler(this.treeViewMain_DoubleClick); - this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown); - // // contextMenuPCKEntries // this.contextMenuPCKEntries.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -698,48 +534,52 @@ namespace PckStudio.Controls resources.ApplyResources(this.addMultipleEntriesToolStripMenuItem, "addMultipleEntriesToolStripMenuItem"); this.addMultipleEntriesToolStripMenuItem.Name = "addMultipleEntriesToolStripMenuItem"; // - // LittleEndianCheckBox + // tableLayoutPanel1 // - resources.ApplyResources(this.LittleEndianCheckBox, "LittleEndianCheckBox"); - this.LittleEndianCheckBox.BackColor = System.Drawing.Color.Transparent; - this.LittleEndianCheckBox.Name = "LittleEndianCheckBox"; - this.LittleEndianCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.LittleEndianCheckBox.UseSelectable = true; + resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); + this.tableLayoutPanel1.Controls.Add(this.treeViewMain, 0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; // - // previewPictureBox + // treeViewMain // - resources.ApplyResources(this.previewPictureBox, "previewPictureBox"); - this.previewPictureBox.BackColor = System.Drawing.Color.Transparent; - this.previewPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; - this.previewPictureBox.Image = global::PckStudio.Properties.Resources.NoImageFound; - this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - this.previewPictureBox.Name = "previewPictureBox"; - this.previewPictureBox.TabStop = false; + this.treeViewMain.AllowDrop = true; + this.treeViewMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(12)))), ((int)(((byte)(12))))); + this.treeViewMain.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeViewMain.ContextMenuStrip = this.contextMenuPCKEntries; + resources.ApplyResources(this.treeViewMain, "treeViewMain"); + this.treeViewMain.ForeColor = System.Drawing.Color.White; + this.treeViewMain.HideSelection = false; + this.treeViewMain.ImageList = this.imageList; + this.treeViewMain.LabelEdit = true; + this.treeViewMain.LineColor = System.Drawing.Color.DarkGray; + this.treeViewMain.Name = "treeViewMain"; + this.treeViewMain.PathSeparator = "/"; + this.tableLayoutPanel1.SetRowSpan(this.treeViewMain, 2); + this.treeViewMain.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewMain_BeforeLabelEdit); + this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag); + this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewMain_AfterSelect); + this.treeViewMain.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewMain_NodeMouseClick); + this.treeViewMain.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragDrop); + this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter); + this.treeViewMain.DragOver += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragOver); + this.treeViewMain.DoubleClick += new System.EventHandler(this.treeViewMain_DoubleClick); + this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown); // - // PckEditor + // PckAssetBrowserEditor // this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); resources.ApplyResources(this, "$this"); - this.Controls.Add(this.previewPictureBox); - this.Controls.Add(this.LittleEndianCheckBox); this.Controls.Add(this.pckFileLabel); - this.Controls.Add(this.labelImageSize); this.Controls.Add(this.fileEntryCountLabel); - this.Controls.Add(this.PropertiesTabControl); this.Controls.Add(this.label11); - this.Controls.Add(this.treeViewMain); this.Controls.Add(logoPictureBox); + this.Controls.Add(this.tableLayoutPanel1); this.ForeColor = System.Drawing.Color.Transparent; - this.Name = "PckEditor"; + this.Name = "PckAssetBrowserEditor"; this.Load += new System.EventHandler(this.PckEditor_Load); ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).EndInit(); - this.PropertiesTabControl.ResumeLayout(false); - this.MetaTab.ResumeLayout(false); - this.MetaTab.PerformLayout(); - this.contextMenuMetaTree.ResumeLayout(false); this.contextMenuPCKEntries.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).EndInit(); + this.tableLayoutPanel1.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -748,14 +588,8 @@ namespace PckStudio.Controls #endregion private MetroFramework.Controls.MetroLabel pckFileLabel; - private MetroFramework.Controls.MetroLabel labelImageSize; private MetroFramework.Controls.MetroLabel fileEntryCountLabel; - private MetroFramework.Controls.MetroTabControl PropertiesTabControl; - private MetroFramework.Controls.MetroTabPage MetaTab; - private System.Windows.Forms.TreeView treeMeta; private MetroFramework.Controls.MetroLabel label11; - private System.Windows.Forms.TreeView treeViewMain; - private PckStudio.ToolboxItems.InterpolationPictureBox previewPictureBox; private System.Windows.Forms.ContextMenuStrip contextMenuMetaTree; private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem1; @@ -806,11 +640,7 @@ namespace PckStudio.Controls private System.Windows.Forms.ImageList imageList; private System.Windows.Forms.ToolStripMenuItem addMultipleEntriesToolStripMenuItem1; private MetroFramework.Controls.MetroLabel metroLabel2; - private MetroFramework.Controls.MetroTextBox entryTypeTextBox; - private MetroFramework.Controls.MetroTextBox entryDataTextBox; - private MetroFramework.Controls.MetroButton buttonEdit; private MetroFramework.Controls.MetroLabel metroLabel1; - private MetroFramework.Controls.MetroCheckBox LittleEndianCheckBox; private System.Windows.Forms.ToolStripMenuItem setSubPCKEndiannessToolStripMenuItem; private ToolStripMenuItem bigEndianXbox360PS3WiiUToolStripMenuItem; private ToolStripMenuItem littleEndianPS4PSVitaSwitchToolStripMenuItem; @@ -820,5 +650,7 @@ namespace PckStudio.Controls private ToolStripMenuItem version3114ToolStripMenuItem; private ToolStripSeparator toolStripSeparator5; private ToolStripSeparator toolStripSeparator6; + private TableLayoutPanel tableLayoutPanel1; + private TreeView treeViewMain; } } diff --git a/PCK-Studio/Controls/PckAssetBrowserEditor.cs b/PCK-Studio/Controls/PckAssetBrowserEditor.cs index 41a6e1fe..a754f9c7 100644 --- a/PCK-Studio/Controls/PckAssetBrowserEditor.cs +++ b/PCK-Studio/Controls/PckAssetBrowserEditor.cs @@ -74,9 +74,15 @@ namespace PckStudio.Controls private delegate void OnModifiedChangeDelegate(bool state); private OnModifiedChangeDelegate _onModifiedChangeDelegate; + private ViewPanel _currentViewPanel; + + private readonly ViewPanel _default; + private readonly ViewPanel _models; + private int _timesSaved = 0; - private readonly Dictionary> _pckAssetTypeHandler; + private readonly IDictionary> _pckAssetTypeHandler; + //private readonly IDictionary _viewPanels; public PckAssetBrowserEditor(PackInfo packInfo, ISaveContext saveContext) : base(packInfo, saveContext) @@ -86,9 +92,20 @@ namespace PckStudio.Controls _originalEndianness = packInfo.ByteOrder; _currentEndianness = packInfo.ByteOrder; - LittleEndianCheckBox.Visible = packInfo.AllowByteOrderSwap; + //! InitializeViewPanels + { + _default = new DefaultPanel(); + _models = new ModelsPanel(TryGet.FromDelegate((string path, out Image img) => + { + bool found = EditorValue.File.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset asset) || + EditorValue.File.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out asset); + img = found ? asset.GetTexture() : default; + return found; + })); + } treeViewMain.TreeViewNodeSorter = new PckNodeSorter(); + LoadViewPanel(_default); skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckAssetType.SkinFile); capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.CapeFile); @@ -140,7 +157,20 @@ namespace PckStudio.Controls [PckAssetType.MaterialFile] = HandleMaterialFile, }; } - + + private void LoadViewPanel(ViewPanel viewPanel) + { + _currentViewPanel?.Reset(); + if (viewPanel == _currentViewPanel) + return; + if (_currentViewPanel is not null) + tableLayoutPanel1.Controls.Remove(_currentViewPanel); + viewPanel.Dock = DockStyle.Fill; + tableLayoutPanel1.SetRowSpan(viewPanel, 2); + tableLayoutPanel1.Controls.Add(viewPanel, 1, 0); + _currentViewPanel = viewPanel; + } + public new void Save() { base.Save(); @@ -216,6 +246,7 @@ namespace PckStudio.Controls Trace.TraceInformation($"[{nameof(PckAssetBrowserEditor)}:{nameof(HandleTextureFile)}] '{asset.Filename}' size is 0."); return; } + _currentViewPanel.LoadAsset(asset, () => _wasModified = true); ResourceLocation resourceLocation = ResourceLocations.GetFromPath(asset.Filename); Debug.WriteLine("Handling Resource file: " + resourceLocation?.ToString()); @@ -495,9 +526,8 @@ namespace PckStudio.Controls using CustomSkinEditor skinEditor = new CustomSkinEditor(skin, cape, saveContext, EditorValue.File.HasVerionString); if (skinEditor.ShowDialog() == DialogResult.OK) { - entryDataTextBox.Text = entryTypeTextBox.Text = string.Empty; _wasModified = true; - ReloadMetaTreeView(); + _currentViewPanel.LoadAsset(asset, () => _wasModified = true); } } @@ -593,8 +623,7 @@ namespace PckStudio.Controls { // In case the Rename function was just used and the selected node name no longer matches the file name string selectedNodeText = treeViewMain.SelectedNode is TreeNode node ? node.FullPath : string.Empty; - previewPictureBox.Image = Resources.NoImageFound; - treeMeta.Nodes.Clear(); + _currentViewPanel.Reset(); treeViewMain.Nodes.Clear(); BuildPckTreeView(treeViewMain.Nodes, EditorValue.File); treeViewMain.Sort(); @@ -685,19 +714,6 @@ namespace PckStudio.Controls return false; } - private void ReloadMetaTreeView() - { - treeMeta.Nodes.Clear(); - if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckAsset asset) - { - foreach (KeyValuePair property in asset.GetProperties()) - { - treeMeta.Nodes.Add(CreateNode(property.Key, property)); - } - } - } - private void UpdateRichPresence() { if (EditorValue is not null && @@ -712,10 +728,10 @@ namespace PckStudio.Controls RPC.SetPresence("An Open Source .PCK File Editor"); } - private static PckAsset CreateNewAudioAsset(bool isLittle, PckAudioFile audioFile) + private static PckAsset CreateNewAudioAsset(OMI.ByteOrder byteOrder, PckAudioFile audioFile) { PckAsset newAsset = new PckAsset("audio.pck", PckAssetType.AudioFile); - newAsset.SetData(new PckAudioFileWriter(audioFile, isLittle ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + newAsset.SetData(new PckAudioFileWriter(audioFile, byteOrder)); return newAsset; } @@ -846,10 +862,6 @@ namespace PckStudio.Controls folderNamePrompt.OKButtonText = "Add"; if (folderNamePrompt.ShowDialog(this) == DialogResult.OK) { - TreeNode folerNode = CreateNode(folderNamePrompt.NewText); - folerNode.ImageIndex = 0; - folerNode.SelectedImageIndex = 0; - TreeNodeCollection nodeCollection = treeViewMain.Nodes; if (treeViewMain.SelectedNode is TreeNode node) { @@ -865,7 +877,9 @@ namespace PckStudio.Controls else nodeCollection = node.Nodes; } - nodeCollection.Add(folerNode); + TreeNode folerNode = nodeCollection.CreateNode(folderNamePrompt.NewText); + folerNode.ImageIndex = 0; + folerNode.SelectedImageIndex = 0; } } @@ -883,86 +897,29 @@ namespace PckStudio.Controls private void treeViewMain_AfterSelect(object sender, TreeViewEventArgs e) { - ReloadMetaTreeView(); - - entryTypeTextBox.Text = entryDataTextBox.Text = labelImageSize.Text = string.Empty; - buttonEdit.Visible = false; - - previewPictureBox.Image = Resources.NoImageFound; - viewFileInfoToolStripMenuItem.Visible = false; + _currentViewPanel.Reset(); if (!e.Node.TryGetTagData(out PckAsset asset)) { return; } + SetViewPanelFor(asset.Type); + _currentViewPanel.LoadAsset(asset, () => _wasModified = true); + viewFileInfoToolStripMenuItem.Visible = true; - if (asset.HasProperty("BOX")) + } + + private void SetViewPanelFor(PckAssetType type) => LoadViewPanel(GetViewPanel(type)); + + private ViewPanel GetViewPanel(PckAssetType type) + { + switch (type) { - buttonEdit.Text = "EDIT BOXES"; - buttonEdit.Visible = true; - } - else if (asset.HasProperty("ANIM") && - asset.GetProperty("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL))) - { - buttonEdit.Text = "View Skin"; - buttonEdit.Visible = true; - } - - switch (asset.Type) - { - case PckAssetType.SkinFile: - case PckAssetType.CapeFile: - case PckAssetType.TextureFile: - { - Image img = asset.GetTexture(); - - previewPictureBox.Image = img; - labelImageSize.Text = $"{previewPictureBox.Image.Size.Width}x{previewPictureBox.Image.Size.Height}"; - - if (asset.Type != PckAssetType.TextureFile) - break; - - ResourceLocation resourceLocation = ResourceLocations.GetFromPath(asset.Filename); - if (resourceLocation is null || resourceLocation.Category == ResourceCategory.Unknown) - break; - - if (resourceLocation.Category == ResourceCategory.ItemAnimation || - resourceLocation.Category == ResourceCategory.BlockAnimation && - !asset.IsMipmappedFile()) - { - buttonEdit.Text = "EDIT TILE ANIMATION"; - buttonEdit.Visible = true; - break; - } - - buttonEdit.Text = "EDIT TEXTURE ATLAS"; - buttonEdit.Visible = true; - } - break; - - case PckAssetType.LocalisationFile: - buttonEdit.Text = "EDIT LOC"; - buttonEdit.Visible = true; - break; - - case PckAssetType.AudioFile: - buttonEdit.Text = "EDIT MUSIC CUES"; - buttonEdit.Visible = true; - break; - - case PckAssetType.ColourTableFile when asset.Filename == "colours.col": - buttonEdit.Text = "EDIT COLORS"; - buttonEdit.Visible = true; - break; - - case PckAssetType.BehavioursFile when asset.Filename == "behaviours.bin": - buttonEdit.Text = "EDIT BEHAVIOURS"; - buttonEdit.Visible = true; - break; + case PckAssetType.ModelsFile: + return _models; default: - buttonEdit.Visible = false; - break; + return _default; } } @@ -1281,7 +1238,7 @@ namespace PckStudio.Controls PckAsset asset = EditorValue.File.CreateNewAsset(animationFilepath, PckAssetType.TextureFile); asset.SetSerializedData(newAnimation, AnimationSerializer.DefaultSerializer); BuildMainTreeView(); - ReloadMetaTreeView(); + _currentViewPanel.LoadAsset(asset, () => _wasModified = true); } } @@ -1301,11 +1258,11 @@ namespace PckStudio.Controls } PckAudioFile newAudioFile = CreateNewAudioFile(); - PckAsset newAudioAsset = CreateNewAudioAsset(LittleEndianCheckBox.Checked, newAudioFile); + PckAsset newAudioAsset = CreateNewAudioAsset(_currentEndianness, newAudioFile); ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (audioFile) => { - newAudioAsset.SetData(new PckAudioFileWriter(audioFile, LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + newAudioAsset.SetData(new PckAudioFileWriter(audioFile, _currentEndianness)); }); AudioEditor diag = new AudioEditor(newAudioFile, saveContext); @@ -1337,8 +1294,7 @@ namespace PckStudio.Controls return; } - EditorValue.File.CreateNewAsset("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), - LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + EditorValue.File.CreateNewAsset("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), _currentEndianness)); BuildMainTreeView(); } @@ -1511,10 +1467,10 @@ namespace PckStudio.Controls if (treeViewMain.SelectedNode.Tag is PckAsset asset) { MessageBox.Show( - $"Asset path: {asset.Filename}" + - $"\nAsset type: {(int)asset.Type} ({asset.Type})" + - $"\nAsset size: {asset.Size}" + - $"\nProperties count: {asset.PropertyCount}" + $"Asset path: {asset.Filename}\n" + + $"Asset type: {(int)asset.Type} ({asset.Type})\n" + + $"Asset size: {asset.Size}\n" + + $"Properties count: {asset.PropertyCount}" , Path.GetFileName(asset.Filename) + " Asset info"); } } @@ -1529,7 +1485,7 @@ namespace PckStudio.Controls if (p.Key == "BOX" || p.Key == "OFFSET") asset.SetProperty(asset.GetPropertyIndex(p), new KeyValuePair(p.Key, p.Value.Replace(',', '.'))); } - ReloadMetaTreeView(); + _currentViewPanel.LoadAsset(asset, () => _wasModified = true); _wasModified = true; } } @@ -1779,6 +1735,7 @@ namespace PckStudio.Controls { if (!BeforeFileRemove(asset) && EditorValue.File.RemoveAsset(asset)) { + _currentViewPanel.Reset(); node.Remove(); _wasModified = true; } @@ -1793,15 +1750,6 @@ namespace PckStudio.Controls } } - private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e) - { - if (e.Node is TreeNode t && t.Tag is KeyValuePair property) - { - entryTypeTextBox.Text = property.Key; - entryDataTextBox.Text = property.Value; - } - } - private void treeViewMain_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) @@ -1823,167 +1771,6 @@ namespace PckStudio.Controls e.CancelEdit = true; } - private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - IEnumerable props = asset.SerializeProperties(seperater: " "); - using (var input = new MultiTextPrompt(props)) - { - if (input.ShowDialog(this) == DialogResult.OK) - { - asset.ClearProperties(); - asset.DeserializeProperties(input.TextOutput); - ReloadMetaTreeView(); - _wasModified = true; - } - } - } - } - - private void treeMeta_DoubleClick(object sender, EventArgs e) - { - if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode node && node.Tag is PckAsset asset) - { - if (asset.HasProperty(property.Key)) - { - switch (property.Key) - { - case "ANIM" when asset.Type == PckAssetType.SkinFile: - try - { - using ANIMEditor diag = new ANIMEditor(SkinANIM.FromString(property.Value)); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); - ReloadMetaTreeView(); - _wasModified = true; - } - return; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Trace.WriteLine("Invalid ANIM value: " + property.Value); - MessageBox.Show(this, "Failed to parse ANIM value, aborting to normal functionality. Please make sure the value only includes hexadecimal characters (0-9,A-F) and has no more than 8 characters."); - } - break; - - case "BOX" when asset.Type == PckAssetType.SkinFile: - try - { - using BoxEditor diag = new BoxEditor(property.Value, false); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); - ReloadMetaTreeView(); - _wasModified = true; - } - return; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Trace.WriteLine("Invalid BOX value: " + property.Value); - MessageBox.Show(this, "Failed to parse BOX value, aborting to normal functionality."); - } - break; - - default: - break; - - } - - using (AddPropertyPrompt addProperty = new AddPropertyPrompt(property)) - { - if (addProperty.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), addProperty.Property); - ReloadMetaTreeView(); - _wasModified = true; - } - } - } - } - } - - private void treeMeta_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyData == Keys.Delete) - deleteEntryToolStripMenuItem_Click(sender, e); - } - - private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - using var input = new MultiTextPrompt(); - if (input.ShowDialog(this) == DialogResult.OK) - { - asset.DeserializeProperties(input.TextOutput); - ReloadMetaTreeView(); - _wasModified = true; - } - } - } - - private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset asset) - { - using BoxEditor diag = new BoxEditor(SkinBOX.DefaultHead, false); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty("BOX", diag.Result); - ReloadMetaTreeView(); - _wasModified = true; - } - return; - } - } - - private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty("ANIM", diag.ResultAnim); - ReloadMetaTreeView(); - _wasModified = true; - } - return; - } - } - - private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode main && main.Tag is PckAsset asset && - asset.RemoveProperty(property)) - { - treeMeta.SelectedNode.Remove(); - _wasModified = true; - } - } - - private void addEntryToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode is TreeNode t && - t.Tag is PckAsset asset) - { - using AddPropertyPrompt addProperty = new AddPropertyPrompt(); - if (addProperty.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty(addProperty.Property); - ReloadMetaTreeView(); - _wasModified = true; - } - } - } - private static bool TryGetDefaultEntityModel(string modelName, out Model model) { if (!GameModelImporter.DefaultModels.TryGetValue(modelName, out DefaultModel defaultModel) || defaultModel is null) @@ -2065,16 +1852,6 @@ namespace PckStudio.Controls UpdateRichPresence(); } - private void SetEndianess(OMI.ByteOrder endianness) - { - LittleEndianCheckBox.Checked = endianness == OMI.ByteOrder.LittleEndian; - } - - private OMI.ByteOrder GetEndianess() - { - return LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian; - } - private void buttonEdit_Click(object sender, EventArgs e) { treeViewMain_DoubleClick(sender, e); diff --git a/PCK-Studio/Controls/PckAssetBrowserEditor.resx b/PCK-Studio/Controls/PckAssetBrowserEditor.resx index 5e94f7c7..5e05c377 100644 --- a/PCK-Studio/Controls/PckAssetBrowserEditor.resx +++ b/PCK-Studio/Controls/PckAssetBrowserEditor.resx @@ -807,7 +807,7 @@ $this - 10 + 5 8, 27 @@ -828,37 +828,7 @@ $this - 4 - - - Top, Right - - - True - - - 1369, 252 - - - 30, 19 - - - 19 - - - aaa - - - labelImageSize - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 5 + 2 Top, Right @@ -885,7 +855,7 @@ $this - 6 + 3 Bottom, Right @@ -894,7 +864,7 @@ True - 204, 144 + -303, 102 0, 0 @@ -908,132 +878,6 @@ MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - MetaTab - - - 2 - - - Bottom, Right - - - - - - NoControl - - - 128, 2 - - - 15, 15 - - - 1 - - - False - - - False - - - 215, 114 - - - 146, 20 - - - 21 - - - entryTypeTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 3 - - - Bottom, Right - - - - - - NoControl - - - 128, 2 - - - 15, 15 - - - 1 - - - False - - - False - - - 215, 146 - - - 146, 20 - - - 16 - - - entryDataTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 4 - - - Bottom, Right - - - 215, 172 - - - 146, 33 - - - 20 - - - buttonEdit - - - False - - - buttonEdit - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 5 - Bottom, Right @@ -1041,7 +885,7 @@ True - 266, 37 + -241, -5 0, 0 @@ -1055,52 +899,32 @@ MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - MetaTab - - - 6 - 301, 19 - - 160, 22 + + 61, 4 - - Add Entry + + contextMenuMetaTree - - 160, 22 - - - Add BOX Entry - - - 160, 22 - - - Add ANIM Entry - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 181, 22 + 32, 19 - - Add Entry + + 32, 19 + + + 32, 19 + + + 32, 19 - 181, 22 - - - Add Multiple Entries + 32, 19 181, 22 @@ -1109,94 +933,7 @@ Delete Entry - 181, 22 - - - Edit All Entries - - - 182, 92 - - - contextMenuMetaTree - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Left - - - 5, 5 - - - 204, 229 - - - 0 - - - treeMeta - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MetaTab - - - 7 - - - 4, 38 - - - 5, 5, 5, 5 - - - 724, 239 - - - 0 - - - Properties - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - Bottom - - - 279, 270 - - - 732, 281 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 7 + 32, 19 True @@ -1223,7 +960,7 @@ $this - 8 + 4 22, 20 @@ -1624,42 +1361,12 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Left - - - 0 - 204, 20 32, 32 - - 5, 50 - - - 0 - - - 274, 501 - - - 20 - - - treeViewMain - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 9 - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -1674,69 +1381,69 @@ Add Multiple Entries - - Top, Right - - - True - - - 831, 0 - - - 173, 15 - - - 22 - - - Save as Switch/Vita/PS4 PCK - - - LittleEndianCheckBox - - - MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 3 - - - Top, Bottom, Left, Right - - - None - - - NoControl - - - 285, 50 - - - 218, 218 - - - Zoom - - - 18 - - - previewPictureBox - - - PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null - - - $this - - + 2 + + Fill + + + 0 + + + 3, 3 + + + 0 + + + 245, 495 + + + 20 + + + treeViewMain + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 0 + + + Fill + + + 5, 50 + + + 2 + + + 1006, 501 + + + 23 + + + tableLayoutPanel1 + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="treeViewMain" Row="0" RowSpan="2" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,25,Percent,75" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> + True @@ -2089,9 +1796,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - PckEditor + PckAssetBrowserEditor - PckStudio.Internal.EditorControl`1[[PckStudio.Internal.PackInfo, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null]], PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null + PckStudio.Controls.EditorControl`1[[PckStudio.Core.PackInfo, PckStudio.Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/PCK-Studio/Controls/ViewPanel.cs b/PCK-Studio/Controls/ViewPanel.cs new file mode 100644 index 00000000..16336f96 --- /dev/null +++ b/PCK-Studio/Controls/ViewPanel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using OMI.Formats.Pck; + +namespace PckStudio.Controls +{ + public class ViewPanel : UserControl + { + + public virtual void LoadAsset(PckAsset asset, Action onChange) => throw new NotImplementedException("Derived class must implement this function."); + public virtual void Reset() => throw new NotImplementedException("Derived class must implement this function."); + } +} diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs index a997d98e..3e7eabcd 100644 --- a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs @@ -66,7 +66,6 @@ namespace PckStudio.Forms.Editor base.OnLoad(e); if (DesignMode) return; - renderer3D1.Initialize(_inflateOverlayParts); renderer3D1.GuideLineColor = Color.LightCoral; skinNameLabel.Text = EditorValue.MetaData.Name; if (EditorValue.HasCape) diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index b2331079..1750519e 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -136,6 +136,12 @@ + + UserControl + + + DefaultPanel.cs + Component @@ -148,7 +154,16 @@ Form + + UserControl + + + ModelsPanel.cs + + + UserControl + UserControl @@ -399,6 +414,12 @@ + + DefaultPanel.cs + + + ModelsPanel.cs + PckAssetBrowserEditor.cs