From de84563377201677ea032ee658322da471edf02f Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Fri, 16 Aug 2019 17:18:44 -0400 Subject: [PATCH] Improve nutexb context menus --- .vs/Toolbox/v15/.suo | Bin 774144 -> 784896 bytes .../FileFormats/Texture/NUTEXB.cs | 111 ++++++++---------- .../Editors/Object Editor/ObjectEditorTree.cs | 2 +- Switch_Toolbox_Library/Toolbox.Library.dll | Bin 5081600 -> 5081600 bytes Switch_Toolbox_Library/Toolbox.Library.pdb | Bin 3667456 -> 3667456 bytes 5 files changed, 49 insertions(+), 64 deletions(-) diff --git a/.vs/Toolbox/v15/.suo b/.vs/Toolbox/v15/.suo index 5e4f5a4ba9cf141641d008456e9900f7e6a8b48d..86c30bfdbc2864b8b627c161b713a99005382557 100644 GIT binary patch delta 9097 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 diff --git a/File_Format_Library/FileFormats/Texture/NUTEXB.cs b/File_Format_Library/FileFormats/Texture/NUTEXB.cs index df8de507..b8035626 100644 --- a/File_Format_Library/FileFormats/Texture/NUTEXB.cs +++ b/File_Format_Library/FileFormats/Texture/NUTEXB.cs @@ -173,7 +173,7 @@ namespace FirstPlugin editor.LoadImage(this); } - private void UseSizeRestrictions(object sender, EventArgs args) + private void UseSizeRestrictionsAction(object sender, EventArgs args) { if (sender is STToolStripItem) { @@ -313,70 +313,57 @@ namespace FirstPlugin public override string ExportFilter => FileFilters.NUTEXB; public override string ReplaceFilter => FileFilters.NUTEXB; - private void Replace(object sender, EventArgs args) + public override void Replace(string FileName) { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = FileFilters.NUTEXB; + var bntxFile = new BNTX(); + var tex = new TextureData(); + tex.Replace(FileName, MipCount, 0, Format); - ofd.Multiselect = false; - if (ofd.ShowDialog() == DialogResult.OK) + //If it's null, the operation is cancelled + if (tex.Texture == null) + return; + + var surfacesNew = tex.GetSurfaces(); + var surfaces = GetSurfaces(); + + if (LimitFileSize) { - var bntxFile = new BNTX(); - var tex = new TextureData(); - tex.Replace(ofd.FileName, MipCount,0, Format); + if (surfaces[0].mipmaps[0].Length != surfacesNew[0].mipmaps[0].Length) + throw new Exception($"Image must be the same size! {surfaces[0].mipmaps[0].Length}"); - //If it's null, the operation is cancelled - if (tex.Texture == null) - return; + if (mipSizes[0].Length != surfacesNew[0].mipmaps.Count) + throw new Exception($"Mip map count must be the same! {mipSizes[0].Length}"); - var surfacesNew = tex.GetSurfaces(); - var surfaces = GetSurfaces(); + if (Width != tex.Texture.Width || Height != tex.Texture.Height) + throw new Exception("Image size must be the same!"); - if (LimitFileSize) - { - if (surfaces[0].mipmaps[0].Length != surfacesNew[0].mipmaps[0].Length) - throw new Exception($"Image must be the same size! {surfaces[0].mipmaps[0].Length}"); + ImageData = tex.Texture.TextureData[0][0]; - if (mipSizes[0].Length != surfacesNew[0].mipmaps.Count) - throw new Exception($"Mip map count must be the same! {mipSizes[0].Length}"); - - if (Width != tex.Texture.Width || Height != tex.Texture.Height) - throw new Exception("Image size must be the same!"); - - ImageData = tex.Texture.TextureData[0][0]; - - Width = tex.Texture.Width; - Height = tex.Texture.Height; - MipCount = tex.Texture.MipCount; - } - else - { - ImageData = tex.Texture.TextureData[0][0]; - - Width = tex.Texture.Width; - Height = tex.Texture.Height; - MipCount = tex.Texture.MipCount; - - Format = tex.Format; - NutFormat = ConvertGenericToNutFormat(tex.Format); - - mipSizes = TegraX1Swizzle.GenerateMipSizes(tex.Format, tex.Width, tex.Height, tex.Depth, tex.ArrayCount, tex.MipCount, (uint)ImageData.Length); - } - - surfacesNew.Clear(); - surfaces.Clear(); - - UpdateEditor(); + Width = tex.Texture.Width; + Height = tex.Texture.Height; + MipCount = tex.Texture.MipCount; } + else + { + ImageData = tex.Texture.TextureData[0][0]; + + Width = tex.Texture.Width; + Height = tex.Texture.Height; + MipCount = tex.Texture.MipCount; + + Format = tex.Format; + NutFormat = ConvertGenericToNutFormat(tex.Format); + + mipSizes = TegraX1Swizzle.GenerateMipSizes(tex.Format, tex.Width, tex.Height, tex.Depth, tex.ArrayCount, tex.MipCount, (uint)ImageData.Length); + } + + surfacesNew.Clear(); + surfaces.Clear(); + + UpdateEditor(); } - - - private void Export(object sender, EventArgs args) - { - ExportImage(); - } - private void Save(object sender, EventArgs args) + private void SaveAction(object sender, EventArgs args) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = Utils.GetAllFilters(this); @@ -591,14 +578,15 @@ namespace FirstPlugin return TegraX1Swizzle.GetImageData(this, ImageData, ArrayLevel, MipLevel, 1); } ToolStripMenuItem save = new ToolStripMenuItem("Save"); - ToolStripMenuItem export = new ToolStripMenuItem("Export"); - ToolStripMenuItem replace = new ToolStripMenuItem("Replace"); ToolStripMenuItem useSizeRestrictions = new ToolStripMenuItem("UseSizeRestrictions"); public void Load(System.IO.Stream stream) { Text = FileName; CanSave = true; + CanReplace = true; + CanRename = true; + CanDelete = true; Read(new FileReader(stream)); @@ -607,18 +595,15 @@ namespace FirstPlugin useSizeRestrictions.Checked = true; - save.Click += Save; - replace.Click += Replace; - export.Click += Export; + save.Click += SaveAction; } public ToolStripItem[] GetContextMenuItems() { List Items = new List(); - Items.Add(save); Items.Add(useSizeRestrictions); - Items.Add(export); - Items.Add(replace); + Items.Add(new STToolStipMenuItem("Save", null, SaveAction, Keys.Control | Keys.S)); + Items.AddRange(base.GetContextMenuItems()); return Items.ToArray(); } diff --git a/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.cs b/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.cs index fa3b5683..da9425c6 100644 --- a/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.cs +++ b/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.cs @@ -311,7 +311,7 @@ namespace Toolbox.Library.Forms { foreach (var item in ((IContextMenuNode)e.Node).GetContextMenuItems()) { - if (item.Text != "Delete" || item.Text != "Remove") + if (item.Text != "Delete" && item.Text != "Remove") treeNodeContextMenu.Items.Add(item); } treeNodeContextMenu.Items.Add(new ToolStripMenuItem("Delete", null, DeleteAction, Keys.Control | Keys.Delete)); diff --git a/Switch_Toolbox_Library/Toolbox.Library.dll b/Switch_Toolbox_Library/Toolbox.Library.dll index 1aac9ad2ea1769764ac8f4a0b97541658cccb99b..85d7af794d458c03388dbe97b011bc1dd75b7e54 100644 GIT binary patch delta 401 zcmWN=%`bv+0KoC5Je3ljL`dG>qQXOY@>X8UThpBS3*1`fFUa9pX1`en8|U1uiyoVU zql>MJ3unw+8fJ6!{cNB7dBvP(@kFkkeqSC7U6^!X)zF6#c3E>J zi{vKh*~lg~8|k?6_p4kz)T;IaHF^73)PB^;TOkv1 zv4w87vW*_LvxA-VvWq@;vxmLxV?PHt$RQ4MgroFxjN=S2$Pgzu$tkLw<_yD(aF!aQ zoZ~zfxX2~O80RuqxXLxIbAt&cxydbVbBDV|CXy;^vT{~?x^QMwVI}eM^||jY?v4;nSm+5;Gj z3v_l`8Vd_Azzs|+`Cjs}w{NB_ukzAOIg!5*x-ja(q>CC|NV+iV!tyGtk1=n^?XqMZ z%m&-Z@4MkRP%#;7L8C9HsaDpqjyBfQ&IUT@ENQCz|0jP$&vwhs^Y~Nd^X2mS`yiK6 zTx_J99yZZSADh|2R<_a4c6P9nUF>ELd)dc+4sehG4sn=4jxfYgj&Yn5oa7Y4R5;BD zXE@6_&U1lL#;9_UON?`wD_rFo6I|y8H@U^_Qc6h{Bhq!@v~p)pC&RMpxj%|#9Xo|R Pd0+baIV@@EWYJ#*VWfsO diff --git a/Switch_Toolbox_Library/Toolbox.Library.pdb b/Switch_Toolbox_Library/Toolbox.Library.pdb index b0a37543366986a1278f99d7cce1f6469daa2842..e32bf3e49619eb53768faea006dedabb5e8a7686 100644 GIT binary patch delta 335 zcmZ|KJxc;{0Knn9yfQ1zO3gfbw^zH;w71bkbPAkqY>$ZGK7bHt97p`On!;WP2^@s* zgvOvx;3PszgG3Mw(c;iAaBX-#z?1)YmGgfdreAAOsa* zOkxVtn87UOFpmfpu!torV+E^-VhtMBZBf~%m;e3M^qBSBjj8dXP&bi45?i)Vw~a>7 kd;ZywB}qy*zut2pv469xJ++UWZ+6(!+84HRw$nNK1+@5@_W%F@ delta 335 zcmZ|KJud@s0KnlpJ@2%K(<@ihOHo|aYhw^$l1Qz+q>&gc5{df&x6}!3^N&Rni3zcE zkTiGQeE>@>7BLWmPaqP06070)0FU$WEIYrd^5&EF^6D1FK{}k*GoR-7;ptv-tA4kB zCEr-7@{!%(*@41}a557K3L4RbX0)IcZD>aaIuS$&D!R~(9%$%A7&;>8Lq7~e zF@Qk~A%