From 3e5b9685018a8a34d23cce24df7c0d7a5b1c17a7 Mon Sep 17 00:00:00 2001 From: CatmanFan Date: Wed, 8 Jan 2025 20:31:03 +0100 Subject: [PATCH] Full list of changes: * Update VirusTotal action * Creating new documentation website based on [MkDocs](https://www.mkdocs.org/) * Add HTML labels, tooltips * Fix controller keymap form resetting after opening & closing content options * Fix online WAD option not saving * Fix Flash not loading on Japanese version * Flash: Add content domain option, BBC iPlayer support (beta) * Translation/string updates * Interface bugfixes and updates * General system stability improvements to enhance the user's experience. --- .github/workflows/dotnet.yml | Bin 2502 -> 5402 bytes .gitignore | 3 +- FriishProduce/FriishProduce.csproj | 34 +- FriishProduce/MainForm.Designer.cs | 36 +- FriishProduce/MainForm.cs | 29 +- FriishProduce/MainForm.resx | 26 +- FriishProduce/ProjectForm.Designer.cs | 39 +- FriishProduce/ProjectForm.cs | 49 +- FriishProduce/ProjectForm.resx | 494 ++-- FriishProduce/SettingsForm.Designer.cs | 22 +- FriishProduce/SettingsForm.cs | 7 +- FriishProduce/SettingsForm.resx | 2143 ++++------------- FriishProduce/Strings/en.json | 16 +- FriishProduce/Strings/es.json | 12 +- FriishProduce/Strings/fr.json | 12 +- FriishProduce/Strings/ja.json | Bin 8516 -> 9842 bytes FriishProduce/Strings/ko.json | 7 + FriishProduce/Subforms/About.cs | 2 +- .../Subforms/ContentOptions.Designer.cs | 19 +- FriishProduce/Subforms/ContentOptions.cs | 5 +- FriishProduce/Subforms/ContentOptions.resx | 138 +- .../ContentOptions/Options_Flash.Designer.cs | 97 +- .../Subforms/ContentOptions/Options_Flash.cs | 6 +- .../ContentOptions/Options_VC_NEO.Designer.cs | 8 +- .../ContentOptions/Options_VC_NES.Designer.cs | 12 - FriishProduce/Subforms/ControllerMapping.cs | 48 +- FriishProduce/Subforms/ControllerMapping.resx | 1054 ++++++-- .../Subforms/Controllers/Controller_Flash.cs | 2 +- .../Subforms/Controllers/Controller_SEGA.cs | 2 +- FriishProduce/Subforms/HTMLForm.Designer.cs | 120 + FriishProduce/Subforms/HTMLForm.cs | 26 + FriishProduce/Subforms/HTMLForm.resx | 120 + FriishProduce/_classes/Creators/Flash.cs | 86 +- .../_classes/Databases/ChannelData.cs | 11 +- .../_classes/Program/CustomGraphics.cs | 88 +- FriishProduce/_classes/Program/Language.cs | 63 +- FriishProduce/_classes/Program/MessageBox.cs | 6 + FriishProduce/_classes/Program/Settings.cs | 70 +- FriishProduce/database.json | 9 +- FriishProduce/packages.config | 5 +- docs/docs/img/favicon.ico | Bin 0 -> 130913 bytes docs/docs/index.md | 17 + docs/mkdocs.yml | 5 + 43 files changed, 2626 insertions(+), 2322 deletions(-) create mode 100644 FriishProduce/Subforms/HTMLForm.Designer.cs create mode 100644 FriishProduce/Subforms/HTMLForm.cs create mode 100644 FriishProduce/Subforms/HTMLForm.resx create mode 100644 docs/docs/img/favicon.ico create mode 100644 docs/docs/index.md create mode 100644 docs/mkdocs.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index ea04246ebdf04ebfaa8508f28b8ccd50a8c26a24..a54598ab68b9ccaec8c930777d256dbb5258cbc4 100644 GIT binary patch literal 5402 zcmbW5eQz5@5XR?kB)-EbL?u+%CItip1(B9Et)Nkq&`2n$jAOfrTgNuBlQdAiI`I5< zvfjP3bEVPA_IYn-=9%}|`}dzutgv70)CM-y-Ia~)+}_wL8|v;VtPFHN)ZMXNXxGqs zy6@=Iv>kga+QKHH8QW{?Ti0gxv3+E4eG+&Tb{2m7S{c|#oRM%Q4m159Yo(CnzOD`3 zooaO^epCHx>FQ}mSO1!JqTMq+zYvb5*2dz|64glGogmk_O~d~S?PZ5c8Hu`);h*YX zN0dGN&ctJ?Z|IVSAcdy7E3S`3<(i`HNc+xiG>BGVoevsrgu6oeO@x0cEz%0B$Fc~L zx_SZ{EODsMO3(nAEBg1c#08(UMc21K#M5=SJ6DiS#0Ad~3DXB_KkQ=XYwbD?Pa|EjYT^aIbKxFoXXD03L?621^Q*A_z`n3``)#=2q79tRvmvWbv*-g?;+gYB!`pD}NaA+jS&05YEuOTujAJAoCxHhT zoJXDfJ?+IC6P{D4)aa8k+>NJ%lye1NrGi4Dvrc7YfcX-y#>{@#s2`LqF zAnRR-BGt%E!_q^2I^vC`TcY2Pb*P8K5MAXRo8r^a6LwcM&i_{ zvKzS1fjNU3yqU~b2BRi^Sdt~=T*RY?2f@ot;vd#bD+?FMvaQdeG zDISx#UFz%+GpZXrf)}ZNg{qYE%W2Ee^lr|d^?0pHi!F7{$F^zrwCeoP&H15c-XjY| zhF=X;p67bn(^ZuUce?MXJVD<`GLk%c$Pc;-TMb%VDt@-@nXo*y7piD&VcM~Sz&qz( zjgVv!yiR4q9{b|5wSbEZCT@q4MV}*jPZxHjNXm79A6z$ucP-OywSw9u7xqpP@DgYm zx?9)xH}+ZRol)<*=zAayK{%DA#^O#^(Sy3W^GXzb%kMzmLD$PU71hzHa;vg8?+|o{ zj^grKsF_>dD#K4?tGtIbmU5+1r!E$;&`X(@$~`wez0|X|cu%yet$N)L^@qs#OP5b% zAfiJteH}>mw*0ZHcxl_uij?29>u+6Eom{WUJU@I!NtLUuC>ZN0^{%L?QShM>Lg}-{ z@_b_7?G@$ryw7pp7UA`tFO)TV_RE3=$}ztyZLg%mxneoyLM|KpDgKx1xGGvQv`{XP z-N{RF4r(rqjHYCh4@{lzMU+8p|8?OsIK%prr$O7|F4xlRkR?^^OV>i zM;+sep2lpWR^GMBybx;6ARWbuPY5Z7s)+JDit|e)bC~d^D45U2#hCKk7_C(Q&R4a>Is(f zF0**5dJ#eFo{r#i?dXII8q448!4|F$vH42>=!DqArE=mWlRR#jTYYBmQ)}#)F^i+r z*za6wQ&SL=&|-(d^Y?W)O|s$!`E|!6#wmIOv`%Qnl&rm8NVBe@Bx` z_u6`Hp9VQtgt>6+b^$&w*ctRz9qt8oqrRqB( z@XT%^o-@x#-YLH=!g8&Ur}0$j-65VT8*~0G^*gr+KER6J5jlOv4uS`e;<*oY&wD8F z0DXbEg}JFNhwtev*}8h{x0+JF)aQHAA8OKCHf?Teb*7A`M;DsI5}IWeDQoXlrzM)Z zPMFvPjq}N2`CNG@jeq~(c?=r#s8&QKi~24=#4x?`jxE)3@*|&Kb9=O9$4KM6i}1E` NPc*zq^NQ88{{X1oNnii~ literal 2502 zcmai0ZBH9H5dNNDF$&Qgpn7v4q|>cLRcL8JR}g}LbZV-|+4W{!y!M`764I9ce&d%7 zY!2P!OA>o#{LC}+jJ*Ssnj2Ut{ZI+Df)y76=8lUJC}dY>6KJ*i#tJ*wfsaZnhmdp+Yk~SFL;}{H-%m)CiGqwK)m}@GFnwcEFz_6iQ4&iGs5Mrj;-ws3nhvA@Q zy5YunaNev?(lTi=+DdcF27_;E9yS8F7)U#52*N;?WT{q$9R7Cj#~^?)mLUV-Cjn&;>Ke9kb0Lcz{k8A2sKuzSgRA1^gt1WW^Uwhn_pWVS-V^VBF@{ zZZ3F{7LF?_3`^&RuP()ijOwE1%g!L=_g*zEW@pGr+yin=ZM}ta&gC>6G2I990omX( zK>4@vOi~O|f*uH8oWg01Z3ZP;C7=Pv&-4di^x6#%ZggTFgOIaA-sJHBPN&mr;Ew?-RbP?>b_s1fI&44w{UxYk^-5U36aB`n))TC z82$X@_WXFX8~%(^SagM-n2QBc9FX7l;<+!*^!oIl5Uwl2J=e}ml%)bpLA(CoWe!Wf zWBpD#KPsru^!u7L^l`kXqngOGWt5XYWQ7AKO3(jW+8J&6?18Ow82$Kx1FF!>n(Tfu zJGs7?{dx8mJUyjjP-v~M1kQ`lQM0)!(d}g$0aRRgIro}%`m!Z@I~jY#;o*UFX?x1I zQir>n&j~`}{#vb=zV&rT>)Ty%dv^-QFbo;_S(808k>PM@9i~Vn6>Edz{OM_!88277>9sY3m_c_{8c7RRQ=SsDg(lg<7C^ zjYtJT$pzX-#!6OZTOcniAcqJ5Q^#r|GYAp~w}Jw@Oh>#}xg}T5pnR>zW?;UKI69y` z)g=`8GKuckqWV{ZI0_s#*foCM(&x1M{GKu}4uK;K&9K|Q`1-E+1OK|)J!}eUk@bqo z?sdb}xC)mcO2A)+#M_Ve5Qjz(C_ES6J%PW FriishProduce.Program + - - ..\packages\HtmlRenderer.Core.1.5.0.6\lib\net45\HtmlRenderer.dll + + ..\packages\HtmlRenderer.Core.1.5.1-beta1\lib\net45\HtmlRenderer.dll - - ..\packages\HtmlRenderer.WinForms.1.5.0.6\lib\net45\HtmlRenderer.WinForms.dll + + ..\packages\HtmlRenderer.WinForms.1.5.1-beta1\lib\net45\HtmlRenderer.WinForms.dll ..\packages\Iconic.Zlib.Signed.1.1.0\lib\net45\Iconic.Zlib.dll @@ -72,12 +73,12 @@ ..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll + + ..\packages\MdiTabCtrl.1.0.0.1\lib\net40\JacksiroKe.MdiTabCtrl.dll + .\libWiiSharp.dll - - .\MdiTabControl.dll - ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll @@ -270,6 +271,12 @@ Controller_SEGA.cs + + Form + + + HTMLForm.cs + Form @@ -448,6 +455,9 @@ Options_VC_SEGA.cs + + HTMLForm.cs + LanguageEditor.cs @@ -580,7 +590,6 @@ - @@ -614,7 +623,6 @@ - @@ -640,22 +648,22 @@ False - Exclude - True + Exclude + True File False - Exclude - True + Exclude + True Assembly diff --git a/FriishProduce/MainForm.Designer.cs b/FriishProduce/MainForm.Designer.cs index 3ac28038..986ca8b5 100644 --- a/FriishProduce/MainForm.Designer.cs +++ b/FriishProduce/MainForm.Designer.cs @@ -74,13 +74,13 @@ private void InitializeComponent() this.check_for_updates = new System.Windows.Forms.MenuItem(); this.auto_update = new System.Windows.Forms.MenuItem(); this.menuItem8 = new System.Windows.Forms.MenuItem(); + this.clear_database = new System.Windows.Forms.MenuItem(); this.language_file_editor = new System.Windows.Forms.MenuItem(); + this.menuItem11 = new System.Windows.Forms.MenuItem(); this.preferences = new System.Windows.Forms.MenuItem(); this.menuItem4 = new System.Windows.Forms.MenuItem(); this.about = new System.Windows.Forms.MenuItem(); - this.tabControl = new MdiTabControl.TabControl(); - this.clear_database = new System.Windows.Forms.MenuItem(); - this.menuItem11 = new System.Windows.Forms.MenuItem(); + this.tabControl = new JacksiroKe.MdiTabCtrl.TabControl(); this.mainPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.Logo)).BeginInit(); this.toolStrip.SuspendLayout(); @@ -409,12 +409,24 @@ private void InitializeComponent() this.menuItem8.Index = 6; resources.ApplyResources(this.menuItem8, "menuItem8"); // + // clear_database + // + this.clear_database.Index = 7; + this.clear_database.Tag = "clear_database"; + resources.ApplyResources(this.clear_database, "clear_database"); + this.clear_database.Click += new System.EventHandler(this.ClearAllDatabases); + // // language_file_editor // this.language_file_editor.Index = 8; resources.ApplyResources(this.language_file_editor, "language_file_editor"); this.language_file_editor.Click += new System.EventHandler(this.LanguageFileEditor); // + // menuItem11 + // + this.menuItem11.Index = 9; + resources.ApplyResources(this.menuItem11, "menuItem11"); + // // preferences // this.preferences.Index = 10; @@ -445,6 +457,7 @@ private void InitializeComponent() this.tabControl.FontBoldOnSelect = false; this.tabControl.MenuRenderer = null; this.tabControl.Name = "tabControl"; + this.tabControl.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.tabControl.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; this.tabControl.TabBackHighColor = System.Drawing.SystemColors.Control; this.tabControl.TabBackHighColorDisabled = System.Drawing.Color.LightGray; @@ -457,18 +470,7 @@ private void InitializeComponent() this.tabControl.TabHeight = 25; this.tabControl.TopSeparator = false; this.tabControl.SelectedTabChanged += new System.EventHandler(this.TabChanged); - // - // clear_database - // - this.clear_database.Index = 7; - this.clear_database.Tag = "clear_database"; - resources.ApplyResources(this.clear_database, "clear_database"); - this.clear_database.Click += new System.EventHandler(this.ClearAllDatabases); - // - // menuItem11 - // - this.menuItem11.Index = 9; - resources.ApplyResources(this.menuItem11, "menuItem11"); + this.tabControl.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint); // // MainForm // @@ -479,6 +481,7 @@ private void InitializeComponent() this.Controls.Add(this.toolStrip); this.Controls.Add(this.tabControl); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.IsMdiContainer = true; this.KeyPreview = true; this.MaximizeBox = false; this.Menu = this.mainMenu; @@ -487,6 +490,7 @@ private void InitializeComponent() this.Tag = "mainform"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_Closing); this.Load += new System.EventHandler(this.MainForm_Loading); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint); this.mainPanel.ResumeLayout(false); this.mainPanel.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.Logo)).EndInit(); @@ -532,7 +536,7 @@ private void InitializeComponent() internal System.Windows.Forms.ToolStripButton toolbarImportGameFile; private System.Windows.Forms.MenuItem import_game_file; private System.Windows.Forms.MenuItem menuItem6; - private MdiTabControl.TabControl tabControl; + private JacksiroKe.MdiTabCtrl.TabControl tabControl; private System.Windows.Forms.MenuItem menuItem8; private System.Windows.Forms.MenuItem check_for_updates; private System.Windows.Forms.MenuItem auto_update; diff --git a/FriishProduce/MainForm.cs b/FriishProduce/MainForm.cs index c8b2a978..4703b7fc 100644 --- a/FriishProduce/MainForm.cs +++ b/FriishProduce/MainForm.cs @@ -133,8 +133,9 @@ private void RefreshForm() toolbarGameScan.Text = game_scan.Text; toolbarPreferences.Text = preferences.Text = Program.Lang.String("preferences"); - SaveProject.Title = save_project_as.Text.Replace("&", ""); - SaveWAD.Title = export.Text.Replace("&", ""); + BrowseProject.Title = new Regex(@"\(.*\)").Replace(open_project.Text, "").Replace("&", ""); + SaveProject.Title = new Regex(@"\(.*\)").Replace(save_project_as.Text, "").Replace("&", ""); + SaveWAD.Title = new Regex(@"\(.*\)").Replace(export.Text, "").Replace("&", ""); try { BrowseProject.Filter = SaveProject.Filter = Program.Lang.String("filter.project"); } catch { MessageBox.Show("Warning!\nThe language strings have not been loaded correctly.\n\nSeveral items may show up as 'undefined'.\n\nOther exceptions related to strings or filters can also occur!", MessageBox.Buttons.Ok, MessageBox.Icons.Warning, false); } @@ -144,9 +145,11 @@ private void RefreshForm() { Text += " [Running in debug mode]"; // Debug mode-only features are activated here. // + extract_wad_banner.Visible = true; + extract_wad_icon.Visible = true; } - foreach (MdiTabControl.TabPage tabPage in tabControl.TabPages) + foreach (JacksiroKe.MdiTabCtrl.TabPage tabPage in tabControl.TabPages) if (tabPage.Form.GetType() == typeof(ProjectForm)) (tabPage.Form as ProjectForm).RefreshForm(); } @@ -298,7 +301,7 @@ private void BrowseROMDialog() if (tabControl.SelectedForm != null) { var p = tabControl.SelectedForm as ProjectForm; - p.BrowseROMDialog(import_game_file.Text); + p.BrowseROMDialog(new Regex(@"\(.*\)").Replace(import_game_file.Text, "").Replace("&", "")); } } @@ -328,7 +331,7 @@ public void CleanTemp() private void TabContextMenu_Opening(object sender, CancelEventArgs e) { var page = (sender as ContextMenuStrip).SourceControl; - var index = tabControl.TabPages.get_IndexOf(page as MdiTabControl.TabPage); + var index = tabControl.TabPages.get_IndexOf(page as JacksiroKe.MdiTabCtrl.TabPage); if (index != -1) tabControl.TabPages[index].Select(); } @@ -487,11 +490,19 @@ private void ExtractWAD_Click(object sender, EventArgs e) SupportMultiDottedExtensions = true }; + bool isIMET = sender == extract_wad_banner && MessageBox.Show(Program.Lang.Msg(11), MessageBox.Buttons.YesNo) == MessageBox.Result.Yes; + if (isIMET) + { + saveDialog.FileName = "opening.bnr"; + saveDialog.Filter = "BNR (*.bnr)|*.bnr|BIN (*.bin)|*.bin" + Program.Lang.String("filter"); + saveDialog.DefaultExt = "bnr"; + } + if (saveDialog.ShowDialog() == DialogResult.OK) { try { - using var x = libWiiSharp.U8.Load(w.BannerApp.Data[w.BannerApp.GetNodeIndex(sender == extract_wad_icon ? "icon.bin" : "banner.bin")]); + using var x = isIMET ? w.BannerApp : U8.Load(w.BannerApp.Data[w.BannerApp.GetNodeIndex(sender == extract_wad_icon ? "icon.bin" : "banner.bin")]); File.WriteAllBytes(saveDialog.FileName, x.ToByteArray()); goto Succeeded; @@ -636,5 +647,11 @@ private void ExtractWAD_Click(object sender, EventArgs e) if (w != null) w.Dispose(); } } + + private void MainForm_Paint(object sender, PaintEventArgs e) + { + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; + } } } diff --git a/FriishProduce/MainForm.resx b/FriishProduce/MainForm.resx index 1353c1c2..21ba4c89 100644 --- a/FriishProduce/MainForm.resx +++ b/FriishProduce/MainForm.resx @@ -590,7 +590,7 @@ tabControl - MdiTabControl.TabControl, MdiTabControl, Version=1.1.6522.19795, Culture=neutral, PublicKeyToken=null + JacksiroKe.MdiTabCtrl.TabControl, JacksiroKe.MdiTabCtrl, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null $this @@ -3045,12 +3045,24 @@ System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + clear_database + + + System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + language_file_editor System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuItem11 + + + System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + preferences @@ -3069,18 +3081,6 @@ System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - clear_database - - - System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuItem11 - - - System.Windows.Forms.MenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - MainForm diff --git a/FriishProduce/ProjectForm.Designer.cs b/FriishProduce/ProjectForm.Designer.cs index 1a117363..d6307b32 100644 --- a/FriishProduce/ProjectForm.Designer.cs +++ b/FriishProduce/ProjectForm.Designer.cs @@ -63,6 +63,7 @@ private void InitializeComponent() this.injection_methods = new System.Windows.Forms.ComboBox(); this.injection_method_options = new System.Windows.Forms.Button(); this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.injection_method_help = new System.Windows.Forms.PictureBox(); this.multifile_software = new System.Windows.Forms.CheckBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.use_offline_wad = new System.Windows.Forms.RadioButton(); @@ -75,6 +76,7 @@ private void InitializeComponent() this.checkImg1 = new System.Windows.Forms.PictureBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.import_wad = new System.Windows.Forms.Button(); + this.using_default_wad = new System.Windows.Forms.Label(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.import_image = new System.Windows.Forms.Button(); this.image_interpolation_mode = new System.Windows.Forms.ComboBox(); @@ -87,13 +89,14 @@ private void InitializeComponent() this.rom_label_filename = new System.Windows.Forms.Label(); this.rom_label = new System.Windows.Forms.Label(); this.backgroundWorker = new System.ComponentModel.BackgroundWorker(); - this.tip = new FriishProduce.CustomToolTip(); + this.tip = new TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip(); this.bannerMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.title_id_random)).BeginInit(); this.groupBox4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.banner)).BeginInit(); this.groupBox5.SuspendLayout(); this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.injection_method_help)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.BaseRegion)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.checkImg1)).BeginInit(); @@ -340,6 +343,7 @@ private void InitializeComponent() // // groupBox3 // + this.groupBox3.Controls.Add(this.injection_method_help); this.groupBox3.Controls.Add(this.injection_method_options); this.groupBox3.Controls.Add(this.injection_methods); this.groupBox3.Controls.Add(this.manual_type); @@ -351,6 +355,15 @@ private void InitializeComponent() this.groupBox3.TabStop = false; this.groupBox3.Tag = "injection_method"; // + // injection_method_help + // + this.injection_method_help.Cursor = System.Windows.Forms.Cursors.Hand; + this.injection_method_help.Image = global::FriishProduce.Properties.Resources.help; + resources.ApplyResources(this.injection_method_help, "injection_method_help"); + this.injection_method_help.Name = "injection_method_help"; + this.injection_method_help.TabStop = false; + this.injection_method_help.Click += new System.EventHandler(this.injection_method_help_Click); + // // multifile_software // resources.ApplyResources(this.multifile_software, "multifile_software"); @@ -441,6 +454,7 @@ private void InitializeComponent() this.groupBox2.Controls.Add(this.baseID); this.groupBox2.Controls.Add(this.current_wad); this.groupBox2.Controls.Add(this.baseName); + this.groupBox2.Controls.Add(this.using_default_wad); resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; @@ -451,10 +465,15 @@ private void InitializeComponent() resources.ApplyResources(this.import_wad, "import_wad"); this.import_wad.Name = "import_wad"; this.import_wad.Tag = "import_wad"; - this.tip.SetToolTip(this.import_wad, resources.GetString("import_wad.ToolTip")); this.import_wad.UseVisualStyleBackColor = true; this.import_wad.Click += new System.EventHandler(this.import_wad_Click); // + // using_default_wad + // + resources.ApplyResources(this.using_default_wad, "using_default_wad"); + this.using_default_wad.Name = "using_default_wad"; + this.using_default_wad.Tag = "using_default_wad"; + // // pictureBox1 // this.pictureBox1.BackColor = System.Drawing.SystemColors.ControlDark; @@ -558,7 +577,18 @@ private void InitializeComponent() // // tip // + this.tip.AllowLinksHandling = true; + this.tip.AutoPopDelay = 10000; + this.tip.BackColor = System.Drawing.Color.White; + this.tip.BaseStylesheet = "div { font-size: 11px !important; }"; + this.tip.ForeColor = System.Drawing.Color.Black; + this.tip.InitialDelay = 500; + this.tip.MaximumSize = new System.Drawing.Size(350, 0); this.tip.OwnerDraw = true; + this.tip.ReshowDelay = 100; + this.tip.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; + this.tip.TooltipCssClass = "htmltooltip"; + this.tip.UseGdiPlusTextRendering = true; // // ProjectForm // @@ -586,6 +616,7 @@ private void InitializeComponent() this.groupBox5.ResumeLayout(false); this.groupBox3.ResumeLayout(false); this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.injection_method_help)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.BaseRegion)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.checkImg1)).EndInit(); @@ -657,6 +688,8 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox multifile_software; private System.ComponentModel.BackgroundWorker backgroundWorker; private System.Windows.Forms.Button import_wad; - private CustomToolTip tip; + private System.Windows.Forms.PictureBox injection_method_help; + private TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip tip; + private System.Windows.Forms.Label using_default_wad; } } \ No newline at end of file diff --git a/FriishProduce/ProjectForm.cs b/FriishProduce/ProjectForm.cs index 5e816137..080fe5c4 100644 --- a/FriishProduce/ProjectForm.cs +++ b/FriishProduce/ProjectForm.cs @@ -19,6 +19,7 @@ public partial class ProjectForm : Form private readonly BannerOptions banner_form; private readonly Savedata savedata; private Wait wait; + private HTMLForm htmlForm; protected string TIDCode; protected string Untitled; @@ -102,6 +103,7 @@ public bool IsEmpty Enabled = !value; include_patch.Enabled = !value && showPatch; + injection_method_help.Visible = !value && htmlForm != null; } } } @@ -283,6 +285,15 @@ private string[] _channelTitles value = new string[8] { channel_name.Text, channel_name.Text, channel_name.Text, channel_name.Text, channel_name.Text, channel_name.Text, channel_name.Text, channel_name.Text }; // DEFAULT: "無題", "Untitled", "Ohne Titel", "Sans titre", "Sin título", "Senza titolo", "Onbekend", "제목 없음" + + int maxLength = 20; + for (int i = 0; i < value.Length; i++) + if (value[i].Length > maxLength) + { + string delimiter = i == 0 ? "…" : "..."; + value[i] = value[i].Substring(0, maxLength - delimiter.Length) + delimiter; + } + return value; } } @@ -514,7 +525,8 @@ public void RefreshForm() #endregion #region ------------------------------------------ Localization: Tooltips ------------------------------------------ - tip.SetToolTip(include_patch, "HELLO!"); + tip.SetToolTip(channel_name, Program.Lang.HTML(0, true, label1.Text)); + tip.SetToolTip(injection_method_options, Program.Lang.HTML(1, true, injection_method_options.Text)); #endregion if (Base.SelectedIndex >= 0) @@ -622,7 +634,7 @@ private void LoadChannelDatabase() try { channels = new ChannelDatabase(targetPlatform); } catch (Exception ex) { - if ((int)targetPlatform < 10) + if ((int)targetPlatform < 10 || targetPlatform == Platform.Flash) { System.Windows.Forms.MessageBox.Show($"A fatal error occurred retrieving the {targetPlatform} WADs database.\n\nException: {ex.GetType().FullName}\nMessage: {ex.Message}\n\nThe application will now shut down.", "Halt", MessageBoxButtons.OK, MessageBoxIcon.Hand); Environment.FailFast("Database initialization failed."); @@ -911,7 +923,9 @@ private void refreshData() if (channels.Entries?[0].ID == "00010001-53544c42") { use_online_wad.Checked = true; - use_online_wad.Enabled = false; + import_wad.Enabled = use_offline_wad.Enabled = use_online_wad.Enabled = false; + using_default_wad.Visible = true; + using_default_wad.BringToFront(); } if (!IsEmpty) @@ -1003,14 +1017,15 @@ public string GetName(bool full) { string FILENAME = File.Exists(patch) ? Path.GetFileNameWithoutExtension(patch) : Path.GetFileNameWithoutExtension(rom?.FilePath); string CHANNELNAME = channel_name.Text; - string FULLNAME = System.Text.RegularExpressions.Regex.Replace(_bannerTitle.Replace(':', '\n').Replace('/', '\n').Replace('/', '\n'), @"\((.*?)\)", "").Replace("\r\n", "\n").Replace("\n", "_"); + string FULLNAME = System.Text.RegularExpressions.Regex.Replace(_bannerTitle, @"\((.*?)\)", "").Replace("\r\n", "\n").Replace("\n", "_"); string TITLEID = title_id_upper.Text.ToUpper(); string PLATFORM = targetPlatform.ToString(); - string REGION = regions.SelectedText; + string REGION = regions.SelectedItem.ToString(); string target = full ? Program.Config.application.default_export_filename : Program.Config.application.default_target_filename; + target = target.Replace("FILENAME", FILENAME).Replace("CHANNELNAME", CHANNELNAME).Replace("FULLNAME", FULLNAME).Replace("TITLEID", TITLEID).Replace("PLATFORM", PLATFORM).Replace("REGION", REGION); - return target.Replace("FILENAME", FILENAME).Replace("CHANNELNAME", CHANNELNAME).Replace("FULLNAME", FULLNAME).Replace("TITLEID", TITLEID).Replace("PLATFORM", PLATFORM).Replace("REGION", REGION); + return string.Join("_", target.Split(Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); } private void isClosing(object sender, FormClosingEventArgs e) @@ -1648,11 +1663,22 @@ private void saveToWAD(object sender, System.ComponentModel.DoWorkEventArgs e) outWad.Region = outWadRegion; Utils.ChangeVideoMode(outWad, video_modes.SelectedIndex); } - + // Other WAD settings to be changed done by WAD creator helper, which will save to a new file // ******* outWad.ChangeChannelTitles(_channelTitles); + /* var banner = outWad.BannerApp.ToByteArray(); + for (int i = 0; i < 8; i++) + { + string text = null; + try { text = _channelTitles[i]; } catch { } + + byte[] textArray = new byte[84]; + System.Text.Encoding.BigEndianUnicode.GetBytes(text).CopyTo(textArray, 0); + textArray.CopyTo(banner, 156 + (i * textArray.Length)); + } + outWad.BannerApp = U8.Load(banner); */ outWad.ChangeTitleID(LowerTitleID.Channel, _tID); outWad.FakeSign = true; @@ -2142,6 +2168,7 @@ private void resetContentOptions() multifile_software.Visible = false; extra.Visible = false; contentOptionsForm = null; + htmlForm = null; if (isVirtualConsole) { @@ -2157,10 +2184,12 @@ private void resetContentOptions() case Platform.SNES: contentOptionsForm = new Options_VC_SNES(); + htmlForm = new(Program.Lang.HTML(0, false), injection_methods.SelectedItem.ToString()); break; case Platform.N64: contentOptionsForm = new Options_VC_N64() { EmuType = inWadRegion == Region.Korea ? 3 : emuVer }; + htmlForm = new(Program.Lang.HTML(1, false), injection_methods.SelectedItem.ToString()); break; case Platform.SMS: @@ -2255,6 +2284,10 @@ private void resetContentOptions() download_image.Enabled = targetPlatform != Platform.C64 && targetPlatform != Platform.Flash && targetPlatform != Platform.RPGM; + + bool hasHelp = !string.IsNullOrWhiteSpace(htmlForm?.FormText); + injection_method_help.Visible = hasHelp && !IsEmpty; + injection_methods.Size = hasHelp ? injection_methods.MinimumSize : injection_methods.MaximumSize; } #endregion @@ -2398,5 +2431,7 @@ private void multifile_software_CheckedChanged(object sender, EventArgs e) if (multifile_software.Checked && !Program.Config.application.donotshow_001 && !IsEmpty) MessageBox.Show(null, Program.Lang.Msg(10, false), 1); } + + private void injection_method_help_Click(object sender, EventArgs e) => htmlForm.ShowDialog(this); } } diff --git a/FriishProduce/ProjectForm.resx b/FriishProduce/ProjectForm.resx index 9c085183..51e2d72e 100644 --- a/FriishProduce/ProjectForm.resx +++ b/FriishProduce/ProjectForm.resx @@ -157,6 +157,15 @@ 809, 17 + + 193, 70 + + + bannerMenu + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 192, 22 @@ -179,15 +188,6 @@ restore_banner_sound - - 193, 70 - - - bannerMenu - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 699, 17 @@ -198,7 +198,7 @@ 10, 35 - 20 + 100 210, 21 @@ -424,6 +424,57 @@ 4 + + video_mode + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + region + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 3 + + + 12, 373 + + + 460, 110 + + + 44 + + + channel_metadata + + + False + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + True @@ -484,33 +535,6 @@ 3 - - 12, 380 - - - 460, 110 - - - 44 - - - channel_metadata - - - False - - - groupBox4 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - False @@ -637,6 +661,45 @@ 3 + + edit_save_data + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + 478, 93 + + + 560, 305 + + + 48 + + + banner + + + False + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m @@ -686,33 +749,6 @@ 2 - - 478, 93 - - - 560, 305 - - - 48 - - - banner - - - False - - - groupBox5 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - SD @@ -723,7 +759,7 @@ 10, 66 - 439, 21 + 440, 21 2 @@ -738,7 +774,7 @@ groupBox3 - 5 + 6 True @@ -771,13 +807,13 @@ groupBox3 - 4 + 5 10, 66 - 439, 21 + 440, 21 1 @@ -792,13 +828,19 @@ groupBox3 - 2 + 3 10, 19 + + 440, 0 + + + 418, 0 + - 439, 21 + 440, 21 3 @@ -813,7 +855,7 @@ groupBox3 - 1 + 2 @@ -838,7 +880,7 @@ NoControl - 179, 94 + 10, 93 270, 24 @@ -865,28 +907,19 @@ groupBox3 - 0 - - - True - - - NoControl + 1 - - 10, 47 + + injection_method_help - - 111, 17 - - - 50 + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - multifile_software + + groupBox3 - - False + + 0 multifile_software @@ -898,13 +931,13 @@ groupBox3 - 3 + 4 - 12, 244 + 12, 239 - 460, 130 + 460, 128 43 @@ -927,6 +960,69 @@ 4 + + NoControl + + + 434, 22 + + + 16, 16 + + + StretchImage + + + 51 + + + False + + + injection_method_help + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + True + + + NoControl + + + 10, 47 + + + 111, 17 + + + 50 + + + multifile_software + + + False + + + multifile_software + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 4 + NoControl @@ -985,7 +1081,7 @@ True - Tahoma, 7pt, style=Bold + Arial, 7pt, style=Bold NoControl @@ -994,7 +1090,7 @@ 85, 20 - 54, 12 + 53, 12 33 @@ -1027,7 +1123,7 @@ 10 - 400, 21 + 401, 21 31 @@ -1051,7 +1147,7 @@ NoControl - 416, 97 + 417, 97 33, 21 @@ -1078,7 +1174,7 @@ True - Tahoma, 7pt + Arial, 7pt NoControl @@ -1087,7 +1183,7 @@ 145, 20 - 50, 12 + 55, 13 33 @@ -1111,7 +1207,7 @@ True - Tahoma, 8.25pt, style=Underline + Tahoma, 8.25pt NoControl @@ -1203,6 +1299,57 @@ 1 + + import_wad + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + using_default_wad + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + 12, 103 + + + 460, 130 + + + 40 + + + wad_base + + + False + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + True @@ -1224,13 +1371,6 @@ import_wad - - 1055, 17 - - - HELLO -This is a test of the CustomToolTip. A description will be displayed for each element on-screen. - import_wad @@ -1243,32 +1383,41 @@ This is a test of the CustomToolTip. A description will be displayed for each el 0 - - 12, 108 + + Fill - - 460, 130 + + False - - 40 + + 3, 17 - - wad_base + + 454, 110 - + + 55 + + + using_default_wad + + + MiddleCenter + + False - - groupBox2 + + using_default_wad - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + groupBox2 - - 7 + + 10 NoControl @@ -1469,7 +1618,7 @@ This is a test of the CustomToolTip. A description will be displayed for each el NoControl - 13, 62 + 10, 59 92, 17 @@ -1492,20 +1641,71 @@ This is a test of the CustomToolTip. A description will be displayed for each el 2 + + rom_label_filename + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + rom_label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 12, 12 + + + 460, 85 + + + 46 + + + main + + + False + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + True - Tahoma, 7pt + Arial, 7pt NoControl - 10, 38 + 8, 37 - 89, 12 + 103, 13 55 @@ -1529,13 +1729,13 @@ This is a test of the CustomToolTip. A description will be displayed for each el True - Tahoma, 8.25pt, style=Underline + Tahoma, 8.25pt NoControl - 10, 19 + 8, 19 53, 13 @@ -1558,36 +1758,12 @@ This is a test of the CustomToolTip. A description will be displayed for each el 1 - - 12, 12 - - - 460, 90 - - - 46 - - - main - - - False - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 6 - 914, 17 + + 1055, 17 + True @@ -1595,7 +1771,7 @@ This is a test of the CustomToolTip. A description will be displayed for each el True - 1050, 500 + 1050, 495 False @@ -3856,7 +4032,7 @@ This is a test of the CustomToolTip. A description will be displayed for each el tip - FriishProduce.CustomToolTip, FriishProduce, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null + TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip, HtmlRenderer.WinForms, Version=1.5.1.0, Culture=neutral, PublicKeyToken=null ProjectForm diff --git a/FriishProduce/SettingsForm.Designer.cs b/FriishProduce/SettingsForm.Designer.cs index c78ad64a..66a70d81 100644 --- a/FriishProduce/SettingsForm.Designer.cs +++ b/FriishProduce/SettingsForm.Designer.cs @@ -44,6 +44,7 @@ private void InitializeComponent() this.GetBanners = new System.Windows.Forms.Button(); this.TreeView = new System.Windows.Forms.TreeView(); this.panel1 = new System.Windows.Forms.Panel(); + this.use_online_wad_tip = new FriishProduce.ImageLabel(); this.bypass_rom_size = new System.Windows.Forms.CheckBox(); this.use_online_wad_enabled = new System.Windows.Forms.CheckBox(); this.use_custom_database = new System.Windows.Forms.CheckBox(); @@ -146,7 +147,6 @@ private void InitializeComponent() this.vc_snes_patch_nodark = new System.Windows.Forms.CheckBox(); this.vc_snes_patch_nosuspend = new System.Windows.Forms.CheckBox(); this.vc_snes_patch_volume = new System.Windows.Forms.CheckBox(); - this.use_online_wad_tip = new FriishProduce.ImageLabel(); this.vc_n64_options.SuspendLayout(); this.bottomPanel2.SuspendLayout(); this.bottomPanel1.SuspendLayout(); @@ -257,7 +257,7 @@ private void InitializeComponent() // // bottomPanel1 // - this.bottomPanel1.BackColor = System.Drawing.Color.WhiteSmoke; + this.bottomPanel1.BackColor = System.Drawing.SystemColors.ControlLight; this.bottomPanel1.Controls.Add(this.b_cancel); this.bottomPanel1.Controls.Add(this.b_ok); this.bottomPanel1.Controls.Add(this.GetBanners); @@ -315,6 +315,15 @@ private void InitializeComponent() resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // use_online_wad_tip + // + resources.ApplyResources(this.use_online_wad_tip, "use_online_wad_tip"); + this.use_online_wad_tip.BackColor = System.Drawing.Color.WhiteSmoke; + this.use_online_wad_tip.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.use_online_wad_tip.Image = global::FriishProduce.Properties.Resources.information; + this.use_online_wad_tip.Name = "use_online_wad_tip"; + this.use_online_wad_tip.Tag = "use_online_wad_tip"; + // // bypass_rom_size // resources.ApplyResources(this.bypass_rom_size, "bypass_rom_size"); @@ -1155,15 +1164,6 @@ private void InitializeComponent() this.vc_snes_patch_volume.Tag = "patch_volume"; this.vc_snes_patch_volume.UseVisualStyleBackColor = true; // - // use_online_wad_tip - // - resources.ApplyResources(this.use_online_wad_tip, "use_online_wad_tip"); - this.use_online_wad_tip.BackColor = System.Drawing.Color.WhiteSmoke; - this.use_online_wad_tip.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.use_online_wad_tip.Image = global::FriishProduce.Properties.Resources.information; - this.use_online_wad_tip.Name = "use_online_wad_tip"; - this.use_online_wad_tip.Tag = "use_online_wad_tip"; - // // SettingsForm // this.AcceptButton = this.b_ok; diff --git a/FriishProduce/SettingsForm.cs b/FriishProduce/SettingsForm.cs index 5907919d..b32901c4 100644 --- a/FriishProduce/SettingsForm.cs +++ b/FriishProduce/SettingsForm.cs @@ -190,6 +190,7 @@ public void RefreshForm() reset_all_dialogs.Checked = false; toggleSwitch2.Checked = Program.Config.forwarder.show_bios_screen; forwarder_type.SelectedIndex = Program.Config.forwarder.root_storage_device; + use_online_wad_enabled.Checked = Program.Config.application.use_online_wad_enabled; // BIOS files bios_filename_neo.Text = Program.Config.paths.bios_neo; @@ -337,6 +338,7 @@ private void OK_Click(object sender, EventArgs e) // ------------------------------------------- Program.Config.application.image_interpolation = image_interpolation_modes.SelectedIndex; + Program.Config.application.use_online_wad_enabled = use_online_wad_enabled.Checked; // ------------------------------------------- // BIOS files @@ -453,11 +455,6 @@ private void Cancel_Click(object sender, EventArgs e) DialogResult = DialogResult.Cancel; } - private void Reset_Click(object sender, EventArgs e) - { - - } - private void DownloadBanners_Click(object sender, EventArgs e) { System.Media.SystemSounds.Beep.Play(); diff --git a/FriishProduce/SettingsForm.resx b/FriishProduce/SettingsForm.resx index 6942a5ec..340d3b05 100644 --- a/FriishProduce/SettingsForm.resx +++ b/FriishProduce/SettingsForm.resx @@ -143,78 +143,6 @@ 0 - - vc_n64_patch_autosizerom - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64_options - - - 0 - - - vc_n64_patch_expandedram - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64_options - - - 1 - - - vc_n64_patch_fixcrashes - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64_options - - - 2 - - - vc_n64_patch_fixbrightness - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64_options - - - 3 - - - 12, 10 - - - 536, 112 - - - 18 - - - vc_options - - - vc_n64_options - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64 - - - 1 - True @@ -336,6 +264,30 @@ 3 + + 12, 10 + + + 536, 112 + + + 18 + + + vc_options + + + vc_n64_options + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + vc_n64 + + + 1 + 10, 18 @@ -364,10 +316,10 @@ NoControl - 642, 8 + 642, 9 - 100, 24 + 100, 23 2 @@ -394,10 +346,10 @@ NoControl - 536, 8 + 536, 9 - 100, 24 + 100, 23 1 @@ -424,10 +376,10 @@ NoControl - 12, 8 + 12, 9 - 165, 24 + 165, 23 0 @@ -595,98 +547,44 @@ 1 - - use_online_wad_tip - - - FriishProduce.ImageLabel, FriishProduce, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null - - - panel1 - - - 0 - - - bypass_rom_size - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 1 - - - use_online_wad_enabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 2 - - - use_custom_database - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 3 - - - reset_all_dialogs + + True - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + TopLeft - - panel1 + + NoControl - - 4 + + 12, 312 - - language + + 536, 96 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 22, 4, 4, 4 - - panel1 + + 130, 23 - - 5 + + 56 - - 194, 0 + + use_online_wad_tip - - 560, 410 + + use_online_wad_tip - - 20 + + FriishProduce.ImageLabel, FriishProduce, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null - + panel1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 + + 0 True @@ -832,38 +730,26 @@ 5 - - vc_n64_romc_type - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_n64 - - - 0 - - + 194, 0 - + 560, 410 - - 21 + + 20 - - vc_n64 + + panel1 - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 7 + + 2 12, 128 @@ -889,50 +775,41 @@ 0 - - forwarder_root_device + + 194, 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 560, 410 - - forwarder + + 21 - - 0 + + vc_n64 - - bios_settings + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - forwarder - - - 1 - - - 194, 0 - - - 560, 410 + + 7 - - 22 + + SD - - forwarder + + USB - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10, 18 - - $this + + 516, 21 - - 4 + + 27 forwarder_type @@ -970,81 +847,6 @@ 0 - - SD - - - USB - - - 10, 18 - - - 516, 21 - - - 27 - - - forwarder_type - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - forwarder_root_device - - - 0 - - - show_bios_screen - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_settings - - - 0 - - - toggleSwitch2 - - - JCS.ToggleSwitch, ToggleSwitch, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null - - - bios_settings - - - 1 - - - 12, 66 - - - 536, 44 - - - 26 - - - bios_settings - - - bios_settings - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - forwarder - - - 1 - True @@ -1096,86 +898,50 @@ 1 - - vc_nes_palette - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_nes - - - 0 - - - 194, 0 - - - 560, 410 - - - 23 - - - vc_nes - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - vc_nes_palette_banner_usage + + 12, 66 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 44 - - vc_nes_palette + + 26 - - 0 + + bios_settings - - vc_nes_palettelist + + bios_settings - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_nes_palette + + forwarder - + 1 - - 12, 10 - - - 536, 70 + + 194, 0 - - 14 + + 560, 410 - - palette + + 22 - - vc_nes_palette + + forwarder - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_nes + + $this - - 0 + + 4 True @@ -1228,38 +994,59 @@ 1 - - vc_neo_bios + + 12, 10 - + + 536, 70 + + + 14 + + + palette + + + vc_nes_palette + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_neo + + vc_nes - + 0 - + 194, 0 - + 560, 410 - - 24 + + 23 - - vc_neo + + vc_nes - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 10 + + 5 + + + 10, 18 + + + 516, 21 + + + 9 vc_neo_bios_list @@ -1297,83 +1084,35 @@ 0 - - 10, 18 - - - 516, 21 - - - 9 - - - vc_neo_bios_list - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_neo_bios - - - 0 - - - vc_sega_country - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega - - - 0 - - - vc_sega_system - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega - - - 1 - - - vc_sega_display - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega - - - 2 - - + 194, 0 - + 560, 410 - - 25 + + 24 - - vc_sega + + vc_neo - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 8 + + 10 + + + 10, 18 + + + 516, 21 + + + 18 vc_sega_countries @@ -1411,87 +1150,6 @@ 0 - - 10, 18 - - - 516, 21 - - - 18 - - - vc_sega_countries - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_country - - - 0 - - - vc_sega_console_disableresetbutton - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_system - - - 0 - - - vc_sega_save_sram - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_system - - - 1 - - - vc_sega_dev_mdpad_enable_6b - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_system - - - 2 - - - 12, 124 - - - 536, 88 - - - 21 - - - vc_options - - - vc_sega_system - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega - - - 1 - True @@ -1582,53 +1240,29 @@ 2 - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_display - - - 0 - - - SEGA_console_brightness - - - System.Windows.Forms.TrackBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_sega_display - - - 1 - - - 12, 10 + + 12, 124 - - 536, 52 + + 536, 88 - - 15 + + 21 - - display + + vc_options - - vc_sega_display + + vc_sega_system - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + vc_sega - - 2 + + 1 True @@ -1687,146 +1321,50 @@ 1 - - vc_pce_system + + 12, 10 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 52 - - vc_pce + + 15 - - 0 + + display - - vc_pce_display + + vc_sega_display - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_pce + + vc_sega - - 1 + + 2 - + 194, 0 - + 560, 410 - - 26 + + 25 - - vc_pce + + vc_sega - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 9 - - - vc_pce_sgenable - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_system - - - 0 - - - vc_pce_backupram - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_system - - - 1 - - - vc_pce_europe_switch - - - JCS.ToggleSwitch, ToggleSwitch, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null - - - vc_pce_system - - - 2 - - - vc_pce_europe - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_system - - - 3 - - - vc_pce_padbutton_switch - - - JCS.ToggleSwitch, ToggleSwitch, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null - - - vc_pce_system - - - 4 - - - vc_pce_padbutton - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_system - - - 5 - - - 12, 10 - - - 536, 110 - - - 27 - - - vc_options - - - vc_pce_system - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce - - - 0 + + 8 True @@ -1990,89 +1528,29 @@ 5 - - vc_pce_y_offset_l - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_display - - - 0 - - - vc_pce_y_offset - - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_display - - - 1 - - - vc_pce_sprline - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_display - - - 2 - - - vc_pce_raster - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_display - - - 3 - - - vc_pce_hide_overscan - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_pce_display - - - 4 - - - 12, 126 + + 12, 10 - - 536, 116 + + 536, 110 - - 28 + + 27 - - display + + vc_options - - vc_pce_display + + vc_pce_system - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + vc_pce - - 1 + + 0 True @@ -2215,86 +1693,50 @@ 4 - - auto_game_scan + + 12, 126 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 116 - - panel2 + + 28 - - 0 + + display - - auto_fill_save_data + + vc_pce_display - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel2 + + vc_pce - + 1 - - image_interpolation_mode + + 194, 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 560, 410 - - panel2 + + 26 - - 2 + + vc_pce - - banner_region + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - panel2 - - - 3 - - - default_target_filename - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 4 - - - 194, 0 - - - 560, 410 - - - 42 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 13 + + 9 True @@ -2356,6 +1798,15 @@ 1 + + 10, 18 + + + 516, 21 + + + 45 + image_interpolation_modes @@ -2392,26 +1843,14 @@ 2 - + 10, 18 - + 516, 21 - - 45 - - - image_interpolation_modes - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - image_interpolation_mode - - - 0 + + 47 banner_regions @@ -2449,123 +1888,6 @@ 3 - - 10, 18 - - - 516, 21 - - - 47 - - - banner_regions - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - banner_region - - - 0 - - - default_target_project - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 0 - - - default_target_project_tb - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 1 - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 2 - - - default_target_wad - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 3 - - - default_target_wad_tb - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 4 - - - default_target_parameters - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_target_filename - - - 5 - - - 12, 122 - - - 536, 160 - - - 61 - - - default_target_filename - - - default_target_filename - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 4 - True @@ -2731,77 +2053,62 @@ 5 - - sega_default - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_injection_methods - - - 0 - - - snes_default - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - default_injection_methods - - - 1 - - - nes_default + + 12, 122 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 160 - - default_injection_methods + + 61 - - 2 + + default_target_filename - - n64_default + + default_target_filename - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - default_injection_methods + + panel2 - - 3 + + 4 - + 194, 0 - + 560, 410 - - 43 + + 42 - - default_injection_methods + + panel2 - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 11 + + 13 - - injection_methods_sega + + 10, 18 + + + 516, 21 + + + 18 + + + injection_methods_sega System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -2836,27 +2143,15 @@ 0 - + 10, 18 - + 516, 21 - + 18 - - injection_methods_sega - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - sega_default - - - 0 - injection_methods_snes @@ -2893,27 +2188,15 @@ 1 - + 10, 18 - + 516, 21 - + 18 - - injection_methods_snes - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - snes_default - - - 0 - injection_methods_nes @@ -2950,27 +2233,15 @@ 2 - + 10, 18 - + 516, 21 - + 18 - - injection_methods_nes - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - nes_default - - - 0 - injection_methods_n64 @@ -3007,119 +2278,26 @@ 3 - - 10, 18 - - - 516, 21 - - - 18 - - - injection_methods_n64 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - n64_default - - - 0 - - - bios_neo - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_files - - - 0 - - - bios_psx - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_files - - - 1 - - + 194, 0 - + 560, 410 - - 3 + + 43 - - bios_files + + default_injection_methods - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 12 - - - browse_bios_neo - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_neo - - - 0 - - - bios_filename_neo - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_neo - - - 1 - - - 12, 10 - - - 536, 50 - - - 53 - - - neo - - - bios_neo - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_files - - - 0 + + 11 NoControl @@ -3169,53 +2347,29 @@ 1 - - browse_bios_psx - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_psx - - - 0 - - - bios_filename_psx - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_psx - - - 1 - - - 12, 66 + + 12, 10 - + 536, 50 - - 52 + + 53 - - psx + + neo - - bios_psx + + bios_neo - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + bios_files - - 1 + + 0 NoControl @@ -3250,173 +2404,65 @@ 435, 21 - - 51 - - - bios_filename_psx - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bios_psx - - - 1 - - - display - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - adobe_flash - - - 0 - - - flash_strap_reminder - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - adobe_flash - - - 1 - - - flash_controls - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - adobe_flash - - - 2 - - - flash_save_data - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - adobe_flash - - - 3 - - - 194, 0 - - - 560, 410 - - - 4 - - - adobe_flash - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - flash_fullscreen - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - display - - - 0 - - - flash_update_frame_rate_l - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - display - - - 1 - - - flash_update_frame_rate + + 51 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + bios_filename_psx - - display + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + bios_psx - - flash_quality_l + + 1 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 12, 66 - - display + + 536, 50 - - 3 + + 52 - - flash_quality_list + + psx - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + bios_psx - - display + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 4 + + bios_files - - 12, 66 + + 1 - - 536, 90 + + 194, 0 - - 23 + + 560, 410 - - display + + 3 - - display + + bios_files - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - adobe_flash + + $this - - 0 + + 12 True @@ -3553,41 +2599,29 @@ 4 - - flash_strap_reminder_list - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_strap_reminder - - - 0 - - - 12, 10 + + 12, 66 - - 536, 50 + + 536, 90 - - 22 + + 23 - - strap_reminder + + display - - flash_strap_reminder + + display - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + adobe_flash - - 1 + + 0 auto @@ -3613,53 +2647,29 @@ 0 - - flash_qwerty_keyboard - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_controls - - - 0 - - - flash_mouse - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_controls - - - 1 - - - 12, 263 + + 12, 10 - - 536, 68 + + 536, 50 - - 21 + + 22 - - controls + + strap_reminder - - flash_controls + + flash_strap_reminder - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + adobe_flash - - 2 + + 1 True @@ -3697,137 +2707,53 @@ NoControl - - 10, 20 - - - 57, 17 - - - 13 - - - mouse - - - flash_mouse - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_controls - - - 1 - - - flash_vff_cache_size_l - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_save_data - - - 0 - - - flash_vff_cache_size - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_save_data - - - 1 - - - flash_persistent_storage_per_movie_l - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_save_data - - - 2 - - - flash_persistent_storage_per_movie - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_save_data - - - 3 - - - flash_persistent_storage_total_l - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flash_save_data - - - 4 - - - flash_persistent_storage_total + + 10, 20 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 57, 17 - - flash_save_data + + 13 - - 5 + + mouse - - flash_save_data_enable + + flash_mouse - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - flash_save_data + + flash_controls - - 6 + + 1 - - 12, 162 + + 12, 263 - - 536, 95 + + 536, 68 - - 19 + + 21 - - save_data + + controls - - flash_save_data + + flash_controls - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + adobe_flash - - 3 + + 2 True @@ -4138,134 +3064,50 @@ 6 - - vc_snes_options - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_snes - - - 0 - - - 194, 0 - - - 560, 410 - - - 22 - - - vc_snes - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 6 - - - vc_snes_patch_nosave - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_snes_options - - - 0 - - - vc_snes_patch_widescreen - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_snes_options - - - 1 - - - vc_snes_patch_nocc + + 12, 162 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 95 - - vc_snes_options + + 19 - - 2 + + save_data - - vc_snes_patch_nodark + + flash_save_data - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_snes_options + + adobe_flash - + 3 - - vc_snes_patch_nosuspend - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 194, 0 - - vc_snes_options + + 560, 410 - + 4 - - vc_snes_patch_volume - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - vc_snes_options - - - 5 - - - 12, 10 - - - 530, 155 - - - 40 - - - vc_options - - - vc_snes_options + + adobe_flash - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - vc_snes + + $this - - 0 + + 3 True @@ -4465,44 +3307,50 @@ 5 - - True + + 12, 10 - - TopLeft + + 530, 155 - - NoControl + + 40 - - 12, 312 + + vc_options - - 536, 96 + + vc_snes_options - - 22, 4, 4, 4 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 130, 23 + + vc_snes - - 56 + + 0 - - use_online_wad_tip + + 194, 0 - - use_online_wad_tip + + 560, 410 - - FriishProduce.ImageLabel, FriishProduce, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null + + 22 - - panel1 + + vc_snes - - 0 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 True @@ -4513,9 +3361,6 @@ Tahoma, 8.25pt - - NoControl - CenterParent diff --git a/FriishProduce/Strings/en.json b/FriishProduce/Strings/en.json index 3d6d8d3c..10ae2468 100644 --- a/FriishProduce/Strings/en.json +++ b/FriishProduce/Strings/en.json @@ -101,6 +101,7 @@ "008": "An update is available\nFriishProduce v{0} is now available for download.\nYou are currently running v{1}.\n\nWould you like to get the latest version from GitHub now?", "009": "You are currently already up to date.", "010": "When this option is enabled, the program will treat all files within the same folder as the currently selected one as forming part of the software to be injected.\n\nPlease make sure that your software files are in a separate folder before continuing.", + "011": "Extract the opening.bnr (includes IMET header)?", "error": "An error has occurred", "e_000": "Unable to connect to the Internet.\n{0}", @@ -120,6 +121,14 @@ "e_014": "Could not find the required BIOS file for this console.\nPlease set this file in the application preferences.", "e_015": "Failed to create savedata TPL.", "e_016": "No Virtual Console manual was found in the provided WAD.", + }, + + "html": { + "l_000": "About SNES VC", + "l_001": "About N64 VC", + + "t_000": "The name used for the channel's icon on the Wii Menu.
A shortened version of 20 characters or less is recommended for longer titles.

Example: Zelda: Ocarina", + "t_001": "Change advanced emulator settings.", } }, @@ -189,6 +198,7 @@ "wad_base": "Base WAD", "import_wad": "Import WAD from file...", "use_online_wad": "...or use a downloadable base", + "using_default_wad": "Using blank WAD", "current_wad": "Current WAD:", "image": "Image", @@ -332,7 +342,6 @@ "mouse": "Mouse", "qwerty_keyboard": "QWERTY keyboard", "midi": "Enable MIDI playback using DLS soundfont", - "background_color": "Change background color", "quality": "Quality", "quality0": "High", "quality1": "Medium", @@ -340,7 +349,10 @@ "strap_reminder": "Strap reminder screen", "strap_reminder0": "{disabled}", "strap_reminder1": "{enabled}", - "strap_reminder2": "{enabled} (w/o extension controller)" + "strap_reminder2": "{enabled} (w/o extension controller)", + "swf_metadata": "SWF metadata", + "content_domain": "Content domain", + "background_color": "Change background color" }, "forwarder": { diff --git a/FriishProduce/Strings/es.json b/FriishProduce/Strings/es.json index b22e2fad..0e3215f1 100644 --- a/FriishProduce/Strings/es.json +++ b/FriishProduce/Strings/es.json @@ -100,6 +100,7 @@ "007": "El seleccionado no contiene ningún contenido válido de manual electrónico.", "008": "Actualización de FriishProduce\nYa está disponible para descargar la nueva versión {0} de FriishProduce.\nActualmente está utilizando la versión {1}.\n\n¿Quiere descargar la actualización de GitHub ahora?", "009": "Actualmente ya está actualizado.", + "011": "¿Extraer el archivo Opening.bnr (incluido la cabecera IMET)?", "error": "Se ha producido un error", "e_000": "No se pudo conectar a Internet.\n{0}", @@ -119,6 +120,11 @@ "e_014": "No se encontró el archivo BIOS necesario para esta consola.\nPor favor seleccione un archivo en los ajustes de la aplicación.", "e_015": "No se pudo crear la imagen TPL para los datos guardados.", "e_016": "No se encontró ningún manual electrónico de Consola Virtual." + }, + + "html": { + "t_000": "Nombre utilizado para el icono que aparece en el menu Wii.
Para títulos más largos, se recomienda utilizar una versión abreviada de 20 caracteres o menos.
Ejemplo: Zelda: Ocarina", + "t_001": "Cambiar la configuración del emulador.", } }, @@ -183,6 +189,7 @@ "wad_base": "Canal de origen", "import_wad": "Abrir un archivo WAD...", "use_online_wad": "...o utilizar un canal descargable", + "using_default_wad": "Utilizando un canal Wii blanco", "current_wad": "WAD actual:", "image": "Imagen", @@ -323,7 +330,10 @@ "strap_reminder": "Advertencia de correa del mando", "strap_reminder0": "{disabled}", "strap_reminder1": "{enabled}", - "strap_reminder2": "{enabled} (sin pantalla de mandos complementarios)" + "strap_reminder2": "{enabled} (sin pantalla de mandos complementarios)", + "swf_metadata": "Metadatos SWF", + "content_domain": "Dominio de contenido", + "background_color": "Cambiar el color de fondo" }, "forwarder": { diff --git a/FriishProduce/Strings/fr.json b/FriishProduce/Strings/fr.json index 61777b94..1ac0664a 100644 --- a/FriishProduce/Strings/fr.json +++ b/FriishProduce/Strings/fr.json @@ -101,6 +101,7 @@ "008": "Une mise à jour est disponible\nFriishProduce v{0} est désormais disponible à télécharger.\nL'actuelle version est v{1}.\n\nObtenir la dernière mise à jour dès GitHub maintenant ?", "009": "Vous êtes déjà à jour.", "010": "Lorsque cette option est activée, l'application traitera tous les fichiers du même dossier que celui actuellement sélectionné comme faisant partie du logiciel à injecter.\n\nVeuillez vous assurer que vos fichiers sont déjà dans un répertoire séparé avant de continuer.", + "011": "Extraire le fichier opening.bnr (comprenant le header IMET) ?", "error": "Oups, un problème est survenu !", "e_000": "Échec de connexion à Internet.\n{0}", @@ -120,6 +121,11 @@ "e_014": "Le fichier BIOS requis pour cette console est indisponible. Veuillez le spécifier de nouveau dans les préférences de l'application.", "e_015": "Échec de création de l'image d'aperçu des données de sauvegarde.", "e_016": "Aucun mode d'emploi de Console virtuelle n'a été trouvé dans cette chaîne." + }, + + "html": { + "t_000": "Le nom de la chaîne tel qu'il apparaît sur le Menu Wii.
Il est recommandé d'utiliser une version abrégée du titre (maximum de 20 caractères) s'il est trop long.

Exemple : Zelda: Ocarina", + "t_001": "Modifier les paramètres de l'émulateur.", } }, @@ -188,6 +194,7 @@ "wad_base": "WAD de base", "import_wad": "Ouvrir un fichier WAD ...", "use_online_wad": "... ou télécharger une chaîne", + "using_default_wad": "Utilisant une chaîne Wii blanche", "current_wad": "WAD actuel :", "image": "Image", @@ -329,7 +336,10 @@ "strap_reminder": "Rappel de dragonne", "strap_reminder0": "{disabled}", "strap_reminder1": "{enabled}", - "strap_reminder2": "{enabled} (sans section consacrée aux extensions externes)" + "strap_reminder2": "{enabled} (sans section consacrée aux extensions externes)", + "swf_metadata": "Métadonnées du contenu SWF", + "content_domain": "Domaine URL du contenu", + "background_color": "Changer la couleur d'arrière-plan" }, "forwarder": { diff --git a/FriishProduce/Strings/ja.json b/FriishProduce/Strings/ja.json index 37353653517b70241247a130a613ce05bd8cb5b3..dbad205b281bb05bb3b10fd1345177d2195046ad 100644 GIT binary patch delta 1182 zcmaJ>X=qbf82wtL)6|!O7MH3WV?nLBow$sS)JjXmN}EQLNDKVZrdP_PQgRcQafpcCU@=by&g}yEO)QBp#%(;$ zE=C=ryPH{IWMN!LM^3Xn62h)@ALG4o+hr0fWO{VtGZ}x4v3x_Sp^nr;KC6M|k=kGi zut7K3YKB=R2{245t8jzFFXIW<^9X$xKl7V-A4Ln{y>m^-AR48BS$-APMvR~HA1a(| z%@6bkI$8Jxb$E!d3Tk7g&P_*l)q7FNSzW~=6U0q|p5!Wtd~pB0!_bDT_wE@Tv&ke@!|JhvP)p4Iq&*2p%3L}|sr|>q(NNz~lTkFFTERsfPmMV!z zom8U*Nm%I$LlH+0UG*97So9VtN7ZC)^q8Ojhlh&hk5W-Br`pc34OrAE8>F6H8+iw1 z8oTMTi6&Vr4p}H3c}yXC*dmU}o*l3x;&{<=mwq?wR*eO!yr4kc({{UOrYmO5;1VaR zgfY?QV05jSlbh(npA`NL&TzfJPvIxml6@H)8g?{Pu_Ut9N3Bq;v~EyQYl-T&cB(r+ zYCkkkmG#o3PK_KEYZgDPYg_|tyyVd+&v6?siCM=Lyr4vP*{ze^3?GINbCyI5pR~d1 zak#QkDh*^@CZ*(FCT-3t%;SE#d9ukx=Jv2sk@IA$pdz5-IF0ify(lh|DPom8v6xpe zfhFNʔq1oD;6vIZH@ta*rU_A shortened version of 20 characters or less is recommended for longer titles.

Example: Zelda: Ocarina", + "t_001": "Change advanced emulator settings.", } }, @@ -187,6 +193,7 @@ "wad_base": "기반", "import_wad": "WAD 가져오기...", "use_online_wad": "...또는 다운로드 가능한 기반 사용", + "using_default_wad": "Using blank WAD", "current_wad": "현재 WAD:", "image": "이미지", diff --git a/FriishProduce/Subforms/About.cs b/FriishProduce/Subforms/About.cs index 4cb2e2a6..c09e4aa0 100644 --- a/FriishProduce/Subforms/About.cs +++ b/FriishProduce/Subforms/About.cs @@ -11,7 +11,7 @@ public About() InitializeComponent(); Text = string.Format(Program.Lang.String("about_app"), Program.Lang.ApplicationTitle); labelProductName.Text = AssemblyProduct; - labelDescription.Text = string.Format("{0}" + Environment.NewLine + "Current language: {0} ({1})", AssemblyDescription, System.Globalization.CultureInfo.CurrentUICulture.EnglishName, Program.Lang.Author); + labelDescription.Text = string.Format("{0}" + Environment.NewLine + "Current language: {1} ({2})", AssemblyDescription, System.Globalization.CultureInfo.CurrentUICulture.EnglishName, Program.Lang.Author); labelVersion.Text = "v" + System.Diagnostics.FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion.ToString(); labelCopyright.Text = AssemblyCopyright; b_ok.Text = Program.Lang.String("b_close"); diff --git a/FriishProduce/Subforms/ContentOptions.Designer.cs b/FriishProduce/Subforms/ContentOptions.Designer.cs index c38c2df3..9828ebca 100644 --- a/FriishProduce/Subforms/ContentOptions.Designer.cs +++ b/FriishProduce/Subforms/ContentOptions.Designer.cs @@ -37,6 +37,7 @@ private void InitializeComponent() this.bottomPanel2 = new System.Windows.Forms.Panel(); this.controller_box = new System.Windows.Forms.GroupBox(); this.controller_cb = new System.Windows.Forms.CheckBox(); + this.tip = new TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip(); this.bottomPanel1.SuspendLayout(); this.bottomPanel2.SuspendLayout(); this.controller_box.SuspendLayout(); @@ -44,7 +45,7 @@ private void InitializeComponent() // // bottomPanel1 // - this.bottomPanel1.BackColor = System.Drawing.Color.WhiteSmoke; + this.bottomPanel1.BackColor = System.Drawing.SystemColors.ControlLight; this.bottomPanel1.Controls.Add(this.b_cancel); this.bottomPanel1.Controls.Add(this.b_ok); resources.ApplyResources(this.bottomPanel1, "bottomPanel1"); @@ -94,6 +95,21 @@ private void InitializeComponent() this.controller_cb.Tag = "controller"; this.controller_cb.UseVisualStyleBackColor = true; // + // tip + // + this.tip.AllowLinksHandling = true; + this.tip.AutoPopDelay = 10000; + this.tip.BackColor = System.Drawing.Color.White; + this.tip.BaseStylesheet = "div { font-size: 11px !important; }"; + this.tip.ForeColor = System.Drawing.Color.Black; + this.tip.InitialDelay = 500; + this.tip.MaximumSize = new System.Drawing.Size(350, 0); + this.tip.OwnerDraw = true; + this.tip.ReshowDelay = 100; + this.tip.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; + this.tip.TooltipCssClass = "htmltooltip"; + this.tip.UseGdiPlusTextRendering = true; + // // ContentOptions // this.AcceptButton = this.b_ok; @@ -127,5 +143,6 @@ private void InitializeComponent() private System.Windows.Forms.Panel bottomPanel2; protected System.Windows.Forms.GroupBox controller_box; protected System.Windows.Forms.CheckBox controller_cb; + private TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip tip; } } \ No newline at end of file diff --git a/FriishProduce/Subforms/ContentOptions.cs b/FriishProduce/Subforms/ContentOptions.cs index d99fcb11..e675b370 100644 --- a/FriishProduce/Subforms/ContentOptions.cs +++ b/FriishProduce/Subforms/ContentOptions.cs @@ -91,13 +91,16 @@ public IDictionary Keymap controllerForm.Keymap = _Keymap; return _Keymap; } + else return null; } set { + _Keymap = value; + if (controllerForm != null) { - controllerForm.Keymap = _Keymap = value; + controllerForm.Keymap = value; } } } diff --git a/FriishProduce/Subforms/ContentOptions.resx b/FriishProduce/Subforms/ContentOptions.resx index 0765b191..049d0ae4 100644 --- a/FriishProduce/Subforms/ContentOptions.resx +++ b/FriishProduce/Subforms/ContentOptions.resx @@ -117,21 +117,69 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + b_cancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel1 + + + 0 + + + b_ok + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel1 + + + 1 + + + Bottom + + + + 0, 1 + + + 554, 41 + + + + 12 + + + bottomPanel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel2 + + + 0 + Bottom, Right NoControl - - 442, 8 + 442, 9 - 100, 24 + 100, 23 - 4 @@ -157,10 +205,10 @@ NoControl
- 336, 8 + 336, 9 - 100, 24 + 100, 23 3 @@ -180,30 +228,6 @@ 1 - - Bottom - - - 0, 1 - - - 554, 41 - - - 12 - - - bottomPanel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bottomPanel2 - - - 0 - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m @@ -277,21 +301,6 @@ 1 - - True - - - 10, 0 - - - 71, 17 - - - 39 - - - controller - controller_cb @@ -328,9 +337,42 @@ 0 + + True + + + 10, 0 + + + 71, 17 + + + 39 + + + controller + + + controller_cb + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + controller_box + + + 0 + + + 17, 17 + True + + True + 554, 422 @@ -343,6 +385,12 @@ injection_method_options + + tip + + + TheArtOfDev.HtmlRenderer.WinForms.HtmlToolTip, HtmlRenderer.WinForms, Version=1.5.1.0, Culture=neutral, PublicKeyToken=null + ContentOptions diff --git a/FriishProduce/Subforms/ContentOptions/Options_Flash.Designer.cs b/FriishProduce/Subforms/ContentOptions/Options_Flash.Designer.cs index 14bafcec..07e95c9f 100644 --- a/FriishProduce/Subforms/ContentOptions/Options_Flash.Designer.cs +++ b/FriishProduce/Subforms/ContentOptions/Options_Flash.Designer.cs @@ -53,6 +53,9 @@ private void InitializeComponent() this.strap_reminder_list = new System.Windows.Forms.ComboBox(); this.ImportDLS = new System.Windows.Forms.OpenFileDialog(); this.BGColor = new System.Windows.Forms.ColorDialog(); + this.swf_metadata = new System.Windows.Forms.GroupBox(); + this.content_domain_l = new System.Windows.Forms.Label(); + this.content_domain = new FriishProduce.PlaceholderTextBox(); this.bottomPanel1.SuspendLayout(); this.controller_box.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -61,16 +64,17 @@ private void InitializeComponent() this.controls.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.background_color_img)).BeginInit(); this.strap_reminder.SuspendLayout(); + this.swf_metadata.SuspendLayout(); this.SuspendLayout(); // // b_controller // - this.b_controller.Size = new System.Drawing.Size(690, 24); + this.b_controller.Size = new System.Drawing.Size(340, 24); // // controller_box // - this.controller_box.Location = new System.Drawing.Point(12, 260); - this.controller_box.Size = new System.Drawing.Size(710, 54); + this.controller_box.Location = new System.Drawing.Point(12, 254); + this.controller_box.Size = new System.Drawing.Size(360, 54); // // quality // @@ -80,7 +84,7 @@ private void InitializeComponent() "auto"}); this.quality.Location = new System.Drawing.Point(15, 36); this.quality.Name = "quality"; - this.quality.Size = new System.Drawing.Size(150, 21); + this.quality.Size = new System.Drawing.Size(154, 21); this.quality.TabIndex = 15; this.quality.Tag = "quality"; // @@ -93,9 +97,9 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.persistent_storage_total_l); this.groupBox1.Controls.Add(this.persistent_storage_total); this.groupBox1.Controls.Add(this.save_data_enable); - this.groupBox1.Location = new System.Drawing.Point(370, 12); + this.groupBox1.Location = new System.Drawing.Point(378, 10); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(352, 146); + this.groupBox1.Size = new System.Drawing.Size(360, 146); this.groupBox1.TabIndex = 16; this.groupBox1.TabStop = false; this.groupBox1.Tag = "save_data"; @@ -132,12 +136,12 @@ private void InitializeComponent() "4096"}); this.vff_cache_size.Location = new System.Drawing.Point(15, 60); this.vff_cache_size.Name = "vff_cache_size"; - this.vff_cache_size.Size = new System.Drawing.Size(150, 21); + this.vff_cache_size.Size = new System.Drawing.Size(152, 21); this.vff_cache_size.TabIndex = 22; // // persistent_storage_per_movie_l // - this.persistent_storage_per_movie_l.Location = new System.Drawing.Point(180, 79); + this.persistent_storage_per_movie_l.Location = new System.Drawing.Point(185, 79); this.persistent_storage_per_movie_l.Name = "persistent_storage_per_movie_l"; this.persistent_storage_per_movie_l.Size = new System.Drawing.Size(160, 30); this.persistent_storage_per_movie_l.TabIndex = 28; @@ -164,9 +168,9 @@ private void InitializeComponent() "1024", "2048", "4096"}); - this.persistent_storage_per_movie.Location = new System.Drawing.Point(188, 113); + this.persistent_storage_per_movie.Location = new System.Drawing.Point(193, 113); this.persistent_storage_per_movie.Name = "persistent_storage_per_movie"; - this.persistent_storage_per_movie.Size = new System.Drawing.Size(150, 21); + this.persistent_storage_per_movie.Size = new System.Drawing.Size(152, 21); this.persistent_storage_per_movie.TabIndex = 27; // // persistent_storage_total_l @@ -200,7 +204,7 @@ private void InitializeComponent() "4096"}); this.persistent_storage_total.Location = new System.Drawing.Point(15, 113); this.persistent_storage_total.Name = "persistent_storage_total"; - this.persistent_storage_total.Size = new System.Drawing.Size(150, 21); + this.persistent_storage_total.Size = new System.Drawing.Size(152, 21); this.persistent_storage_total.TabIndex = 25; // // save_data_enable @@ -222,9 +226,9 @@ private void InitializeComponent() this.display.Controls.Add(this.update_frame_rate); this.display.Controls.Add(this.quality_l); this.display.Controls.Add(this.quality); - this.display.Location = new System.Drawing.Point(12, 68); + this.display.Location = new System.Drawing.Point(12, 66); this.display.Name = "display"; - this.display.Size = new System.Drawing.Size(352, 90); + this.display.Size = new System.Drawing.Size(360, 90); this.display.TabIndex = 17; this.display.TabStop = false; this.display.Tag = "display"; @@ -260,7 +264,7 @@ private void InitializeComponent() 0, 0}); this.update_frame_rate.Name = "update_frame_rate"; - this.update_frame_rate.Size = new System.Drawing.Size(150, 21); + this.update_frame_rate.Size = new System.Drawing.Size(154, 21); this.update_frame_rate.TabIndex = 0; // // quality_l @@ -278,9 +282,9 @@ private void InitializeComponent() this.controls.Controls.Add(this.midi); this.controls.Controls.Add(this.qwerty_keyboard); this.controls.Controls.Add(this.mouse); - this.controls.Location = new System.Drawing.Point(12, 168); + this.controls.Location = new System.Drawing.Point(12, 162); this.controls.Name = "controls"; - this.controls.Size = new System.Drawing.Size(352, 86); + this.controls.Size = new System.Drawing.Size(360, 86); this.controls.TabIndex = 18; this.controls.TabStop = false; this.controls.Tag = "controls"; @@ -323,17 +327,17 @@ private void InitializeComponent() // background_color_img // this.background_color_img.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.background_color_img.Location = new System.Drawing.Point(692, 170); + this.background_color_img.Location = new System.Drawing.Point(326, 68); this.background_color_img.Name = "background_color_img"; - this.background_color_img.Size = new System.Drawing.Size(30, 20); + this.background_color_img.Size = new System.Drawing.Size(25, 18); this.background_color_img.TabIndex = 17; this.background_color_img.TabStop = false; // // background_color // - this.background_color.Location = new System.Drawing.Point(370, 168); + this.background_color.Location = new System.Drawing.Point(10, 65); this.background_color.Name = "background_color"; - this.background_color.Size = new System.Drawing.Size(316, 23); + this.background_color.Size = new System.Drawing.Size(310, 23); this.background_color.TabIndex = 16; this.background_color.Tag = "background_color"; this.background_color.Text = "background_color"; @@ -343,9 +347,9 @@ private void InitializeComponent() // strap_reminder // this.strap_reminder.Controls.Add(this.strap_reminder_list); - this.strap_reminder.Location = new System.Drawing.Point(12, 12); + this.strap_reminder.Location = new System.Drawing.Point(12, 10); this.strap_reminder.Name = "strap_reminder"; - this.strap_reminder.Size = new System.Drawing.Size(352, 50); + this.strap_reminder.Size = new System.Drawing.Size(360, 50); this.strap_reminder.TabIndex = 19; this.strap_reminder.TabStop = false; this.strap_reminder.Tag = "strap_reminder"; @@ -359,7 +363,7 @@ private void InitializeComponent() "auto"}); this.strap_reminder_list.Location = new System.Drawing.Point(10, 18); this.strap_reminder_list.Name = "strap_reminder_list"; - this.strap_reminder_list.Size = new System.Drawing.Size(333, 21); + this.strap_reminder_list.Size = new System.Drawing.Size(340, 21); this.strap_reminder_list.TabIndex = 16; this.strap_reminder_list.Tag = "strap_reminder"; // @@ -368,24 +372,54 @@ private void InitializeComponent() this.ImportDLS.DefaultExt = "dls"; this.ImportDLS.Filter = ".dls (*.dls)|*.dls"; // + // swf_metadata + // + this.swf_metadata.Controls.Add(this.content_domain_l); + this.swf_metadata.Controls.Add(this.content_domain); + this.swf_metadata.Controls.Add(this.background_color); + this.swf_metadata.Controls.Add(this.background_color_img); + this.swf_metadata.Location = new System.Drawing.Point(378, 162); + this.swf_metadata.Name = "swf_metadata"; + this.swf_metadata.Size = new System.Drawing.Size(360, 98); + this.swf_metadata.TabIndex = 39; + this.swf_metadata.TabStop = false; + this.swf_metadata.Tag = "swf_metadata"; + this.swf_metadata.Text = "swf_metadata"; + // + // content_domain_l + // + this.content_domain_l.AutoSize = true; + this.content_domain_l.Location = new System.Drawing.Point(7, 18); + this.content_domain_l.Name = "content_domain_l"; + this.content_domain_l.Size = new System.Drawing.Size(84, 13); + this.content_domain_l.TabIndex = 19; + this.content_domain_l.Tag = "content_domain"; + this.content_domain_l.Text = "content_domain"; + // + // content_domain + // + this.content_domain.Location = new System.Drawing.Point(15, 36); + this.content_domain.Name = "content_domain"; + this.content_domain.PlaceholderText = "file:///trusted/"; + this.content_domain.Size = new System.Drawing.Size(330, 21); + this.content_domain.TabIndex = 0; + // // Options_Flash // - this.ClientSize = new System.Drawing.Size(734, 371); - this.Controls.Add(this.background_color_img); + this.ClientSize = new System.Drawing.Size(751, 364); + this.Controls.Add(this.swf_metadata); this.Controls.Add(this.strap_reminder); this.Controls.Add(this.controls); - this.Controls.Add(this.background_color); this.Controls.Add(this.display); this.Controls.Add(this.groupBox1); this.Name = "Options_Flash"; this.Tag = "adobe_flash"; - this.Controls.SetChildIndex(this.controller_box, 0); this.Controls.SetChildIndex(this.groupBox1, 0); this.Controls.SetChildIndex(this.display, 0); - this.Controls.SetChildIndex(this.background_color, 0); this.Controls.SetChildIndex(this.controls, 0); this.Controls.SetChildIndex(this.strap_reminder, 0); - this.Controls.SetChildIndex(this.background_color_img, 0); + this.Controls.SetChildIndex(this.swf_metadata, 0); + this.Controls.SetChildIndex(this.controller_box, 0); this.bottomPanel1.ResumeLayout(false); this.controller_box.ResumeLayout(false); this.controller_box.PerformLayout(); @@ -398,6 +432,8 @@ private void InitializeComponent() this.controls.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.background_color_img)).EndInit(); this.strap_reminder.ResumeLayout(false); + this.swf_metadata.ResumeLayout(false); + this.swf_metadata.PerformLayout(); this.ResumeLayout(false); } @@ -427,5 +463,8 @@ private void InitializeComponent() private System.Windows.Forms.ColorDialog BGColor; private System.Windows.Forms.Button background_color; private System.Windows.Forms.PictureBox background_color_img; + private System.Windows.Forms.GroupBox swf_metadata; + private PlaceholderTextBox content_domain; + private System.Windows.Forms.Label content_domain_l; } } diff --git a/FriishProduce/Subforms/ContentOptions/Options_Flash.cs b/FriishProduce/Subforms/ContentOptions/Options_Flash.cs index 704d9d1c..f17d0608 100644 --- a/FriishProduce/Subforms/ContentOptions/Options_Flash.cs +++ b/FriishProduce/Subforms/ContentOptions/Options_Flash.cs @@ -29,7 +29,8 @@ public Options_Flash() : base() { "strap_reminder", Program.Config.flash.strap_reminder }, { "midi", null }, { "fullscreen", Program.Config.flash.fullscreen }, - { "background_color", "0 0 0 0" } + { "content_domain", null }, + { "background_color", "0 0 0 0" }, }; // Cosmetic @@ -69,6 +70,7 @@ protected override void ResetOptions() strap_reminder_list.SelectedIndex = Options["strap_reminder"] switch { "none" => 0, "normal" => 1, _ => 2 }; // MIDI is counted separately fullscreen.Checked = Options["fullscreen"] == "yes"; + if (Options.ContainsKey("content_domain")) content_domain.Text = Options["content_domain"]; // Background color // **************** @@ -106,6 +108,7 @@ protected override void ResetOptions() { "strap_reminder", Program.Config.flash.strap_reminder }, { "midi", null }, { "fullscreen", Program.Config.flash.fullscreen }, + { "content_domain", null }, { "background_color", "0 0 0 0" } }; @@ -144,6 +147,7 @@ protected override void SaveOptions() Options["strap_reminder"] = strap_reminder_list.SelectedIndex switch { 0 => "none", 1 => "normal", _ => "no_ex" }; Options["hbm_no_save"] = Options["shared_object_capability"] == "on" ? "no" : "yes"; Options["fullscreen"] = fullscreen.Checked ? "yes" : "no"; + Options["content_domain"] = content_domain.Text; Options["background_color"] = BGColor.Color.R + BGColor.Color.G + BGColor.Color.B > 0 ? $"{BGColor.Color.R} {BGColor.Color.G} {BGColor.Color.B} 255" : "0 0 0 0"; } diff --git a/FriishProduce/Subforms/ContentOptions/Options_VC_NEO.Designer.cs b/FriishProduce/Subforms/ContentOptions/Options_VC_NEO.Designer.cs index 0d5aa67e..17b67327 100644 --- a/FriishProduce/Subforms/ContentOptions/Options_VC_NEO.Designer.cs +++ b/FriishProduce/Subforms/ContentOptions/Options_VC_NEO.Designer.cs @@ -33,6 +33,7 @@ private void InitializeComponent() this.bios_list = new System.Windows.Forms.ComboBox(); this.g1 = new System.Windows.Forms.GroupBox(); this.bottomPanel1.SuspendLayout(); + this.controller_box.SuspendLayout(); this.g1.SuspendLayout(); this.SuspendLayout(); // @@ -58,7 +59,7 @@ private void InitializeComponent() // g1 // this.g1.Controls.Add(this.bios_list); - this.g1.Location = new System.Drawing.Point(12, 9); + this.g1.Location = new System.Drawing.Point(12, 10); this.g1.Name = "g1"; this.g1.Size = new System.Drawing.Size(400, 50); this.g1.TabIndex = 38; @@ -68,12 +69,15 @@ private void InitializeComponent() // // Options_VC_NEO // - this.ClientSize = new System.Drawing.Size(424, 114); + this.ClientSize = new System.Drawing.Size(424, 116); this.Controls.Add(this.g1); this.Name = "Options_VC_NEO"; this.Tag = "vc_neo"; + this.Controls.SetChildIndex(this.controller_box, 0); this.Controls.SetChildIndex(this.g1, 0); this.bottomPanel1.ResumeLayout(false); + this.controller_box.ResumeLayout(false); + this.controller_box.PerformLayout(); this.g1.ResumeLayout(false); this.ResumeLayout(false); diff --git a/FriishProduce/Subforms/ContentOptions/Options_VC_NES.Designer.cs b/FriishProduce/Subforms/ContentOptions/Options_VC_NES.Designer.cs index 86c5f97c..b66073a6 100644 --- a/FriishProduce/Subforms/ContentOptions/Options_VC_NES.Designer.cs +++ b/FriishProduce/Subforms/ContentOptions/Options_VC_NES.Designer.cs @@ -39,18 +39,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // - // b_cancel - // - this.b_cancel.Location = new System.Drawing.Point(242, 8); - // - // b_ok - // - this.b_ok.Location = new System.Drawing.Point(136, 8); - // - // bottomPanel1 - // - this.bottomPanel1.Size = new System.Drawing.Size(354, 41); - // // b_controller // this.b_controller.Location = new System.Drawing.Point(-264, 7); diff --git a/FriishProduce/Subforms/ControllerMapping.cs b/FriishProduce/Subforms/ControllerMapping.cs index 9a93aabb..41bfb546 100644 --- a/FriishProduce/Subforms/ControllerMapping.cs +++ b/FriishProduce/Subforms/ControllerMapping.cs @@ -17,6 +17,26 @@ public ControllerMapping() InitializeComponent(); } + protected void LoadLayout() + { + if (DesignMode) return; + + // Map button values to null + // --------------- + if (Mapping == null) + { + ResetLayout(); + } + + // Map button values to existing list + // --------------- + else + { + if (OldMapping == null) OldMapping = new Dictionary(Mapping); + SetKeymap(Mapping.Values.ToArray()); + } + } + protected void ResetLayout() { if (DesignMode) return; @@ -69,6 +89,7 @@ protected void ResetLayout() presets_list.Items.Clear(); presets_list.Items.Add(Program.Lang.String("preset_blank", "controller")); presets_list.Items.AddRange(presets.Keys.ToArray()); + if (presets_list.Items?.Count > 0) { preset_load.Enabled = presets_list.Enabled = true; @@ -78,6 +99,7 @@ protected void ResetLayout() presets_list.Items.Add(empty); preset_load.Enabled = presets_list.Enabled = false; } + presets_list.SelectedIndex = 0; } @@ -153,19 +175,7 @@ protected void Cancel_Click(object sender, EventArgs e) protected void Form_Load(object sender, EventArgs e) { if (DesignMode) return; - - // Map button values to null - // --------------- - if (Mapping == null) - { - ResetLayout(); - } - else - { - SetKeymap(Mapping.Values.ToArray()); - - if (OldMapping == null) OldMapping = new Dictionary(Mapping); - } + LoadLayout(); if (!UsesGC && tabControl1.TabPages.Contains(page3)) tabControl1.TabPages.Remove(page3); if (!UsesNunchuk) vertical_layout.Checked = false; @@ -213,19 +223,13 @@ public IDictionary Keymap { Mapping = new Dictionary(value); - if (Visible) - { - try { SetKeymap(value.Values.ToArray()); } catch { } - } + try { SetKeymap(value.Values.ToArray()); } catch { } } else { - if (Visible) - { - try { SetKeymap(new string[available.Wii.Length]); } catch { } - } - Mapping = null; + + try { SetKeymap(new string[available.Wii.Length]); } catch { } } } } diff --git a/FriishProduce/Subforms/ControllerMapping.resx b/FriishProduce/Subforms/ControllerMapping.resx index a6f1e569..efd9ac5f 100644 --- a/FriishProduce/Subforms/ControllerMapping.resx +++ b/FriishProduce/Subforms/ControllerMapping.resx @@ -117,21 +117,105 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + bottomPanel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel2 + + + 0 + + + Bottom + + + + 0, 420 + + + 784, 42 + + + + 13 + + + bottomPanel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + b_cancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel1 + + + 0 + + + b_ok + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel1 + + + 1 + + + Bottom + + + 0, 1 + + + 784, 41 + + + 4 + + + bottomPanel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bottomPanel2 + + + 0 + Bottom, Right NoControl - - 672, 8 + 672, 9 - 100, 24 + 100, 23 - 4 @@ -157,10 +241,10 @@ NoControl - 566, 8 + 566, 9 - 100, 24 + 100, 23 3 @@ -177,56 +261,248 @@ bottomPanel1 - - 1 + + 1 + + + page1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + page2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + page3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + 12, 11 + + + 760, 345 + + + 17 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + vertical_layout + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 0 + + + WiiRemote_Minus + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 1 + + + WiiRemote_Plus + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 2 + + + WiiRemote_B + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 3 + + + WiiRemote_A + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 4 + + + WiiRemote_2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 5 + + + WiiRemote_1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 6 + + + WiiRemote_Left + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 7 + + + WiiRemote_Down + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 8 + + + WiiRemote_Up + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 9 + + + WiiRemote_Right + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 10 + + + pictureBox2 - - Bottom + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 1 + + page1 - - 784, 41 + + 11 - - 4 + + pictureBox3 - - bottomPanel1 + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + page1 - - bottomPanel2 + + 12 - - 0 + + 4, 22 - - Bottom + + 3, 3, 3, 3 - - 0, 420 + + 752, 319 - - 784, 42 + + 0 - - 13 + + page1 - - bottomPanel2 + + page1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + tabControl1 - - 1 + + 0 MiddleRight @@ -492,92 +768,272 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page1 + + page1 + + + 10 + + + NoControl + + + 91, 29 + + + 570, 260 + + + AutoSize + + + 17 + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 11 + + + NoControl + + + 91, 29 + + + 570, 260 + + + AutoSize + + + 17 + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page1 + + + 12 + + + Classic_Plus + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 0 + + + Classic_Minus + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 1 + + + Classic_B + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 2 + + + Classic_A + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 3 + + + Classic_Y + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 4 + + + Classic_X + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 5 + + + Classic_R + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 6 + + + Classic_ZR + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 7 + + + Classic_Down + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 8 + + + Classic_Right + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 9 + + + Classic_Left + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 - + 10 - - NoControl - - - 91, 29 - - - 570, 260 + + Classic_Up - - AutoSize + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17 + + page2 - - pictureBox2 + + 11 - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Classic_L - - page1 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 11 + + page2 - - NoControl + + 12 - - 91, 29 + + Classic_ZL - - 570, 260 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - AutoSize + + page2 - - 17 + + 13 - - pictureBox3 + + image_cc - + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page1 + + page2 - - 12 + + 14 - + 4, 22 - + 3, 3, 3, 3 - + 752, 319 - - 0 + + 1 - - page1 + + page2 - - page1 + + page2 - + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tabControl1 - - 0 + + 1 False @@ -828,146 +1284,302 @@ 121, 21 - - 20 + + 20 + + + Classic_Left + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 10 + + + False + + + 23, 89 + + + 121, 21 + + + 19 + + + Classic_Up + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 11 + + + False + + + 23, 52 + + + 121, 21 + + + 18 + + + Classic_L + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 12 + + + False + + + 23, 27 + + + 121, 21 + + + 17 + + + Classic_ZL + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 13 + + + NoControl + + + 91, 27 + + + 570, 260 + + + AutoSize + + + 16 + + + image_cc + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page2 + + + 14 + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page3 + + + 0 + + + GC_Z + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page3 + + + 1 + + + GC_R + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page3 + + + 2 + + + GC_B + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + page3 - - Classic_Left + + 3 - + + GC_A + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page2 + + page3 - - 10 + + 4 - - False + + GC_X - - 23, 89 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 121, 21 + + page3 - - 19 + + 5 - - Classic_Up + + GC_Y - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page2 + + page3 - - 11 + + 6 - - False + + GC_Down - - 23, 52 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 121, 21 + + page3 - - 18 + + 7 - - Classic_L + + GC_Right - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page2 + + page3 - - 12 + + 8 - - False + + GC_Left - - 23, 27 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 121, 21 + + page3 - - 17 + + 9 - - Classic_ZL + + GC_Up - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page2 - - - 13 + + page3 - - NoControl + + 10 - - 91, 27 + + GC_L - - 570, 260 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - AutoSize + + page3 - - 16 + + 11 - - image_cc + + pictureBox1 - + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - page2 + + page3 - - 14 + + 12 - + 4, 22 - + 3, 3, 3, 3 - + 752, 319 - - 1 + + 2 - - page2 + + page3 - - page2 + + page3 - + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tabControl1 - - 1 + + 2 False @@ -1284,53 +1896,53 @@ 12 - - 4, 22 + + presets_list - - 3, 3, 3, 3 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 752, 319 + + presets_gb - - 2 + + 0 - - page3 + + preset_load - - page3 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + presets_gb - - tabControl1 + + 1 - - 2 + + 12, 358 - - 12, 11 + + 760, 50 - - 760, 345 + + 5 - - 17 + + presets - - tabControl1 + + presets_gb - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 2 + + 0 10, 18 @@ -1377,30 +1989,6 @@ 1 - - 12, 358 - - - 760, 50 - - - 5 - - - presets - - - presets_gb - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - True diff --git a/FriishProduce/Subforms/Controllers/Controller_Flash.cs b/FriishProduce/Subforms/Controllers/Controller_Flash.cs index 46a2c25b..9157c027 100644 --- a/FriishProduce/Subforms/Controllers/Controller_Flash.cs +++ b/FriishProduce/Subforms/Controllers/Controller_Flash.cs @@ -309,7 +309,7 @@ public Controller_Flash() : base() }; #endregion - ResetLayout(); + LoadLayout(); // Localization // ----------------------------------------------------------------------------------------------------------- diff --git a/FriishProduce/Subforms/Controllers/Controller_SEGA.cs b/FriishProduce/Subforms/Controllers/Controller_SEGA.cs index 51205ca3..19c25ff4 100644 --- a/FriishProduce/Subforms/Controllers/Controller_SEGA.cs +++ b/FriishProduce/Subforms/Controllers/Controller_SEGA.cs @@ -167,7 +167,7 @@ public Controller_SEGA(bool IsSMS) : base() }; #endregion - ResetLayout(); + LoadLayout(); // Localization // ----------------------------------------------------------------------------------------------------------- diff --git a/FriishProduce/Subforms/HTMLForm.Designer.cs b/FriishProduce/Subforms/HTMLForm.Designer.cs new file mode 100644 index 00000000..b4c7457b --- /dev/null +++ b/FriishProduce/Subforms/HTMLForm.Designer.cs @@ -0,0 +1,120 @@ + +namespace FriishProduce +{ + partial class HTMLForm + { + /// + /// 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 Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bottomPanel2 = new System.Windows.Forms.Panel(); + this.bottomPanel1 = new System.Windows.Forms.Panel(); + this.b_ok = new System.Windows.Forms.Button(); + this.htmlPanel1 = new TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel(); + this.bottomPanel2.SuspendLayout(); + this.bottomPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // bottomPanel2 + // + this.bottomPanel2.BackColor = System.Drawing.SystemColors.ActiveBorder; + this.bottomPanel2.Controls.Add(this.bottomPanel1); + this.bottomPanel2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.bottomPanel2.Location = new System.Drawing.Point(0, 330); + this.bottomPanel2.Name = "bottomPanel2"; + this.bottomPanel2.Size = new System.Drawing.Size(444, 42); + this.bottomPanel2.TabIndex = 26; + // + // bottomPanel1 + // + this.bottomPanel1.BackColor = System.Drawing.SystemColors.ControlLight; + this.bottomPanel1.Controls.Add(this.b_ok); + this.bottomPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.bottomPanel1.Location = new System.Drawing.Point(0, 1); + this.bottomPanel1.Name = "bottomPanel1"; + this.bottomPanel1.Size = new System.Drawing.Size(444, 41); + this.bottomPanel1.TabIndex = 3; + // + // b_ok + // + this.b_ok.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.b_ok.AutoSize = true; + this.b_ok.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.b_ok.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.b_ok.Location = new System.Drawing.Point(310, 9); + this.b_ok.Name = "b_ok"; + this.b_ok.Size = new System.Drawing.Size(122, 23); + this.b_ok.TabIndex = 24; + this.b_ok.Tag = "b_ok"; + this.b_ok.Text = "&OK"; + // + // htmlPanel1 + // + this.htmlPanel1.AutoScroll = true; + this.htmlPanel1.AutoScrollMinSize = new System.Drawing.Size(420, 17); + this.htmlPanel1.BackColor = System.Drawing.SystemColors.Control; + this.htmlPanel1.BaseStylesheet = "div { font-size: 95% !important; }"; + this.htmlPanel1.Cursor = System.Windows.Forms.Cursors.IBeam; + this.htmlPanel1.IsSelectionEnabled = false; + this.htmlPanel1.Location = new System.Drawing.Point(12, 12); + this.htmlPanel1.Name = "htmlPanel1"; + this.htmlPanel1.Size = new System.Drawing.Size(420, 306); + this.htmlPanel1.TabIndex = 27; + this.htmlPanel1.Text = "
Not implemented
"; + this.htmlPanel1.UseSystemCursors = true; + // + // HTMLForm + // + this.AcceptButton = this.b_ok; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + this.ClientSize = new System.Drawing.Size(444, 372); + this.ControlBox = false; + this.Controls.Add(this.htmlPanel1); + this.Controls.Add(this.bottomPanel2); + this.Font = new System.Drawing.Font("Tahoma", 8.25F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "HTMLForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = " "; + this.bottomPanel2.ResumeLayout(false); + this.bottomPanel1.ResumeLayout(false); + this.bottomPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel bottomPanel2; + private System.Windows.Forms.Panel bottomPanel1; + private System.Windows.Forms.Button b_ok; + private TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel htmlPanel1; + } +} \ No newline at end of file diff --git a/FriishProduce/Subforms/HTMLForm.cs b/FriishProduce/Subforms/HTMLForm.cs new file mode 100644 index 00000000..52b0cfc8 --- /dev/null +++ b/FriishProduce/Subforms/HTMLForm.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FriishProduce +{ + public partial class HTMLForm : Form + { + public string FormText { get; private set; } = null; + + public HTMLForm(string text = null, string title = null) + { + InitializeComponent(); + FormText = text; + Text = title; + htmlPanel1.Text = string.IsNullOrWhiteSpace(text) ? "Not implemented" : text; + b_ok.Text = Program.Lang.String("b_close"); + } + } +} diff --git a/FriishProduce/Subforms/HTMLForm.resx b/FriishProduce/Subforms/HTMLForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/FriishProduce/Subforms/HTMLForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FriishProduce/_classes/Creators/Flash.cs b/FriishProduce/_classes/Creators/Flash.cs index f3c6bafa..4dbf9e8c 100644 --- a/FriishProduce/_classes/Creators/Flash.cs +++ b/FriishProduce/_classes/Creators/Flash.cs @@ -1,4 +1,5 @@ using libWiiSharp; +using System; using System.Collections.Generic; using System.IO; using System.Text; @@ -390,6 +391,13 @@ KEY_BUTTON_A 88 KEY_BUTTON_PLUS KEY_ENTER */ + private enum Type + { + Invalid = -1, + BackToNature = 0, + iPlayer = 1 + } + private U8 MainContent { get; set; } public WAD Inject(WAD w, string[] lines, ImageHelper Img) @@ -397,14 +405,53 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) MainContent = U8.Load(w.Contents[2]); MainContent.Extract(Paths.FlashContents); + // Determining the Flash emulator type + // ******** + Type type = Type.Invalid; + string target = null; + + if (File.Exists(Paths.FlashContents + "content\\menu.swf")) + { + target = Paths.FlashContents + "content\\menu.swf"; + type = Type.BackToNature; + } + + else if (File.Exists(Paths.FlashContents + "trusted\\startup.swf")) + { + target = Paths.FlashContents + "trusted\\startup.swf"; + type = Type.iPlayer; + } + + /* else if (File.Exists(Paths.FlashContents + "trusted\\wii_shim.swf")) + { + target = Paths.FlashContents + "trusted\\wii_shim.swf"; + type = Type.YouTube; + } */ + + else + { + throw new Exception(Program.Lang.Msg(13, true)); + } + // Actually replacing the SWF // ******** - string target = Directory.Exists(Paths.FlashContents + "content\\") ? Paths.FlashContents + "content\\menu.swf" : Paths.FlashContents + "trusted\\startup.swf"; File.Copy(SWF, target, true); + // if (type == Type.YouTube) File.Copy(SWF, Paths.FlashContents + "trusted\\wii_dev_shim.swf"); + + // Copying other needed files + // ******** if (Multifile) - foreach (string etc in Directory.EnumerateFiles(Path.GetDirectoryName(SWF), "*.*", SearchOption.TopDirectoryOnly)) + { + foreach (string folder in Directory.EnumerateDirectories(Path.GetDirectoryName(SWF), "*.*", SearchOption.AllDirectories)) + { + string newFolder = folder.Replace(Path.GetDirectoryName(SWF), Path.GetDirectoryName(target)); + Directory.CreateDirectory(newFolder); + } + + foreach (string etc in Directory.EnumerateFiles(Path.GetDirectoryName(SWF), "*.*", SearchOption.AllDirectories)) if (etc != SWF) - File.Copy(etc, Path.Combine(Path.GetDirectoryName(target), Path.GetFileName(etc)), true); + File.Copy(etc, etc.Replace(Path.GetDirectoryName(SWF), Path.GetDirectoryName(target)), true); + } // Copying the SWF soundfont // ******** @@ -469,7 +516,7 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) File.WriteAllBytes(file, Encoding.UTF8.GetBytes(string.Join("\r\n", txt) + "\r\n")); } - else if (item.EndsWith("config.common.pcf")) + else if (Path.GetFileName(item).Contains("common.pcf")) { List txt = new() { @@ -477,9 +524,6 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) "static_heap_size 8192 # 8192[KB] -> 8[MB]", "dynamic_heap_size 16384 # 16384[KB] -> 16[MB]", - "#stream_cache_max_file_size 512 # 512[KB] -> 0.5[MB]", - "#stream_cache_size 2048 # 2048[KB] -> 2.0[MB]", - $"update_frame_rate {Settings["update_frame_rate"]} # not TV-framerate(NTSC/PAL)", $"mouse {Settings["mouse"]}", @@ -500,7 +544,7 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) "dialog_cursor_archive cursor.arc", "dialog_cursor_layout cursor.brlyt", - $"shared_object_capability {Settings["shared_object_capability"]}", + $"shared_object_capability {(type == Type.BackToNature ? Settings["shared_object_capability"] : "on")}", "num_vff_drives 1", $"vff_cache_size {Settings["vff_cache_size"]}", $"vff_sync_on_write {Settings["vff_sync_on_write"]}", @@ -516,11 +560,29 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) $"hbm_no_save {Settings["hbm_no_save"]}", - "content_url file:///content/menu.swf", - "#content_domain file:///trusted/", - "#flash_vars dummy = 1", + $"content_url {(type == Type.BackToNature ? "file:///content/menu.swf" : "file:///trusted/startup.swf")}", }; + if (type == Type.iPlayer) + { + txt.AddRange(new string[] + { + "##### iPlayer Settings #####", + + "mp4_stream_buffer_size 512 # 512[KB] -> 0.5[MB]", + "stream_cache_max_file_size 512 # 512[KB] -> 0.5[MB]", + "stream_cache_size 2048 # 2048[KB] -> 2.0[MB]", + "static_module static.sel", + "plugin_modules plugin_wiinotification.rso plugin_wiiremote.rso plugin_wiisystem.rso", + "trace_filter none", + "texture_filter linear", + "certificate_files GTEGI.cer", + $"content_domain {(!Settings.ContainsKey("content_domain") || string.IsNullOrWhiteSpace(Settings["content_domain"]) ? "file:///trusted/" : Settings["content_domain"])}", + "#flash_vars dummy = 1", + } + ); + } + File.WriteAllBytes(file, Encoding.GetEncoding(932).GetBytes(string.Join("\r\n", txt) + "\r\n")); } @@ -576,7 +638,7 @@ public WAD Inject(WAD w, string[] lines, ImageHelper Img) { "not_copy off", "anim_type bounce", - $"title_text {System.Uri.EscapeUriString(lines[0])}", + $"title_text {Uri.EscapeUriString(lines[0])}", $"comment_text {(lines.Length > 1 && !string.IsNullOrEmpty(lines[1]) ? System.Uri.EscapeUriString(lines[1]) : "%20")}", $"banner_tpl banner/{(region == 2 ? "JP" : region == 1 ? "EU" : "US")}/banner.tpl", $"icon_tpl banner/{(region == 2 ? "JP" : region == 1 ? "EU" : "US")}/icons.tpl", diff --git a/FriishProduce/_classes/Databases/ChannelData.cs b/FriishProduce/_classes/Databases/ChannelData.cs index 01a5c46c..80a43657 100644 --- a/FriishProduce/_classes/Databases/ChannelData.cs +++ b/FriishProduce/_classes/Databases/ChannelData.cs @@ -170,6 +170,11 @@ public WAD GetWAD(int index) URL = "https://repo.mariocube.com/WADs/Flash%20Injects/Base/" + Uri.EscapeDataString(name) + ".wad"; tID = "WNAP"; } + else if (GetUpperID(index).StartsWith("HCJ")) + { + int ver = 768; + URL = "https://repo.mariocube.com/WADs/_WiiWare,%20VC,%20DLC,%20Channels%20&%20IOS/" + name[0].ToString().ToUpper() + "/" + Uri.EscapeDataString(name + $" (v{ver}) (Channel)") + ".wad"; + } else if (GetUpperID(index).StartsWith("HCX")) { int ver = Regions[index] == 0 ? 768 : Regions[index] == 3 ? 1537 : 1536; @@ -230,11 +235,11 @@ private void getStaticBase() /// public ChannelDatabase(Platform c, string externalFile = null) { - string file = File.Exists(externalFile) ? externalFile : File.Exists(Program.Config.paths.database) ? Program.Config.paths.database : null; + string file = File.Exists(externalFile) && !string.IsNullOrWhiteSpace(externalFile) ? externalFile : File.Exists(Program.Config.paths.database) ? Program.Config.paths.database : null; Entries = new List(); - if (!File.Exists(Program.Config.paths.database) && Program.Config.paths.database != null) + if (!File.Exists(Program.Config.paths.database) && !string.IsNullOrWhiteSpace(Program.Config.paths.database)) { Program.Config.paths.database = null; Program.Config.Save(); @@ -300,7 +305,7 @@ private void GetEntries(Platform c, byte[] file) } } - if (!(Program.Lang.Current.StartsWith("ja") && !y.Regions.Contains(0))) + if (!(Program.Lang.Current.StartsWith("ja") && !y.Regions.Contains(0)) || c == Platform.Flash || c == Platform.C64 || c == Platform.MSX) Entries.Add(y); } } diff --git a/FriishProduce/_classes/Program/CustomGraphics.cs b/FriishProduce/_classes/Program/CustomGraphics.cs index 98855aba..dfa763de 100644 --- a/FriishProduce/_classes/Program/CustomGraphics.cs +++ b/FriishProduce/_classes/Program/CustomGraphics.cs @@ -1,21 +1,90 @@ -using System.Drawing; +using System; +using System.ComponentModel; +using System.Drawing; using System.Drawing.Drawing2D; +using System.Runtime.InteropServices; using System.Windows.Forms; + namespace FriishProduce { + class PlaceholderTextBox : TextBox + { + private string placeholderText = string.Empty; + private const int EM_SETCUEBANNER = 0x1501; + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool MessageBeep(uint type); + public PlaceholderTextBox() : base() + { + + } + + [Localizable(true)] + [DefaultValue("")] + [Description("")] + public virtual string PlaceholderText + { + get + { + return placeholderText; + } + set + { + if (value is null) + { + value = string.Empty; + } + + if (placeholderText != value) + { + placeholderText = value; + if (IsHandleCreated) + { + Invalidate(); + SetPlaceholderText(); + } + } + } + } + + protected override void OnCreateControl() + { + base.OnCreateControl(); + SetPlaceholderText(); + } + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern Int32 SendMessage + (IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); + public void SetPlaceholderText() + { + SendMessage(Handle, EM_SETCUEBANNER, 0, placeholderText); + } + } + class CustomToolTip : ToolTip { + private const int GCL_STYLE = -26; + private const int CS_DROPSHADOW = 0x20000; + + [DllImport("user32.dll", EntryPoint = "GetClassLong")] + private static extern int GetClassLong(IntPtr hWnd, int nIndex); + [DllImport("user32.dll", EntryPoint = "SetClassLong")] + private static extern int SetClassLong(IntPtr hWnd, int nIndex, int dwNewLong); + public CustomToolTip() { OwnerDraw = true; + UseAnimation = false; + UseFading = true; Popup += new PopupEventHandler(OnPopup); Draw += new DrawToolTipEventHandler(OnDraw); } private void OnPopup(object sender, PopupEventArgs e) // use this event to set the size of the tool tip { - e.ToolTipSize = new Size(350, 100); + e.ToolTipSize = new Size(300, 100); } private void OnDraw(object sender, DrawToolTipEventArgs e) // use this event to customise the tool tip @@ -26,17 +95,16 @@ private void OnDraw(object sender, DrawToolTipEventArgs e) // use this event to const int spacing_X = 8; const int spacing_Y = 6; - Rectangle bounds = new(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height); - LinearGradientBrush b = new LinearGradientBrush(bounds, Color.WhiteSmoke, Color.Gainsboro, 0f); + string[] text = e.ToolTipText.Split('\n'); + bool isMultiline = text.Length > 1; - g.FillRectangle(b, bounds); + Rectangle bounds = new(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height); - g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(e.Bounds.X, e.Bounds.Y, - bounds.Width - 1, bounds.Height - 1)); + using LinearGradientBrush b = new LinearGradientBrush(bounds, Color.White, Color.FromArgb(239, 240, 246), 90f); + g.FillRectangle(b, bounds); - string[] text = e.ToolTipText.Split('\n'); - bool isMultiline = text.Length > 1; + e.DrawBorder(); int Y = e.Bounds.Y + spacing_X; g.DrawString(text[0], new Font(e.Font, isMultiline ? FontStyle.Bold : FontStyle.Regular), Brushes.Black, @@ -49,7 +117,7 @@ private void OnDraw(object sender, DrawToolTipEventArgs e) // use this event to Y += e.Font.Height + spacing_Y; g.DrawLine(new Pen(Brushes.Black, 1), new PointF(bounds.X + spacing_X, Y), - new PointF(bounds.Width - spacing_Y, Y)); + new PointF(bounds.Width - spacing_X, Y)); Y += spacing_Y; g.DrawString(description, new Font(e.Font, FontStyle.Regular), Brushes.Black, diff --git a/FriishProduce/_classes/Program/Language.cs b/FriishProduce/_classes/Program/Language.cs index c250b7a4..a492f599 100644 --- a/FriishProduce/_classes/Program/Language.cs +++ b/FriishProduce/_classes/Program/Language.cs @@ -171,6 +171,35 @@ public string GetSystemLanguage() return "en"; } + public enum ScriptType + { + Normal, + CJK, + RTL + } + + public ScriptType GetScript(string text) + { + return new System.Text.RegularExpressions.Regex( + @"\p{IsHangulJamo}|" + + @"\p{IsCJKRadicalsSupplement}|" + + @"\p{IsCJKSymbolsandPunctuation}|" + + @"\p{IsEnclosedCJKLettersandMonths}|" + + @"\p{IsCJKCompatibility}|" + + @"\p{IsCJKUnifiedIdeographsExtensionA}|" + + @"\p{IsCJKUnifiedIdeographs}|" + + @"\p{IsHangulSyllables}|" + + @"\p{IsHiragana}|" + + @"\p{IsKatakana}|" + + @"\p{IsCJKCompatibilityForms}").IsMatch(text) ? ScriptType.CJK + : new System.Text.RegularExpressions.Regex( + @"\p{IsArabic}|" + + @"\p{IsHebrew}|" + + @"\p{IsArabicPresentationForms-A}|" + + @"\p{IsArabicPresentationForms-B}|").IsMatch(text) ? ScriptType.RTL + : ScriptType.Normal; + } + /// /// Localizes a control or form using an auto-determined or manually-inputted tag name. /// @@ -215,35 +244,12 @@ public void Control(Control c, string tag = null) /// Determines if the message should be drawn from the errors category instead. public string Msg(int number, bool isError = false) => String((isError ? "e_" : null) + number.ToString("000"), "messages"); - /* public string ToolTip(int number) + public string HTML(int number, bool isTooltip, string title = null) { - int spaces = 0; - string text = ""; - string input = String(number.ToString("000"), "tooltips"); - - for (int i = 0; i < input.Length; i++) - { - if (input[i] == ' ') - { - try - { - if ((i + 1 < input.Length && input[i + 1] != '!' && input[i + 1] != '?') && (i - 2 >= 0 && input[i - 2] != ' ')) spaces++; - } - catch { spaces++; } - } - else if (input[i] == '\n') - spaces = 0; - - if (spaces > 10) - { - text += '\n'; - spaces = 0; - } - else text += input[i]; - } - - return text; - } */ + string text = !string.IsNullOrWhiteSpace(title) ? "" + title.TrimEnd(':', ':', '.', '。', '…').Trim() + "

