From 21ffb891788d742057713f9f5ba297bd79b3f215 Mon Sep 17 00:00:00 2001 From: MattNL Date: Mon, 28 Nov 2022 17:54:38 -0500 Subject: [PATCH] Completed SubPCK Support (: --- PCK-Studio/MainForm.cs | 128 +++++++++++++++++++++++++++++++---------- 1 file changed, 98 insertions(+), 30 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index ddf4a56a..110805d7 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -277,7 +277,7 @@ namespace PckStudio { // In case the Rename function was just used and the selected node name no longer matches the file name string filepath = ""; - if(treeViewMain.SelectedNode != null) filepath = (treeViewMain.SelectedNode.Tag as PCKFile.FileData).filepath; + if(treeViewMain.SelectedNode != null && treeViewMain.SelectedNode.Tag is PCKFile.FileData) filepath = (treeViewMain.SelectedNode.Tag as PCKFile.FileData).filepath; treeViewMain.Nodes.Clear(); BuildPckTreeView(treeViewMain.Nodes, currentPCK); if (!String.IsNullOrEmpty(filepath)) @@ -509,6 +509,7 @@ namespace PckStudio if (ofd.ShowDialog() == DialogResult.OK) { file.SetData(File.ReadAllBytes(ofd.FileName)); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); saved = false; } return; @@ -560,7 +561,7 @@ namespace PckStudio node.Remove(); saved = false; } - if (IsSubPCKNode(path)) RebuildSubPCK(path); + if (IsSubPCKNode(path)) RebuildSubPCK(node); } private void renameFileToolStripMenuItem_Click(object sender, EventArgs e) @@ -577,7 +578,7 @@ namespace PckStudio { file.filepath = diag.NewText; } - else // folder + else if(!IsSubPCKNode(path)) // folder { currentPCK.Files.ForEach(file => { @@ -585,8 +586,18 @@ namespace PckStudio file.filepath = diag.NewText + file.filepath.Substring(node.FullPath.Length); }); } + else + { + foreach (var n in GetNodes(node.Nodes)) + { + if (n.Tag is PCKFile.FileData f && n.FullPath.StartsWith(node.FullPath)) + { + f.filepath = diag.NewText + n.FullPath.Substring(node.FullPath.Length); + } + } + } saved = false; - if (IsSubPCKNode(path)) RebuildSubPCK(path); + if (IsSubPCKNode(path)) RebuildSubPCK(node); BuildMainTreeView(); } } @@ -601,14 +612,52 @@ namespace PckStudio using (addNewSkin add = new addNewSkin(locFile)) if (add.ShowDialog() == DialogResult.OK) { + if (currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + { + TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); + if (subPCK.Nodes.ContainsKey("Skins")) add.Skin.filepath = add.Skin.filepath.Insert(0, "Skins/"); + add.Skin.filepath = add.Skin.filepath.Insert(0, "Skins.pck/"); + + TreeNode newNode = new TreeNode(Path.GetFileName(add.Skin.filepath)); + newNode.Tag = add.Skin; + setFileIcon(newNode, PCKFile.FileData.FileType.SkinFile); + + subPCK.Nodes.Add(newNode); + + RebuildSubPCK(newNode); + } + else + { + if (treeViewMain.Nodes.ContainsKey("Skins")) add.Skin.filepath = add.Skin.filepath.Insert(0, "Skins/"); // Then Skins folder + currentPCK.Files.Add(add.Skin); + } + if (add.useCape) - currentPCK.Files.Add(add.Cape); - if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) - add.Skin.filepath = $"{treeViewMain.SelectedNode.FullPath}/{add.Skin.filepath}"; - currentPCK.Files.Add(add.Skin); + { + if (currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + { + TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); + if (subPCK.Nodes.ContainsKey("Skins")) add.Cape.filepath = add.Cape.filepath.Insert(0, "Skins/"); + add.Cape.filepath = add.Cape.filepath.Insert(0, "Skins.pck/"); + + TreeNode newNode = new TreeNode(Path.GetFileName(add.Cape.filepath)); + newNode.Tag = add.Cape; + setFileIcon(newNode, PCKFile.FileData.FileType.SkinFile); + + subPCK.Nodes.Add(newNode); + + RebuildSubPCK(newNode); + } + else + { + if (treeViewMain.Nodes.ContainsKey("Skins")) add.Cape.filepath = add.Cape.filepath.Insert(0, "Skins/"); // Then Skins folder + currentPCK.Files.Add(add.Cape); + } + } + TrySetLocFile(locFile); saved = false; - BuildMainTreeView(); + //BuildMainTreeView(); } } @@ -696,32 +745,48 @@ namespace PckStudio return isSubFile; } - List GetSubPCKNodes(TreeNodeCollection children) + List GetNodes(TreeNodeCollection children) { List new_nodes = new List(); foreach(TreeNode node in children) { + new_nodes.Add(node); if (node.Nodes.Count > 0) { - // TODO: for some reason, folders aren't included when rebuilding PCKs? - new_nodes.Concat(GetSubPCKNodes(node.Nodes)); + foreach(var n in GetNodes(node.Nodes)) + { + new_nodes.Add(n); + } } - else if(node.Tag is PCKFile.FileData) new_nodes.Add(node); } return new_nodes; } - void RebuildSubPCK(string PCKPath) + TreeNode GetSubPCK(TreeNode child) + { + TreeNode parent = child; + + bool flag = false; + + while (parent.Parent != null) + { + parent = parent.Parent; + Console.WriteLine(parent.Text); + flag = parent.Tag is PCKFile.FileData f && (f.filetype is PCKFile.FileData.FileType.TexturePackInfoFile || f.filetype is PCKFile.FileData.FileType.SkinDataFile); + if (flag) break; + } + + if (!flag) return null; + else return parent; + } + + void RebuildSubPCK(TreeNode childNode) { // Support for if a file is edited within a PCK File - PCKPath = Path.GetDirectoryName(PCKPath).Replace('\\', '/'); - - Console.WriteLine(PCKPath); - - TreeNode parent = treeViewMain.Nodes.Find(Path.GetFileName(PCKPath), true).ToList().Find(t => t.Tag != null && (t.Tag as PCKFile.FileData).filepath == PCKPath); + TreeNode parent = GetSubPCK(childNode); if (parent == null) return; PCKFile.FileData parent_file = parent.Tag as PCKFile.FileData; @@ -730,11 +795,10 @@ namespace PckStudio Console.WriteLine("Rebuilding " + parent_file.filepath); PCKFile newPCKFile = new PCKFile(3); - foreach (TreeNode node in GetSubPCKNodes(parent.Nodes)) + foreach (TreeNode node in GetNodes(parent.Nodes)) { if (node.Tag is PCKFile.FileData) { - Console.WriteLine(node.FullPath); PCKFile.FileData node_file = (PCKFile.FileData)node.Tag; PCKFile.FileData new_file = new PCKFile.FileData(node_file.filepath, node_file.filetype); foreach (var prop in node_file.properties) new_file.properties.Add(prop); @@ -759,10 +823,6 @@ namespace PckStudio if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PCKFile.FileData file) { pckFileTypeHandler[file.filetype]?.Invoke(file); - if (t.FullPath.Contains(".pck")) - { - RebuildSubPCK(t.FullPath); - } } } @@ -791,7 +851,7 @@ namespace PckStudio if (diag.ShowDialog(this) == DialogResult.OK && diag.saved) { file.properties[i] = new ValueTuple("ANIM", diag.outANIM); - if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode.FullPath); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); ReloadMetaTreeView(); saved = false; } @@ -807,7 +867,7 @@ namespace PckStudio if (add.ShowDialog() == DialogResult.OK && i != -1) { file.properties[i] = new ValueTuple(add.PropertyName, add.PropertyValue); - if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode.FullPath); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); ReloadMetaTreeView(); saved = false; } @@ -854,7 +914,7 @@ namespace PckStudio else node.Parent.Nodes.Insert(node.Index + 1, newNode);//adds generated minefile node to selected folder if (!IsSubPCKNode(node.FullPath)) currentPCK.Files.Insert(node.Index + 1, mf); - else RebuildSubPCK(node.FullPath); + else RebuildSubPCK(node); } private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) @@ -864,7 +924,7 @@ namespace PckStudio file.properties.Remove(property)) { treeMeta.SelectedNode.Remove(); - if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode.FullPath); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); saved = false; } } @@ -891,7 +951,7 @@ namespace PckStudio if (add.ShowDialog() == DialogResult.OK) { file.properties.Add((add.PropertyName, add.PropertyValue)); - if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode.FullPath); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); ReloadMetaTreeView(); saved = false; } @@ -927,6 +987,9 @@ namespace PckStudio treeViewMain.SelectedNode.Remove(); } treeViewMain.SelectedNode = move; + + if (IsSubPCKNode(move.FullPath)) RebuildSubPCK(move); + BuildMainTreeView(); saved = false; } @@ -959,6 +1022,10 @@ namespace PckStudio treeViewMain.SelectedNode.Remove(); } treeViewMain.SelectedNode = move; + + if (IsSubPCKNode(move.FullPath)) RebuildSubPCK(move); + BuildMainTreeView(); + saved = false; } #region drag and drop for main tree node @@ -2924,6 +2991,7 @@ namespace PckStudio Console.WriteLine($"Setting {file.filetype} to {type}"); file.filetype = type; setFileIcon(t, type); + if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); } }