From b94ff2f149b05645c3e3bea1f9031d7829a183cd Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:10:32 +0200 Subject: [PATCH 1/5] Update CreditsForm to reflect more recent Contributors --- ...signer.cs => ContributorsForm.Designer.cs} | 96 +++++--------- PCK-Studio/Forms/ContributorsForm.cs | 44 +++++++ ...CreditsForm.resx => ContributorsForm.resx} | 9 -- PCK-Studio/Forms/CreditsForm.cs | 26 ---- PCK-Studio/Internal/ApplicationScope.cs | 13 ++ PCK-Studio/MainForm.cs | 2 +- PCK-Studio/PckStudio.csproj | 31 +++-- PCK-Studio/Properties/Resources.Designer.cs | 10 -- PCK-Studio/Properties/Resources.resx | 3 - PCK-Studio/Resources/Splash.png | Bin 137748 -> 0 bytes .../ToolboxItems/GithubUserPanel.Designer.cs | 90 +++++++++++++ PCK-Studio/ToolboxItems/GithubUserPanel.cs | 78 ++++++++++++ PCK-Studio/ToolboxItems/GithubUserPanel.resx | 120 ++++++++++++++++++ 13 files changed, 398 insertions(+), 124 deletions(-) rename PCK-Studio/Forms/{CreditsForm.Designer.cs => ContributorsForm.Designer.cs} (60%) create mode 100644 PCK-Studio/Forms/ContributorsForm.cs rename PCK-Studio/Forms/{CreditsForm.resx => ContributorsForm.resx} (99%) delete mode 100644 PCK-Studio/Forms/CreditsForm.cs delete mode 100644 PCK-Studio/Resources/Splash.png create mode 100644 PCK-Studio/ToolboxItems/GithubUserPanel.Designer.cs create mode 100644 PCK-Studio/ToolboxItems/GithubUserPanel.cs create mode 100644 PCK-Studio/ToolboxItems/GithubUserPanel.resx diff --git a/PCK-Studio/Forms/CreditsForm.Designer.cs b/PCK-Studio/Forms/ContributorsForm.Designer.cs similarity index 60% rename from PCK-Studio/Forms/CreditsForm.Designer.cs rename to PCK-Studio/Forms/ContributorsForm.Designer.cs index 97229cae..1fdb6b58 100644 --- a/PCK-Studio/Forms/CreditsForm.Designer.cs +++ b/PCK-Studio/Forms/ContributorsForm.Designer.cs @@ -1,6 +1,6 @@ namespace PckStudio.Forms { - partial class CreditsForm + partial class ContributorsForm { /// /// Required designer variable. @@ -28,88 +28,47 @@ /// private void InitializeComponent() { - System.Windows.Forms.PictureBox pictureBox1; MetroFramework.Controls.MetroLabel metroLabel1; MetroFramework.Controls.MetroLabel metroLabel2; - MetroFramework.Controls.MetroLabel metroLabel3; - MetroFramework.Controls.MetroLabel metroLabel4; MetroFramework.Controls.MetroLabel metroLabel5; MetroFramework.Controls.MetroLabel metroLabel6; - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreditsForm)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ContributorsForm)); this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); this.buildLabel = new MetroFramework.Controls.MetroLabel(); - pictureBox1 = new System.Windows.Forms.PictureBox(); + this.contributorsLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); metroLabel1 = new MetroFramework.Controls.MetroLabel(); metroLabel2 = new MetroFramework.Controls.MetroLabel(); - metroLabel3 = new MetroFramework.Controls.MetroLabel(); - metroLabel4 = new MetroFramework.Controls.MetroLabel(); metroLabel5 = new MetroFramework.Controls.MetroLabel(); metroLabel6 = new MetroFramework.Controls.MetroLabel(); - ((System.ComponentModel.ISupportInitialize)(pictureBox1)).BeginInit(); this.SuspendLayout(); // - // pictureBox1 - // - pictureBox1.BackColor = System.Drawing.Color.Transparent; - pictureBox1.Enabled = false; - pictureBox1.Image = global::PckStudio.Properties.Resources.Splash; - pictureBox1.Location = new System.Drawing.Point(4, 5); - pictureBox1.Margin = new System.Windows.Forms.Padding(0, 0, 11, 0); - pictureBox1.Name = "pictureBox1"; - pictureBox1.Size = new System.Drawing.Size(550, 293); - pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - pictureBox1.TabIndex = 0; - pictureBox1.TabStop = false; - // // metroLabel1 // metroLabel1.AutoSize = true; metroLabel1.Enabled = false; - metroLabel1.Location = new System.Drawing.Point(4, 301); + metroLabel1.Location = new System.Drawing.Point(23, 475); metroLabel1.Name = "metroLabel1"; - metroLabel1.Size = new System.Drawing.Size(250, 19); + metroLabel1.Size = new System.Drawing.Size(168, 19); metroLabel1.TabIndex = 1; - metroLabel1.Text = "Restored and maintained by PhoenixARC"; + metroLabel1.Text = "Maintained by PhoenixARC"; metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; // // metroLabel2 // metroLabel2.AutoSize = true; metroLabel2.Enabled = false; - metroLabel2.Location = new System.Drawing.Point(314, 301); + metroLabel2.Location = new System.Drawing.Point(23, 456); metroLabel2.Name = "metroLabel2"; - metroLabel2.Size = new System.Drawing.Size(269, 19); + metroLabel2.Size = new System.Drawing.Size(368, 19); metroLabel2.TabIndex = 2; - metroLabel2.Text = "Utilizing the Nobledez Website by Newagent"; + metroLabel2.Text = "Originally created and developed by jam1garner && Nobledez"; metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; // - // metroLabel3 - // - metroLabel3.AutoSize = true; - metroLabel3.Enabled = false; - metroLabel3.Location = new System.Drawing.Point(314, 339); - metroLabel3.Name = "metroLabel3"; - metroLabel3.Size = new System.Drawing.Size(212, 19); - metroLabel3.TabIndex = 3; - metroLabel3.Text = "3D skin renderer by Łukasz Rejman"; - metroLabel3.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // metroLabel4 - // - metroLabel4.AutoSize = true; - metroLabel4.Enabled = false; - metroLabel4.Location = new System.Drawing.Point(314, 320); - metroLabel4.Name = "metroLabel4"; - metroLabel4.Size = new System.Drawing.Size(199, 19); - metroLabel4.TabIndex = 4; - metroLabel4.Text = "3D renderer found by Newagent"; - metroLabel4.Theme = MetroFramework.MetroThemeStyle.Dark; - // // metroLabel5 // metroLabel5.AutoSize = true; metroLabel5.Enabled = false; - metroLabel5.Location = new System.Drawing.Point(4, 320); + metroLabel5.Location = new System.Drawing.Point(397, 456); metroLabel5.Name = "metroLabel5"; metroLabel5.Size = new System.Drawing.Size(300, 19); metroLabel5.TabIndex = 5; @@ -120,7 +79,7 @@ // metroLabel6.AutoSize = true; metroLabel6.Enabled = false; - metroLabel6.Location = new System.Drawing.Point(4, 339); + metroLabel6.Location = new System.Drawing.Point(397, 475); metroLabel6.Name = "metroLabel6"; metroLabel6.Size = new System.Drawing.Size(203, 19); metroLabel6.TabIndex = 6; @@ -132,40 +91,46 @@ this.buildLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(34)))), ((int)(((byte)(56))))); this.buildLabel.Enabled = false; this.buildLabel.ForeColor = System.Drawing.SystemColors.Control; - this.buildLabel.Location = new System.Drawing.Point(314, 30); + this.buildLabel.Location = new System.Drawing.Point(473, 6); this.buildLabel.Name = "buildLabel"; - this.buildLabel.Size = new System.Drawing.Size(212, 171); + this.buildLabel.Size = new System.Drawing.Size(212, 54); this.buildLabel.TabIndex = 7; this.buildLabel.Text = "Build Information"; this.buildLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; this.buildLabel.Theme = MetroFramework.MetroThemeStyle.Dark; this.buildLabel.WrapToLine = true; // - // CreditsForm + // contributorsLayoutPanel + // + this.contributorsLayoutPanel.AutoScroll = true; + this.contributorsLayoutPanel.Location = new System.Drawing.Point(23, 63); + this.contributorsLayoutPanel.Name = "contributorsLayoutPanel"; + this.contributorsLayoutPanel.Size = new System.Drawing.Size(684, 390); + this.contributorsLayoutPanel.TabIndex = 8; + // + // ContributorsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(585, 364); + this.ClientSize = new System.Drawing.Size(730, 500); + this.Controls.Add(this.contributorsLayoutPanel); this.Controls.Add(this.buildLabel); this.Controls.Add(metroLabel6); this.Controls.Add(metroLabel1); this.Controls.Add(metroLabel5); - this.Controls.Add(metroLabel4); - this.Controls.Add(metroLabel3); this.Controls.Add(metroLabel2); - this.Controls.Add(pictureBox1); - this.DisplayHeader = false; + this.ForeColor = System.Drawing.SystemColors.ButtonHighlight; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(730, 500); this.MinimizeBox = false; - this.Name = "CreditsForm"; - this.Padding = new System.Windows.Forms.Padding(20, 30, 20, 20); + this.MinimumSize = new System.Drawing.Size(730, 500); + this.Name = "ContributorsForm"; this.Resizable = false; this.ShadowType = MetroFramework.Forms.MetroFormShadowType.DropShadow; - this.Style = MetroFramework.MetroColorStyle.Black; - this.Text = "programInfo"; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Text = "Contributors"; this.Theme = MetroFramework.MetroThemeStyle.Dark; - ((System.ComponentModel.ISupportInitialize)(pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -175,5 +140,6 @@ private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; private MetroFramework.Controls.MetroLabel buildLabel; + private System.Windows.Forms.FlowLayoutPanel contributorsLayoutPanel; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/ContributorsForm.cs b/PCK-Studio/Forms/ContributorsForm.cs new file mode 100644 index 00000000..b4bf59ed --- /dev/null +++ b/PCK-Studio/Forms/ContributorsForm.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; +using MetroFramework.Forms; +using PckStudio.Internal; +using PckStudio.ToolboxItems; + +namespace PckStudio.Forms +{ + public partial class ContributorsForm : MetroForm + { + public ContributorsForm() + { + InitializeComponent(); +#if false + Task.Run(GetContributors); +#endif + string buildConfig = ""; +#if BETA + buildConfig = "Beta"; +#elif DEBUG + buildConfig = "Debug"; +#elif RELEASE + buildConfig = "Release"; +#else + buildConfig = "unknown"; +#endif + buildLabel.Text = $"Verion: {Application.ProductVersion}\nBuild Config: {buildConfig}\nBranch: {CommitInfo.BranchName}@{CommitInfo.CommitHash}"; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + foreach (var contributorsName in ApplicationScope.Contributors) + { + if (InvokeRequired) + Invoke(() => contributorsLayoutPanel.Controls.Add(new GithubUserPanel(contributorsName))); + else + contributorsLayoutPanel.Controls.Add(new GithubUserPanel(contributorsName)); + } + } + } +} diff --git a/PCK-Studio/Forms/CreditsForm.resx b/PCK-Studio/Forms/ContributorsForm.resx similarity index 99% rename from PCK-Studio/Forms/CreditsForm.resx rename to PCK-Studio/Forms/ContributorsForm.resx index b7a2f32a..70546ba1 100644 --- a/PCK-Studio/Forms/CreditsForm.resx +++ b/PCK-Studio/Forms/ContributorsForm.resx @@ -117,21 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - False False - - False - - - False - False diff --git a/PCK-Studio/Forms/CreditsForm.cs b/PCK-Studio/Forms/CreditsForm.cs deleted file mode 100644 index df2c386c..00000000 --- a/PCK-Studio/Forms/CreditsForm.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Windows.Forms; -using MetroFramework.Forms; -using PckStudio.Internal; - -namespace PckStudio.Forms -{ - public partial class CreditsForm : MetroForm - { - public CreditsForm() - { - InitializeComponent(); - string buildConfig = ""; -#if BETA - buildConfig = "Beta"; -#elif DEBUG - buildConfig = "Debug"; -#elif RELEASE - buildConfig = "Release"; -#else - buildConfig = "unknown"; -#endif - buildLabel.Text = $"Verion: {Application.ProductVersion}\nBuild Config: {buildConfig}\nBranch: {CommitInfo.BranchName}@{CommitInfo.CommitHash}"; - } - } -} diff --git a/PCK-Studio/Internal/ApplicationScope.cs b/PCK-Studio/Internal/ApplicationScope.cs index 21ee70e9..dfa04d9f 100644 --- a/PCK-Studio/Internal/ApplicationScope.cs +++ b/PCK-Studio/Internal/ApplicationScope.cs @@ -7,6 +7,8 @@ using PckStudio.Extensions; using System.Globalization; using PckStudio.Internal.Json; using PckStudio.Internal.Misc; +using System.Threading.Tasks; +using System.Windows.Forms; namespace PckStudio.Internal { @@ -14,6 +16,8 @@ namespace PckStudio.Internal { public static FileCacher DataCacher { get; private set; } + public static Octokit.RepositoryContributor[] Contributors { get; private set; } + private static Image[] _entityImages; public static Image[] EntityImages => _entityImages; @@ -41,8 +45,17 @@ namespace PckStudio.Internal _ = Tiles.PaintingImageList; SettingsManager.Initialize(); CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + Task.Run(GetContributors); } Profiler.Stop(); } + + internal static void GetContributors() + { + var ghClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue(Application.ProductName + "Credits")); + var allContributorsAct = ghClient.Repository.GetAllContributors("PhoenixARC", "-PCK-Studio"); + allContributorsAct.Wait(); + Contributors = allContributorsAct.Result.ToArray(); + } } } \ No newline at end of file diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 5154e2de..fc4bc306 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -1703,7 +1703,7 @@ namespace PckStudio private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { - using CreditsForm info = new CreditsForm(); + using ContributorsForm info = new ContributorsForm(); info.ShowDialog(this); } diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 2332b391..95545a07 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -133,6 +133,12 @@ + + Form + + + ContributorsForm.cs + @@ -159,6 +165,12 @@ Component + + UserControl + + + GithubUserPanel.cs + Component @@ -429,14 +441,11 @@ - - Form - - - CreditsForm.cs - + + ContributorsForm.cs + CemuPanel.cs @@ -566,14 +575,14 @@ AudioEditor.cs Designer - - CreditsForm.cs - PublicResXFileCodeGenerator Designer Resources.Designer.cs + + GithubUserPanel.cs + @@ -627,7 +636,6 @@ - @@ -707,6 +715,9 @@ 13.0.3 + + 12.0.0 + 4.5.0 diff --git a/PCK-Studio/Properties/Resources.Designer.cs b/PCK-Studio/Properties/Resources.Designer.cs index cbb4dd6a..27cbbf9d 100644 --- a/PCK-Studio/Properties/Resources.Designer.cs +++ b/PCK-Studio/Properties/Resources.Designer.cs @@ -1039,16 +1039,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap Splash { - get { - object obj = ResourceManager.GetObject("Splash", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/PCK-Studio/Properties/Resources.resx b/PCK-Studio/Properties/Resources.resx index 302b7724..bc72525c 100644 --- a/PCK-Studio/Properties/Resources.resx +++ b/PCK-Studio/Properties/Resources.resx @@ -283,9 +283,6 @@ ..\Resources\atlases\explosion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\Splash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\external\WiiU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/PCK-Studio/Resources/Splash.png b/PCK-Studio/Resources/Splash.png deleted file mode 100644 index 5b1a9b1917acb06fc167cd6450ce9cbc65d12223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137748 zcmd3Nhd*0y*uG80R(r%~tF2wCD5BJ8wMG{$P0ZSR6MIB!S8J217Nz#yJF)i;f*`2W zh!yjfe&6@~AAXdJuNpa2?+`P6Ya+@NJz*9NJvN% zXsC$qytzpsOMD`Af1#yDQZmH5N!+2Ze)Rki2}yZ8;M|OoxPQ$>`>i_(2}9?<2Px9I zz>gSWkk6!tJw=b?`S|VR#qqRz^C7XAmkKR|@G)}$=xR$}(gW}{ovB++3+vRM- zr?pFMFCBLB$T@S$WG{mTWWwlU+Ns1WW-D&KtvD*4d|~f+*iu?;xON%X%F6se*xBlX z)oUxO+ILuEK0a5BW~Mx|t208uH{}_phQam!Hn7aAyKE_nGB@7;zWwR@e_O?B0r~&D z`hNQl&M!TfzS~=$P~b z>Hm&%{intM*FO*w9{o@wA0^Dj;r+?$&{fcHxE9wPGpKetyICJK{ukq%bFsPVD+S?u zC|#greJ7<|uhOmt&p)5n z+|p1wL!-G`{Sup6Y0~8Qfb{T9O`ohzl}W&d!SwrpmTK{|XK!BodbQRTLY@=17w9vS z9V6O_h~-K8`QncB^vRU1u!HC#)m}jKT!x-;OxV$iBcV(mdPY1}^#*ug-e)Gi6UO*} zyU_=tru@DBT_3(J-j|h6-OeLpr%A$!=SOcj_sW`1YW#WkN?b(Qu*x9Q))rm~T&sWV zJKWBTb)Dh=HT|J^BpLss7wg=t3jH?$#iX(6+3?+c$B zPW5Zat9uyaPw|PbUQpw0>&p5AoEe16FURQZoI02p|AHF`lvLj9VjaL+@B`02oE&jZ z4*=$#3jZizJ;2m(dhqfXTLrpfY-I!KA4*beMXUz{qmtpb{~U?E+y7kX%%M z=ED?rJ|qJ1G_`hrDC=S8o?y-*aaQ-SxC|)>7`=Mg+}tdCX+!ZLF>h@)A|js$;6Mei zrpn5b?l7&}kaiL=$s7%&#Jv`P3!A8A^xS1*rls*kNOA5r(gOPOM-Ig zO)p1yWh3uKra2}H#A||Lt+qr1Ok>>WhyO)>v~)v;>d}xf=WL+TzBWff7A$uV)2eE{ zT93_6a?P>ma|aAjBh?s~Czk6cBUFAWs2mr|Q zE2us(B_-29Z#7P&5bJV=-Rg)af$tko*yytbn202+RWlfw1TBTx=j#p7$3I zb1A*w5T$qLR$d7g&|`P`lD2b_Y!I&rpfBNl1=n1ZuR#iae!5=%yfYf3*%@(4XNo2< z-xNsz5|nr@VZs*Oc#*;xTpQ3hfmR?Kp#o459hUBZgNp6h>zBIP}Pq4 z4G6$w_B07Z#f?}9x?|$+@V~eh*t5d>T!25U=?SNSEQ$379&7}=gevG>jQG;5S@JS_n|Z4*KzRy;vDeAs zU#1yyCMU_4$jjZMa*?uq_7W_KGBws7CMYoNP*;2}kK}djd&_X|vrRmHK6;SUVc3_y z3b3{DS;<);FK~cB34o2Mcxh6ADEg4^?^VOPN%&PjH22db+xP*k6krkN#E5jCSh^oh&Z)sybPL zC%G=&pV(%Hj!6;ps0Hd_OMKjDe>CDRUnh#rlCOe~y%Co{qW?9tpf`7;ZweR(q z!*Wt*{mWg%LMBp(d<~jvRD=FSFT;D zw~)~5>}|D&2-Gy`x>I+vG@ zgfYzR;M9+~|G`{>LVsD91NT!|6Pv2l8S5k9g+j0&GF9_RL>j^ib8~ifrplo{J1Y<3 z^n7E1R;*H2Z=jZ@PwCM%hXg>F@F+dPQ9ACC95NdNO~(mlW~QZag*Dl7K2dnEF8d~( zJ~gHYG_=8FZfEn@pf&J^?c@HYU3qtWheD3)Yl{IvCtD|)PYqvAD#t{I7|CLB2G6=l ztGvkqxUeT?fvYEv&fapSXR>ZplU*!?yQ$L*S-2$Qroj5NFPR zEW9JTzi~TiFU}Esb4#mcnC#V0+vW6wX!mY!@jqS|@4>!)_?QiBwux+ctzD`C?!=RvY3!Qs zDOR|K-k|@mW7BU<*BA2$HZIS8Lbw+v6#~sR_R#kM*s!>V7DUG(r8@3@dC$18HotPx zb;$TF$|Y`1KKyrBf&UkzpqE~I0rs^fIAZnnGet$Wk~+DQh!Li^HLDqR5en3b&v#`7 zL#BkPtm=hK9zzoZLgW0L4I4&^`-l&@%<4Mg9OLC7&}m-%!VmN&iQu=w|Dg@>6FRS7 zGU`=xk}Q48IH@$z(xwV(O+z4ilb~2=k(Q=r3BtUR(u|&6oBQLrTo(G=)y#30CQ~xu z4~Hb-h#mlJ{rbZI6o-4+1B#3|CaKXgXI6^P@V^dNl245sqTF~FQgX+6)!d(H&yA|* zU6>-zx68ZXRvUn`)zVWZgW@1d6ryI_x!+tEB8l)Q*X+vi=l~e6GCK))4_ue1*m4YSRpN@%*egCl>MUgcn1q?yP zn3#X}Nrs3?^Q|38ZAI;=#NaL_n5}ekXprevjnX3a-|%dl>RUD3NPVCO2B+|y2T8m3 zSjCJ-Nmnq*z2DfzN9UC+LuY3v${-e5ToqEj^XT%^c)lKlGBIOxC=*WZK#np4`J8cP zP3O+2ltBsm*c_2o)o>3iG+lL9$2TC>~6N${BP=x8Tt{%;SqU8LMc+AGt zqb`wea42GlcV)7GEDn9cV{J0d?7*IUUlP{GlUPfO=~P&n8BkQ=j-?+%CeDW`1X4M= zNg#YQ7%F@zZ-ku(Mq#XH?rlRTFQ(K7?0Ssj92IXYZho;g7`fi6uj*!|uEl4N!aQv2 zI>)^6Y)pD>K1;O`IkNsJj?F_U*20wn-s&-yH+hZNC%t{QOW1y49qA=L@TF5!;JtB; z!zOj7(Z-t&sXA`J(qRhNZ*#JUgu`UDzw@h+4?EPi^>ta9bfIee%5o=+5ZekBj_G!y z)9hdtOYqO>*BQYGu>ZjrozyYK!4*C2s0dAzPfDP43=9(LO}r?30SvT98R$uf-Fv#a zSE$X{Fdfn6%&7dm6B?}RHZ1G$Ekv+3v*}<=r_@wBklo^xB4$=Sq2CxfCN*zpQQq(; zN#A};^_EBE)-5nh+GpXl;d@W6vlyktQVEP3$o`VGMkJ{EjNuFc*|nNaHj*gaZ>6 zu{N@NYG2xXWY^`fzTq-1|Dm9WC*EL496MPp?Yq0wZqew4^P}?QSLc9hHM<&mF=5Bo zZXY9xN?T6Tb8-ZSQlJb1yE4I1^Gp-0TGWR>=nt&9u^YCWKT)Plpa^#y+jY^UI^IZk zZ-qH1`A`@@z!^*^{M<_wAV&KKijX#B11f0qMJj(^y;@4HhP*B+thSIE?pYg_f>yG zLu8fd6An>-&QcSvTAFm*`;%@u_B@n%dPtH`)K* zs18v!|@fQk(+a9LKgb1bCEco8CvS{xEz$4n=c*NC>@C5)Z$KP zqV*AsE1$N&9|j#726-kGjU~DZOzd6k1YLQTUvS2)VWmo8qk&|Y8V2M6o6APa4lDem zi^s$uhwVa*uqqO`BJx)g1Z>Mxf)Nx3lsG?+Q4Rg%;n-Ku&yV#NypqlYlzx*;YC3Hf zm9Jg!LK$QI`NeJ?FZ%DSdbi-S$fX+M%`T5uoA%<^P5cQBt9(V2EDvl)5dcwRrRD2z`m_|L?*+$z)`S8$Vk- zZt)zkCP%o5$D~e1QA^b{#rt!f{_Zlu%Q56k?!~64UqvbyetGUob551K!@2&N0!;cg z9{1eP#I;*78DjHrb@+07_=JuIIFRQKllVHOp8_c(x^54N}@<_uuR*xpmKtBA&)cp9TAH zhG0qIKbh8rgMQT=P8px6T<*m~+;G*?;K;pZUU;-&dtD2QZ6IQoR=QM9de?5j?!ao~ zwd30>AB7lcWF*{hpDV;`)jbq$Z*!%TX>W*;uS#p_R_FL7w_aj#zB z{$YQzcq7H>dpa2A-A3PV!`k@@Ii?-^VhnmF@M-vP_8SpkHTBt~kgKssG5DaRc7T5o zYBSLh5pgs?FNcP2rx8`G?X_AeyCIAYJ}A_pX6_P{v&~QdKK#Ok^g4#bmfIexdVEi8 zi$e_3a{d`~-U(`AK~SPsg(s4f(IYgij2LZU4LZPvIwtuz3SWPn+Z&qk;-y0DuBSi- zV>-UYR}lz($gnePJ@6oPFPTg6bN|04G^D#q-3vE&pLF4+3+KL#ULZD@K+NZd5i9gj z?u}Lepz!C~`u!umApme|U0f7v0hT~C?XrtazwtETsuh+EJ(F{s>#Bbnvd0~ngEW3` zL&6}`%xfmT?%aKU+N9D?LLr(ycB#el&(z*5&Ct!*SBe6%x@QT<+Q^TrsArloP~{$; zrE`6Lgc@1=>vh2%h4EK<9MhfCxxBp5=O$(kWh?Gv;C2<@>-*)-zrvi6_)5@Or6>rW zHazk~g;5b4KAeVk`8^_ih%L|T-v9tfN`Im5wlEN5SI-+1N54AWyDG!alTld#MwOcXW=&a|@a&SQmVZ@;oAp(8;Ur zlicew&;sv$uGMf|%z+rIQ2Ug;~B-Y-|;Ug??R!JXYgQGLr<)msn64u16W9|S4 zW??qJPacTkjxg~&`yzxxMB`o2aN|*FPTrw`#`FDt0#(&uK_@0zSD^LTl51yCi1;Rm zgV&-5gDsI4jGCnab^7?Pypiw2ww^8Q#FacAj5v@!cMm9`I-31?Gdbte(fx3Xt{|u1 zfw<{FM^QvD#tmFytCG3_vQovxygU_y5@Ibwt|L)eyO>)=o8<)4fk>^rew9sEOt4RqFY?1xC#M;IJ-;>@nyA(s>MK z;HhlsSa-4#ook#?Sm#^7Ve)ZSedpef`yB87D{8Bgd7KXy$2y#AZMXYz_id7f8LL&i zN^m~-QLn6kVv^1zLt1&btg7wOp0Qg?`q$FluZFiJsiv^?LzpNeZU>x4@Hr z*^!^_*J^BRls)RpM*A``n97$)e14^WOIxu}!R=Xn@Rh@}Z?uPdiWeP{=N)$PdZJ~` zT$)FU{KySzXZIhSZ4bcWb__--7MZt-@i!R&Qz^YnD~CSg8HTqKR-!jwl>6d8fMdVyX;VKA>|#L4{*4m759$b1r9$@zyHm}k-m~u#h(@$pG zJo3oUHS$)0?nOf~Re8>rJMZ))qx*Z-+%$gN8G$izEr}b~>`ou9%?fRF1FJAaUcUC@ z_c*m6MODX)s0&_7VGFIF~>3IE~1x@WX#k_*$`P7<{>zlf|Iz0Rpiz>mBla zHae_3Aatj?OuvZKoIurj{&}MURSA!XuN^$0_Vn%V+X6^7jd0hu_bI2G6CywSep?xd z@RmeKxT!MP*a%dV-iwPDPphOi z8shdjGLQn%r6lV+S=aOO^Dm0z{s`6{wb!q)G1cEC&+4iJU7h2tz-rCuo9zM7*92=c zE}ikCBK3!qkFxz$eN|XHfQ7t1S7&IT(nA^JR-cE_*A90bo#*QevIRrI#Ke+m?chFU z1!}}pAIREw_N}>E*Ou#ni=uA?b&IPtV8H=k7<9(EC)=-U` zc^NhZyZbCa+I(`g+?!?Zf?vi4qyZqe-n>|+Gq+9X3ph7A_aCKb9o%uXTBk%^J0wOs zEp)scqO#67y_Zr<5Vq?sFE7typrL2#$?5C{vac4~Kp(X&5yhKy6~pCasR;E+h81#< ztn6b8u+vxdCF6#T@SbAb`5lyVCAT}v(b@NCiSOg>7EuhmKo;zSwb2xcOCJFC_x*L_ zK*3k2;J`gp@rT&0^RqH3d5>kz2OWPpG1HVP&fQp^6E5CsyYGf|uD;#Ivg}rdAcav0 zu!Z_kwzS*m7eVi=RQBJLnB2k2efCiGf$jrfRsJ<)0Z;D`5wLY;%|n6ch-k}3^&)@( zyMxM1AGNyew)^sjjjIsgNk|_0GKnBoRZL=gKa$b|6L7d+eBa}swyw(4AWx}J#%9y`r*x;U&loat#ygMr|r`Xy+Lj-Y@mRD}Dhc&ji3; z!bX1`o&9;7pJ4WS-8D;?mVE|yyUA<55G$8kiHjyLQ|oQtj_$iHrSAu-Nm#z@F?x+_ zFV(`%*>%D3vvhq&4JkND`RRlFNhXmAuIRELbvEGNwTqoDoFiY=>I=_A{~o~<$K7N} z!q?Se%^WfXg|5=EjVRQ{V5UrSZsL^Z5AkwXc+l znhUk_ZaU-jkLqn4IAkPMx|Vk<=_{NT6cxbwx(Dj)S<{QetWfp~uepMg@_Fw_$}vA5 zafUIIkaAKk=r4jc^=SyRB{m2AN?xycXKOF9{&_S`PO%+&(1ipBHOSV0B*=#n23NlW)hzqY_)mLNXya-n z8|w?ja+KAp37@yrv#WB(T(aL-T)DvryXV!&Gxi(j7p{0F#ZhEfI@Dph6S}7jKtL{1 zuR`a4+(Er3?0<<=2AZxF>jv!jO*gJLQHpM>H-TPxqFVwiy3G?AbKr=}CkIv^{QS}l zA8iDesi_YxLHB5*1}Hsp4LY2kVr2`P_!Cv0YXT|-*0>{1Us3*J3)hs7n}o(AS`OQ7 zR*H2Ob^?zZIXuqNwdRh4^mB9WidWc<=aKTNE2jd$YefN<0;c7-%-9~I1}2gDX|W06 zd5E)^y8H~U`;CjX2c=Ssp*6nI+@;*R57NfYw-e^6%D^+!2R(mjXpSGy9{yT?An`H+ zD-WX)jNNbI&R8MDzjx#j`Ilt|#to={e5JfS1l=lgXlg<`X)v&Z2uDmKZTW(_?5(>w zwx!0x%IUb=5E9|gNJkDjFYfvt7L$+NnDFwQru*SkD$ZKQyLh0hTm8K3_m@qyWEexI z_E7SB(|F*Gc4yTbYEMiMOM)K8E|8*FY7=RKXilU0mghhRVoZh0o@x>cVXUWnOUFee zjpbC5G5mB*O(E9OApW@Z>f&M|`qa$CSL3;h2KSiuhurfI1BO#-b5Y~Z5YW}iZKzd* zuT#NA>i9@9{RfF~MVtXIvv78Zua{xKhyDU~Y>Qt&ArjgrM~1C|UhBeV1q4^}HqZZa zWhi*d=NhWou@@=+nNs7Z)I8i;gZY|Na|!mWAZ0lo{}na@zqgYcoXac%8`UQAf+JGX z(w527Y&qj)+js!)Nwy!J-W3Jy*23wDOrV^n>UP3?Y_|X3-bdIcoGii{XwESxi82hg z5<*U$u6!j(p-FT0{J#DA&(}>Q_Ym}mv=fDE>e^6LSp5^h5rVd9Nd*z=6`dtOZ%jM- zbN6ON6Q;uAxa7mr-uxlB0VYe?6h}3c+2_EOe#M!rrbBAcynsGyCXsyR!6WhRnF(RB zc>Ft+=+wtu!?~7*hSOZFFG`6$WK~KfCaihLj}6jQcWaPMjlIH0QQ; zAiisC;Jwt~6XuOU>qjH8Y4g8c=F`p$(mv<;MyjSxQSs}R#tXwn)-F`0NO`Pf`>jr6H@8|GgBTm^{Z%lID-Bu?ME&ZOtT8GGkhHcJ^Zr?l^7IeZrF00>fiR z;SW!1%ugrA88ua$mHXSCEE#`3DV%Bn5)y%FhfJOY9Bbd2P=(}uf6=XQT^PletUfGW zMk)}G!C;zBN4E_}o=k9NF;pROb0MVnFMi?PJ#HH2KeAR4{LNZHWZvf|CMIrV#((VX z?M(w-E(1%r8vPDCmGp#_F2lyRV zdCf~1D)^mz(8Z=6d=)zYznFz*odd5hK{0`cMUbqI@fM;D;*T%tOj^aSsL#@?cG!wv zb5<#4@0o9(fv)f%tUNpXV%u78uku(1P8jGN4!Xn(L(W$?^7;KXa@?R$yI@tcmr+Ta z%8WRrrDKQd+~b0Ot&`o)_rSjYs;q4qxENNwd* zir5AN6=IsOIcF;CoeA?X=luz-65vIoN-39^7WL+4K0KSBkMCzE>kg(@J#I!V-5 zx^mQEH5M(|TJj+^)FbOw@87>q2|C9B(JxAM>u?ru4kww*1tQm)BIS(|ICeeQd>hl= zBCHk18?@U_tz{5y_=sCU@IG?#6Psv_YJO2VpJB@aQ!9v}zoQ^s!SBF^;gn5YWW$@w z!r18*%oGx#BGBi?A58&6;`TLA+Kt#Cv!D;=vXdg!F zMUq_L)p5`jlch?SbO4v*vm8Bp*A^3LI9>o8S(bSf^9ZOZ<(*`cA5;D`x0rNbe3!^# zM56cNyeFD`V-Iha8a#Bp2--Og+!0teeHdr41q!jSVXKjBUHK$ha{dc``b!Xk>@N~Y z5&P=Uitay}C(h>jfU~36w(|9vXR1!jjyGH+j?A3a@Ene^=jZhJPDh|jd^=Fx24gUQ ztIXHUnsYzdT^42polAj4_i5Y%%yRyvJJsglKe}V(q5|TcRZp13pimpab@s_-qf9X3 z^q7n;Jf$u+Am7%f{yUzkze4AJ?%~J6>1iCQcDQYKootBmNP{zCSYR>o$&xC-AAOfj7Uxu`dw>z>zQL3 z#HPx?a@fX^unqPJ_nU-vizO2J#od`hJH%nE{mwBADY2%{e*g-W0|&INln0V;rzB?!CEFp*% zxey8pdSVZ6{|CV8)sW8ZcA8LTS`Ke9w{tmfx@fe481$@+iWPOx?|1|Vj1>n=otfwi;F8QgcQS9!13+M>&IF~iAaR;=bxy2N7-^e?F;z^JJ6=H*E9~kVKdb;OXw^lUFyVhHdVJI`riz^+lX>%mS+j6kf`GN1M>LCw^4AWBolm z?Uza(*IEpYI?NrblYBt$KA0Wa#laNA&j?&$!>nLOrO^7koMxDGO}rV}=Y&fpMRCsy zWp9eK6nA-s<<4N@HEjAU7w5jliKH--L|6lB;?2=UmBZ-dxwl3f#2Wd<@D87=DtEE? zXvcNPx3bM+=?}D;s@DK~3b6;ST}Y<5hhZVL<~?MbQ-I|+?!w>pS~L%#ta~*^N&^-F z5+f6A0J+$V<|yC8b%g^n>V3GC>Y@zIL(V$JHJj_LByS}^9Rh{U{1T3h=VOFU1+qRW&2kt~gGLuTBGf`N}rx8KX_q=Ut zEu)M$Q>r7TcZQx+_DzVYI0x!@Xr`9czK=Ek&1hkwAR=ku56fT$D<}B=;+R)b#;#*; z$_t#oIbpKQZd1xyD*xDI$mI3?NnpmMQh)AWJdI@TU~^P6ejvZS*iF@g@zwEJ$Gz=m z&-u;`7}j$5_$~ZLs8D8&!xr<9a0bboA*T&rT3@KNY6t_(zM6q2>Zq%>NVczZtn5Ry zA~jZ8G(u==>wU&+oyvf3i+}BSUeA_)i172Y zw|SwenFofD&Cl%C`k&A6cKhtgW3hYJSIlpVfYDT~Pf4~&GIlz`M)5jvA`pmuP z*0A_1<{4`B!k7f)cO)#;)^gOva=Yc}(45i*CcjTA6c7T!_cbx$$8&p zcmssxO8OlzLgD^P4n5*VE@~%sZx#b589VE-c^OW2r{o`UCN#xWCvAIpBN|@P$VkPw z&q(mAKxZBb#D2|)*0lI*z7l_vi`+0fj`?LK>i}hJK6AK*3ok>5^jy3&_CyQMLInav zaUBWsJ|+m$Af=V_1z@$RIXykLt7db$yck~dGp7FBfk(2wskl9(GT7r{yb{C#Z5R8v z$~6|2v}xGjX>(wr$z9-l*(C6D5lGcz9dEF0xTRvrpT=p3O|#khA|DctN4A*5IL ziy?aX!DUW3PCO{3#(-X|zpcfcjszKLajyfzVH?PwJx+ zH)V~&P9i{LIU%aT&~)kA#1EIh(*r~7t4<^+V`C`9M%>WM?2gp0qE#%sSRV!el2x?DXUde6mU^6it-6n8c zy0pfY;N);5C~gSi?l2BkOVdW8P7n`T+KcWd^#C=NBy%KB2=Q;C(o0ACyGg-%1!`eQ zrE)}zkGmT!;f5jU{YK1U_2rSQfi@bmsGP+mYOP*)X}G{Vs` zQXmgZ1-P1T26tg`Cb^3W2BpL2bj#G&vMi5hi6NkI>t-G(yxt2C`MH4M>ao8v8JzNu zD^DDT+{ky`?%|-7|58`9@aZ3igO#!#ApO;tAXNH6FrKv22wV*it|ud}A4o+Fcx$}- zP!6as1}3#PQJI%(8_ugeCpU-z&wNkP16>@42Kgh^X2!ZTguV=CUzRD`H$iu-raQl4XL?dy9Lfe$ed#0a+gS^qivGK#4Auv4+(2T?Pm}3M+k{jJ^uaK__EDbEJpf?m|=| zH9E5n$qkbkNmAi>3^w7>`du0o$vO1opT(K zJ}*UX2u#>Z@Cm*w32rM`VoLzuXmlpp${U7*CX$$Im|uvo=O=)u;KB{>E!^BHTvm?DVCYA z`0UopW1Qg(_Qh+{hPqec5JI2f2@fmu(t<)awy7B~+jQ})TT>n zhI3$}?aU=vq|If3$H$xBSTVI<96eMod}YuCWzmQKkgnJrzE(083AJZhRCMFz0l4p3 zZkUSmTNtmJafWx3)C^=7ri;05QP|m$;(Td_GyDkEy;QlU;OGyZ4FbS z4zCp|e-oA-oj(~kOxj$mY4+sfpPgE+>R-;!(EGFkkZa#LtX(N3!%wOnf}Px)DRuMBCv#xId_-b9Am{0`rr-lhoEi;qhEmBb)UX zRmjN0V1gz3i!ELaM}GVA6>kob*wTkO%&#$k@5LdYusOckjdU z(HW}h)6p>qq4Sdk(%s)CD!}J^8P?@lk`FqgKiLMTa|aB6rst9K_~+4TVwu2orr)=3 zU}~5yHrB$%V3Hn1J-nsk74akcGV2E`uC_WhRjiL;tv0u~F2>Js*IBSi$UkS`W`>w% zpm4HU-oGY!Yc)n*Akct;qh+q@adf2H;}X=ZXQ-O(qfi%5d(V)WZ!$sp1_Cb)e(P&d3YL%Ih67#8`I;pDNYwX|JR{db#f_+5>x9%ost*bA+$L9Q z${3Vj3Hm_Muc4vgl(@L53`@by+Z_N&6R&nk4zbpwIeSBJz~N+nKpjz6g)OJjpz>KHPtYocci_Dw5FU$T1g^!qWHqD>~cjKhz22^H#Oo z`&j&NlCrn*L}O&i`<_Wg1zWEMPvDi(w|SrDx{?<{$%(;U;&R60dw?cOLDEXy}iA;L+CmPMx#U) z!OzCVW`Wq5PL&d^Z{(eG)%FkC@65IZA5h8j*p~+l5*2+z$Atz@O5OxB`CH^YJN394 zR6~NUx`&U3<>JJ6z#B-Jg5lNN6XgK*@s{EpIo`^-CA1JK!RXSV??HpntgFylhtR9~ z*oZ3TsoKQBM5gLW)!CM(N>uoiDb7*xJctRz_(xXpKW9!UyW&Rh1SE#L`}GP6pq{*2 z=g?XoeCyq05b1Z+r-GMSA2<3aH@3E(3ega)UGYw>>60mn0kJ7L^S!-KE=LwQ;a5vI z!>Bc_>nW?mnL8HRR2OH~>hJIWa${eh=f z^=uBl5Q&bfE}yw2C@FEzyu5;M;;oAHRz;6y0ko4rjA7LOn$%kMo=ns;*m4L~j>6kh?Cz$V^u3t=6l&o`G(>UB`7 zV_M$#Pz<=gGA(S<&uP(l;@NZTTdH1n_v_R5At(1H&`R?1bqoysPk&G|AO8k7Hvlm0 zt_NXb>8vap>%T@pGYr2{rX_wmfSjr^*fhPf*gu9=)8fL-&aplhE*YD3zX?4~UBBf% zY%Z|?1SB4oI5ia$q;!sieu;EqXMK)l61)aN{#(d7VTP*ab%%Lgu69?%gfmlJN-yb^ ze0d+2rJxo7HLbO;;d4>?ER`)oC!wR=wY~1sEbpP#a`02~`E}ZeYhQRYrfvh(c6#u@ zIDHV@>Bj@$?VX(+NMztRX+53p%p~zXs%fDn=FLCMixkx1%Ty^X*(evy#mr~7xJn|D z4iyh@FJhM8^}G#fP-j|*#ckti(JDbAH%Q*07*)`QK>Hu=zh{>_SCu`!wk8DXfkNRs&A(G<^Ut9@BBH$%@o zML`$UhQyTmzYTxR!#4419&~h8PX5VTynCvOJii@fl1rQ}vk zCd{wF*An@_P>daq^SdN>%a~?7@(TzkNWpd*l zXw6O8jq`5G-O1X4TB92m4@+A9*)91mCm|P;lR^6;L2k>|ptIRO5{=sx{mU*Uqzm8& z_wRc?zm@d%>(if9%*XpRHLN1K1O24TS)p-0d>C66v=g;~@%|Mr4)07lIQ*H_;Q^{v z-)^-&o6zLdTf)qm)O;dmLU!WOXsN~e+`NM0(*)yVmxmLznkvzesDBiWeP|qn^jb># zTSV~rj?H+wr4>p;Pwh*sYG~o}!+1x}&@xC%>qKXMXA$Y;7WFt$&X6&#by|zx)9_4) zI+6+3jS_zuQNj6-Kvp_hOUQmKN6cu&hLrMxKZ$ZGzDQpLdU+%138XYeF1_#LAMQw| zUi%kQFqe5w===4HzS8r)hT(v}?$e#u6o3~kx8cKZ_~3_>cG6}0fJQl|`5x4qPj+=6 z+l^P_KLZ*8Jk3)yXX|^vY#;@y2`1Oey~5TxG@gSJk{vINEy)wbV9!xX*9;cV%MTsj zOGF5n|y%?4REC zOvl|H)XTDm0$Ga{R)Eq_F_NloP<~j|pj^>iaq+S4xuXDZql4w%UHhrcRI0dn!E`oLf0jJm?u!6aKZZ>Wk!!9 zFANvFs)}N}mpn~x!#3MSjy5$Ty*(k0Sw8g%qoW3jyaTJaH@78T5iJ-Tm|&WpFFqQo z+}3kiqeVp~0=u7`I>t-#An2CWkMdl09o{f7FqCv$dX9KLzx$QD zXAUSou#Wc)qWs}1EdAT0mb4Dno}G^SsXE7)_q*m|4i_PGk4(DSQLH5XenkR)+=q756#t?5roznvaux|CgLmKGh0SzQic*}dDo}D)NvS5q)DJ=pAMYN{tMHgO zrDFT5p6S=*fy2&yd%-vMl4ra)H&jQ`Ouv}!4_x)11FFGnDsO9|b7lj(L9PegAwk-Z3>7a||?ZRC;fT`b=XX%m#vCr2IW z9}~j;U?|r*H1%eq&RM{o4`F{TVAI2oX4A^1HhuwClD0(KGye)!eK#Wn^LLk^mf-Nf z?BV_A5)~Kk>LmsXz$$G8jju!}`l3QDC)Tg2fCVa7NuR)c+gk`seMc-EO0x{74}mLg zTXBPA*E|dR%*iFLb;z;LX8tQbcYhF@D&Du-Cs_7xCmkHzFsXGGS(`_4NxdU=I5$^z zO&~tE!!!2jCnx+3Yo2hQ=et&^DZ=W@xL0{qw{nP+MC zku%kkcc2+&HV=dhPYoTNa~{9O2$}HcJZVJcYraBR8Crc@)RC9-GJ(!71`-2*yHr>4 zZ}3ca$vsM7=tP#Zvu#DDYjVju~vL^s@pSMIqk zCWHQPKPNJEl#grqTqMUXRjc9zTN2Z?MsQS&^q@6^dgnTEtVdA!_z~rw%SYP;?iFIN z?~*7ABs~07qnW^eg$z2^YH=(Q1P5(k6xY0h3-n4P_u52NY%HeOgn=Cu{CS%m0<&TA z z3MbAWYJKP6ID94j(6+_s?d0iva%Q^RhvC})@Ws-A3F)%=b&3o&2~D}Yy^WC0#85$< zWWnE&!X3Z>+ zsM%$77`26>6`R^>Qv|hZ)1v>X-I%qB9iwLK*qd09;7#8zzDI8EJ?A{X=Q(TPZW+PF z4&MOiULV>xhgQ8YT`#AhS!Cdma^BhDRJWu{^Bq;*Y+W73nJq&78(~3OdMKxH%koGm zY>%>6nKIaRm*C-5YKQPC>pp&erZCUXGLCYYqGGSGsdC^*%8>53vJQNVAfW{m@&*5u zB(={(>@`>1^3AkxW{$!_$!&ffhn+QqRiQTOm?F~GP_8^hvH?9jrTw%hljb?PBt-DD z5iLO%N82fwSNyJ~thzygQ(t0lolw^QAJ0T-^e1_I$2~Ef$;#yCeKl-7ZPCwoso&Mi zJd)U!)Mm(XM8daA|>;6sKqH- zo4Yi3Cc?%zQ5!x=vM!kQAy4H?iG;Ay@i5=*?VX(goBd{zv1yJ+26`Ku(VhUwz_9{rPm2Y!@`!-iKhIyE$5U$O^X8aUrNF~H zRL#ls`g@#^VlB((+G_K;5KO6g;E~@Hq#auSaA;fXHN0ZHbpP?1EXmzpW=v>so%X*6 z=GT}cIiK0zU7Oc0jN%)mjD%yQXYlAX39BZ$v`*%EVg$O7P`|UR#5T}uKv;-f0)Mb( zwzCSjI3LFXDZIGfKv`dzMs7(URG5~eI#ho3T09H@|2d+0HD8?k#((-C`AY5WbwJRe z2x$`5qo7gr$-lY@(~xb!x28a`0EC*Qo;( zxp#*gOhEfvJESa(67>8zcIXdYF_Sl$-2{{>0w2{wm!I?bKH~EsD;9dh134Zo zj1~Q@`C$M~wfIh@#-GjJS?CAsCJgx%=_|xzl66-gXTm>R2Fny^htGMl9d#U z{MYIP`Fl!JyQre>qdEapjd0ZxdmKRU0!kA!EaU;LT_4cK&FO-yz#;Dg_*?34aY1#K zyL?c)Sy`wVulVzi6hB}6ww~?0yW|rc5(hqbZEQNTJO%=bpu-k{{QzrF+`jYQJ?$k7 zR{(7|08&CIoHl8W6ylF=$#$ud+mg}t+WvU0NLqAl_w6H4#qZ?1Uf}jCf8)yB++Fn| zy0irHA9|0%pi1QvN2h9MeK+(kiB6rm(|$a)e!7YgcS5eA!9sPfbxf6A0%ple0Pc2q zb|H-#QfTM}REU4Dj#L=YZ~DHh$D>kTW&3rky=Z;Z=|eH&3|>R<*H@H5s2*z*=l}Q0 z9E#hYE+Pb)AmMl!I`ZCz^sJ7D2+cb)aoMDsD1UxEH1ZEt`OMw?bZK){{=H~E0_!13r+ z33en@=U|RdKEM_)e=Yi*!IbuyPyJpVU?WQt@CX@p*@wcuk^z>1?4MR%s*%z84VTY_ zJ1DC-n-$@$7R#!kTwNbX zzsYY3_p7HV0+GaP-mm zZTLVr)tRZU7`(5>j{DbydfXOQ;>glFR@$&|A5hGgZrOpo4B2xG@_U`rOh*(F%jE~O zQRF?AEh7a*>lUOEyjYCOpH?OFq+JzzmZGyCH@E)$x#QM_%mxMeA*NcdPfLQ=jDpr2 z=8kHwe&KRVM+aDS-uEj^}}{Gm!!7;eh`WBmw&#c}m#yU~GEH&1J=n-|m3r z_3`S}`J!dqrG>WUI>T1YH>XCHY4BppBp39FznHi654ssitgJX=9gBE!l?<<26Y57l zm0jI$4tl$_2piNW8NbzQr^ca6af`>0QUVzJ?!(@Q$-isIYn+9g&)B7qRET21!0J#} zYhs3iBWAYR`Vgm4{1eTjbaSf_!Ipf)?6rGG=>5|i6Ja}Ls@%_A3zk*54=5^Ja4}t{ zA_XVwJOL|kT|+Hidmj<9R30`H(E9raK6J%@tT|`bcJmI3^l+7q;}1aOJb=O?G0QBG zigoj@u+4A8+F`oAgBKSUt0yNi9Es>|8#iEfmO%a@uLF)-{sBRQMN=fS3;71zTwf&+ zbb$lP$Upw)psfzsRj>!a;kW?+f|{w8HwVO9mCr8F2~3@mHt9tzVS=zB0h|+q>{}5Y z@x=QJckXxNH&Fa)?rPzM9p0Z>{i3B`tTgV`6{_lodo{59=HC#mgF5}-ggmBt(Us&) zXov_6O{Jlk?mZ1lan$+*9V$CkU-mlr(qi3drfN?idVsc$UtDCodS$}hA`*eDxQh0| zVZ{ZFOw|ehRfY7eXcC@h#sO+Js+=68H^TE05BS9hCI^y%i$*t=TobHw^32=@&C?YK z-}^GFv?7wwrHUYl2h|C|oX$1$Y&a+rCU5@UidXvG3i8Yeo93Ig608y%!Gz-56#+rO zQt>U7BFpgJ?qKV@z{9x!%n;s9#{$c&niKS`X_?QKoQzCr+FZEykzn(27lU4kZmx1> zR5H<<5`m?-?5`Oa@}EzFYHLUom1EEwZqJtq!h6rriEDwr5B0Kvyl?_f5T6b>=8$?! z963119$q#|Xp5ssUUnB}-d`VxBfH|4A}d_)h@LukTpTWw7isE+KWT1BWvNAE+_3(( zoOhzwxws7d2F?982a3TWo$tV(Cyo*um>RrpZRw?D`=FKVULAEaAvE^iHD;{a+79_b zWk&S(-$KQE9R258k#1bZ$7U^rtKNNoJX4sJaBpH>Gpb<6N1W{ zViA<&S-FQB$iUg6zEe^k-X;EZIY$UBqWZ$pR?Vs847ZS%<8+p8!)~@e0BV%*jt%|f zN=&w>bDj?+us2INbQY9q8J~tr5C{YT--zeX0D3Q9_;M~Q$TK2sa3)+N;S!U8nK7unyaQmp3 zGwl8GV+lDqInyzFw07fKPGU?j^ldp4K4hjnv?JBW<*}MiWmiXmIy*RI9SkzVCzn9~%*k7gsW2CVS zch7K+ox7DJ6!k4)<-;uX*$`6_d%ulo`(5ANhCgGK<@`Wmn4`(jI_><#T*g?^bjd`IICf|Z%J)*$CLg!DjVW}y= zMyEqcfK}~kxDdP_6s78WtyF$$Q z0rA4YcK&x9El7`$8KxS)-jn@a^8O8QCQo#?o|nFrRoA{PGPTV4hy)Qrnof++_-vbP~SRO@i`a7+*;P#c`C63!j0NFvC1yTREIZMiO zpHN}O%vieYU=0fqe67&(>)*&hc60N7;)NpQ{0)3!_iclw-pU`$<<%@`S~^8y1Hmn80fPT8{_ zS5yG`2*mOSrD3ke9{ys`|J>h{yR`7 zmEi(;g0U1io35_;k&aZ(vefqev?6>D-a&*3q^yk-E*=)+_3^yxlj{Ib@a-nrf<1^thp!T2{NMjZnBha0 zjekoDO5u0mz^T~aQ&mgH5DZZOHYc8dllDT5gPK=-OyULtOm5jY^?KI=xwD3jy_)fF zJS`{-NIHy;il@p<)CIz8J1LJU-N+8&!b5bQ)Y7Q*k330@$^co0`^;lvqNu7?g6BV2{vY^a^tpQ__xS@t|9jz3pr4^-<{7E* z;h9|p7!&Zd?*3Bi(pl2BTm$vXgc~%tY2G40Y2xfZ-{m)yJA6JI8TPpD3?tPM0Sn5d zH;KxYeZo(*U)%XlTf)@uP19mnn&21g6xEmXtJ;+G7m5})Vc|L6L4oA&mF~82`dobn zNd1;ImrmPM`p&gwvua9jkZJfs=)jJ<%jHE^@FSGzfEL0(znhH^1HrNIyR}WwIUCSpT8Wc z*nW@lz+DJbMQmwZT)ym?vX4$k7Ty`Ck9*%p`v{RdMOpC9sl)q_=`^W*ZK`uWIfbU& z$;<^ybxJ{e?eTm5|6Gx7%_=Pg6Nt6c>=WK5>P1~bgp-L6>xxs`9vwn8JE?0|n0e*7 zL?oo$>*3qljN@u$L9-{WfV*YA&=Y3SXBQoo!OMpv0OiBE!NEacSCF?VlDEOknVps* zFRJZ<4CB?Fa0oh90OJr>ZD{~*K#Dgz2lJOM-YS{LTe00upU#Cg_2g5WL=el0Hdcw% zWM4-wJEe}=TbyR9Wiy2l;*KOL4OFHqC)1_gV0i$63$>06mVZ#Oc(pDSylCRzmEc6z zf(!UIT&R)v@5z8dFSW99QLV55B2pZ^(;(?`KkYXqB`6u2AXh(c|sDtUcp}2@eRr`}c$IR_s65ra}L)UT>U7 z=&-CeOi%sDJMdIvy?F-yZx0pl;}yB-;`S$+x;-1mp5lgOB)Lo|v*Reo6~>M@fD@Ui zQ>V%_D)ZDdFz{=Yinr5O?ye0@1Yk{;ImyLJus%kQEw$n5D$#6ZpIe|v9d zc*fUIm(Iaq*nf$U!zyWmL{(H&Ob?pmXKKx@IwHt#npi8Tw~YCql`IpBWo@m3=1DZp zMdbtNgV0{RFjt_Ret1faT|;pd|26^lwFKgF7P0dixdF$0_RFr#w>Kb4p0gy{;jQH= zq~v^-#hPM9s`$rGI{D3HeztE&u0MWQ^$iMi1| zZws@av(iX68=VCcn-S)ZZu1yPNm!lG5u*qwMFsQcAW$6O2saxsoE8gXezD-HItU#l z(j7gY#|N6b^7)T0-0JTK+$AOiG;9LyMqX4=AriPjksuAbkygHw)U$&01pZ3kt^|&A zePZ}0N0W&fb?^3>S=Y|v$~f~0{a^4`6)z0#-*CrRd0}vG3mzgA!Jv3EHu6A9+*%HR zg~~D6&p79&uj>_kD0C|F1+G~l+}D6@A3$?^gC0&&s5n~xW~T<0{n0rfpyf6}WmE^u z(5%BuUovsC3IH+4J*u#D$bbRaSXCgWKZr-K(e4~ew{@^R+3S5-n8b=UKV~0u+5Qwr z>=m<(3h*DSDz5-5!J*Hz-$&aL%r$M1&{wOzEV6s2sY_!#M#rTeysnuEUt)>}6RRy$ z;H~i-51%9RH#6&>RMcbD6f?&*q$|OS3=6VrAU2~x20djH-;3p_Sedwkrt^i&rh^v$ z%kric6|bqfmPep9V_*r6XT^MpT22l(|>xr63c9Y)tjK*aUb&E?Nmz^h*E zv+H#ie2?_MD3CLPo^owGfA;#}sXX;z4xtx95Tbl~66I(DmjkU>?yKx|Y~gI`W`HR0 z-*}su116K}Cn{U;3aX;A=V-ZjnMJa0RY*2B8x<(Q?qxHS@^rUNKKr>z{g1H4v}V?@ zt`d6bCB6Q7UyFj?jQ>UtTw?>hVJ1Cn)6S^x zZ1kxf?skJ_IolwnCWy#q-asc`)*$MZT(76=vP*@>cn>N5yy`?abb=ENN(edSCURuQ zso^N3V9uu5bTi(kR-#4&S{w9`6J7`P%jNR@BTOfZerKk!@aG5Z)q>|jQZ~?;-uib| zEN978Y)UaEWP2W2d(z(3-7y_OY|pO#Q-0FqSIA%!tbE}iI=iu>z!Dd;TEzag#!G|t zOv%^!PieVJ=fqkbm@&XaJj;$-aaKUhcIMK(`!T#>vG_xOgVbC?Tf+&2dqWgcB#CA( zP#&i?gr)9O>}z0lF8kkSLoDHMD`o-znv}VsJ=$o?fPlkT%CuaEf*P#1Wj7nIabo>T z9-*qbXWx~*33Z_8%>`O74s_hh8}(1;G(VsJxET8{BF4j2Bll>TfC0ut?ezxVfekPy zdGGo-+1jrDAh>P?swhCzBq#LpK)trZg`9ykSO<|pd`2sI5*jd8K>d~Wq@>(AG1;=@X~doz(U>fx;X->Bd(Fh;+1(?9r7q%tenu5b^L z!H-XEK%4B@8hbrhPpT>}k=-9BAkL~H)L5Xau2ZIykXPo%T>zBwqrZ5+AadC<0^~~x zTEwSiy&}YGIbNPt_y;oel;V2i7N?_*SeJa<=H!E1T9${rl_ATQI~Bl%O6$(Hk&%&G z8*M6lc`u5;2+{uBBaBw|YM33>f_X{kaR1pUkg2u&{kJ2I$sbzJ_1&HgLu=S`og z*}-uoKZSiu(L2NM2huyO1$DjkC#TNWD9?)+3<4!bSia>Z#~PmiY;?*e-7a~*B_UK1 zd3nk1v)C3>UwELuU1YVHsdH=G_uks$KeX0Xfx_a`XQ%ah#~oKr>irGam5GEx6p&1a z;is?~JZHf<&%s6vY`B zk{kMd^d%nx&ek#5jb%P3^-H&KZF;_Pe-q97X$qeyr>A;5iOBF}+;wA)E& zYfI>QDphD21c{TA8%Zw*I-b7ZTiiA?Z{CyhFZ}sTT8kTYr?C1-$*U&|p((oGFW$~B z6TEM!BqSt1rwFWr^IHF#oqsr)ZpVLb?p7E#5I0ShTM%-^J`>Dd;+CyJSE|95mVj*x z%HQNl z5|)?!mm*h{2VX`Tx7-u`}W1qshE;vb-PuZOROz+CMA+JNqv zwmM(6{WtM5(&$#)=)+yp8b;nazj!vJA`!Z=yrROzOE$|K*1#MJ^3H4&7d0<20sFDLs}jh{VNAK6cb=+1hhkylk%D;9i|qckJ5w+#{$as2ggD8;O+8=Zpyj1$s^HUNNi(pG#+wQQGji3@R{0Hx8$-+n`_*xpQKw(lLsFrg6GURvEzRAW0VB z0YB=anrDf%4oNhbb-l3-if!4fEfapF1{$cMg-bi)?WF!(xF}FB{H9>@_w%o#rlHLR zON_MMCp+?`c75v9SeJ0LetmsSL-Ap=l551bz^w}vXS*+NVb)dDokOMd+x**;)H@ zQx@-CWdqIuomuAr`KKVeNOva?>NnbSeq&>n)Bd*?UO58l-%M+5;%4PD=sp}4$g}u+ zE8ci}(=Jxz+L{d=z5IL>yCnKio%%U1cp%U_TQK<)s-#?^0Z$0Ke!|vUcPfAVJ20+a z!B-i8Z*bg*!B!nFH?&_(!@V9BfvhAn6wulBVZTUA z?3t|0;$mdDJ)04@!R#s`|A3thMvwRm>8V0X@+sE)8G29W#{UVJ@m}kq|G@%Al_&gb zA3b8fHxREdr8=NQVL>Qy3F;tj?H0>>N#7)1xz&AlmCPX|lIs$83E01TN89c@9edbM z7^y#_5Qj`Xqwe)*u@+#bc0SNJL^Ult?1m+~ZLanuYZGR5UMn)H$}oq^-Xz|L%sJ|K z*V0F(!L6H7m$BA@?W|k@u&gQ?!Pqv^G&?DiS*tB>k+~1aeOhe=jFNZ%jy!4l<8`d3h1AS*;Mq9y7h#G8)uTo&bRV7Arj7A*Z3W5C z+bFp5XS$Z;U!7C?~dNwKPpWz45j(k!>)n#EfeDR=@ z{0H$bL4Xbyed*24fLx-ZwK2-%-m|mQF-o?!i?WQ|T*W*zNkh6@85izp?|R1NQ5ji! zl#~&-8Idm&?*g&H&m^SVnyC6_k;?jKcJLW;sN#SP-K&%QNl}Kw0Er9(lC} z!k-Ns9oYJ_RExu*7~`}p#p;X$xH|s2vYBR=0kd1RI&jD+ya?}NX7JDDsXtOBRd^r~ zDFox~N$$bDC;R4``Xd3CUz}1?ZL*ll=APZJ@D3Hz@=LoivTR}$M80ylfzCg;X5>Nv zCp+Q70v?DnymIx6UHic3)Z;f-;{yfftnve{`pF+$7ev*A0Ozqziw{tDXT(%?};9 zIf&*do*AgXlRtj38X~E=_-q-qG-%nD?~p zqv4M}(-qO2G_ggIyL7MoV)Im8RY)YHQI1k_iz;vj#EL&p5;@rk6I0JX{3M8-kL1Oi z+b-rl;o0=}U$BFjwWlBfd-XhAdN#M4#50>2mmj9IGNah?(Om0-qG+8zqX1TY(z7TJ z)5^$u%1yY9heDMD`xD#zV%lwwdRc0q1|^e)LoKX*qTI-pUSGsJ5@i9>L|&NENMrL zuY`l+dYLts>N=|`H0pNg2WRWYUF{iH}1Tj9zgcTDFxhiB|tpS}PswAjO zAS!>A0NQKV!`wO^7mmwE(agFjP<5EU{G2j^WuPGeLSmsj_9jP2F8kH!#QDIfG^_TE zo^KU|vOtlM+L`?u5)Q}+nxRDql-WaIb-x4<65|xvudw*S>rDW-b-HBJSXJeWqq9@^ z?T&<)shyLAR*dZzSg!L1(OP&ZdJgW?0~APbiN_oA`o=5sZ6>%6tqpAb*mNx?>tPdr8m zhJGN_2gE_#WvJ z98iXaaBlECgNd)Zfimq85|{60S;E~#s@YNRR4N#bZDB0DOW>*M?-nRS(8g&0odg%M z;fld3X?+FRyBbWl8^4cG>XL1w8UbW&VB&3(encxT2Guw3oTgTJqFGqloCXHsVCKT6 zC$7E)3m~7F$;x-Lq`O7W9ixc$E__oOH-EAZyt!I?Moc}?O_AQQ+)9V?)Q`elURF;g z7Gs=|&`~zXL2E$erRhu|)yC)+(xY#CA634+kNFN7lj*r~>%M*kOG$;AK1kuNrjN?| zUYMiKCIoHZV)FvF*f4)o(9G-VWaEM!7bA}Ne^Y!d@6Oy?Pz&?jdF&lZoL3byz zhJf7yV)aX*g9H>F7a0{9wH$VgGE(G{!zbKagBLbX&x)skwa@AzT|~SipYf}O^_-P|0AKl?xgfB)wt{_A#e#GXQKo#twlGpa*^rMb0qf z@{+>M#lUwsM$R^KA%wS44W+C-9U`-MyNCP;8%N!<#~Qw~oM?VN0K8aBWv2>0{Y1u# z%h^!)iX3q3^7g@BK$K$9*_dI;C)W7oRU^X6kyTMz)kYF5W%%F2L)Z04xp^*t8ze7) zOkWmfqrShG?|2@IzU)=+!~Fnad$nl`kjRshlV)m;VprPoh+Lz&4$RUom%URD z=Nuupnsz(u-!l&~NbgbD!d9({A9 zWe~=WfdeKpm*qz**VWn}Lh(p3RHVw(>h1+w%3JmkDRJ(KyEMT>s9_t!JD;qOiMH{{#~5f3}v=Mn-9BSm9B z6}lI`uH1K%w8=jm6TFbJ&i^Elc!$wRQgMXQRE_%Acj$*(R&VYHcGXi7#{yx; z%hC7hd+RA5E2PI6@1#VxjB;&1Z$}a_1}ua|yqC~^%J0j-=!u+h5rLYdp*JUne?3ZB zHGNgfLYii;uz5ysK_?lh`sv%#p{Elv0KeW5oKaYbKfjgNZ(Z_9fS+t8M^?RxRG%Q{ zE#CmP9w+er)y$@VG1<5r8c5ZCqRlXyB1hRP<;n2v)g8#3&`XbOwFMMlq>Q|29l6Gh z)mt6Pd`)&sJZOa$6Zk{fjcjCQ`I-pBcv&#Jwvt6bkQflE!!j%caYCILM}|0_jc#dR z=fu6r@N~@ahH|EnRksz&6{4awVN`|!{&W5EeQva2Y*3tW57DxygsMx^9()%tALNfz zS~!APM52=3EwELzg19$gQod8Owiu?Re>i`G8-!=3nUem9Iw+c$IU7w&(mj4ihcGyk z%!91<#6Yz!V=+#r=Zk-9=0xij9$x-Sct7x+Qd*op-~ZU!^v_EoaCvx^Ti3Gpi^a$A zCGuQuEDNEY7j5^3G0{mn*oaHc-=a{0pDB<8Mh@Yr+3W*@pJJ@?755 zN3lF%B43_2DL4H2q{V<~HsIEZq^S&t=AtZ|v;b9eVW-L19QR z^IoRYgIDdGxY=hVRPnb%sq&J5f1WJ`fzhMArG6 zK!#xz9QKxz19i{{g827(1UL#H(!7#{dAz2!5=Kn^_IU3ixia^*Xr7!kE$-QZm7R&u zfoF+@P2%GRF4i89-m29-=ykJTG&)LAL;yP8=N0&y%^L+H;!qmpa93#A4c)EVAo9{w zSop%oa#9YY@GhTcBH0ActP*>EBN{#nWC@-~Ldl$c*m-5|?~KD_N%>~wib8hWsqxRa zyEaQ0mOQ_YJ=aDgxljeBKx2eD`)yjwo(nTI7`)wnnpJMzPpUH@PZY*ETeTd-*{ZCV zd2rbyTzq!1@kV?~{4B;J83CG->p!mJI>yAJxv?qjG8`Lq;(s!>qrMnk>wv`8KBKc{_1Nc<%UO<4(CyCOB!xPglI( zO%kJ^C8O2V<{ENUi@JZ!#m$iz)Vr@a7vDx6Bz<*twLp}~0FMazjE-m|lpw+%@fU8O z8k?n}7!adB8bW#1%TugI{>{5I&M6BD&E2Ar|tosLOUR&_QVNUX? gd6b3v>DaKAR2@kFoL!Q^r5>WoP}H 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%0AI;M!)bh4QIS*4zAAQqp3ftTB4M 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 CvJ8U& diff --git a/PCK-Studio/ToolboxItems/GithubUserPanel.Designer.cs b/PCK-Studio/ToolboxItems/GithubUserPanel.Designer.cs new file mode 100644 index 00000000..43aa9849 --- /dev/null +++ b/PCK-Studio/ToolboxItems/GithubUserPanel.Designer.cs @@ -0,0 +1,90 @@ +namespace PckStudio.ToolboxItems +{ + partial class GithubUserPanel + { + ///

+ /// 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.userPictureBox = new System.Windows.Forms.PictureBox(); + this.userNameLabel = new MetroFramework.Controls.MetroLabel(); + this.aboutButton = new MetroFramework.Controls.MetroButton(); + ((System.ComponentModel.ISupportInitialize)(this.userPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // userPictureBox + // + this.userPictureBox.BackColor = System.Drawing.Color.Transparent; + this.userPictureBox.Location = new System.Drawing.Point(8, 34); + this.userPictureBox.Name = "userPictureBox"; + this.userPictureBox.Size = new System.Drawing.Size(100, 100); + this.userPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.userPictureBox.TabIndex = 0; + this.userPictureBox.TabStop = false; + // + // userNameLabel + // + this.userNameLabel.FontSize = MetroFramework.MetroLabelSize.Tall; + this.userNameLabel.Location = new System.Drawing.Point(8, 6); + this.userNameLabel.Name = "userNameLabel"; + this.userNameLabel.Size = new System.Drawing.Size(100, 25); + this.userNameLabel.TabIndex = 0; + this.userNameLabel.Text = "user name"; + this.userNameLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.userNameLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // aboutButton + // + this.aboutButton.Location = new System.Drawing.Point(8, 140); + this.aboutButton.Name = "aboutButton"; + this.aboutButton.Size = new System.Drawing.Size(100, 23); + this.aboutButton.TabIndex = 0; + this.aboutButton.Text = "about button"; + this.aboutButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.aboutButton.UseSelectable = true; + // + // GithubUserPanel + // + this.Controls.Add(this.userPictureBox); + this.Controls.Add(this.aboutButton); + this.Controls.Add(this.userNameLabel); + this.MaximumSize = new System.Drawing.Size(115, 170); + this.MinimumSize = new System.Drawing.Size(115, 170); + this.Name = "GithubUserPanel"; + this.Padding = new System.Windows.Forms.Padding(5); + this.Size = new System.Drawing.Size(115, 170); + this.Theme = MetroFramework.MetroThemeStyle.Dark; + ((System.ComponentModel.ISupportInitialize)(this.userPictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox userPictureBox; + private MetroFramework.Controls.MetroLabel userNameLabel; + private MetroFramework.Controls.MetroButton aboutButton; + } +} diff --git a/PCK-Studio/ToolboxItems/GithubUserPanel.cs b/PCK-Studio/ToolboxItems/GithubUserPanel.cs new file mode 100644 index 00000000..31c026d4 --- /dev/null +++ b/PCK-Studio/ToolboxItems/GithubUserPanel.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using Octokit; +using MetroFramework.Controls; +using System.Drawing; +using System.Net; +using System.IO; +using System.Threading.Tasks; +using PckStudio.Internal; +using System.Drawing.Imaging; + +namespace PckStudio.ToolboxItems +{ + public partial class GithubUserPanel : MetroUserControl + { + private Author _contributor; + + public GithubUserPanel() + { + InitializeComponent(); + } + + public GithubUserPanel(Author contributor) : this() + { + _contributor = contributor; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + if (DesignMode) + return; + + Visible = false; + Task.Run(LoadAuthor); + } + + private void LoadAuthor() + { + string cacheKey = Convert.ToBase64String(Encoding.Default.GetBytes(_contributor.AvatarUrl)); + + if (!ApplicationScope.DataCacher.HasFileCached(cacheKey)) + { + using (WebClient webClient = new WebClient()) + { + Stream avatarImgStream = webClient.OpenRead(_contributor.AvatarUrl); + MemoryStream ms = new MemoryStream(); + new Bitmap(avatarImgStream).Save(ms, ImageFormat.Png); + avatarImgStream.Flush(); + avatarImgStream.Dispose(); + ApplicationScope.DataCacher.Cache(ms.ToArray(), cacheKey); + } + } + + Image avatarUserImg = Image.FromFile(ApplicationScope.DataCacher.GetCachedFilepath(cacheKey)); + + Action setUiElements = () => + { + userPictureBox.Image = avatarUserImg; + userNameLabel.Text = _contributor.Login; + aboutButton.Text = "Github profile"; + aboutButton.Click += (s, e) => Process.Start(_contributor.HtmlUrl); + Visible = true; + }; + + if (InvokeRequired) + { + Invoke(setUiElements); + return; + } + setUiElements(); + } + } +} diff --git a/PCK-Studio/ToolboxItems/GithubUserPanel.resx b/PCK-Studio/ToolboxItems/GithubUserPanel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/PCK-Studio/ToolboxItems/GithubUserPanel.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 From c5098bf4af30653cc7fa07d134297002042a2b81 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 21 Jun 2024 19:19:27 +0200 Subject: [PATCH 2/5] Rename every variable-/parameter-/propertyname of type PckAsset from 'file' to 'asset' --- PCK-Studio/Extensions/PckAssetExtensions.cs | 64 +-- PCK-Studio/Extensions/PckFileExtensions.cs | 6 +- PCK-Studio/Forms/Editor/AudioEditor.cs | 52 +- PCK-Studio/Forms/Editor/BehaviourEditor.cs | 10 +- PCK-Studio/Forms/Editor/COLEditor.cs | 10 +- PCK-Studio/Forms/Editor/LOCEditor.cs | 10 +- PCK-Studio/Forms/Editor/MaterialsEditor.cs | 10 +- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 16 +- .../Forms/Skins-And-Textures/AddNewSkin.cs | 40 +- .../Skins-And-Textures/AdvancedOptions.cs | 19 +- .../Forms/Skins-And-Textures/generateModel.cs | 22 +- .../Interfaces/IPckAssetDeserializer.cs | 2 +- PCK-Studio/Interfaces/IPckAssetSerializer.cs | 2 +- .../Deserializer/AnimationDeserializer.cs | 10 +- .../Deserializer/ImageDeserializer.cs | 8 +- PCK-Studio/Internal/PckNodeSorter.cs | 4 +- .../Serializer/AnimationSerializer.cs | 6 +- .../Internal/Serializer/ImageSerializer.cs | 8 +- PCK-Studio/MainForm.Designer.cs | 2 +- PCK-Studio/MainForm.cs | 537 +++++++++--------- 20 files changed, 421 insertions(+), 417 deletions(-) diff --git a/PCK-Studio/Extensions/PckAssetExtensions.cs b/PCK-Studio/Extensions/PckAssetExtensions.cs index 950d3a15..f419488b 100644 --- a/PCK-Studio/Extensions/PckAssetExtensions.cs +++ b/PCK-Studio/Extensions/PckAssetExtensions.cs @@ -19,57 +19,57 @@ namespace PckStudio.Extensions { private const string MipMap = "MipMapLevel"; - internal static Image GetTexture(this PckAsset file) + internal static Image GetTexture(this PckAsset asset) { - if (file.Type != PckAssetType.SkinFile && - file.Type != PckAssetType.CapeFile && - file.Type != PckAssetType.TextureFile) + if (asset.Type != PckAssetType.SkinFile && + asset.Type != PckAssetType.CapeFile && + asset.Type != PckAssetType.TextureFile) { - throw new Exception("File is not suitable to contain image data."); + throw new Exception("Asset is not suitable to contain image data."); } - return file.GetDeserializedData(ImageDeserializer.DefaultDeserializer); + return asset.GetDeserializedData(ImageDeserializer.DefaultDeserializer); } - internal static T GetDeserializedData(this PckAsset file, IPckAssetDeserializer deserializer) + internal static T GetDeserializedData(this PckAsset asset, IPckAssetDeserializer deserializer) { - return deserializer.Deserialize(file); + return deserializer.Deserialize(asset); } - internal static T GetData(this PckAsset file, IDataFormatReader formatReader) where T : class + internal static T GetData(this PckAsset asset, IDataFormatReader formatReader) where T : class { - using var ms = new MemoryStream(file.Data); + using var ms = new MemoryStream(asset.Data); return formatReader.FromStream(ms); } - internal static void SetSerializedData(this PckAsset file, T obj, IPckAssetSerializer serializer) + internal static void SetSerializedData(this PckAsset asset, T obj, IPckAssetSerializer serializer) { - serializer.Serialize(obj, ref file); + serializer.Serialize(obj, ref asset); } - internal static void SetData(this PckAsset file, IDataFormatWriter formatWriter) + internal static void SetData(this PckAsset asset, IDataFormatWriter formatWriter) { using (var stream = new MemoryStream()) { formatWriter.WriteToStream(stream); - file.SetData(stream.ToArray()); + asset.SetData(stream.ToArray()); } } - internal static void SetTexture(this PckAsset file, Image image) + internal static void SetTexture(this PckAsset asset, Image image) { - if (file.Type != PckAssetType.SkinFile && - file.Type != PckAssetType.CapeFile && - file.Type != PckAssetType.TextureFile) + if (asset.Type != PckAssetType.SkinFile && + asset.Type != PckAssetType.CapeFile && + asset.Type != PckAssetType.TextureFile) { - throw new Exception("File is not suitable to contain image data."); + throw new Exception("Asset is not suitable to contain image data."); } - file.SetSerializedData(image, ImageSerializer.DefaultSerializer); + asset.SetSerializedData(image, ImageSerializer.DefaultSerializer); } - internal static bool IsMipmappedFile(this PckAsset file) + internal static bool IsMipmappedFile(this PckAsset asset) { // We only want to test the file name itself. ex: "terrainMipMapLevel2" - string name = Path.GetFileNameWithoutExtension(file.Filename); + string name = Path.GetFileNameWithoutExtension(asset.Filename); // check if last character is a digit (0-9). If not return false if (!char.IsDigit(name[name.Length - 1])) @@ -81,15 +81,15 @@ namespace PckStudio.Extensions return true; } - internal static string GetNormalPath(this PckAsset file) + internal static string GetNormalPath(this PckAsset asset) { - if (!file.IsMipmappedFile()) - return file.Filename; - string ext = Path.GetExtension(file.Filename); - return file.Filename.Remove(file.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; + if (!asset.IsMipmappedFile()) + return asset.Filename; + string ext = Path.GetExtension(asset.Filename); + return asset.Filename.Remove(asset.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; } - internal static void DeserializePropertiesFromString(this PckAsset file, string serializedData) + internal static void DeserializePropertiesFromString(this PckAsset asset, string serializedData) { string[] lines = serializedData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) @@ -97,14 +97,14 @@ namespace PckStudio.Extensions int idx = line.IndexOf(' '); if (idx == -1 || line.Length - 1 == idx) continue; - file.AddProperty(line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1)); + asset.AddProperty(line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1)); } } - internal static string SerializePropertiesToString(this PckAsset file) + internal static string SerializePropertiesToString(this PckAsset asset) { - StringBuilder builder = new StringBuilder(file.PropertyCount * 20); - foreach (var property in file.GetProperties()) + StringBuilder builder = new StringBuilder(asset.PropertyCount * 20); + foreach (var property in asset.GetProperties()) { builder.AppendLine(property.Key + ": " + property.Value); } diff --git a/PCK-Studio/Extensions/PckFileExtensions.cs b/PCK-Studio/Extensions/PckFileExtensions.cs index 869b30d6..bb9386f0 100644 --- a/PCK-Studio/Extensions/PckFileExtensions.cs +++ b/PCK-Studio/Extensions/PckFileExtensions.cs @@ -22,9 +22,9 @@ namespace PckStudio.Extensions internal static PckAsset CreateNewFile(this PckFile pck, string filename, PckAssetType filetype, IDataFormatWriter writer) { - var file = pck.CreateNewFile(filename, filetype); - file.SetData(writer); - return file; + var asset = pck.CreateNewFile(filename, filetype); + asset.SetData(writer); + return asset; } } } diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index f9730a6f..693cca20 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -28,8 +28,8 @@ namespace PckStudio.Forms.Editor public partial class AudioEditor : MetroForm { public string defaultType = "yes"; - PckAudioFile audioFile = null; - PckAsset audioPCK; + PckAudioFile _audioFile = null; + PckAsset _audioAsset; bool _isLittleEndian = false; MainForm parent = null; @@ -63,7 +63,7 @@ namespace PckStudio.Forms.Editor return (PckAudioFile.AudioCategory.EAudioType)Categories.IndexOf(category); } - public AudioEditor(PckAsset file, bool isLittleEndian) + public AudioEditor(PckAsset asset, bool isLittleEndian) { InitializeComponent(); @@ -71,11 +71,11 @@ namespace PckStudio.Forms.Editor _isLittleEndian = isLittleEndian; - audioPCK = file; - using (var stream = new MemoryStream(file.Data)) + _audioAsset = asset; + using (var stream = new MemoryStream(asset.Data)) { var reader = new PckAudioFileReader(isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - audioFile = reader.FromStream(stream); + _audioFile = reader.FromStream(stream); } SetUpTree(); @@ -86,7 +86,7 @@ namespace PckStudio.Forms.Editor treeView1.BeginUpdate(); treeView1.Nodes.Clear(); - foreach (var category in audioFile.Categories) + foreach (var category in _audioFile.Categories) { // fix songs with directories using backslash instead of forward slash // Songs with a backslash instead of a forward slash would not play in RPCS3 @@ -96,7 +96,7 @@ namespace PckStudio.Forms.Editor if (category.audioType == PckAudioFile.AudioCategory.EAudioType.Creative) { if (category.Name == "include_overworld" && - audioFile.TryGetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld, out PckAudioFile.AudioCategory overworldCategory)) + _audioFile.TryGetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld, out PckAudioFile.AudioCategory overworldCategory)) { foreach (var name in category.SongNames.ToList()) { @@ -112,7 +112,7 @@ namespace PckStudio.Forms.Editor treeNode.Tag = category; treeView1.Nodes.Add(treeNode); } - playOverworldInCreative.Enabled = audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Creative); + playOverworldInCreative.Enabled = _audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Creative); treeView1.EndUpdate(); } @@ -141,15 +141,15 @@ namespace PckStudio.Forms.Editor private void addCategoryStripMenuItem_Click(object sender, EventArgs e) { - string[] available = Categories.FindAll(str => !audioFile.HasCategory(GetCategoryId(str))).ToArray(); + string[] available = Categories.FindAll(str => !_audioFile.HasCategory(GetCategoryId(str))).ToArray(); if (available.Length > 0) { using ItemSelectionPopUp add = new ItemSelectionPopUp(available); if (add.ShowDialog(this) == DialogResult.OK) - audioFile.AddCategory(GetCategoryId(add.SelectedItem)); + _audioFile.AddCategory(GetCategoryId(add.SelectedItem)); else return; - var category = audioFile.GetCategory(GetCategoryId(add.SelectedItem)); + var category = _audioFile.GetCategory(GetCategoryId(add.SelectedItem)); if (GetCategoryId(add.SelectedItem) == PckAudioFile.AudioCategory.EAudioType.Creative) { @@ -190,7 +190,7 @@ namespace PckStudio.Forms.Editor private void removeCategoryStripMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode is TreeNode main && - audioFile.RemoveCategory(GetCategoryId(treeView1.SelectedNode.Text))) + _audioFile.RemoveCategory(GetCategoryId(treeView1.SelectedNode.Text))) { if(GetCategoryId(treeView1.SelectedNode.Text) == PckAudioFile.AudioCategory.EAudioType.Creative) { @@ -360,18 +360,18 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - if (!audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Overworld) || - !audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Nether) || - !audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.End)) + if (!_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Overworld) || + !_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Nether) || + !_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.End)) { MessageBox.Show(this, "Your changes were not saved. The game will crash when loading your pack if the Overworld, Nether and End categories don't all exist with at least one valid song.", "Mandatory Categories Missing"); return; } - PckAudioFile.AudioCategory overworldCategory = audioFile.GetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); + PckAudioFile.AudioCategory overworldCategory = _audioFile.GetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); bool songs_missing = false; - foreach (var category in audioFile.Categories) + foreach (var category in _audioFile.Categories) { if (category.SongNames.Count < 1) { @@ -410,7 +410,7 @@ namespace PckStudio.Forms.Editor return; } - audioPCK.SetData(new PckAudioFileWriter(audioFile, _isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + _audioAsset.SetData(new PckAudioFileWriter(_audioFile, _isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); DialogResult = DialogResult.OK; } @@ -433,7 +433,7 @@ namespace PckStudio.Forms.Editor DialogResult dr = MessageBox.Show(this, "This will delete all unused BINKA songs in the Data directory. This cannot be undone. Are you sure you want to continue?", "Warning", MessageBoxButtons.YesNo); if (dr != DialogResult.Yes) return; var totalSongList = new List(); - foreach (string song in audioFile.Categories.SelectMany(cat => cat.SongNames)) + foreach (string song in _audioFile.Categories.SelectMany(cat => cat.SongNames)) { Console.WriteLine(song); totalSongList.Add(song); @@ -525,7 +525,7 @@ namespace PckStudio.Forms.Editor if (string.IsNullOrEmpty(ofn.FileName)) return; // Return if name is null or if the user cancels var totalSongList = new List(); - foreach (string song in audioFile.Categories.SelectMany(cat => cat.SongNames)) + foreach (string song in _audioFile.Categories.SelectMany(cat => cat.SongNames)) { totalSongList.Add(song); } @@ -573,18 +573,18 @@ namespace PckStudio.Forms.Editor { if (!(treeView1.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category)) return; - string[] available = Categories.FindAll(str => !audioFile.HasCategory(GetCategoryId(str))).ToArray(); + string[] available = Categories.FindAll(str => !_audioFile.HasCategory(GetCategoryId(str))).ToArray(); if (available.Length > 0) { using ItemSelectionPopUp add = new ItemSelectionPopUp(available); add.ButtonText = "Save"; if (add.ShowDialog(this) != DialogResult.OK) return; - audioFile.RemoveCategory(category.audioType); + _audioFile.RemoveCategory(category.audioType); - audioFile.AddCategory(category.parameterType, GetCategoryId(add.SelectedItem), category.audioType == PckAudioFile.AudioCategory.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : ""); + _audioFile.AddCategory(category.parameterType, GetCategoryId(add.SelectedItem), category.audioType == PckAudioFile.AudioCategory.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : ""); - var newCategory = audioFile.GetCategory(GetCategoryId(add.SelectedItem)); + var newCategory = _audioFile.GetCategory(GetCategoryId(add.SelectedItem)); category.SongNames.ForEach(c => newCategory.SongNames.Add(c)); @@ -603,7 +603,7 @@ namespace PckStudio.Forms.Editor if (treeView1.Nodes.Count < 1 || !parent.CreateDataFolder()) return; string musicdir = Path.Combine(parent.GetDataPath(), "Music"); Directory.CreateDirectory(musicdir); - foreach (var category in audioFile.Categories) + foreach (var category in _audioFile.Categories) { for (var i = 0; i < category.SongNames.Count; i++) // using standard for loop so the list can be modified { diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index 0dcf8099..94f22c07 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -21,7 +21,7 @@ namespace PckStudio.Forms.Editor public partial class BehaviourEditor : MetroForm { // Behaviours File Format research by Miku and MattNL - private readonly PckAsset _file; + private readonly PckAsset _asset; BehaviourFile behaviourFile; private readonly List BehaviourData = Entities.BehaviourInfos; @@ -54,15 +54,15 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public BehaviourEditor(PckAsset file) + public BehaviourEditor(PckAsset asset) { InitializeComponent(); saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - _file = file; + _asset = asset; - using (var stream = new MemoryStream(file.Data)) + using (var stream = new MemoryStream(asset.Data)) { var reader = new BehavioursReader(); behaviourFile = reader.FromStream(stream); @@ -255,7 +255,7 @@ namespace PckStudio.Forms.Editor } } - _file.SetData(new BehavioursWriter(behaviourFile)); + _asset.SetData(new BehavioursWriter(behaviourFile)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index 5c9bfb10..cf2f9bda 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -19,22 +19,22 @@ namespace PckStudio.Forms.Editor ColorContainer colourfile; string clipboard_color = "#FFFFFF"; - private readonly PckAsset _file; + private readonly PckAsset _asset; List colorCache = new List(); List waterCache = new List(); List underwaterCache = new List(); List fogCache = new List(); - public COLEditor(PckAsset file) + public COLEditor(PckAsset asset) { InitializeComponent(); saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - _file = file; + _asset = asset; - using(var stream = new MemoryStream(file.Data)) + using(var stream = new MemoryStream(asset.Data)) { var reader = new COLFileReader(); colourfile = reader.FromStream(stream); @@ -288,7 +288,7 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - _file.SetData(new COLFileWriter(colourfile)); + _asset.SetData(new COLFileWriter(colourfile)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/LOCEditor.cs b/PCK-Studio/Forms/Editor/LOCEditor.cs index b2c213f6..def6082f 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.cs @@ -19,13 +19,13 @@ namespace PckStudio.Forms.Editor { DataTable tbl; LOCFile currentLoc; - PckAsset _file; + PckAsset _asset; - public LOCEditor(PckAsset file) + public LOCEditor(PckAsset asset) { InitializeComponent(); - _file = file; - using (var ms = new MemoryStream(file.Data)) + _asset = asset; + using (var ms = new MemoryStream(asset.Data)) { var reader = new LOCFileReader(); currentLoc = reader.FromStream(ms); @@ -145,7 +145,7 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - _file.SetData(new LOCFileWriter(currentLoc, 2)); + _asset.SetData(new LOCFileWriter(currentLoc, 2)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index 2129b393..7b0cb021 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -19,7 +19,7 @@ namespace PckStudio.Forms.Editor public partial class MaterialsEditor : MetroForm { // Materials File Format research by PhoenixARC - private readonly PckAsset _file; + private readonly PckAsset _asset; MaterialContainer materialFile; private readonly List MaterialData = Entities.BehaviourInfos; @@ -64,12 +64,12 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public MaterialsEditor(PckAsset file) + public MaterialsEditor(PckAsset asset) { InitializeComponent(); - _file = file; + _asset = asset; - using (var stream = new MemoryStream(file.Data)) + using (var stream = new MemoryStream(asset.Data)) { var reader = new MaterialFileReader(); materialFile = reader.FromStream(stream); @@ -136,7 +136,7 @@ namespace PckStudio.Forms.Editor materialFile.Add(mat); } - _file.SetData(new MaterialFileWriter(materialFile)); + _asset.SetData(new MaterialFileWriter(materialFile)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index f52f8cb7..6f91c202 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -170,10 +170,10 @@ namespace PckStudio.Forms.Editor private bool AcquireColorTable(PckFile pckFile) { - if (pckFile.TryGetFile("colours.col", PckAssetType.ColourTableFile, out var colFile) && - colFile.Size > 0) + if (pckFile.TryGetFile("colours.col", PckAssetType.ColourTableFile, out var colAsset) && + colAsset.Size > 0) { - using var ms = new MemoryStream(colFile.Data); + using var ms = new MemoryStream(colAsset.Data); var reader = new COLFileReader(); _colourTable = reader.FromStream(ms); return true; @@ -243,18 +243,18 @@ namespace PckStudio.Forms.Editor if (animationButton.Enabled = _atlasType == "blocks" || _atlasType == "items") { - PckAsset animationFile; + PckAsset animationAsset; bool hasAnimation = - _pckFile.TryGetValue($"res/textures/{_atlasType}/{dataTile.Tile.InternalName}.png", PckAssetType.TextureFile, out animationFile) || - _pckFile.TryGetValue($"res/textures/{_atlasType}/{dataTile.Tile.InternalName}.tga", PckAssetType.TextureFile, out animationFile); + _pckFile.TryGetValue($"res/textures/{_atlasType}/{dataTile.Tile.InternalName}.png", PckAssetType.TextureFile, out animationAsset) || + _pckFile.TryGetValue($"res/textures/{_atlasType}/{dataTile.Tile.InternalName}.tga", PckAssetType.TextureFile, out animationAsset); animationButton.Text = hasAnimation ? "Edit Animation" : "Create Animation"; if (playAnimationsToolStripMenuItem.Checked && hasAnimation && - animationFile.Size > 0) + animationAsset.Size > 0) { - var animation = animationFile.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); + var animation = animationAsset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); selectTilePictureBox.Image = animation.CreateAnimationImage(); selectTilePictureBox.Start(); } diff --git a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs index 743e0cb2..4dc93f1e 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs @@ -17,13 +17,13 @@ namespace PckStudio.Popups { public partial class AddNewSkin : MetroFramework.Forms.MetroForm { - public PckAsset SkinFile => skin; - public PckAsset CapeFile => cape; - public bool HasCape => cape is not null; + public PckAsset SkinAsset => _skin; + public PckAsset CapeAsset => _cape; + public bool HasCape => _cape is not null; private LOCFile currentLoc; - private PckAsset skin = new PckAsset("dlcskinXYXYXYXY", PckAssetType.SkinFile); - private PckAsset cape; + private PckAsset _skin = new PckAsset("dlcskinXYXYXYXY", PckAssetType.SkinFile); + private PckAsset _cape; private SkinANIM anim = new SkinANIM(); private Random rng = new Random(); @@ -226,8 +226,8 @@ namespace PckStudio.Popups return; } capePictureBox.Image = Image.FromFile(ofd.FileName); - cape ??= new PckAsset("dlccapeXYXYXYXY", PckAssetType.CapeFile); - cape.SetData(File.ReadAllBytes(ofd.FileName)); + _cape ??= new PckAsset("dlccapeXYXYXYXY", PckAssetType.CapeFile); + _cape.SetData(File.ReadAllBytes(ofd.FileName)); contextMenuCape.Items[0].Text = "Replace"; capeLabel.Visible = false; contextMenuCape.Visible = true; @@ -243,35 +243,35 @@ namespace PckStudio.Popups return; } string skinId = _skinId.ToString("d08"); - skin.Filename = $"dlcskin{skinId}.png"; - skin.AddProperty("DISPLAYNAME", textSkinName.Text); + _skin.Filename = $"dlcskin{skinId}.png"; + _skin.AddProperty("DISPLAYNAME", textSkinName.Text); if (currentLoc is not null) { string skinDisplayNameLocKey = $"IDS_dlcskin{skinId}_DISPLAYNAME"; - skin.AddProperty("DISPLAYNAMEID", skinDisplayNameLocKey); + _skin.AddProperty("DISPLAYNAMEID", skinDisplayNameLocKey); currentLoc.AddLocKey(skinDisplayNameLocKey, textSkinName.Text); } if (!string.IsNullOrEmpty(textThemeName.Text)) { - skin.AddProperty("THEMENAME", textThemeName.Text); + _skin.AddProperty("THEMENAME", textThemeName.Text); if (currentLoc is not null) { - skin.AddProperty("THEMENAMEID", $"IDS_dlcskin{skinId}_THEMENAME"); + _skin.AddProperty("THEMENAMEID", $"IDS_dlcskin{skinId}_THEMENAME"); currentLoc.AddLocKey($"IDS_dlcskin{skinId}_THEMENAME", textThemeName.Text); } } - skin.AddProperty("ANIM", anim); - skin.AddProperty("GAME_FLAGS", "0x18"); - skin.AddProperty("FREE", "1"); + _skin.AddProperty("ANIM", anim); + _skin.AddProperty("GAME_FLAGS", "0x18"); + _skin.AddProperty("FREE", "1"); if (HasCape) { - cape.Filename = $"dlccape{skinId}.png"; - skin.AddProperty("CAPEPATH", cape.Filename); + _cape.Filename = $"dlccape{skinId}.png"; + _skin.AddProperty("CAPEPATH", _cape.Filename); } - skin.SetTexture(skinPictureBox.Image); + _skin.SetTexture(skinPictureBox.Image); DialogResult = DialogResult.OK; Close(); } @@ -288,9 +288,9 @@ namespace PckStudio.Popups if (MessageBox.Show(this, "Create your own custom skin model?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) != DialogResult.Yes) return; - skin.SetTexture(Resources.classic_template); + _skin.SetTexture(Resources.classic_template); - using generateModel generate = new generateModel(skin); + using generateModel generate = new generateModel(_skin); if (generate.ShowDialog() == DialogResult.OK) { diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index ab5f6864..82af2bd7 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -1,4 +1,5 @@ -using OMI; +using DiscordRPC; +using OMI; using OMI.Formats.Pck; using OMI.Workers.Pck; using PckStudio.Extensions; @@ -44,20 +45,20 @@ namespace PckStudio.Popups MessageBox.Show(this, "Please select a filetype before applying"); } - private void applyBulkProperties(IReadOnlyCollection files, int index) + private void applyBulkProperties(IReadOnlyCollection assets, int index) { - foreach (PckAsset file in files) + foreach (PckAsset asset in assets) { - if (file.Type == PckAssetType.TexturePackInfoFile || - file.Type == PckAssetType.SkinDataFile) + if (asset.Type == PckAssetType.TexturePackInfoFile || + asset.Type == PckAssetType.SkinDataFile) { try { var reader = new PckFileReader(_endianness); - using var ms = new MemoryStream(file.Data); + using var ms = new MemoryStream(asset.Data); PckFile subPCK = reader.FromStream(ms); applyBulkProperties(subPCK.GetFiles(), index); - file.SetData(new PckFileWriter(subPCK, _endianness)); + asset.SetData(new PckFileWriter(subPCK, _endianness)); } catch (OverflowException ex) { @@ -65,9 +66,9 @@ namespace PckStudio.Popups } } - if (index == -1 || (Enum.IsDefined(typeof(PckAssetType), index) && (int)file.Type == index)) + if (index == -1 || (Enum.IsDefined(typeof(PckAssetType), index) && (int)asset.Type == index)) { - file.AddProperty(propertyKeyTextBox.Text, propertyValueTextBox.Text); + asset.AddProperty(propertyKeyTextBox.Text, propertyValueTextBox.Text); } } diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs index 840a06c2..fea72585 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs @@ -39,7 +39,7 @@ namespace PckStudio.Forms left, } - private PckAsset _file; + private PckAsset _asset; private SkinANIM _ANIM; private static Color _backgroundColor = Color.FromArgb(0xff, 0x50, 0x50, 0x50); @@ -126,22 +126,22 @@ namespace PckStudio.Forms } } - public generateModel(PckAsset file) + public generateModel(PckAsset asset) { MessageBox.Show(this, "This feature is now considered deprecated and will no longer recieve updates. A better alternative is currently under development. Use at your own risk.", "Deprecated Feature", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); InitializeComponent(); - _file = file; - if (file.Size > 0) + _asset = asset; + if (asset.Size > 0) { - using (var ms = new MemoryStream(file.Data)) + using (var ms = new MemoryStream(asset.Data)) { uvPictureBox.Image = Image.FromStream(ms); } } comboParent.Items.Clear(); comboParent.Items.AddRange(ValidModelBoxTypes); - LoadData(file); + LoadData(asset); } private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) @@ -149,9 +149,9 @@ namespace PckStudio.Forms return sWhitespace.Replace(input, replacement); } - private void LoadData(PckAsset file) + private void LoadData(PckAsset asset) { - comboParent.Enabled = file.GetMultipleProperties("BOX").All(kv => { + comboParent.Enabled = asset.GetMultipleProperties("BOX").All(kv => { var box = SkinBOX.FromString(kv.Value); if (ValidModelBoxTypes.Contains(box.Type)) { @@ -160,7 +160,7 @@ namespace PckStudio.Forms } return false; }); - file.GetMultipleProperties("OFFSET").All(kv => { + asset.GetMultipleProperties("OFFSET").All(kv => { string[] offset = ReplaceWhitespace(kv.Value, ",").TrimEnd('\n', '\r', ' ').Split(','); if (offset.Length < 3) return false; @@ -176,7 +176,7 @@ namespace PckStudio.Forms return false; }); - _ANIM = file.GetProperty("ANIM", SkinANIM.FromString); + _ANIM = asset.GetProperty("ANIM", SkinANIM.FromString); UpdateListView(); Rerender(); } @@ -1094,7 +1094,7 @@ namespace PckStudio.Forms { foreach (var part in modelBoxes) { - _file.AddProperty("BOX", part); + _asset.AddProperty("BOX", part); } //Bitmap bitmap2 = new Bitmap(64, 64); diff --git a/PCK-Studio/Interfaces/IPckAssetDeserializer.cs b/PCK-Studio/Interfaces/IPckAssetDeserializer.cs index d016cce9..358b23c0 100644 --- a/PCK-Studio/Interfaces/IPckAssetDeserializer.cs +++ b/PCK-Studio/Interfaces/IPckAssetDeserializer.cs @@ -9,6 +9,6 @@ namespace PckStudio.Interfaces { internal interface IPckAssetDeserializer { - public T Deserialize(PckAsset file); + public T Deserialize(PckAsset asset); } } \ No newline at end of file diff --git a/PCK-Studio/Interfaces/IPckAssetSerializer.cs b/PCK-Studio/Interfaces/IPckAssetSerializer.cs index 81370be1..46cdf4e0 100644 --- a/PCK-Studio/Interfaces/IPckAssetSerializer.cs +++ b/PCK-Studio/Interfaces/IPckAssetSerializer.cs @@ -9,6 +9,6 @@ namespace PckStudio.Interfaces { internal interface IPckAssetSerializer { - public void Serialize(T obj, ref PckAsset file); + public void Serialize(T obj, ref PckAsset asset); } } diff --git a/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs b/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs index c15eee2b..fca18165 100644 --- a/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs +++ b/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs @@ -16,14 +16,14 @@ namespace PckStudio.Internal.Deserializer { public static readonly AnimationDeserializer DefaultDeserializer = new AnimationDeserializer(); - public Animation Deserialize(PckAsset file) + public Animation Deserialize(PckAsset asset) { - _ = file ?? throw new ArgumentNullException(nameof(file)); - if (file.Size > 0) + _ = asset ?? throw new ArgumentNullException(nameof(asset)); + if (asset.Size > 0) { - var texture = file.GetTexture(); + var texture = asset.GetTexture(); var frameTextures = texture.Split(ImageLayoutDirection.Vertical); - var _animation = new Animation(frameTextures, file.GetProperty("ANIM")); + var _animation = new Animation(frameTextures, asset.GetProperty("ANIM")); return _animation; } return Animation.CreateEmpty(); diff --git a/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs b/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs index 2a4d5135..eb00b243 100644 --- a/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs +++ b/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs @@ -18,19 +18,19 @@ namespace PckStudio.Internal.Deserializer public static readonly ImageDeserializer DefaultDeserializer = new ImageDeserializer(); private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb); - public Image Deserialize(PckAsset file) + public Image Deserialize(PckAsset asset) { - using var stream = new MemoryStream(file.Data); + using var stream = new MemoryStream(asset.Data); try { - if (Path.GetExtension(file.Filename) == ".tga") + if (Path.GetExtension(asset.Filename) == ".tga") return TGADeserializer.DeserializeFromStream(stream); else return Image.FromStream(stream); } catch (Exception ex) { - Trace.TraceError($"Failed to read image from pck file data({file.Filename})."); + Trace.TraceError($"Failed to read image from pck file data({asset.Filename})."); Debug.WriteLine(ex.Message); return EmptyImage; } diff --git a/PCK-Studio/Internal/PckNodeSorter.cs b/PCK-Studio/Internal/PckNodeSorter.cs index 640db7d7..af2390ad 100644 --- a/PCK-Studio/Internal/PckNodeSorter.cs +++ b/PCK-Studio/Internal/PckNodeSorter.cs @@ -15,8 +15,8 @@ namespace PckStudio.Internal private bool CheckForSkinAndCapeFiles(TreeNode node) { - return node.TryGetTagData(out PckAsset file) && - (file.Type == PckAssetType.SkinFile || file.Type == PckAssetType.CapeFile); + return node.TryGetTagData(out PckAsset asset) && + (asset.Type == PckAssetType.SkinFile || asset.Type == PckAssetType.CapeFile); } public int Compare(object x, object y) diff --git a/PCK-Studio/Internal/Serializer/AnimationSerializer.cs b/PCK-Studio/Internal/Serializer/AnimationSerializer.cs index 52010802..fd3bcb9d 100644 --- a/PCK-Studio/Internal/Serializer/AnimationSerializer.cs +++ b/PCK-Studio/Internal/Serializer/AnimationSerializer.cs @@ -17,12 +17,12 @@ namespace PckStudio.Internal.Serializer { public static readonly AnimationSerializer DefaultSerializer = new AnimationSerializer(); - public void Serialize(Animation animation, ref PckAsset file) + public void Serialize(Animation animation, ref PckAsset asset) { string anim = animation.BuildAnim(); - file.SetProperty("ANIM", anim); + asset.SetProperty("ANIM", anim); var texture = animation.BuildTexture(); - file.SetTexture(texture); + asset.SetTexture(texture); } } } diff --git a/PCK-Studio/Internal/Serializer/ImageSerializer.cs b/PCK-Studio/Internal/Serializer/ImageSerializer.cs index 99c9da12..8bd8241b 100644 --- a/PCK-Studio/Internal/Serializer/ImageSerializer.cs +++ b/PCK-Studio/Internal/Serializer/ImageSerializer.cs @@ -17,20 +17,20 @@ namespace PckStudio.Internal.Serializer { public static readonly ImageSerializer DefaultSerializer = new ImageSerializer(); - public void Serialize(Image obj, ref PckAsset file) + public void Serialize(Image obj, ref PckAsset asset) { var stream = new MemoryStream(); try { - if (Path.GetExtension(file.Filename) == ".tga") + if (Path.GetExtension(asset.Filename) == ".tga") TGASerializer.SerializeToStream(stream, obj); else obj.Save(stream, ImageFormat.Png); - file.SetData(stream.ToArray()); + asset.SetData(stream.ToArray()); } catch (Exception ex) { - Trace.TraceError($"Failed to serialize image to pck file data({file.Filename})."); + Trace.TraceError($"Failed to serialize image to pck file data({asset.Filename})."); Debug.WriteLine(ex.Message); } } diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 5f89cede..608eb613 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -1116,7 +1116,7 @@ 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.selectNode); + this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewMain_AfterSelect); 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); diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index fc4bc306..688936a7 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -111,15 +111,15 @@ namespace PckStudio } // TODO: decide on how to handle embedded pck files - private void HandleInnerPckFile(PckAsset file) + private void HandleInnerPckFile(PckAsset asset) { if (Settings.Default.LoadSubPcks && - (file.Type == PckAssetType.SkinDataFile || file.Type == PckAssetType.TexturePackInfoFile) && - file.Size > 0 && treeViewMain.SelectedNode.Nodes.Count == 0) + (asset.Type == PckAssetType.SkinDataFile || asset.Type == PckAssetType.TexturePackInfoFile) && + asset.Size > 0 && treeViewMain.SelectedNode.Nodes.Count == 0) { try { - PckFile subPCKfile = file.GetData(new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + PckFile subPCKfile = asset.GetData(new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); BuildPckTreeView(treeViewMain.SelectedNode.Nodes, subPCKfile); treeViewMain.SelectedNode.ExpandAll(); } @@ -300,9 +300,9 @@ namespace PckStudio private void CheckForPasswordAndRemove() { - if (currentPCK.TryGetFile("0", PckAssetType.InfoFile, out PckAsset file)) + if (currentPCK.TryGetFile("0", PckAssetType.InfoFile, out PckAsset asset)) { - file.RemoveProperties("LOCK"); + asset.RemoveProperties("LOCK"); } } @@ -405,14 +405,14 @@ namespace PckStudio private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile) { - foreach (PckAsset file in pckFile.GetFiles()) + foreach (PckAsset asset in pckFile.GetFiles()) { // fix any file paths that may be incorrect //if (file.Filename.StartsWith(parentPath)) // file.Filename = file.Filename.Remove(0, parentPath.Length); - TreeNode node = BuildNodeTreeBySeperator(root, file.Filename, '/'); - node.Tag = file; - SetNodeIcon(node, file.Type); + TreeNode node = BuildNodeTreeBySeperator(root, asset.Filename, '/'); + node.Tag = asset; + SetNodeIcon(node, asset.Type); }; } @@ -444,33 +444,33 @@ namespace PckStudio } } - private void HandleTextureFile(PckAsset file) + private void HandleTextureFile(PckAsset asset) { - _ = file.IsMipmappedFile() && currentPCK.TryGetValue(file.GetNormalPath(), PckAssetType.TextureFile, out file); + _ = asset.IsMipmappedFile() && currentPCK.TryGetValue(asset.GetNormalPath(), PckAssetType.TextureFile, out asset); - if (file.Size <= 0) + if (asset.Size <= 0) { - Debug.WriteLine($"'{file.Filename}' size is 0.", category: nameof(HandleTextureFile)); + Debug.WriteLine($"'{asset.Filename}' size is 0.", category: nameof(HandleTextureFile)); return; } - bool isTerrain = file.Filename == "res/terrain.png"; - bool isItems = file.Filename == "res/items.png"; - bool isParticles = file.Filename == "res/particles.png"; - bool isMoonPhases = file.Filename == "res/terrain/moon_phases.png"; - bool isMapIcons = file.Filename == "res/misc/mapicons.png"; - bool isAdditionalMapIcons = file.Filename == "res/misc/additionalmapicons.png"; - bool isXPOrbs = file.Filename == "res/item/xporb.png"; - bool isExplosions = file.Filename == "res/misc/explosion.png"; - bool isPaintings = file.Filename == "res/art/kz.png"; - bool isBanners = file.Filename == "res/item/banner/Banner_Atlas.png"; + bool isTerrain = asset.Filename == "res/terrain.png"; + bool isItems = asset.Filename == "res/items.png"; + bool isParticles = asset.Filename == "res/particles.png"; + bool isMoonPhases = asset.Filename == "res/terrain/moon_phases.png"; + bool isMapIcons = asset.Filename == "res/misc/mapicons.png"; + bool isAdditionalMapIcons = asset.Filename == "res/misc/additionalmapicons.png"; + bool isXPOrbs = asset.Filename == "res/item/xporb.png"; + bool isExplosions = asset.Filename == "res/misc/explosion.png"; + bool isPaintings = asset.Filename == "res/art/kz.png"; + bool isBanners = asset.Filename == "res/item/banner/Banner_Atlas.png"; if ( isTerrain || isItems || isParticles || isMoonPhases || isPaintings || isMapIcons || isAdditionalMapIcons || isXPOrbs || isExplosions || isBanners ) { - Image img = file.GetTexture(); + Image img = asset.GetTexture(); var tile_size = new Size(); int banner_scale = img.Width / Resources.banners_atlas.Width; @@ -495,7 +495,7 @@ namespace PckStudio tile_size = new Size(resolution, resolution); } - var viewer = new TextureAtlasEditor(currentPCK, file.Filename, img, tile_size); + var viewer = new TextureAtlasEditor(currentPCK, asset.Filename, img, tile_size); if (viewer.ShowDialog(this) == DialogResult.OK) { Image texture = viewer.FinalTexture; @@ -519,21 +519,21 @@ namespace PckStudio texture = _img; } - file.SetTexture(texture); + asset.SetTexture(texture); wasModified = true; BuildMainTreeView(); } return; } - if (!file.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation)) && - !file.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.BlockAnimation))) + if (!asset.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation)) && + !asset.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.BlockAnimation))) return; - Animation animation = file.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); - string filename = Path.GetFileNameWithoutExtension(file.Filename); + Animation animation = asset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); + string filename = Path.GetFileNameWithoutExtension(asset.Filename); - var textureInfos = ResourceLocation.GetCategoryFromPath(file.Filename) switch + var textureInfos = ResourceLocation.GetCategoryFromPath(asset.Filename) switch { ResourceCategory.BlockAnimation => Tiles.BlockTileInfos, ResourceCategory.ItemAnimation => Tiles.ItemTileInfos, @@ -548,13 +548,13 @@ namespace PckStudio if (animationEditor.ShowDialog(this) == DialogResult.OK) { wasModified = true; - file.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); + asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); BuildMainTreeView(); } } } - private void HandleGameRuleFile(PckAsset file) + private void HandleGameRuleFile(PckAsset asset) { const string use_deflate = "PS3"; const string use_xmem = "Xbox 360"; @@ -574,55 +574,55 @@ namespace PckStudio _ => GameRuleFile.CompressionType.Unknown }; - GameRuleFile grf = file.GetData(new GameRuleFileReader(compressiontype)); + GameRuleFile grf = asset.GetData(new GameRuleFileReader(compressiontype)); using GameRuleFileEditor grfEditor = new GameRuleFileEditor(grf); if (grfEditor.ShowDialog(this) == DialogResult.OK) { - file.SetData(new GameRuleFileWriter(grfEditor.Result)); + asset.SetData(new GameRuleFileWriter(grfEditor.Result)); wasModified = true; UpdateRichPresence(); } } - private void HandleAudioFile(PckAsset file) + private void HandleAudioFile(PckAsset asset) { try { - using AudioEditor audioEditor = new AudioEditor(file, LittleEndianCheckBox.Checked); + using AudioEditor audioEditor = new AudioEditor(asset, LittleEndianCheckBox.Checked); wasModified = audioEditor.ShowDialog(this) == DialogResult.OK; } catch (OverflowException) { - MessageBox.Show(this, $"Failed to open {file.Filename}\n" + + MessageBox.Show(this, $"Failed to open {asset.Filename}\n" + "Try converting the file by using the \"Misc. Functions/Set PCK Endianness\" tool and try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception ex) { - MessageBox.Show($"Failed to open {file.Filename}\n" + ex.Message, + MessageBox.Show($"Failed to open {asset.Filename}\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void HandleLocalisationFile(PckAsset file) + private void HandleLocalisationFile(PckAsset asset) { - using LOCEditor locedit = new LOCEditor(file); + using LOCEditor locedit = new LOCEditor(asset); wasModified = locedit.ShowDialog(this) == DialogResult.OK; UpdateRichPresence(); } - private void HandleColourFile(PckAsset file) + private void HandleColourFile(PckAsset asset) { - using COLEditor diag = new COLEditor(file); + using COLEditor diag = new COLEditor(asset); wasModified = diag.ShowDialog(this) == DialogResult.OK; } - public void HandleSkinFile(PckAsset file) + public void HandleSkinFile(PckAsset asset) { - if (file.HasProperty("BOX")) + if (asset.HasProperty("BOX")) { - using generateModel generate = new generateModel(file); + using generateModel generate = new generateModel(asset); if (generate.ShowDialog(this) == DialogResult.OK) { entryDataTextBox.Text = entryTypeTextBox.Text = string.Empty; @@ -632,57 +632,60 @@ namespace PckStudio return; } - Image img = file.GetTexture(); - using var skinViewer = new SkinPreview(img, file.GetProperty("ANIM", SkinANIM.FromString)); + Image img = asset.GetTexture(); + using var skinViewer = new SkinPreview(img, asset.GetProperty("ANIM", SkinANIM.FromString)); skinViewer.ShowDialog(this); } - public void HandleModelsFile(PckAsset file) + public void HandleModelsFile(PckAsset asset) { MessageBox.Show(this, "Models.bin support has not been implemented. You can use the Spark Editor for the time being to edit these files.", "Not implemented yet."); } - public void HandleBehavioursFile(PckAsset file) + public void HandleBehavioursFile(PckAsset asset) { - using BehaviourEditor edit = new BehaviourEditor(file); + using BehaviourEditor edit = new BehaviourEditor(asset); wasModified = edit.ShowDialog(this) == DialogResult.OK; } - public void HandleMaterialFile(PckAsset file) + public void HandleMaterialFile(PckAsset asset) { - using MaterialsEditor edit = new MaterialsEditor(file); + using MaterialsEditor edit = new MaterialsEditor(asset); wasModified = edit.ShowDialog(this) == DialogResult.OK; } - private void selectNode(object sender, TreeViewEventArgs e) + 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; - if (e.Node.TryGetTagData(out PckAsset file)) + + if (e.Node.TryGetTagData(out PckAsset asset)) { viewFileInfoToolStripMenuItem.Visible = true; - if (file.HasProperty("BOX")) + if (asset.HasProperty("BOX")) { buttonEdit.Text = "EDIT BOXES"; buttonEdit.Visible = true; } - else if (file.HasProperty("ANIM") && - file.GetProperty("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL))) + 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 (file.Type) + switch (asset.Type) { case PckAssetType.SkinFile: case PckAssetType.CapeFile: case PckAssetType.TextureFile: { - Image img = file.GetTexture(); + Image img = asset.GetTexture(); if (img.RawFormat != ImageFormat.Jpeg || img.RawFormat != ImageFormat.Png) { @@ -702,30 +705,30 @@ namespace PckStudio Debug.WriteLine(string.Format("An error occured of type: {0} with message: {1}", ex.GetType(), ex.Message), "Exception"); } - if ((file.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation)) || - file.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.BlockAnimation))) && - file.Type == PckAssetType.TextureFile - && !file.IsMipmappedFile()) + if ((asset.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation)) || + asset.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.BlockAnimation))) && + asset.Type == PckAssetType.TextureFile + && !asset.IsMipmappedFile()) { buttonEdit.Text = "EDIT TILE ANIMATION"; buttonEdit.Visible = true; } - bool isTerrain = file.Filename == "res/terrain.png"; - bool isItems = file.Filename == "res/items.png"; - bool isParticles = file.Filename == "res/particles.png"; - bool isMoonPhases = file.Filename == "res/terrain/moon_phases.png"; - bool isMapIcons = file.Filename == "res/misc/mapicons.png"; - bool isAdditionalMapIcons = file.Filename == "res/misc/additionalmapicons.png"; - bool isXPOrbs = file.Filename == "res/item/xporb.png"; - bool isExplosions = file.Filename == "res/misc/explosion.png"; - bool isPaintings = file.Filename == "res/art/kz.png"; - bool isBanners = file.Filename == "res/item/banner/Banner_Atlas.png"; + bool isTerrain = asset.Filename == "res/terrain.png"; + bool isItems = asset.Filename == "res/items.png"; + bool isParticles = asset.Filename == "res/particles.png"; + bool isMoonPhases = asset.Filename == "res/terrain/moon_phases.png"; + bool isMapIcons = asset.Filename == "res/misc/mapicons.png"; + bool isAdditionalMapIcons = asset.Filename == "res/misc/additionalmapicons.png"; + bool isXPOrbs = asset.Filename == "res/item/xporb.png"; + bool isExplosions = asset.Filename == "res/misc/explosion.png"; + bool isPaintings = asset.Filename == "res/art/kz.png"; + bool isBanners = asset.Filename == "res/item/banner/Banner_Atlas.png"; if (( isTerrain || isItems || isParticles || isMoonPhases || isPaintings || isMapIcons || isAdditionalMapIcons || isXPOrbs || isExplosions || isBanners - ) && file.Type == PckAssetType.TextureFile) + ) && asset.Type == PckAssetType.TextureFile) { buttonEdit.Text = "EDIT TEXTURE ATLAS"; buttonEdit.Visible = true; @@ -743,12 +746,12 @@ namespace PckStudio buttonEdit.Visible = true; break; - case PckAssetType.ColourTableFile when file.Filename == "colours.col": + case PckAssetType.ColourTableFile when asset.Filename == "colours.col": buttonEdit.Text = "EDIT COLORS"; buttonEdit.Visible = true; break; - case PckAssetType.BehavioursFile when file.Filename == "behaviours.bin": + case PckAssetType.BehavioursFile when asset.Filename == "behaviours.bin": buttonEdit.Text = "EDIT BEHAVIOURS"; buttonEdit.Visible = true; break; @@ -759,28 +762,28 @@ namespace PckStudio } } - private void extractFile(string outFilePath, PckAsset file) + private void extractFile(string outFilePath, PckAsset asset) { - File.WriteAllBytes(outFilePath, file.Data); - if (file.PropertyCount > 0) + File.WriteAllBytes(outFilePath, asset.Data); + if (asset.PropertyCount > 0) { - File.WriteAllText($"{outFilePath}.txt", file.SerializePropertiesToString()); + File.WriteAllText($"{outFilePath}.txt", asset.SerializePropertiesToString()); } } - private void extractFolderFile(string outPath, PckAsset file) + private void extractFolderFile(string outPath, PckAsset asset) { TreeNode node = treeViewMain.SelectedNode; // abb = "Abbreviated Path" - string abbPath = Path.GetDirectoryName(file.Filename); + string abbPath = Path.GetDirectoryName(asset.Filename); int startIndex = abbPath.IndexOf(node.Text); abbPath = abbPath.Substring(startIndex, abbPath.Length - startIndex); string finalPath = ($"{outPath}/{abbPath}/").Replace('\\', '/'); if (!Directory.Exists(finalPath)) Directory.CreateDirectory(finalPath); - extractFile(finalPath + "/" + Path.GetFileName(file.Filename), file); + extractFile(finalPath + "/" + Path.GetFileName(asset.Filename), asset); } private void extractFolder(string outPath) @@ -793,20 +796,20 @@ namespace PckStudio { GetAllChildNodes(node.Nodes).ForEach(fileNode => { - if (fileNode.TryGetTagData(out PckAsset file)) + if (fileNode.TryGetTagData(out PckAsset asset)) { - extractFolderFile(outPath, file); + extractFolderFile(outPath, asset); } } ); } else { - foreach (PckAsset _file in currentPCK.GetFiles()) + foreach (PckAsset _asset in currentPCK.GetFiles()) { - if (_file.Filename.StartsWith(selectedFolder)) + if (_asset.Filename.StartsWith(selectedFolder)) { - extractFolderFile(outPath, _file); + extractFolderFile(outPath, _asset); } }; } @@ -831,11 +834,11 @@ namespace PckStudio if (dialog.ShowDialog(Handle) == true) extractFolder(dialog.ResultPath); } - else if (node.TryGetTagData(out PckAsset file)) + else if (node.TryGetTagData(out PckAsset asset)) { using SaveFileDialog exFile = new SaveFileDialog(); - exFile.FileName = Path.GetFileName(file.Filename); - exFile.Filter = Path.GetExtension(file.Filename).Replace(".", string.Empty) + " File|*" + Path.GetExtension(file.Filename); + exFile.FileName = Path.GetFileName(asset.Filename); + exFile.Filter = Path.GetExtension(asset.Filename).Replace(".", string.Empty) + " File|*" + Path.GetExtension(asset.Filename); if (exFile.ShowDialog(this) != DialogResult.OK || // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable string.IsNullOrWhiteSpace(Path.GetDirectoryName(exFile.FileName))) @@ -845,7 +848,7 @@ namespace PckStudio return; } - extractFile(exFile.FileName, file); + extractFile(exFile.FileName, asset); } // Verification that file extraction path was successful @@ -877,31 +880,31 @@ namespace PckStudio private void replaceToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckAsset file) + if (treeViewMain.SelectedNode.Tag is PckAsset asset) { using var ofd = new OpenFileDialog(); // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? So now it's formatted correctly and now displays the file type name in the dialog. string extra_extensions = ""; - switch (file.Type) + switch (asset.Type) { case PckAssetType.TextureFile: - if (Path.GetExtension(file.Filename) == ".png") + if (Path.GetExtension(asset.Filename) == ".png") extra_extensions = ";*.tga"; - else if (Path.GetExtension(file.Filename) == ".tga") + else if (Path.GetExtension(asset.Filename) == ".tga") extra_extensions = ";*.png"; break; } - string fileExt = Path.GetExtension(file.Filename); + string fileExt = Path.GetExtension(asset.Filename); - ofd.Filter = $"{file.Type} (*{fileExt}{extra_extensions})|*{fileExt}{extra_extensions}"; + ofd.Filter = $"{asset.Type} (*{fileExt}{extra_extensions})|*{fileExt}{extra_extensions}"; if (ofd.ShowDialog(this) == DialogResult.OK) { string newFileExt = Path.GetExtension(ofd.FileName); - file.SetData(File.ReadAllBytes(ofd.FileName)); - file.Filename = file.Filename.Replace(fileExt, newFileExt); + asset.SetData(File.ReadAllBytes(ofd.FileName)); + asset.Filename = asset.Filename.Replace(fileExt, newFileExt); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); wasModified = true; BuildMainTreeView(); @@ -911,18 +914,18 @@ namespace PckStudio MessageBox.Show(this, "Can't replace a folder."); } - /// - /// Action to run before a file will be deleted - /// - /// File to remove - /// True if the remove should be canceled, otherwise False - private bool BeforeFileRemove(PckAsset file) + /// + /// Action to run before an asset will be deleted + /// + /// Asset to remove + /// True if the remove should be canceled, otherwise False + private bool BeforeFileRemove(PckAsset asset) { string itemPath = ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation); // warn the user about deleting compass.png and clock.png - if (file.Type == PckAssetType.TextureFile && - (file.Filename == itemPath + "/compass.png" || file.Filename == itemPath + "/clock.png")) + if (asset.Type == PckAssetType.TextureFile && + (asset.Filename == itemPath + "/compass.png" || asset.Filename == itemPath + "/clock.png")) { if (MessageBox.Show(this, "Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) @@ -930,13 +933,13 @@ namespace PckStudio } // remove loc key if its a skin/cape - if (file.Type == PckAssetType.SkinFile || file.Type == PckAssetType.CapeFile) + if (asset.Type == PckAssetType.SkinFile || asset.Type == PckAssetType.CapeFile) { if (TryGetLocFile(out LOCFile locFile)) { - if (file.TryGetProperty("THEMENAMEID", out string value)) + if (asset.TryGetProperty("THEMENAMEID", out string value)) locFile.RemoveLocKey(value); - if (file.TryGetProperty("DISPLAYNAMEID", out value)) + if (asset.TryGetProperty("DISPLAYNAMEID", out value)) locFile.RemoveLocKey(value); TrySetLocFile(locFile); } @@ -952,9 +955,9 @@ namespace PckStudio string path = node.FullPath; - if (node.TryGetTagData(out PckAsset file)) + if (node.TryGetTagData(out PckAsset asset)) { - if (!BeforeFileRemove(file) && currentPCK.RemoveFile(file)) + if (!BeforeFileRemove(asset) && currentPCK.RemoveFile(asset)) { node.Remove(); wasModified = true; @@ -977,30 +980,30 @@ namespace PckStudio if (node == null) return; string path = node.FullPath; - bool isFile = node.TryGetTagData(out var file); + bool isFile = node.TryGetTagData(out var asset); - using TextPrompt diag = new TextPrompt(isFile ? file.Filename : Path.GetFileName(node.FullPath)); + using TextPrompt diag = new TextPrompt(isFile ? asset.Filename : Path.GetFileName(node.FullPath)); if (diag.ShowDialog(this) == DialogResult.OK) { if (isFile) { - if (currentPCK.Contains(diag.NewText, file.Type)) + if (currentPCK.Contains(diag.NewText, asset.Type)) { MessageBox.Show(this, $"{diag.NewText} already exists", "File already exists"); return; } - file.Filename = diag.NewText; + asset.Filename = diag.NewText; } else // folders { node.Text = diag.NewText; foreach (TreeNode childNode in GetAllChildNodes(node.Nodes)) { - if (childNode.Tag is PckAsset folderFile) + if (childNode.Tag is PckAsset folderAsset) { - if (folderFile.Filename == diag.NewText) continue; - folderFile.Filename = childNode.FullPath; + if (folderAsset.Filename == diag.NewText) continue; + folderAsset.Filename = childNode.FullPath; } } } @@ -1020,36 +1023,36 @@ namespace PckStudio if (currentPCK.HasFile("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); - if (subPCK.Nodes.ContainsKey("Skins")) add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins/"); - add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins.pck/"); - TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinFile.Filename)); - newNode.Tag = add.SkinFile; + if (subPCK.Nodes.ContainsKey("Skins")) add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); + add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins.pck/"); + TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinAsset.Filename)); + newNode.Tag = add.SkinAsset; SetNodeIcon(newNode, PckAssetType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } else { - if (treeViewMain.Nodes.ContainsKey("Skins")) add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddFile(add.SkinFile); + if (treeViewMain.Nodes.ContainsKey("Skins")) add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); // Then Skins folder + currentPCK.AddFile(add.SkinAsset); } if (add.HasCape) { if (currentPCK.HasFile("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); - if (subPCK.Nodes.ContainsKey("Skins")) add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins/"); - add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins.pck/"); - TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeFile.Filename)); - newNode.Tag = add.CapeFile; + if (subPCK.Nodes.ContainsKey("Skins")) add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); + add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins.pck/"); + TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeAsset.Filename)); + newNode.Tag = add.CapeAsset; SetNodeIcon(newNode, PckAssetType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } else { - if (treeViewMain.Nodes.ContainsKey("Skins")) add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddFile(add.CapeFile); + if (treeViewMain.Nodes.ContainsKey("Skins")) add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); // Then Skins folder + currentPCK.AddFile(add.CapeAsset); } } @@ -1065,9 +1068,9 @@ namespace PckStudio audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); - PckAsset pckFileData = new PckAsset("audio.pck", PckAssetType.AudioFile); - pckFileData.SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - return pckFileData; + PckAsset newAsset = new PckAsset("audio.pck", PckAssetType.AudioFile); + newAsset.SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + return newAsset; } private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) @@ -1084,11 +1087,11 @@ namespace PckStudio return; } - PckAsset file = CreateNewAudioFile(LittleEndianCheckBox.Checked); - AudioEditor diag = new AudioEditor(file, LittleEndianCheckBox.Checked); + PckAsset asset = CreateNewAudioFile(LittleEndianCheckBox.Checked); + AudioEditor diag = new AudioEditor(asset, LittleEndianCheckBox.Checked); if (diag.ShowDialog(this) == DialogResult.OK) { - currentPCK.AddFile(file); + currentPCK.AddFile(asset); } diag.Dispose(); BuildMainTreeView(); @@ -1112,8 +1115,8 @@ namespace PckStudio if (animationEditor.ShowDialog() == DialogResult.OK) { wasModified = true; - PckAsset file = currentPCK.CreateNewFile(animationFilepath, PckAssetType.TextureFile); - file.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); + PckAsset asset = currentPCK.CreateNewFile(animationFilepath, PckAssetType.TextureFile); + asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); BuildMainTreeView(); ReloadMetaTreeView(); } @@ -1158,9 +1161,9 @@ namespace PckStudio foreach (string node in s) { TreeNode parent = treeViewMain.Nodes.Find(node, true)[0]; - if (parent.TryGetTagData(out PckAsset f) && - (f.Type is PckAssetType.TexturePackInfoFile || - f.Type is PckAssetType.SkinDataFile)) + if (parent.TryGetTagData(out PckAsset asset) && + (asset.Type is PckAssetType.TexturePackInfoFile || + asset.Type is PckAssetType.SkinDataFile)) return parent; } @@ -1178,67 +1181,67 @@ namespace PckStudio Debug.WriteLine(parent.Name); if (parent == null) return; - PckAsset parent_file = parent.Tag as PckAsset; - PckFile parent_file_pck = + PckAsset parentAsset = parent.Tag as PckAsset; + PckFile parentAssetPck = new PckFileReader( LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian - ).FromStream(new MemoryStream(parent_file.Data)); + ).FromStream(new MemoryStream(parentAsset.Data)); - if (parent_file.Type is PckAssetType.TexturePackInfoFile || parent_file.Type is PckAssetType.SkinDataFile) + if (parentAsset.Type is PckAssetType.TexturePackInfoFile || parentAsset.Type is PckAssetType.SkinDataFile) { - Debug.WriteLine("Rebuilding " + parent_file.Filename); - PckFile newPCKFile = new PckFile(3, parent_file.Type is PckAssetType.SkinDataFile); + Debug.WriteLine("Rebuilding " + parentAsset.Filename); + PckFile newPCKFile = new PckFile(3, parentAsset.Type is PckAssetType.SkinDataFile); bool hasSkinsFolder = false; // add original pck files to prevent data loss - foreach (PckAsset _fd in parent_file_pck.GetFiles()) + foreach (PckAsset asset in parentAssetPck.GetFiles()) { - PckAsset new_file = newPCKFile.CreateNewFile(_fd.Filename, _fd.Type); + PckAsset newAsset = newPCKFile.CreateNewFile(asset.Filename, asset.Type); // check for skins folder so files are placed consistently in final pck - if (_fd.Filename.StartsWith("Skins/") && parent_file.Type is PckAssetType.SkinDataFile) hasSkinsFolder = true; - foreach (var prop in _fd.GetProperties()) - new_file.AddProperty(prop); - new_file.SetData(_fd.Data); + if (asset.Filename.StartsWith("Skins/") && parentAsset.Type is PckAssetType.SkinDataFile) hasSkinsFolder = true; + foreach (var prop in asset.GetProperties()) + newAsset.AddProperty(prop); + newAsset.SetData(asset.Data); } foreach (TreeNode node in GetAllChildNodes(parent.Nodes)) { - if (node.Tag is PckAsset node_file) + if (node.Tag is PckAsset nodeAsset) { - PckAsset new_file = newPCKFile.CreateNewFile( + PckAsset newAsset = newPCKFile.CreateNewFile( (hasSkinsFolder ? "Skins/" : String.Empty) - + node_file.Filename.Replace(parent_file.Filename + "/", String.Empty), node_file.Type); - foreach (var prop in node_file.GetProperties()) - new_file.AddProperty(prop); - new_file.SetData(node_file.Data); + + nodeAsset.Filename.Replace(parentAsset.Filename + "/", String.Empty), nodeAsset.Type); + foreach (var prop in nodeAsset.GetProperties()) + newAsset.AddProperty(prop); + newAsset.SetData(nodeAsset.Data); } } - parent_file.SetData(new PckFileWriter(newPCKFile, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - parent.Tag = parent_file; + parentAsset.SetData(new PckFileWriter(newPCKFile, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + parent.Tag = parentAsset; // erase hidden sub-pck nodes to prevent duplication parent.Nodes.Clear(); BuildMainTreeView(); - MessageBox.Show(this, $"Files added successfully to {parent_file.Filename}"); + MessageBox.Show(this, $"Files added successfully to {parentAsset.Filename}"); } } private void treeViewMain_DoubleClick(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) { - if (file.Size <= 0) + if (asset.Size <= 0) { - Trace.WriteLine($"'{file.Filename}' has no data attached.", category: nameof(treeViewMain_DoubleClick)); + Trace.WriteLine($"'{asset.Filename}' has no data attached.", category: nameof(treeViewMain_DoubleClick)); return; } - pckFileTypeHandler[file.Type]?.Invoke(file); + pckFileTypeHandler[asset.Type]?.Invoke(asset); } } @@ -1254,19 +1257,19 @@ namespace PckStudio 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 file) + treeViewMain.SelectedNode is TreeNode node && node.Tag is PckAsset asset) { - if (file.HasProperty(property.Key)) + if (asset.HasProperty(property.Key)) { switch (property.Key) { - case "ANIM" when file.Type == PckAssetType.SkinFile: + case "ANIM" when asset.Type == PckAssetType.SkinFile: try { using ANIMEditor diag = new ANIMEditor(property.Value); if (diag.ShowDialog(this) == DialogResult.OK) { - file.SetProperty(file.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); + asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -1281,13 +1284,13 @@ namespace PckStudio } break; - case "BOX" when file.Type == PckAssetType.SkinFile: + case "BOX" when asset.Type == PckAssetType.SkinFile: try { using BoxEditor diag = new BoxEditor(property.Value, IsSubPCKNode(treeViewMain.SelectedNode.FullPath)); if (diag.ShowDialog(this) == DialogResult.OK) { - file.SetProperty(file.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); + asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -1311,7 +1314,7 @@ namespace PckStudio { if (addProperty.ShowDialog(this) == DialogResult.OK) { - file.SetProperty(file.GetPropertyIndex(property), addProperty.Property); + asset.SetProperty(asset.GetPropertyIndex(property), addProperty.Property); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -1334,16 +1337,16 @@ namespace PckStudio if (diag.ShowDialog(this) == DialogResult.OK) { - if (node.Tag is PckAsset file) + if (node.Tag is PckAsset asset) { TreeNode newNode = new TreeNode(); newNode.Text = Path.GetFileName(diag.NewText); - var newFile = new PckAsset(diag.NewText, file.Type); - foreach (var property in file.GetProperties()) + var newFile = new PckAsset(diag.NewText, asset.Type); + foreach (var property in asset.GetProperties()) { newFile.AddProperty(property); } - newFile.SetData(file.Data); + newFile.SetData(asset.Data); newFile.Filename = diag.NewText; newNode.Tag = newFile; newNode.ImageIndex = node.ImageIndex; @@ -1373,8 +1376,8 @@ namespace PckStudio 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 file && - file.RemoveProperty(property)) + treeViewMain.SelectedNode is TreeNode main && main.Tag is PckAsset asset && + asset.RemoveProperty(property)) { treeMeta.SelectedNode.Remove(); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -1386,9 +1389,9 @@ namespace PckStudio { treeMeta.Nodes.Clear(); if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckAsset file) + node.Tag is PckAsset asset) { - foreach (var property in file.GetProperties()) + foreach (var property in asset.GetProperties()) { treeMeta.Nodes.Add(CreateNode(property.Key, property)); } @@ -1398,12 +1401,12 @@ namespace PckStudio private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode t && - t.Tag is PckAsset file) + t.Tag is PckAsset asset) { using AddPropertyPrompt addProperty = new AddPropertyPrompt(); if (addProperty.ShowDialog(this) == DialogResult.OK) { - file.AddProperty(addProperty.Property); + asset.AddProperty(addProperty.Property); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -1422,7 +1425,7 @@ namespace PckStudio if (e.Button != MouseButtons.Left || e.Item is not TreeNode node) return; - if ((node.TryGetTagData(out PckAsset file) && currentPCK.Contains(file.Filename, file.Type)) || node.Parent is TreeNode) + if ((node.TryGetTagData(out PckAsset asset) && currentPCK.Contains(asset.Filename, asset.Type)) || node.Parent is TreeNode) { treeViewMain.DoDragDrop(node, DragDropEffects.Move); } @@ -1506,15 +1509,15 @@ namespace PckStudio Debug.WriteLine($"Target drop location is {(isTargetPckFile ? "file" : "folder")}."); // Retrieve the node that was dragged. - if (draggedNode.TryGetTagData(out PckAsset draggedFile) && - targetNode.FullPath != draggedFile.Filename) + if (draggedNode.TryGetTagData(out PckAsset draggedAsset) && + targetNode.FullPath != draggedAsset.Filename) { - Debug.WriteLine(draggedFile.Filename + " was droped onto " + targetNode.FullPath); + Debug.WriteLine(draggedAsset.Filename + " was droped onto " + targetNode.FullPath); string newFilePath = Path.Combine(isTargetPckFile ? Path.GetDirectoryName(targetNode.FullPath) - : targetNode.FullPath, Path.GetFileName(draggedFile.Filename)); + : targetNode.FullPath, Path.GetFileName(draggedAsset.Filename)); Debug.WriteLine("New filepath: " + newFilePath); - draggedFile.Filename = newFilePath; + draggedAsset.Filename = newFilePath; wasModified = true; BuildMainTreeView(); return; @@ -1582,9 +1585,9 @@ namespace PckStudio { var pack = new PckFile(3); - PckAsset zeroFile = pack.CreateNewFile("0", PckAssetType.InfoFile); - zeroFile.AddProperty("PACKID", packId); - zeroFile.AddProperty("PACKVERSION", packVersion); + PckAsset zeroAsset = pack.CreateNewFile("0", PckAssetType.InfoFile); + zeroAsset.AddProperty("PACKID", packId); + zeroAsset.AddProperty("PACKVERSION", packVersion); var locFile = new LOCFile(); locFile.InitializeDefault(packName); @@ -1604,17 +1607,17 @@ namespace PckStudio PckFile infoPCK = new PckFile(3); - PckAsset icon = infoPCK.CreateNewFile("icon.png", PckAssetType.TextureFile); - icon.SetTexture(Resources.TexturePackIcon); + PckAsset iconAsset = infoPCK.CreateNewFile("icon.png", PckAssetType.TextureFile); + iconAsset.SetTexture(Resources.TexturePackIcon); - PckAsset comparison = infoPCK.CreateNewFile("comparison.png", PckAssetType.TextureFile); - comparison.SetTexture(Resources.Comparison); + PckAsset comparisonAsset = infoPCK.CreateNewFile("comparison.png", PckAssetType.TextureFile); + comparisonAsset.SetTexture(Resources.Comparison); - PckAsset texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile); - texturepackInfo.AddProperty("PACKID", "0"); - texturepackInfo.AddProperty("DATAPATH", $"{res}Data.pck"); + PckAsset texturepackInfoAsset = pack.CreateNewFile($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile); + texturepackInfoAsset.AddProperty("PACKID", "0"); + texturepackInfoAsset.AddProperty("DATAPATH", $"{res}Data.pck"); - texturepackInfo.SetData(new PckFileWriter(infoPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + texturepackInfoAsset.SetData(new PckFileWriter(infoPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); return pack; } @@ -1622,7 +1625,7 @@ namespace PckStudio private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { PckFile pack = InitializeTexturePack(packId, packVersion, packName, res, true); - PckAsset gameRuleFile = pack.CreateNewFile("GameRules.grf", PckAssetType.GameRulesFile); + PckAsset gameRuleAsset = pack.CreateNewFile("GameRules.grf", PckAssetType.GameRulesFile); GameRuleFile grfFile = new GameRuleFile(); grfFile.AddRule("MapOptions", new KeyValuePair("seed", "0"), @@ -1639,7 +1642,7 @@ namespace PckStudio new KeyValuePair("spawnZ", "0") ); - gameRuleFile.SetData(new GameRuleFileWriter(grfFile)); + gameRuleAsset.SetData(new GameRuleFileWriter(grfFile)); return pack; } @@ -1782,14 +1785,14 @@ namespace PckStudio continue; } - PckAsset newFile = currentPCK.CreateNewFile(pckfilepath, pckfiletype); + PckAsset newAsset = currentPCK.CreateNewFile(pckfilepath, pckfiletype); byte[] filedata = File.ReadAllBytes(fullfilename); - newFile.SetData(filedata); + newAsset.SetData(filedata); if (File.Exists(fullfilename + ".txt")) { string propertiesFileContent = File.ReadAllText(fullfilename + ".txt"); - newFile.DeserializePropertiesFromString(propertiesFileContent); + newAsset.DeserializePropertiesFromString(propertiesFileContent); } } BuildMainTreeView(); @@ -1799,8 +1802,8 @@ namespace PckStudio private bool TryGetLocFile(out LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locdata) && - !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locAsset)) { locFile = null; return false; @@ -1808,7 +1811,7 @@ namespace PckStudio try { - using (var stream = new MemoryStream(locdata.Data)) + using (var stream = new MemoryStream(locAsset.Data)) { var reader = new LOCFileReader(); locFile = reader.FromStream(stream); @@ -1825,15 +1828,15 @@ namespace PckStudio private bool TrySetLocFile(in LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locdata) && - !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locAsset)) { return false; } try { - locdata.SetData(new LOCFileWriter(locFile, 2)); + locAsset.SetData(new LOCFileWriter(locFile, 2)); return true; } catch (Exception ex) @@ -1902,9 +1905,9 @@ namespace PckStudio TreeNodeCollection nodeCollection = treeViewMain.Nodes; if (treeViewMain.SelectedNode is TreeNode node) { - if (node.Tag is PckAsset fd && - (fd.Type != PckAssetType.TexturePackInfoFile && - fd.Type != PckAssetType.SkinDataFile)) + if (node.Tag is PckAsset asset && + (asset.Type != PckAssetType.TexturePackInfoFile && + asset.Type != PckAssetType.SkinDataFile)) { if (node.Parent is TreeNode parentNode) { @@ -2111,10 +2114,10 @@ namespace PckStudio private void SetFileType(PckAssetType type) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) { - Debug.WriteLine($"Setting {file.Type} to {type}"); - file.Type = type; + Debug.WriteLine($"Setting {asset.Type} to {type}"); + asset.Type = type; SetNodeIcon(treeViewMain.SelectedNode, type); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); } @@ -2136,7 +2139,7 @@ namespace PckStudio MessageBox.Show(this, $"'{renamePrompt.NewText}' already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - PckAsset file = currentPCK.CreateNewFile(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); + PckAsset asset = currentPCK.CreateNewFile(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); BuildMainTreeView(); wasModified = true; } @@ -2145,28 +2148,28 @@ namespace PckStudio private void viewFileInfoToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckAsset file) + if (treeViewMain.SelectedNode.Tag is PckAsset asset) { MessageBox.Show(this, - "File path: " + file.Filename + - "\nAssigned File type: " + (int)file.Type + " (" + file.Type + ")" + - "\nFile size: " + file.Size + - "\nProperties count: " + file.PropertyCount - , Path.GetFileName(file.Filename) + " file info"); + "File path: " + asset.Filename + + "\nAssigned File type: " + (int)asset.Type + " (" + asset.Type + ")" + + "\nFile size: " + asset.Size + + "\nProperties count: " + asset.PropertyCount + , Path.GetFileName(asset.Filename) + " file info"); } } private void generateMipMapTextureToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckAsset file && file.Type == PckAssetType.TextureFile) + if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type == PckAssetType.TextureFile) { - string textureDirectory = Path.GetDirectoryName(file.Filename); - string textureName = Path.GetFileNameWithoutExtension(file.Filename); + string textureDirectory = Path.GetDirectoryName(asset.Filename); + string textureName = Path.GetFileNameWithoutExtension(asset.Filename); - if (file.IsMipmappedFile()) + if (asset.IsMipmappedFile()) return; - string textureExtension = Path.GetExtension(file.Filename); + string textureExtension = Path.GetExtension(asset.Filename); using NumericPrompt numericPrompt = new NumericPrompt(0); numericPrompt.Minimum = 1; @@ -2183,10 +2186,10 @@ namespace PckStudio Debug.WriteLine(mippedPath); if (currentPCK.HasFile(mippedPath, PckAssetType.TextureFile)) currentPCK.RemoveFile(currentPCK.GetFile(mippedPath, PckAssetType.TextureFile)); - PckAsset MipMappedFile = new PckAsset(mippedPath, PckAssetType.TextureFile); + PckAsset mipMappedAsset = new PckAsset(mippedPath, PckAssetType.TextureFile); - Image originalTexture = file.GetTexture(); + Image originalTexture = asset.GetTexture(); int NewWidth = Math.Max(originalTexture.Width / (int)Math.Pow(2, i - 1), 1); int NewHeight = Math.Max(originalTexture.Height / (int)Math.Pow(2, i - 1), 1); @@ -2200,9 +2203,9 @@ namespace PckStudio gfx.DrawImage(originalTexture, tileArea); } - MipMappedFile.SetTexture(mippedTexture); + mipMappedAsset.SetTexture(mippedTexture); - currentPCK.InsertFile(currentPCK.IndexOfFile(file) + i - 1, MipMappedFile); + currentPCK.InsertFile(currentPCK.IndexOfFile(asset) + i - 1, mipMappedAsset); } BuildMainTreeView(); } @@ -2216,8 +2219,8 @@ namespace PckStudio MessageBox.Show(this, "A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - PckAsset newColorFile = currentPCK.CreateNewFile("colours.col", PckAssetType.ColourTableFile); - newColorFile.SetData(Resources.tu69colours); + PckAsset newColorAsset = currentPCK.CreateNewFile("colours.col", PckAssetType.ColourTableFile); + newColorAsset.SetData(Resources.tu69colours); BuildMainTreeView(); } @@ -2228,15 +2231,15 @@ namespace PckStudio private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file) && - file.Type == PckAssetType.SkinFile) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && + asset.Type == PckAssetType.SkinFile) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "3DS Texture|*.3dst"; saveFileDialog.DefaultExt = ".3dst"; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { - Image img = file.GetTexture(); + Image img = asset.GetTexture(); var writer = new _3DSTextureWriter(img); writer.WriteToFile(saveFileDialog.FileName); } @@ -2245,7 +2248,7 @@ namespace PckStudio private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) { using (var input = new MultiTextPrompt()) { @@ -2256,7 +2259,7 @@ namespace PckStudio int idx = line.IndexOf(' '); if (idx == -1 || line.Length - 1 == idx) continue; - file.AddProperty(line.Substring(0, idx), line.Substring(idx + 1)); + asset.AddProperty(line.Substring(0, idx), line.Substring(idx + 1)); } ReloadMetaTreeView(); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -2268,13 +2271,13 @@ namespace PckStudio private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file) && - file.Type == PckAssetType.SkinFile) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && + asset.Type == PckAssetType.SkinFile) { - foreach (KeyValuePair p in file.GetProperties().ToList()) + foreach (KeyValuePair p in asset.GetProperties().ToList()) { if (p.Key == "BOX" || p.Key == "OFFSET") - file.SetProperty(file.GetPropertyIndex(p), new KeyValuePair(p.Key, p.Value.Replace(',', '.'))); + asset.SetProperty(asset.GetPropertyIndex(p), new KeyValuePair(p.Key, p.Value.Replace(',', '.'))); } ReloadMetaTreeView(); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -2304,20 +2307,20 @@ namespace PckStudio private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) { - string[] props = file.GetProperties().Select(p => p.Key + " " + p.Value).ToArray(); + string[] props = asset.GetProperties().Select(p => p.Key + " " + p.Value).ToArray(); using (var input = new MultiTextPrompt(props)) { if (input.ShowDialog(this) == DialogResult.OK) { - file.ClearProperties(); + asset.ClearProperties(); foreach (string line in input.TextOutput) { int idx = line.IndexOf(' '); if (idx == -1 || line.Length - 1 == idx) continue; - file.AddProperty(line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1)); + asset.AddProperty(line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1)); } ReloadMetaTreeView(); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -2345,7 +2348,7 @@ namespace PckStudio MessageBox.Show(this, $"'{diag.Filepath}' of type {diag.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - PckAsset file = currentPCK.CreateNewFile(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); + PckAsset asset = currentPCK.CreateNewFile(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -2440,12 +2443,12 @@ namespace PckStudio private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset file) + if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset asset) { using BoxEditor diag = new BoxEditor(SkinBOX.Empty, IsSubPCKNode(treeViewMain.SelectedNode.FullPath)); if (diag.ShowDialog(this) == DialogResult.OK) { - file.AddProperty("BOX", diag.Result); + asset.AddProperty("BOX", diag.Result); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -2456,12 +2459,12 @@ namespace PckStudio private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) { using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); if (diag.ShowDialog(this) == DialogResult.OK) { - file.AddProperty("ANIM", diag.ResultAnim); + asset.AddProperty("ANIM", diag.ResultAnim); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); ReloadMetaTreeView(); wasModified = true; @@ -2489,19 +2492,19 @@ namespace PckStudio { try { - if (treeViewMain.SelectedNode.Tag is PckAsset file && (file.Type is PckAssetType.AudioFile || file.Type is PckAssetType.SkinDataFile || file.Type is PckAssetType.TexturePackInfoFile)) + if (treeViewMain.SelectedNode.Tag is PckAsset asset && (asset.Type is PckAssetType.AudioFile || asset.Type is PckAssetType.SkinDataFile || asset.Type is PckAssetType.TexturePackInfoFile)) { - IDataFormatReader reader = file.Type is PckAssetType.AudioFile + IDataFormatReader reader = asset.Type is PckAssetType.AudioFile ? new PckAudioFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian) : new PckFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - object pck = reader.FromStream(new MemoryStream(file.Data)); + object pck = reader.FromStream(new MemoryStream(asset.Data)); - IDataFormatWriter writer = file.Type is PckAssetType.AudioFile + IDataFormatWriter writer = asset.Type is PckAssetType.AudioFile ? new PckAudioFileWriter((PckAudioFile)pck, endianness) : new PckFileWriter((PckFile)pck, endianness); - file.SetData(writer); + asset.SetData(writer); wasModified = true; - MessageBox.Show($"\"{file.Filename}\" successfully converted to {(endianness == OMI.Endianness.LittleEndian ? "little" : "big")} endian.", "Converted PCK file"); + MessageBox.Show($"\"{asset.Filename}\" successfully converted to {(endianness == OMI.Endianness.LittleEndian ? "little" : "big")} endian.", "Converted PCK file"); } } catch (OverflowException) @@ -2521,11 +2524,11 @@ namespace PckStudio private void SetModelVersion(int version) { - if (treeViewMain.SelectedNode.Tag is PckAsset file && file.Type is PckAssetType.ModelsFile) + if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type is PckAssetType.ModelsFile) { try { - ModelContainer container = file.GetData(new ModelFileReader()); + ModelContainer container = asset.GetData(new ModelFileReader()); if (container.Version == version) { @@ -2557,11 +2560,11 @@ namespace PckStudio return; } - file.SetData(new ModelFileWriter(container, version)); + asset.SetData(new ModelFileWriter(container, version)); wasModified = true; MessageBox.Show( this, - $"\"{file.Filename}\" successfully converted to Version {version + 1} format.", + $"\"{asset.Filename}\" successfully converted to Version {version + 1} format.", "Converted model container file" ); } From d9397eb787a1a98f8ef6b3417b29af3636f9d592 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 21 Jun 2024 19:30:01 +0200 Subject: [PATCH 3/5] Update OMI submodule ref --- PCK-Studio/Extensions/PckFileExtensions.cs | 8 +- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 2 +- .../Skins-And-Textures/AdvancedOptions.cs | 4 +- PCK-Studio/MainForm.cs | 86 +++++++++---------- Vendor/OMI-Lib | 2 +- 5 files changed, 51 insertions(+), 51 deletions(-) diff --git a/PCK-Studio/Extensions/PckFileExtensions.cs b/PCK-Studio/Extensions/PckFileExtensions.cs index bb9386f0..b6099592 100644 --- a/PCK-Studio/Extensions/PckFileExtensions.cs +++ b/PCK-Studio/Extensions/PckFileExtensions.cs @@ -11,18 +11,18 @@ namespace PckStudio.Extensions { internal static class PckFileExtensions { - internal static PckAsset CreateNewFileIf(this PckFile pck, bool condition, string filename, PckAssetType filetype, IDataFormatWriter writer) + internal static PckAsset CreateNewAssetIf(this PckFile pck, bool condition, string filename, PckAssetType filetype, IDataFormatWriter writer) { if (condition) { - return pck.CreateNewFile(filename, filetype, writer); + return pck.CreateNewAsset(filename, filetype, writer); } return null; } - internal static PckAsset CreateNewFile(this PckFile pck, string filename, PckAssetType filetype, IDataFormatWriter writer) + internal static PckAsset CreateNewAsset(this PckFile pck, string filename, PckAssetType filetype, IDataFormatWriter writer) { - var asset = pck.CreateNewFile(filename, filetype); + var asset = pck.CreateNewAsset(filename, filetype); asset.SetData(writer); return asset; } diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index 6f91c202..86893b9e 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -170,7 +170,7 @@ namespace PckStudio.Forms.Editor private bool AcquireColorTable(PckFile pckFile) { - if (pckFile.TryGetFile("colours.col", PckAssetType.ColourTableFile, out var colAsset) && + if (pckFile.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out var colAsset) && colAsset.Size > 0) { using var ms = new MemoryStream(colAsset.Data); diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index 82af2bd7..da4ee2fb 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -38,7 +38,7 @@ namespace PckStudio.Popups { if (fileTypeComboBox.SelectedIndex >= 0 && fileTypeComboBox.SelectedIndex <= 13) { - applyBulkProperties(_pckFile.GetFiles(), fileTypeComboBox.SelectedIndex - 1); + applyBulkProperties(_pckFile.GetAssets(), fileTypeComboBox.SelectedIndex - 1); DialogResult = DialogResult.OK; return; } @@ -57,7 +57,7 @@ namespace PckStudio.Popups var reader = new PckFileReader(_endianness); using var ms = new MemoryStream(asset.Data); PckFile subPCK = reader.FromStream(ms); - applyBulkProperties(subPCK.GetFiles(), index); + applyBulkProperties(subPCK.GetAssets(), index); asset.SetData(new PckFileWriter(subPCK, _endianness)); } catch (OverflowException ex) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 688936a7..3c98007e 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -300,7 +300,7 @@ namespace PckStudio private void CheckForPasswordAndRemove() { - if (currentPCK.TryGetFile("0", PckAssetType.InfoFile, out PckAsset asset)) + if (currentPCK.TryGetAsset("0", PckAssetType.InfoFile, out PckAsset asset)) { asset.RemoveProperties("LOCK"); } @@ -308,7 +308,7 @@ namespace PckStudio private void LoadEditorTab() { - fileEntryCountLabel.Text = "Files:" + currentPCK.FileCount; + fileEntryCountLabel.Text = "Files:" + currentPCK.AssetCount; if (isTemplateFile) pckFileLabel.Text = "Unsaved File!"; else @@ -405,7 +405,7 @@ namespace PckStudio private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile) { - foreach (PckAsset asset in pckFile.GetFiles()) + foreach (PckAsset asset in pckFile.GetAssets()) { // fix any file paths that may be incorrect //if (file.Filename.StartsWith(parentPath)) @@ -425,7 +425,7 @@ namespace PckStudio treeViewMain.Nodes.Clear(); BuildPckTreeView(treeViewMain.Nodes, currentPCK); - if (isTemplateFile && currentPCK.HasFile("Skins.pck", PckAssetType.SkinDataFile)) + if (isTemplateFile && currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) { TreeNode skinsNode = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); TreeNode folderNode = CreateNode("Skins"); @@ -805,7 +805,7 @@ namespace PckStudio } else { - foreach (PckAsset _asset in currentPCK.GetFiles()) + foreach (PckAsset _asset in currentPCK.GetAssets()) { if (_asset.Filename.StartsWith(selectedFolder)) { @@ -957,7 +957,7 @@ namespace PckStudio if (node.TryGetTagData(out PckAsset asset)) { - if (!BeforeFileRemove(asset) && currentPCK.RemoveFile(asset)) + if (!BeforeFileRemove(asset) && currentPCK.RemoveAsset(asset)) { node.Remove(); wasModified = true; @@ -1020,7 +1020,7 @@ namespace PckStudio using AddNewSkin add = new AddNewSkin(locFile); if (add.ShowDialog(this) == DialogResult.OK) { - if (currentPCK.HasFile("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); @@ -1034,11 +1034,11 @@ namespace PckStudio else { if (treeViewMain.Nodes.ContainsKey("Skins")) add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddFile(add.SkinAsset); + currentPCK.AddAsset(add.SkinAsset); } if (add.HasCape) { - if (currentPCK.HasFile("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); @@ -1052,7 +1052,7 @@ namespace PckStudio else { if (treeViewMain.Nodes.ContainsKey("Skins")) add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddFile(add.CapeAsset); + currentPCK.AddAsset(add.CapeAsset); } } @@ -1091,7 +1091,7 @@ namespace PckStudio AudioEditor diag = new AudioEditor(asset, LittleEndianCheckBox.Checked); if (diag.ShowDialog(this) == DialogResult.OK) { - currentPCK.AddFile(asset); + currentPCK.AddAsset(asset); } diag.Dispose(); BuildMainTreeView(); @@ -1115,7 +1115,7 @@ namespace PckStudio if (animationEditor.ShowDialog() == DialogResult.OK) { wasModified = true; - PckAsset asset = currentPCK.CreateNewFile(animationFilepath, PckAssetType.TextureFile); + PckAsset asset = currentPCK.CreateNewAsset(animationFilepath, PckAssetType.TextureFile); asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); BuildMainTreeView(); ReloadMetaTreeView(); @@ -1197,9 +1197,9 @@ namespace PckStudio bool hasSkinsFolder = false; // add original pck files to prevent data loss - foreach (PckAsset asset in parentAssetPck.GetFiles()) + foreach (PckAsset asset in parentAssetPck.GetAssets()) { - PckAsset newAsset = newPCKFile.CreateNewFile(asset.Filename, asset.Type); + PckAsset newAsset = newPCKFile.CreateNewAsset(asset.Filename, asset.Type); // check for skins folder so files are placed consistently in final pck if (asset.Filename.StartsWith("Skins/") && parentAsset.Type is PckAssetType.SkinDataFile) hasSkinsFolder = true; foreach (var prop in asset.GetProperties()) @@ -1211,7 +1211,7 @@ namespace PckStudio { if (node.Tag is PckAsset nodeAsset) { - PckAsset newAsset = newPCKFile.CreateNewFile( + PckAsset newAsset = newPCKFile.CreateNewAsset( (hasSkinsFolder ? "Skins/" : String.Empty) + nodeAsset.Filename.Replace(parentAsset.Filename + "/", String.Empty), nodeAsset.Type); foreach (var prop in nodeAsset.GetProperties()) @@ -1365,7 +1365,7 @@ namespace PckStudio if (node.Parent == null) treeViewMain.Nodes.Insert(node.Index + 1, newNode); //adds generated file node else node.Parent.Nodes.Insert(node.Index + 1, newNode);//adds generated file node to selected folder - if (!IsSubPCKNode(node.FullPath)) currentPCK.InsertFile(node.Index + 1, newFile); + if (!IsSubPCKNode(node.FullPath)) currentPCK.InsertAsset(node.Index + 1, newFile); else RebuildSubPCK(node.FullPath); BuildMainTreeView(); wasModified = true; @@ -1565,7 +1565,7 @@ namespace PckStudio MessageBox.Show(this, $"'{addFile.Filepath}' of type {addFile.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); continue; } - var importedFile = currentPCK.CreateNewFile(addFile.Filepath, addFile.Filetype, () => File.ReadAllBytes(filepath)); + var importedFile = currentPCK.CreateNewAsset(addFile.Filepath, addFile.Filetype, () => File.ReadAllBytes(filepath)); string propertyFile = filepath + ".txt"; if (File.Exists(propertyFile)) { @@ -1585,15 +1585,15 @@ namespace PckStudio { var pack = new PckFile(3); - PckAsset zeroAsset = pack.CreateNewFile("0", PckAssetType.InfoFile); + PckAsset zeroAsset = pack.CreateNewAsset("0", PckAssetType.InfoFile); zeroAsset.AddProperty("PACKID", packId); zeroAsset.AddProperty("PACKVERSION", packVersion); var locFile = new LOCFile(); locFile.InitializeDefault(packName); - pack.CreateNewFile("localisation.loc", PckAssetType.LocalisationFile, new LOCFileWriter(locFile, 2)); + pack.CreateNewAsset("localisation.loc", PckAssetType.LocalisationFile, new LOCFileWriter(locFile, 2)); - pack.CreateNewFileIf(createSkinsPCK, "Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + pack.CreateNewAssetIf(createSkinsPCK, "Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); @@ -1607,13 +1607,13 @@ namespace PckStudio PckFile infoPCK = new PckFile(3); - PckAsset iconAsset = infoPCK.CreateNewFile("icon.png", PckAssetType.TextureFile); + PckAsset iconAsset = infoPCK.CreateNewAsset("icon.png", PckAssetType.TextureFile); iconAsset.SetTexture(Resources.TexturePackIcon); - PckAsset comparisonAsset = infoPCK.CreateNewFile("comparison.png", PckAssetType.TextureFile); + PckAsset comparisonAsset = infoPCK.CreateNewAsset("comparison.png", PckAssetType.TextureFile); comparisonAsset.SetTexture(Resources.Comparison); - PckAsset texturepackInfoAsset = pack.CreateNewFile($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile); + PckAsset texturepackInfoAsset = pack.CreateNewAsset($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile); texturepackInfoAsset.AddProperty("PACKID", "0"); texturepackInfoAsset.AddProperty("DATAPATH", $"{res}Data.pck"); @@ -1625,7 +1625,7 @@ namespace PckStudio private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { PckFile pack = InitializeTexturePack(packId, packVersion, packName, res, true); - PckAsset gameRuleAsset = pack.CreateNewFile("GameRules.grf", PckAssetType.GameRulesFile); + PckAsset gameRuleAsset = pack.CreateNewAsset("GameRules.grf", PckAssetType.GameRulesFile); GameRuleFile grfFile = new GameRuleFile(); grfFile.AddRule("MapOptions", new KeyValuePair("seed", "0"), @@ -1785,7 +1785,7 @@ namespace PckStudio continue; } - PckAsset newAsset = currentPCK.CreateNewFile(pckfilepath, pckfiletype); + PckAsset newAsset = currentPCK.CreateNewAsset(pckfilepath, pckfiletype); byte[] filedata = File.ReadAllBytes(fullfilename); newAsset.SetData(filedata); @@ -1802,8 +1802,8 @@ namespace PckStudio private bool TryGetLocFile(out LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && - !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locAsset)) + if (!currentPCK.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !currentPCK.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) { locFile = null; return false; @@ -1828,8 +1828,8 @@ namespace PckStudio private bool TrySetLocFile(in LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && - !currentPCK.TryGetFile("languages.loc", PckAssetType.LocalisationFile, out locAsset)) + if (!currentPCK.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !currentPCK.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) { return false; } @@ -1866,7 +1866,7 @@ namespace PckStudio return; } - PckAsset importSkinAsset = currentPCK.CreateNewFile(skinNameImport, PckAssetType.SkinFile); + PckAsset importSkinAsset = currentPCK.CreateNewAsset(skinNameImport, PckAssetType.SkinFile); importSkinAsset.SetData(data); string propertyFile = contents.FileName + ".txt"; if (File.Exists(propertyFile)) @@ -2139,7 +2139,7 @@ namespace PckStudio MessageBox.Show(this, $"'{renamePrompt.NewText}' already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - PckAsset asset = currentPCK.CreateNewFile(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); + PckAsset asset = currentPCK.CreateNewAsset(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); BuildMainTreeView(); wasModified = true; } @@ -2184,8 +2184,8 @@ namespace PckStudio { string mippedPath = $"{textureDirectory}/{textureName}MipMapLevel{i}{textureExtension}"; Debug.WriteLine(mippedPath); - if (currentPCK.HasFile(mippedPath, PckAssetType.TextureFile)) - currentPCK.RemoveFile(currentPCK.GetFile(mippedPath, PckAssetType.TextureFile)); + if (currentPCK.HasAsset(mippedPath, PckAssetType.TextureFile)) + currentPCK.RemoveAsset(currentPCK.GetAsset(mippedPath, PckAssetType.TextureFile)); PckAsset mipMappedAsset = new PckAsset(mippedPath, PckAssetType.TextureFile); @@ -2205,7 +2205,7 @@ namespace PckStudio mipMappedAsset.SetTexture(mippedTexture); - currentPCK.InsertFile(currentPCK.IndexOfFile(asset) + i - 1, mipMappedAsset); + currentPCK.InsertAsset(currentPCK.IndexOfAsset(asset) + i - 1, mipMappedAsset); } BuildMainTreeView(); } @@ -2214,12 +2214,12 @@ namespace PckStudio private void colourscolToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("colours.col", PckAssetType.ColourTableFile, out _)) + if (currentPCK.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out _)) { MessageBox.Show(this, "A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - PckAsset newColorAsset = currentPCK.CreateNewFile("colours.col", PckAssetType.ColourTableFile); + PckAsset newColorAsset = currentPCK.CreateNewAsset("colours.col", PckAssetType.ColourTableFile); newColorAsset.SetData(Resources.tu69colours); BuildMainTreeView(); } @@ -2287,13 +2287,13 @@ namespace PckStudio private void CreateSkinsPCKToolStripMenuItem1_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("Skins.pck", PckAssetType.SkinDataFile, out _)) + if (currentPCK.TryGetAsset("Skins.pck", PckAssetType.SkinDataFile, out _)) { MessageBox.Show(this, "A Skins.pck file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + currentPCK.CreateNewAsset("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); BuildMainTreeView(); @@ -2348,7 +2348,7 @@ namespace PckStudio MessageBox.Show(this, $"'{diag.Filepath}' of type {diag.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - PckAsset asset = currentPCK.CreateNewFile(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); + PckAsset asset = currentPCK.CreateNewAsset(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); @@ -2361,24 +2361,24 @@ namespace PckStudio private void behavioursbinToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("behaviours.bin", PckAssetType.BehavioursFile, out _)) + if (currentPCK.TryGetAsset("behaviours.bin", PckAssetType.BehavioursFile, out _)) { MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("behaviours.bin", PckAssetType.BehavioursFile, BehaviourResources.BehaviourFileInitializer); + currentPCK.CreateNewAsset("behaviours.bin", PckAssetType.BehavioursFile, BehaviourResources.BehaviourFileInitializer); BuildMainTreeView(); } private void entityMaterialsbinToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("entityMaterials.bin", PckAssetType.MaterialFile, out _)) + if (currentPCK.TryGetAsset("entityMaterials.bin", PckAssetType.MaterialFile, out _)) { MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("entityMaterials.bin", PckAssetType.MaterialFile, MaterialResources.MaterialsFileInitializer); + currentPCK.CreateNewAsset("entityMaterials.bin", PckAssetType.MaterialFile, MaterialResources.MaterialsFileInitializer); BuildMainTreeView(); } diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index 16893bc5..55b084f4 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit 16893bc51e459f48c6c95d3f5adbb231186728dd +Subproject commit 55b084f40e32e1427c12146fa35fa0525273a696 From 2ad8423eff567b6dc3a7da4c2904c22531724d3b Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 21 Jun 2024 19:49:09 +0200 Subject: [PATCH 4/5] MainForm - Add some main menu icons --- PCK-Studio/MainForm.Designer.cs | 26 +- PCK-Studio/MainForm.resx | 996 +++++++++++++++++++++----------- 2 files changed, 664 insertions(+), 358 deletions(-) diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 608eb613..eb75cbbe 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -89,12 +89,12 @@ this.texturePackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mashUpPackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.recentlyOpenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.packSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fullBoxSupportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.recentlyOpenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.quickChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -534,13 +534,13 @@ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newToolStripMenuItem, this.openToolStripMenuItem, - this.packSettingsToolStripMenuItem, - this.saveToolStripMenuItem1, - this.saveToolStripMenuItem, - this.closeToolStripMenuItem, toolStripSeparator2, this.recentlyOpenToolStripMenuItem, toolStripSeparator4, + this.closeToolStripMenuItem, + this.packSettingsToolStripMenuItem, + this.saveToolStripMenuItem1, + this.saveToolStripMenuItem, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.Silver; this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; @@ -579,6 +579,11 @@ this.openToolStripMenuItem.Name = "openToolStripMenuItem"; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // + // recentlyOpenToolStripMenuItem + // + resources.ApplyResources(this.recentlyOpenToolStripMenuItem, "recentlyOpenToolStripMenuItem"); + this.recentlyOpenToolStripMenuItem.Name = "recentlyOpenToolStripMenuItem"; + // // packSettingsToolStripMenuItem // this.packSettingsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -608,19 +613,14 @@ // // closeToolStripMenuItem // - this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; resources.ApplyResources(this.closeToolStripMenuItem, "closeToolStripMenuItem"); + this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click); // - // recentlyOpenToolStripMenuItem - // - this.recentlyOpenToolStripMenuItem.Name = "recentlyOpenToolStripMenuItem"; - resources.ApplyResources(this.recentlyOpenToolStripMenuItem, "recentlyOpenToolStripMenuItem"); - // // exitToolStripMenuItem // - this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; resources.ApplyResources(this.exitToolStripMenuItem, "exitToolStripMenuItem"); + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // // editToolStripMenuItem @@ -648,8 +648,8 @@ // // openPckManagerToolStripMenuItem // - this.openPckManagerToolStripMenuItem.Name = "openPckManagerToolStripMenuItem"; resources.ApplyResources(this.openPckManagerToolStripMenuItem, "openPckManagerToolStripMenuItem"); + this.openPckManagerToolStripMenuItem.Name = "openPckManagerToolStripMenuItem"; this.openPckManagerToolStripMenuItem.Click += new System.EventHandler(this.openPckManagerToolStripMenuItem_Click); // // convertMusicFilesToolStripMenuItem diff --git a/PCK-Studio/MainForm.resx b/PCK-Studio/MainForm.resx index 2d5a3cd8..53843773 100644 --- a/PCK-Studio/MainForm.resx +++ b/PCK-Studio/MainForm.resx @@ -833,6 +833,29 @@ 116, 17 + + 224, 324 + + + contextMenuPCKEntries + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ + /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF + TkSuQmCC + + + + 223, 22 + + + Create + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -921,19 +944,20 @@ EntityMaterials.bin - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ - /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB + DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW + mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF TkSuQmCC - + 223, 22 - - Create + + Import @@ -987,20 +1011,11 @@ Add File - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB - DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW - mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF - TkSuQmCC - - - + 223, 22 - - Import + + Export 186, 22 @@ -1008,11 +1023,11 @@ Export as 3DS Texture - + 223, 22 - - Export + + Set File Type 222, 22 @@ -1086,12 +1101,6 @@ Entity Materials File (.BIN) - - 223, 22 - - - Set File Type - 220, 6 @@ -1113,6 +1122,12 @@ Correct Skin Decimals + + 223, 22 + + + Set SubPCK Endianness + 250, 22 @@ -1125,11 +1140,11 @@ Little Endian (PS4/PS Vita/Switch) - + 223, 22 - - Set SubPCK Endianness + + Set Model Container Format 216, 22 @@ -1149,12 +1164,6 @@ Version 3 (1.14 [PS4 ONLY]) - - 223, 22 - - - Set Model Container Format - 220, 6 @@ -1223,15 +1232,6 @@ Delete - - 224, 346 - - - contextMenuPCKEntries - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 17, 17 @@ -1244,24 +1244,6 @@ None - - 151, 22 - - - Skin Pack - - - 151, 22 - - - Texture Pack - - - 151, 22 - - - Mash-Up Pack - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -1296,11 +1278,56 @@ Open - - 160, 22 + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAT + rAAAE6wBzl+vrgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHkSURBVFhH1ZfN + KwVRGIevBRslZUtZsPG1kEhZ21hYKfkTpMTCwoqF4l+QNbKysraU8rW1ZEEUpcg3v2fMYXLn471zz+12 + n3q6c8685z3vzJy65xRqhT45LidyytheWTKD8lR+efJEDkgTTP4kGXgj9+ROThlLDnI9SlMR7sm3ZCMd + ZUKObUnOYzrS6JHuyX1M7iDXrSR3Nx1JsGgI4tX5hpzkZo5EWLkE8f18Q05yM0cipRYwG2qhIgW8h1qo + SAHEooXYAliR93I5aBUXMCy5Pxe0ivFSwKv8lGMyWkCLvAjbizKOsguABcmNOzkdXhO8G14fyAYZB/fR + QmIBddJNdh7+noW/FNUukyAGLSQWANHXjR/SfZY0XHxb0EontQAYkm/SJV2TWRxKYi9l1t9uZgGwLgm6 + lvV0ZNAs9yVjHuSoTMJUAOthRrYGLRss0E1J8hc5JeMwFZAXCl+VTMDaWZL/qWgBjnnJAmaiFToimD/B + iGwKWvmYlM/yKmj9YSqARUTQRtDKT4fs/Ln8xVQANwki2De1UUDVt2RuU8oGslKb0i460uAQQSBbaR9F + kMNty4/oyILDA4cI9yZ4dXy/PDLWPTk5+6UJiuAQwUAf8uTmyaOwY2LRsHLzyNjUg0iVKBS+AWAi5w3z + cKwSAAAAAElFTkSuQmCC + - - Full box support + + 186, 22 + + + Recently open + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAAJ10AACddAWJ4eeMAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwa + AAADaElEQVR4Xu2bO49NURiGx/1OhCiERhQKFZ2CBAlxvyv8BtHTKTUKkaCViFuCiEQoFESiICiUKgoR + BZGgcHmfYpKTPe+aOWfvb629JftJnmbOmf2t7519XXvNWE9PT09PGZbKE/K8vCZv1vCK3C7/K+bIs/K7 + /BvgH3lc/hcsk0+la6SJbLPzsMu/lK6BpqYC2CLfyG/ytlwuW2GxfCHd4JvKIXBMVtktf8rB73LeKM5C + +UwODmTQT/K+rJ7ghpGT4DZZxTWPX2VR5ssnsjqQca9LAook1Ty+ksWYKx9JNxC8IWfISCZrnp9vlkWY + Ldmt3UDwjpwlI9kpf0hX75fcJ4tAYzToBoIPJAFFMtlfHk/KIrBLs2u7QSCHBIdGJFM1j0dldqbLq9IN + ALkSRJ/wJtvtB80ewDR5Sbri+FwukpEM2zxmDYDmL0pXGLn0cBcYySjNY9YATktXFHM0P9Wlzv08WwAb + 5W/pir6VPPxEMlXzfO4+yxbAPekKvpMrZCTDNA/u8ywBcFLjBqNa7L1cKSMZtnlw38kSwCbpiu2QkYzS + PLjvHZHhHJCu2DwZxajNc0Vy380SABt1xRhEBHXu7VMBHJbh5Ayg7oMNd6Pud7IEwEZdsaYB1G0eUgEc + kuGkAmAQdWnSPPAw5n43SwBs1BWrG0DT5qETAdSZ5YloHlIBHJThRAUQ1TzMlG47WQJgo67YKAFENg+p + ALhnCScVAIMYhujmgek4t70sAaTuBIcJIEfz0IkApprtzdU8pALYL8OpE0DO5oHZZrftLAHwSqpaiOZS + 9wGjPtjUoWgAS+RnOVjornSUaB6KBgDMCfDKm5eOvH52s0ClmgcWX7g6TQ+t2uQ+5qukAtgri1O6eeCt + k6tXPIA2modOBNBW85AKYI8sQpvNA/ORrnaRANpuHloLoAvNA0ty3BgiL7UT6ErzUDyALjUPqQB2yXC6 + 1jwskG484QF0sXkoEgDLT1P39uhWbZZilXRj2irDYO2tKzIuCyba4ox0Y1orw2DhsSsy6Gv5WPKEWF3e + Gi01qEVNN5aPssnLmgnckq5QVz0nQ2HJOakzB8DhQMKucBf8IKPXKE1gvfwi3QDalNmqDbIIq+VD6QbS + hqxIXSOLs06ekhfkZVn3n6FGkRrUoia1GUNPT09Pz+iMjf0D9wsBsNeAg5QAAAAASUVORK5CYII= + + + + 186, 22 + + + Close + + + False 186, 22 @@ -1355,20 +1382,17 @@ Save As - - 186, 22 - - - Close - - - False - - - 186, 22 - - - Recently open + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wQAADsEBuJFr7QAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEkSURBVFhH7ZfN + asJAFEbzEoo/b6QU36a6LhR8IzdKlVJoQTd24WuUtpuu9Dsjs5FI594ZCEQPHHBg7s2XxISb6k4CE7mW + v/KYKHtf5IPMYi7rDmDxWbrgzGnwJx/lQKbC3qmklh5jaYbLTjGNvFBLj1VYGfmRFPfDykdP0uM7rIxQ + iLm4+7QmAI8jmikVwE0rAizkVnbDykiJABycHp/SHKJEgI7cS/ocpOmd8l+AjYx7Un2XycSia3gCfMhk + YlEOl7eAV3MyJQLsJD0a+xNyyRt9DLNoTYA3+Xr+aaNUAHefxgPEkcwyjF4ylPT4CisjDBEU5wylM0mP + ZVgZ4aOCYkZrQuSM5SPpgo8KGuT4JLPgo4K5ntG67gB1spfL7j7zW6GqTtAaslLCb2cpAAAAAElFTkSu + QmCC + 186, 22 @@ -1382,6 +1406,108 @@ File + + 39, 20 + + + Edit + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + DAAACwwBP0AiyAAAA6pJREFUeF7tms9vDVEYhouqpFZVRFpdd+cPkFphQeKPqIUfSVl0Y9OQWNpXE/ak + SEhYkEjZUFZERCxtCaKKWKDe787jpNftmTlzz4x0rvMkb3Lzzfu9c8690zkz0+lLJBKJRCKRqIOVlZUx + 6Yb0WSqL9dyUxolrFhq4Tf6DFMtHaYzY5qBB2y9fFdeIbQ4adDeHvY8lYpsDA3dQDoY2B+XmwLgdlIOh + zUG5OTBuB+VgaHNQbg6M20E5GNoclP8N2l/M+r3eKHc9IWNV6/d6I+x6QqYq1+/1RvH1hEy9cNj7KL6e + wNizME0/+HoWpukHX8/CNP3gK8NeWq13IivVStT+aPUjz6R0S/pmDUXQ5qBcG+zGQbmIr5LNaZK2YmQe + lA5K56V70hvpu9QGdgfl2mA3DsqrsTHaWO9KNvYD0iD2RKIIHS7T0h5pA6XGY3NhTtOU/Mj0h7fSFem4 + ZGfbXdIWbOsWGyNjtTGfkK5KNpcW2PzgC4Y2B+XaYDcOysHQ5gdfMLQ5KNcGu3FQDoY2P/jKMEGr9e7L + SrUStT9a/eDrWZimH3x18Ez6kX3M5af0PPtYPUzTD74qeS0dJnumVclnBu9+6UWrUiGWnQu+KrBHUGek + AaIte6N0X/LxUNqE3fz90jHpnVQJRPvBF8ttaZjINlQfkeyXfSktSA+kV5IdKSPY2lB9WLojRUOkH3yx + XCCuMiwzi46DOD/4YrHDfyuR0SjL7kzfW3AsRPrBVwUniYzGsrLIeIj0g68KFoiMRll2nqgEIv3gi+WX + dITIaJR1iMxoiPSDL5aLxFWGZWbRcRDnB18M9ixxB3EdaJvdrp6WnkhfkH0+JXlvt7Vtu2TP9qIgzg++ + GOaI6kDbRqW8y1y7XB7F3oG2zbZcERDlB18ZHkmXpLOSPVEeIqoN1e2XD7nGty9hzSNB9SHpqHROuiw9 + lkpBlB98ZeinNRf57LAPZYq2XOTbnNnDodUPvmBoK0TWp1lHEIu0FYI/GNr84AuGtkJkXc46glimrRD8 + wdDmB18wtBUia5kvIPi1OPzB0OYHXzC0FSJrY/4Eyr4gEXoStHU+lLpOgp9o9SOTvVBUBluKbEmypcmW + qLxl0Ja4IszjHqKsRvVtUswyOE+UH5nGJbud7ZZZojrQNrsQyvsSii6E5lqu7rDb6d1E5SOjvSl2Xerm + fSG7XF3zaZChbQPSlLQo2YnRZL+k1db85Q1t2ykF/cv+L5akeSls8olEIpFIJP4T+vp+A8lMcFIN42ej + AAAAAElFTkSuQmCC + + + + 62, 20 + + + Tools + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + DAAACwwBP0AiyAAAAeRJREFUeF7tzjGOIzEMAEH//9N3SaEzwzLH2plAFTZEUq/jOI7jOI5f+beZM8/l + n9s481z+uY0zz+Wf2zjzHP4VeRtnIt/HPyJv40zk+/hH5G2ciXwf/4i8jTOR/467kW/jG5H3cSfybXwj + 8j7uRL6Nb0Tex53It/GNyL9jb+RlxsasWWYs8pw9kZcZG7NmmbHIc/ZEXmZszJplxiLP2RN5mbExa5YZ + izxnT+RlxiK/5VnkZcYiz9kTeZmxyG95FnmZschz9kReZizyW55FXmYs8pw9kZcZi/yWZ5GXGYs8Z0/k + bZyJvMxY5Dl7Im/jTORlxiLP2RN5G2ciLzMWec6eyNs4E3mZschz9kS+zLqPPF9mLPKcPZEvs+4jz5cZ + izxnT+TLrPvI82XGIs/ZE/ky6z7yfJmxyHP2RL7MusiXWRd5zp7Il1kX+TLrIs/ZE/mxfDPynD2RH8s3 + I8/ZE/mxfDPynD2RH8s3I8/ZE/ky6yJfZl3kOXsiX2Zd5Musi/w79kb+mvHIXzMeeR93In/NeOSvGY+8 + jzuRb+MbkfdxJ/JtfCPy33E38jbORL6Pf0TexpnI9/GPyNs4E/k+/hF5G2ciP4d/bePMc/nnNs48l39u + 48xz+ec2zhzHcRzHcVz0ev0HFtq118xXwn0AAAAASUVORK5CYII= + + + + 60, 20 + + + Help + + + 24, 44 + + + 1016, 24 + + + 2 + + + MainMenuStrip + + + menuStrip + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 151, 22 + + + Skin Pack + + + 151, 22 + + + Texture Pack + + + 151, 22 + + + Mash-Up Pack + + + 160, 22 + + + Full box support + False @@ -1539,11 +1665,20 @@ Quick Change - - 39, 20 - - - Edit + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA + rgAAAK4B+ff3XQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHrSURBVFhH7dZB + KCVxAMfxhyinTbQHXOyFLW1JbW1tkshBIuHi4LxtOWhbm/ZkLw6iOEgpJyUHJScUUqK4bBSrlCthV3bb + k13f3zP/Z+b5z/PGvMfl/epTM/znP795b95/JpJJEilHD/p8tCMfaUkF/uL/A5aQlujKdYJ52K5eDqAx + DUh5PkGTq4hfOqEx6ygIIAvWvMUYJrAJTb7h7MswqmGSjT1oXBDnaIYnRbiC7QA3jSmGSSV0HxwFcI1D + eFILnWAR9T4moTEjCJNL/LzdvEsdNPlUdM+el/iNP2iCraTNG7i/91iBGqxgBz+gAmfOvug++Ar3wd+g + cUFNwyRW4AS2wfG6YKIb7zNmMJukU2gefYJKrID+qLvY9lORRmjMPnLw2KxC87yK7sUV+K6NBFmDxo3D + thjZfEAJTEIV0NqQzJIcTx97IZRQBZQq9MJ2tTZaGTW3WWxCFwiaIWhuPS2VTIFMAVPgFy7wD7t4tgJa + /N7jyQuYryCWMAX0gGqB3iNeoBW5UEyBj9BJt5z9MngSpsA76PhR9DvbKqGYAm56C8qDJ/rHYwuUQk/T + brQ526+hmAKaexlzUOF7CVMgUeLvAd9o0DE6UmwBmtt8Jb7Zhgamg17d3C+v1ugO/oLBFBuA3gMzSZBI + 5Ab5tjecGDuUzgAAAABJRU5ErkJggg== + 161, 22 @@ -1551,6 +1686,12 @@ Pck Manager + + 161, 22 + + + Audio Converter + 145, 22 @@ -1563,40 +1704,6 @@ Binka -> Wav - - 161, 22 - - - Audio Converter - - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAA6pJREFUeF7tms9vDVEYhouqpFZVRFpdd+cPkFphQeKPqIUfSVl0Y9OQWNpXE/ak - SEhYkEjZUFZERCxtCaKKWKDe787jpNftmTlzz4x0rvMkb3Lzzfu9c8690zkz0+lLJBKJRCKRqIOVlZUx - 6Yb0WSqL9dyUxolrFhq4Tf6DFMtHaYzY5qBB2y9fFdeIbQ4adDeHvY8lYpsDA3dQDoY2B+XmwLgdlIOh - zUG5OTBuB+VgaHNQbg6M20E5GNoclP8N2l/M+r3eKHc9IWNV6/d6I+x6QqYq1+/1RvH1hEy9cNj7KL6e - wNizME0/+HoWpukHX8/CNP3gK8NeWq13IivVStT+aPUjz6R0S/pmDUXQ5qBcG+zGQbmIr5LNaZK2YmQe - lA5K56V70hvpu9QGdgfl2mA3DsqrsTHaWO9KNvYD0iD2RKIIHS7T0h5pA6XGY3NhTtOU/Mj0h7fSFem4 - ZGfbXdIWbOsWGyNjtTGfkK5KNpcW2PzgC4Y2B+XaYDcOysHQ5gdfMLQ5KNcGu3FQDoY2P/jKMEGr9e7L - SrUStT9a/eDrWZimH3x18Ez6kX3M5af0PPtYPUzTD74qeS0dJnumVclnBu9+6UWrUiGWnQu+KrBHUGek - AaIte6N0X/LxUNqE3fz90jHpnVQJRPvBF8ttaZjINlQfkeyXfSktSA+kV5IdKSPY2lB9WLojRUOkH3yx - XCCuMiwzi46DOD/4YrHDfyuR0SjL7kzfW3AsRPrBVwUniYzGsrLIeIj0g68KFoiMRll2nqgEIv3gi+WX - dITIaJR1iMxoiPSDL5aLxFWGZWbRcRDnB18M9ixxB3EdaJvdrp6WnkhfkH0+JXlvt7Vtu2TP9qIgzg++ - GOaI6kDbRqW8y1y7XB7F3oG2zbZcERDlB18ZHkmXpLOSPVEeIqoN1e2XD7nGty9hzSNB9SHpqHROuiw9 - lkpBlB98ZeinNRf57LAPZYq2XOTbnNnDodUPvmBoK0TWp1lHEIu0FYI/GNr84AuGtkJkXc46glimrRD8 - wdDmB18wtBUia5kvIPi1OPzB0OYHXzC0FSJrY/4Eyr4gEXoStHU+lLpOgp9o9SOTvVBUBluKbEmypcmW - qLxl0Ja4IszjHqKsRvVtUswyOE+UH5nGJbud7ZZZojrQNrsQyvsSii6E5lqu7rDb6d1E5SOjvSl2Xerm - fSG7XF3zaZChbQPSlLQo2YnRZL+k1db85Q1t2ykF/cv+L5akeSls8olEIpFIJP4T+vp+A8lMcFIN42ej - AAAAAElFTkSuQmCC - - - - 62, 20 - - - Tools - iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -2110,6 +2217,20 @@ About + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 + jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq + myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp + JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC + + + + 205, 22 + + + Tutorials + 312, 22 @@ -2152,38 +2273,6 @@ How PCKs work - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 - jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq - myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp - JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC - - - - 205, 22 - - - Tutorials - - - 233, 22 - - - Nobledez (Original Developer) - - - 233, 22 - - - PhoenixARC (Developer) - - - 233, 22 - - - MattNL (Other Developer) - iVBORw0KGgoAAAANSUhEUgAAAgAAAAIBCAYAAAA/JAdfAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN @@ -2482,6 +2571,24 @@ Support a Developer + + 233, 22 + + + Nobledez (Original Developer) + + + 233, 22 + + + PhoenixARC (Developer) + + + 233, 22 + + + MattNL (Other Developer) + iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -2938,53 +3045,32 @@ Settings - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAAeRJREFUeF7tzjGOIzEMAEH//9N3SaEzwzLH2plAFTZEUq/jOI7jOI5f+beZM8/l - n9s481z+uY0zz+Wf2zjzHP4VeRtnIt/HPyJv40zk+/hH5G2ciXwf/4i8jTOR/467kW/jG5H3cSfybXwj - 8j7uRL6Nb0Tex53It/GNyL9jb+RlxsasWWYs8pw9kZcZG7NmmbHIc/ZEXmZszJplxiLP2RN5mbExa5YZ - izxnT+RlxiK/5VnkZcYiz9kTeZmxyG95FnmZschz9kReZizyW55FXmYs8pw9kZcZi/yWZ5GXGYs8Z0/k - bZyJvMxY5Dl7Im/jTORlxiLP2RN5G2ciLzMWec6eyNs4E3mZschz9kS+zLqPPF9mLPKcPZEvs+4jz5cZ - izxnT+TLrPvI82XGIs/ZE/ky6z7yfJmxyHP2RL7MusiXWRd5zp7Il1kX+TLrIs/ZE/mxfDPynD2RH8s3 - I8/ZE/mxfDPynD2RH8s3I8/ZE/ky6yJfZl3kOXsiX2Zd5Musi/w79kb+mvHIXzMeeR93In/NeOSvGY+8 - jzuRb+MbkfdxJ/JtfCPy33E38jbORL6Pf0TexpnI9/GPyNs4E/k+/hF5G2ciP4d/bePMc/nnNs48l39u - 48xz+ec2zhzHcRzHcVz0ev0HFtq118xXwn0AAAAASUVORK5CYII= - - - - 60, 20 - - - Help - - - 24, 44 - - - 1016, 24 - - - 2 - - - MainMenuStrip - - - menuStrip - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - 298, 17 + + 182, 92 + + + contextMenuMetaTree + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 181, 22 + + + Add Entry + 160, 22 @@ -3003,20 +3089,6 @@ Add ANIM Entry - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 181, 22 - - - Add Entry - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -3052,14 +3124,128 @@ Edit All Entries - - 182, 92 + + openTab - - contextMenuMetaTree + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + + + Fill + + + 20, 30 + + + 0, 0, 0, 0 + + + 1024, 600 + + + 0 + + + tabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 4 + + + pckOpen + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + openTab + + + 2 + + + label5 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + openTab + + + 3 + + + labelVersion + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + openTab + + + 4 + + + ChangelogRichTextBox + + + System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + openTab + + + 5 + + + 4, 38 + + + 18, 30, 20, 5 + + + 1016, 558 + + + 1 + + + openTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 0 None @@ -4171,33 +4357,120 @@ 5 - - 4, 38 - - - 18, 30, 20, 5 - - - 1016, 558 - - - 1 - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 - + + True + None + + pckFileLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 2 + + + labelImageSize + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 3 + + + fileEntryCountLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 4 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + + + label11 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 6 + + + treeViewMain + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editorTab + + + 7 + + + previewPictureBox + + + PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null + + + editorTab + + + 9 + + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + 3, 17 @@ -4276,6 +4549,138 @@ Top, Bottom, Right + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + + + 338, 277 + + + 671, 282 + + + 11 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + + + metroLabel2 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 2 + + + treeMeta + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MetaTab + + + 3 + + + entryTypeTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 4 + + + entryDataTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 5 + + + buttonEdit + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 6 + + + metroLabel1 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 7 + + + 4, 38 + + + 3, 3, 3, 3 + + + 663, 240 + + + 0 + + + Properties + + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + Top, Right @@ -4477,54 +4882,6 @@ 7 - - 4, 38 - - - 3, 3, 3, 3 - - - 663, 240 - - - 0 - - - Properties - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - 338, 277 - - - 671, 282 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - True @@ -4627,57 +4984,6 @@ 9 - - 4, 38 - - - 5, 50, 5, 7 - - - 1016, 558 - - - 0 - - - editorTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 1 - - - Fill - - - 20, 30 - - - 0, 0, 0, 0 - - - 1024, 600 - - - 0 - - - tabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 4 - Top, Right @@ -7574,6 +7880,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + recentlyOpenToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + packSettingsToolStripMenuItem @@ -7604,12 +7916,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - recentlyOpenToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - exitToolStripMenuItem From fcdadb35306272ad4d1a0fa8d8239851e36dc4fc Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 21 Jun 2024 20:04:08 +0200 Subject: [PATCH 5/5] GithubUserPanel - Add todo --- PCK-Studio/ToolboxItems/GithubUserPanel.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PCK-Studio/ToolboxItems/GithubUserPanel.cs b/PCK-Studio/ToolboxItems/GithubUserPanel.cs index 31c026d4..124717d7 100644 --- a/PCK-Studio/ToolboxItems/GithubUserPanel.cs +++ b/PCK-Studio/ToolboxItems/GithubUserPanel.cs @@ -41,6 +41,7 @@ namespace PckStudio.ToolboxItems private void LoadAuthor() { + // TODO: find a better way to check if the avatar has changed since last cache. string cacheKey = Convert.ToBase64String(Encoding.Default.GetBytes(_contributor.AvatarUrl)); if (!ApplicationScope.DataCacher.HasFileCached(cacheKey))