" : ""; + string input = String((isTooltip ? "t_" : "l_") + number.ToString("000"), "html"); + return "
" + text + input + "
"; + } /// /// Returns a localized string which changes depending on a boolean condition. This is the name of the string suffixed with "0" if false, or "1" if true. @@ -303,6 +309,7 @@ public string String(string name, string sectionName = "") || sectionName.ToLower() == "filters" || sectionName.ToLower() == "platforms" || sectionName.ToLower() == "messages" + || sectionName.ToLower() == "html" || sectionName.ToLower() == "tooltips" ? target.global : target.strings; string result = null; diff --git a/FriishProduce/_classes/Program/MessageBox.cs b/FriishProduce/_classes/Program/MessageBox.cs index bf87066b..793fa3d0 100644 --- a/FriishProduce/_classes/Program/MessageBox.cs +++ b/FriishProduce/_classes/Program/MessageBox.cs @@ -143,6 +143,12 @@ public static Result Show(string mainText, string description, string[] buttons, if (dontShow >= 0) { t.VerificationText = Program.Lang.String("do_not_show"); } + if (!string.IsNullOrEmpty(t.MainInstruction) && Program.Lang.GetScript(t.MainInstruction) == Language.ScriptType.CJK) + { + using System.Drawing.Font f = new(System.Drawing.SystemFonts.MessageBoxFont.FontFamily, 6.5f, System.Drawing.FontStyle.Regular); + t.Width = Math.Max(t.Width, System.Windows.Forms.TextRenderer.MeasureText(t.MainInstruction, f).Width + 15); + } + var clicked = t.ShowDialog(); if (t.IsVerificationChecked && dontShow >= 0) diff --git a/FriishProduce/_classes/Program/Settings.cs b/FriishProduce/_classes/Program/Settings.cs index 2cc58842..624d69af 100644 --- a/FriishProduce/_classes/Program/Settings.cs +++ b/FriishProduce/_classes/Program/Settings.cs @@ -50,6 +50,44 @@ private void Reset(bool save) if (save) Save(); } + private Settings Parse(byte[] file = null) + { + if (file == null) file = File.ReadAllBytes(FriishProduce.Paths.Configuration); + + Settings reader = null; + var encoding = Encoding.UTF8; + + using (MemoryStream ms = new(file)) + using (StreamReader sr = new(ms, encoding)) + { + JsonDocument.Parse(sr.ReadToEnd(), new JsonDocumentOptions() { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }); + encoding = sr.CurrentEncoding; + } + + using (MemoryStream ms = new(file)) + using (StreamReader sr = new(ms, encoding)) + using (var fileReader = JsonDocument.Parse(sr.ReadToEnd(), new JsonDocumentOptions() { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip })) + { + reader = JsonSerializer.Deserialize(fileReader, new JsonSerializerOptions() { AllowTrailingCommas = true, ReadCommentHandling = JsonCommentHandling.Skip, IncludeFields = true }); + + sr.Dispose(); + ms.Dispose(); + } + + string lang = reader.application.language; + if (reader.paths == null) throw new InvalidDataException(); + if (reader.nes == null) throw new InvalidDataException(); + if (reader.snes == null) throw new InvalidDataException(); + if (reader.n64 == null) throw new InvalidDataException(); + if (reader.sega == null) throw new InvalidDataException(); + if (reader.pce == null) throw new InvalidDataException(); + if (reader.neo == null) throw new InvalidDataException(); + if (reader.forwarder == null) throw new InvalidDataException(); + if (reader.flash == null) throw new InvalidDataException(); + + return reader; + } + public Settings() { Reset(false); @@ -67,36 +105,7 @@ public Settings(string file) { try { - Settings reader = null; - var encoding = Encoding.UTF8; - - using (MemoryStream ms = new(File.ReadAllBytes(file))) - using (StreamReader sr = new(ms, encoding)) - { - JsonDocument.Parse(sr.ReadToEnd(), new JsonDocumentOptions() { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }); - encoding = sr.CurrentEncoding; - } - - using (MemoryStream ms = new(File.ReadAllBytes(file))) - using (StreamReader sr = new(ms, encoding)) - using (var fileReader = JsonDocument.Parse(sr.ReadToEnd(), new JsonDocumentOptions() { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip })) - { - reader = JsonSerializer.Deserialize(fileReader, new JsonSerializerOptions() { AllowTrailingCommas = true, ReadCommentHandling = JsonCommentHandling.Skip, IncludeFields = true }); - - sr.Dispose(); - ms.Dispose(); - } - - string lang = reader.application.language; - if (reader.paths == null) throw new InvalidDataException(); - if (reader.nes == null) throw new InvalidDataException(); - if (reader.snes == null) throw new InvalidDataException(); - if (reader.n64 == null) throw new InvalidDataException(); - if (reader.sega == null) throw new InvalidDataException(); - if (reader.pce == null) throw new InvalidDataException(); - if (reader.neo == null) throw new InvalidDataException(); - if (reader.forwarder == null) throw new InvalidDataException(); - if (reader.flash == null) throw new InvalidDataException(); + Settings reader = Parse(File.ReadAllBytes(file)); application = reader.application; paths = reader.paths; @@ -210,6 +219,7 @@ public class Forwarder public class Flash { + public string content_domain { get; set; } = ""; public string quality { get; set; } = "high"; public string mouse { get; set; } = "on"; public string qwerty_keyboard { get; set; } = "on"; diff --git a/FriishProduce/database.json b/FriishProduce/database.json index 8f5938bf..1dc89818 100644 --- a/FriishProduce/database.json +++ b/FriishProduce/database.json @@ -552,7 +552,7 @@ "emu_ver": [0], "titles": ["イーガー皇帝の逆襲 イー・アル・カンフー2", "Yie-Gah Koutei no Gyakushuu: Yie Ar Kung-Fu 2"], "wad_titles": ["Yie-Gah Koutei no Gyakushuu - Yie Ar Kung-Fu 2"] - }, + } ], "flash": [ @@ -561,6 +561,13 @@ "region": [1, 3], "emu_ver": [0, 0], "titles": ["Flash Placeholder"] + }, + + { + "id": "00010001-48434a__", + "region": [3], + "emu_ver": [0], + "titles": ["BBC iPlayer"] } ] } \ No newline at end of file diff --git a/FriishProduce/packages.config b/FriishProduce/packages.config index 1df95106..f790a09e 100644 --- a/FriishProduce/packages.config +++ b/FriishProduce/packages.config @@ -1,8 +1,9 @@  - - + + + diff --git a/docs/docs/img/favicon.ico b/docs/docs/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b941e973a2c51b05f91b20709483d7eca6cbb7a6 GIT binary patch literal 130913 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 MX&Y&M*RYTLKeES<