diff --git a/LibW4M/Data/Stats/StatsContainerData.cs b/LibW4M/Data/Stats/StatsContainerData.cs index 9a83ed6..3dd04c4 100644 --- a/LibW4M/Data/Stats/StatsContainerData.cs +++ b/LibW4M/Data/Stats/StatsContainerData.cs @@ -10,18 +10,48 @@ namespace LibW4M.Data.Stats { public class StatsContainerData : SaveDataEntry { - int[] Values; + public int[] Values; internal XomString? teamName; public StatsContainerData(W4SaveFile fileBelongs, XomContainer mainContainer) : base(fileBelongs, mainContainer) { } + public bool IsRenamable + { + get + { + return (teamName is not null); + } + } + + public void ChangeName(string newName) + { + if (!IsRenamable) return; + if (teamName.Value.Equals(newName)) return; + + for(int i = 0; i < this.fileBelongs.TeamStatsCollective.Length; i++) + { + StatsContainerData? stat = this.fileBelongs.TeamStatsCollective[i] as StatsContainerData; + if (stat is null) continue; + + if (stat.uuid.Equals(this.uuid)) + { + if (i > this.fileBelongs.TeamStatsCollective.TeamNames.Count) break; + XomString xStr = this.fileBelongs.LookupString(newName); + + // update in both places + this.fileBelongs.TeamStatsCollective.TeamNames[i] = xStr; + this.teamName = xStr; + } + } + } + public override string FriendlyName { get { - if (teamName.Value is not null) return teamName.Value; - return base.FriendlyName; + if (IsRenamable) return teamName.Value; + return String.Join(" - ", Values); } } diff --git a/Thumbs.db b/Thumbs.db index 4713912..3ae8a9e 100644 Binary files a/Thumbs.db and b/Thumbs.db differ diff --git a/W4Gui/Components/AwardPanel.Designer.cs b/W4Gui/Components/AwardPanel.Designer.cs index 88a4d0c..28e5743 100644 --- a/W4Gui/Components/AwardPanel.Designer.cs +++ b/W4Gui/Components/AwardPanel.Designer.cs @@ -28,27 +28,27 @@ /// private void InitializeComponent() { - this.variableTabControl = new System.Windows.Forms.TabControl(); + this.awardTabControl = new System.Windows.Forms.TabControl(); this.generalTab = new System.Windows.Forms.TabPage(); this.tblGeneral = new System.Windows.Forms.TableLayoutPanel(); this.lblAwardList = new System.Windows.Forms.Label(); this.selAwardList = new W4Gui.Components.IntList(); this.lblAwardListExplaination = new System.Windows.Forms.Label(); - this.variableTabControl.SuspendLayout(); + this.awardTabControl.SuspendLayout(); this.generalTab.SuspendLayout(); this.tblGeneral.SuspendLayout(); this.SuspendLayout(); // - // variableTabControl + // awardTabControl // - this.variableTabControl.Controls.Add(this.generalTab); - this.variableTabControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.variableTabControl.HotTrack = true; - this.variableTabControl.Location = new System.Drawing.Point(0, 0); - this.variableTabControl.Name = "variableTabControl"; - this.variableTabControl.SelectedIndex = 0; - this.variableTabControl.Size = new System.Drawing.Size(707, 419); - this.variableTabControl.TabIndex = 1; + this.awardTabControl.Controls.Add(this.generalTab); + this.awardTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.awardTabControl.HotTrack = true; + this.awardTabControl.Location = new System.Drawing.Point(0, 0); + this.awardTabControl.Name = "awardTabControl"; + this.awardTabControl.SelectedIndex = 0; + this.awardTabControl.Size = new System.Drawing.Size(707, 419); + this.awardTabControl.TabIndex = 1; // // generalTab // @@ -117,11 +117,11 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.LightGray; - this.Controls.Add(this.variableTabControl); + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.awardTabControl); this.Name = "AwardPanel"; this.Size = new System.Drawing.Size(707, 419); - this.variableTabControl.ResumeLayout(false); + this.awardTabControl.ResumeLayout(false); this.generalTab.ResumeLayout(false); this.generalTab.PerformLayout(); this.tblGeneral.ResumeLayout(false); @@ -132,7 +132,7 @@ #endregion - private TabControl variableTabControl; + private TabControl awardTabControl; private TabPage generalTab; private TableLayoutPanel tblGeneral; private Label lblAwardList; diff --git a/W4Gui/Components/StatisticsPanel.Designer.cs b/W4Gui/Components/StatisticsPanel.Designer.cs new file mode 100644 index 0000000..aecdbde --- /dev/null +++ b/W4Gui/Components/StatisticsPanel.Designer.cs @@ -0,0 +1,157 @@ +namespace W4Gui.Components +{ + partial class StatisticsPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statisticsTabControl = new System.Windows.Forms.TabControl(); + this.generalTab = new System.Windows.Forms.TabPage(); + this.tblGeneral = new System.Windows.Forms.TableLayoutPanel(); + this.lblStatsValues = new System.Windows.Forms.Label(); + this.lblTeamName = new System.Windows.Forms.Label(); + this.selTeamName = new System.Windows.Forms.TextBox(); + this.selStatValues = new W4Gui.Components.IntList(); + this.statisticsTabControl.SuspendLayout(); + this.generalTab.SuspendLayout(); + this.tblGeneral.SuspendLayout(); + this.SuspendLayout(); + // + // statisticsTabControl + // + this.statisticsTabControl.Controls.Add(this.generalTab); + this.statisticsTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.statisticsTabControl.HotTrack = true; + this.statisticsTabControl.Location = new System.Drawing.Point(0, 0); + this.statisticsTabControl.Name = "statisticsTabControl"; + this.statisticsTabControl.SelectedIndex = 0; + this.statisticsTabControl.Size = new System.Drawing.Size(707, 419); + this.statisticsTabControl.TabIndex = 1; + // + // generalTab + // + this.generalTab.BackColor = System.Drawing.Color.Transparent; + this.generalTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.generalTab.Controls.Add(this.tblGeneral); + this.generalTab.Location = new System.Drawing.Point(4, 24); + this.generalTab.Name = "generalTab"; + this.generalTab.Padding = new System.Windows.Forms.Padding(3); + this.generalTab.Size = new System.Drawing.Size(699, 391); + this.generalTab.TabIndex = 0; + this.generalTab.Text = "General"; + // + // tblGeneral + // + this.tblGeneral.AutoSize = true; + this.tblGeneral.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset; + this.tblGeneral.ColumnCount = 2; + this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tblGeneral.Controls.Add(this.lblStatsValues, 0, 1); + this.tblGeneral.Controls.Add(this.lblTeamName, 0, 0); + this.tblGeneral.Controls.Add(this.selTeamName, 1, 0); + this.tblGeneral.Controls.Add(this.selStatValues, 1, 1); + this.tblGeneral.Dock = System.Windows.Forms.DockStyle.Top; + this.tblGeneral.Location = new System.Drawing.Point(3, 3); + this.tblGeneral.Name = "tblGeneral"; + this.tblGeneral.RowCount = 2; + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tblGeneral.Size = new System.Drawing.Size(689, 130); + this.tblGeneral.TabIndex = 0; + // + // lblStatsValues + // + this.lblStatsValues.AutoSize = true; + this.lblStatsValues.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblStatsValues.Location = new System.Drawing.Point(5, 33); + this.lblStatsValues.Name = "lblStatsValues"; + this.lblStatsValues.Size = new System.Drawing.Size(93, 95); + this.lblStatsValues.TabIndex = 17; + this.lblStatsValues.Text = "Statistics Values:"; + this.lblStatsValues.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblTeamName + // + this.lblTeamName.AutoSize = true; + this.lblTeamName.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblTeamName.Location = new System.Drawing.Point(5, 2); + this.lblTeamName.Name = "lblTeamName"; + this.lblTeamName.Size = new System.Drawing.Size(93, 29); + this.lblTeamName.TabIndex = 0; + this.lblTeamName.Text = "Team Name:"; + this.lblTeamName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // selTeamName + // + this.selTeamName.Dock = System.Windows.Forms.DockStyle.Top; + this.selTeamName.Location = new System.Drawing.Point(106, 5); + this.selTeamName.Name = "selTeamName"; + this.selTeamName.PlaceholderText = "Team Name"; + this.selTeamName.ReadOnly = true; + this.selTeamName.Size = new System.Drawing.Size(578, 23); + this.selTeamName.TabIndex = 1; + // + // selStatValues + // + this.selStatValues.AutoSize = true; + this.selStatValues.Dock = System.Windows.Forms.DockStyle.Fill; + this.selStatValues.Label = "%n"; + this.selStatValues.Location = new System.Drawing.Point(106, 36); + this.selStatValues.Name = "selStatValues"; + this.selStatValues.Size = new System.Drawing.Size(578, 89); + this.selStatValues.TabIndex = 18; + // + // StatisticsPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.LightGray; + this.Controls.Add(this.statisticsTabControl); + this.Name = "StatisticsPanel"; + this.Size = new System.Drawing.Size(707, 419); + this.statisticsTabControl.ResumeLayout(false); + this.generalTab.ResumeLayout(false); + this.generalTab.PerformLayout(); + this.tblGeneral.ResumeLayout(false); + this.tblGeneral.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private TabControl statisticsTabControl; + private TabPage generalTab; + private TableLayoutPanel tblGeneral; + private Label lblTeamName; + private TextBox selTeamName; + private Label lblStatsValues; + private IntList selStatValues; + } +} diff --git a/W4Gui/Components/StatisticsPanel.cs b/W4Gui/Components/StatisticsPanel.cs new file mode 100644 index 0000000..4389bf8 --- /dev/null +++ b/W4Gui/Components/StatisticsPanel.cs @@ -0,0 +1,51 @@ +using LibW4M.Data.Highscores; +using LibW4M.Data.Stats; +using LibW4M.Data.Teams; +using LibW4M.Data.WeaponFactory; +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; +using W4Gui.Dialogs; + +namespace W4Gui.Components +{ + public partial class StatisticsPanel : UserControl + { + public StatisticsPanel() + { + InitializeComponent(); + } + + + public void SaveStatsData(ref StatsContainerData stats) + { + // Save general + stats.Values = selStatValues.Values; + if (stats.IsRenamable) stats.ChangeName(selTeamName.Text); + } + + public void LoadStatsData(StatsContainerData stats) + { + // Load general + selStatValues.LoadItems(stats.Values); + + if (stats.IsRenamable) + { + selTeamName.Text = stats.FriendlyName; + selTeamName.ReadOnly = false; + } + else + { + selTeamName.Text = "(GLOBAL)"; + selTeamName.ReadOnly = true; + } + } + + } +} diff --git a/W4Gui/Components/StatisticsPanel.resx b/W4Gui/Components/StatisticsPanel.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/W4Gui/Components/StatisticsPanel.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/W4Gui/Dialogs/AboutW4Gui.Designer.cs b/W4Gui/Dialogs/AboutW4Gui.Designer.cs new file mode 100644 index 0000000..a3f8830 --- /dev/null +++ b/W4Gui/Dialogs/AboutW4Gui.Designer.cs @@ -0,0 +1,190 @@ +namespace W4Gui.Dialogs +{ + partial class AboutW4Gui + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutW4Gui)); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + this.labelProductName = new System.Windows.Forms.Label(); + this.labelVersion = new System.Windows.Forms.Label(); + this.labelCopyright = new System.Windows.Forms.Label(); + this.labelCompanyName = new System.Windows.Forms.Label(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.tableLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); + this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); + this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); + this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); + this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); + this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(10, 10); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 6; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(487, 307); + this.tableLayoutPanel.TabIndex = 0; + // + // logoPictureBox + // + this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); + this.logoPictureBox.Location = new System.Drawing.Point(4, 3); + this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.logoPictureBox.Name = "logoPictureBox"; + this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); + this.logoPictureBox.Size = new System.Drawing.Size(152, 301); + this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // labelProductName + // + this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelProductName.Location = new System.Drawing.Point(167, 0); + this.labelProductName.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0); + this.labelProductName.MaximumSize = new System.Drawing.Size(0, 20); + this.labelProductName.Name = "labelProductName"; + this.labelProductName.Size = new System.Drawing.Size(316, 20); + this.labelProductName.TabIndex = 19; + this.labelProductName.Text = "Worms 4: Mayehm! Save Editor"; + this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelVersion + // + this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelVersion.Location = new System.Drawing.Point(167, 30); + this.labelVersion.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0); + this.labelVersion.MaximumSize = new System.Drawing.Size(0, 20); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Size = new System.Drawing.Size(316, 20); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "Version"; + this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCopyright + // + this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCopyright.Location = new System.Drawing.Point(167, 60); + this.labelCopyright.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0); + this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 20); + this.labelCopyright.Name = "labelCopyright"; + this.labelCopyright.Size = new System.Drawing.Size(316, 20); + this.labelCopyright.TabIndex = 21; + this.labelCopyright.Text = "Public Domain 2023"; + this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCompanyName + // + this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCompanyName.Location = new System.Drawing.Point(167, 90); + this.labelCompanyName.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0); + this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 20); + this.labelCompanyName.Name = "labelCompanyName"; + this.labelCompanyName.Size = new System.Drawing.Size(316, 20); + this.labelCompanyName.TabIndex = 22; + this.labelCompanyName.Text = "Created by Li (They/Them)"; + this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // textBoxDescription + // + this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxDescription.Location = new System.Drawing.Point(167, 123); + this.textBoxDescription.Margin = new System.Windows.Forms.Padding(7, 3, 4, 3); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ReadOnly = true; + this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxDescription.Size = new System.Drawing.Size(316, 147); + this.textBoxDescription.TabIndex = 23; + this.textBoxDescription.TabStop = false; + this.textBoxDescription.Text = resources.GetString("textBoxDescription.Text"); + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(395, 277); + this.okButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(88, 27); + this.okButton.TabIndex = 24; + this.okButton.Text = "&OK"; + // + // AboutW4Gui + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(507, 327); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutW4Gui"; + this.Padding = new System.Windows.Forms.Padding(10); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About Worms 4: Mayhem! Save Editor"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.PictureBox logoPictureBox; + private System.Windows.Forms.Label labelProductName; + private System.Windows.Forms.Label labelVersion; + private System.Windows.Forms.Label labelCopyright; + private System.Windows.Forms.Label labelCompanyName; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.Button okButton; + } +} diff --git a/W4Gui/Dialogs/AboutW4Gui.cs b/W4Gui/Dialogs/AboutW4Gui.cs new file mode 100644 index 0000000..12f1d4e --- /dev/null +++ b/W4Gui/Dialogs/AboutW4Gui.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace W4Gui.Dialogs +{ + partial class AboutW4Gui : Form + { + public AboutW4Gui() + { + InitializeComponent(); + this.Text = String.Format("About {0}", AssemblyTitle); + this.labelProductName.Text = AssemblyProduct; + this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion); + this.labelCopyright.Text = AssemblyCopyright; + //this.labelCompanyName.Text = AssemblyCompany; + //this.textBoxDescription.Text = AssemblyDescription; + } + + #region Assembly Attribute Accessors + + public string AssemblyTitle + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); + if (attributes.Length > 0) + { + AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; + if (titleAttribute.Title != "") + { + return titleAttribute.Title; + } + } + return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); + } + } + + public string AssemblyVersion + { + get + { + return Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + } + + public string AssemblyDescription + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyDescriptionAttribute)attributes[0]).Description; + } + } + + public string AssemblyProduct + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyProductAttribute)attributes[0]).Product; + } + } + + public string AssemblyCopyright + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; + } + } + + public string AssemblyCompany + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCompanyAttribute)attributes[0]).Company; + } + } + #endregion + } +} diff --git a/W4Gui/Dialogs/AboutW4Gui.resx b/W4Gui/Dialogs/AboutW4Gui.resx new file mode 100644 index 0000000..ddf1b6d --- /dev/null +++ b/W4Gui/Dialogs/AboutW4Gui.resx @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + + -- Credits -- + +- Program Development: +Li + +- Corrected Typos: +RandomHuman2020 + +- Beta Testing: +DiamondCreeper75 +hacker known as cbps [ Confirmed Xbox ] +Li [ Confirmed PS2 ] + +- Int compression help: +Rufis_ +shadowknight1620 + +- Reverse Engineering: +Li +- Worms 4 Mayhem: +Team17 +Codemasters +Majesco + + +- PS2 psu format: +gothi [https://www.ps2savetools.com/documents/ps2-save-game-format-for-ems-adapter-psu] + +- .NET Core: +Microsoft Corperation + +- Windows Forms: +Microsoft Corperation + +-- License -- + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <http://unlicense.org/> + + \ No newline at end of file diff --git a/W4Gui/Main.Designer.cs b/W4Gui/Main.Designer.cs index 294b8ed..a14d2c4 100644 --- a/W4Gui/Main.Designer.cs +++ b/W4Gui/Main.Designer.cs @@ -36,10 +36,9 @@ namespace W4Gui this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.convertToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.convertToPS2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.convertToXboxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extractAllXomContainersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutProgramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mainTabControl = new System.Windows.Forms.TabControl(); this.weaponTab = new System.Windows.Forms.TabPage(); this.weaponPage = new W4Gui.Tabs.WeaponsTab(); @@ -54,11 +53,11 @@ namespace W4Gui this.inputTab = new System.Windows.Forms.TabPage(); this.inputEventMappingsPanel = new W4Gui.Tabs.InputEventMappingTab(); this.statsTab = new System.Windows.Forms.TabPage(); + this.statsPanel = new W4Gui.Tabs.StatsTab.StatTypeSelectionTab(); this.awardsTab = new System.Windows.Forms.TabPage(); this.awardPanel = new W4Gui.Tabs.AwardTab(); this.variablesTab = new System.Windows.Forms.TabPage(); this.variablesPage = new W4Gui.Tabs.VariablesTab.VariablesTabs(); - this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mainMenuStrip.SuspendLayout(); this.mainTabControl.SuspendLayout(); this.weaponTab.SuspendLayout(); @@ -67,6 +66,7 @@ namespace W4Gui this.highscoreTab.SuspendLayout(); this.unlockItemsTab.SuspendLayout(); this.inputTab.SuspendLayout(); + this.statsTab.SuspendLayout(); this.awardsTab.SuspendLayout(); this.variablesTab.SuspendLayout(); this.SuspendLayout(); @@ -76,7 +76,7 @@ namespace W4Gui this.mainMenuStrip.BackColor = System.Drawing.SystemColors.Control; this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, - this.convertToolStripMenuItem}); + this.helpToolStripMenuItem}); this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); this.mainMenuStrip.Name = "mainMenuStrip"; this.mainMenuStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; @@ -109,36 +109,28 @@ namespace W4Gui this.saveToolStripMenuItem.Text = "Save"; this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); // - // convertToolStripMenuItem + // saveAsToolStripMenuItem // - this.convertToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.convertToPS2ToolStripMenuItem, - this.convertToXboxToolStripMenuItem, - this.extractAllXomContainersToolStripMenuItem}); - this.convertToolStripMenuItem.Enabled = false; - this.convertToolStripMenuItem.Name = "convertToolStripMenuItem"; - this.convertToolStripMenuItem.Size = new System.Drawing.Size(61, 20); - this.convertToolStripMenuItem.Text = "Convert"; + this.saveAsToolStripMenuItem.Enabled = false; + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.saveAsToolStripMenuItem.Text = "Save As"; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); // - // convertToPS2ToolStripMenuItem + // helpToolStripMenuItem // - this.convertToPS2ToolStripMenuItem.Name = "convertToPS2ToolStripMenuItem"; - this.convertToPS2ToolStripMenuItem.Size = new System.Drawing.Size(211, 22); - this.convertToPS2ToolStripMenuItem.Text = "Convert to PS2"; - this.convertToPS2ToolStripMenuItem.Click += new System.EventHandler(this.convertToPS2ToolStripMenuItem_Click); + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutProgramToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; // - // convertToXboxToolStripMenuItem + // aboutProgramToolStripMenuItem // - this.convertToXboxToolStripMenuItem.Name = "convertToXboxToolStripMenuItem"; - this.convertToXboxToolStripMenuItem.Size = new System.Drawing.Size(211, 22); - this.convertToXboxToolStripMenuItem.Text = "Convert to Xbox"; - // - // extractAllXomContainersToolStripMenuItem - // - this.extractAllXomContainersToolStripMenuItem.Name = "extractAllXomContainersToolStripMenuItem"; - this.extractAllXomContainersToolStripMenuItem.Size = new System.Drawing.Size(211, 22); - this.extractAllXomContainersToolStripMenuItem.Text = "Extract All XomContainers"; - this.extractAllXomContainersToolStripMenuItem.Click += new System.EventHandler(this.extractAllXomContainersToolStripMenuItem_Click); + this.aboutProgramToolStripMenuItem.Name = "aboutProgramToolStripMenuItem"; + this.aboutProgramToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.aboutProgramToolStripMenuItem.Text = "About"; + this.aboutProgramToolStripMenuItem.Click += new System.EventHandler(this.aboutProgramToolStripMenuItem_Click); // // mainTabControl // @@ -284,6 +276,7 @@ namespace W4Gui // statsTab // this.statsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.statsTab.Controls.Add(this.statsPanel); this.statsTab.Location = new System.Drawing.Point(4, 24); this.statsTab.Name = "statsTab"; this.statsTab.Padding = new System.Windows.Forms.Padding(3); @@ -292,6 +285,15 @@ namespace W4Gui this.statsTab.Text = "Statistics"; this.statsTab.UseVisualStyleBackColor = true; // + // statsPanel + // + this.statsPanel.BackColor = System.Drawing.SystemColors.Control; + this.statsPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.statsPanel.Location = new System.Drawing.Point(3, 3); + this.statsPanel.Name = "statsPanel"; + this.statsPanel.Size = new System.Drawing.Size(182, 62); + this.statsPanel.TabIndex = 0; + // // awardsTab // this.awardsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; @@ -333,14 +335,6 @@ namespace W4Gui this.variablesPage.Size = new System.Drawing.Size(182, 62); this.variablesPage.TabIndex = 0; // - // saveAsToolStripMenuItem - // - this.saveAsToolStripMenuItem.Enabled = false; - this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; - this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.saveAsToolStripMenuItem.Text = "Save As"; - this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); - // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -364,6 +358,7 @@ namespace W4Gui this.highscoreTab.ResumeLayout(false); this.unlockItemsTab.ResumeLayout(false); this.inputTab.ResumeLayout(false); + this.statsTab.ResumeLayout(false); this.awardsTab.ResumeLayout(false); this.variablesTab.ResumeLayout(false); this.ResumeLayout(false); @@ -380,10 +375,6 @@ namespace W4Gui private TabControl mainTabControl; private TabPage weaponTab; private WeaponsTab weaponPage; - private ToolStripMenuItem convertToolStripMenuItem; - private ToolStripMenuItem convertToPS2ToolStripMenuItem; - private ToolStripMenuItem convertToXboxToolStripMenuItem; - private ToolStripMenuItem extractAllXomContainersToolStripMenuItem; private TabPage teamTab; private TeamsTab teamsPage; private TabPage schemeTab; @@ -400,5 +391,8 @@ namespace W4Gui private AwardTab awardPanel; private InputEventMappingTab inputEventMappingsPanel; private ToolStripMenuItem saveAsToolStripMenuItem; + private Tabs.StatsTab.StatTypeSelectionTab statsPanel; + private ToolStripMenuItem helpToolStripMenuItem; + private ToolStripMenuItem aboutProgramToolStripMenuItem; } } \ No newline at end of file diff --git a/W4Gui/Main.cs b/W4Gui/Main.cs index 7cf3f06..f792691 100644 --- a/W4Gui/Main.cs +++ b/W4Gui/Main.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using W4Gui.Dialogs; using W4Gui.Tabs; namespace W4Gui @@ -34,77 +35,74 @@ namespace W4Gui private void openToolStripMenuItem_Click(object sender, EventArgs e) { - OpenFileDialog fd = new OpenFileDialog(); - fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|data"; - fd.Title = "Open Worms 4 Save File"; - if(fd.ShowDialog() == DialogResult.OK) + try { - DataManager.LoadedSavePath = fd.FileName; - DataManager.LoadedSaveType = (SaveType)(fd.FilterIndex - 1); - - switch (DataManager.LoadedSaveType) + OpenFileDialog fd = new OpenFileDialog(); + fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|data"; + fd.Title = "Open Worms 4 Save File"; + if (fd.ShowDialog() == DialogResult.OK) { - case SaveType.PC: - default: - DataManager.SaveFile = new W4SaveFile(XomReader.ReadXomFile(fd.FileName)); - break; - case SaveType.PS2: - DataManager.SaveFile = Ps2Save.ReadPS2Save(fd.FileName); - break; - case SaveType.XBOX: - DataManager.SaveFile = XboxSave.ReadXboxSave(fd.FileName); - break; + DataManager.LoadedSavePath = fd.FileName; + DataManager.LoadedSaveType = (SaveType)(fd.FilterIndex - 1); + switch (DataManager.LoadedSaveType) + { + case SaveType.PC: + default: + DataManager.SaveFile = new W4SaveFile(XomReader.ReadXomFile(fd.FileName)); + break; + case SaveType.PS2: + DataManager.SaveFile = Ps2Save.ReadPS2Save(fd.FileName); + break; + case SaveType.XBOX: + DataManager.SaveFile = XboxSave.ReadXboxSave(fd.FileName); + break; + + } + + + this.mainTabControl.Enabled = true; + this.saveToolStripMenuItem.Enabled = true; + this.saveAsToolStripMenuItem.Enabled = true; + + this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]"; + + DataManager.LoadAll(); } - - - this.mainTabControl.Enabled = true; - this.saveToolStripMenuItem.Enabled = true; - this.saveAsToolStripMenuItem.Enabled = true; - this.convertToolStripMenuItem.Enabled = true; - - this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]"; - - DataManager.LoadAll(); } + catch (Exception ex) + { + MessageBox.Show("Failed to load save: " + ex.Message + "\nIt may be invalid or corrupt.", "Load failed!", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - mainTabControl.Enabled = false; - DataManager.SaveAll(); - switch (DataManager.LoadedSaveType) + try { - case SaveType.PC: - DataManager.SaveFile.SavePC(DataManager.LoadedSavePath); - break; - case SaveType.PS2: - DataManager.SaveFile.SavePS2PSU(DataManager.LoadedSavePath); - break; - case SaveType.XBOX: - DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath); - break; + mainTabControl.Enabled = false; + DataManager.SaveAll(); + switch (DataManager.LoadedSaveType) + { + case SaveType.PC: + DataManager.SaveFile.SavePC(DataManager.LoadedSavePath); + break; + case SaveType.PS2: + DataManager.SaveFile.SavePS2PSU(DataManager.LoadedSavePath); + break; + case SaveType.XBOX: + DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath); + break; + } + mainTabControl.Enabled = true; + MessageBox.Show("File saved to: " + DataManager.LoadedSavePath, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - mainTabControl.Enabled = true; - MessageBox.Show("File saved to: " + DataManager.LoadedSavePath, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information); - - } - - private void extractAllXomContainersToolStripMenuItem_Click(object sender, EventArgs e) - { - FolderBrowserDialog fbd = new FolderBrowserDialog(); - fbd.Description = "Select folder to extract XomContainers too."; - if(fbd.ShowDialog() == DialogResult.OK) + catch (Exception ex) { - - this.mainTabControl.Enabled = false; - - DataManager.SaveFile.ExtractAllContainers(fbd.SelectedPath); - - this.mainTabControl.Enabled = true; + MessageBox.Show("Failed to save: " + ex.Message, "Save failed!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void mainTabControl_SelectedIndexChanged(object sender, EventArgs e) { if (lastTabIndex >= 0) @@ -140,55 +138,50 @@ namespace W4Gui lastTabIndex = this.mainTabControl.SelectedIndex; } - private void convertToPS2ToolStripMenuItem_Click(object sender, EventArgs e) + private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) { - SaveFileDialog fd = new SaveFileDialog(); - fd.Filter = "Worms 4: Mayhem PlayStation 2 Save File|*"; - fd.Title = "Save Worms 4 PlayStation 2 Save File"; - fd.FileName = "BESLES-53096W4MA"; - if (fd.ShowDialog() == DialogResult.OK) + try { - this.mainTabControl.Enabled = false; + SaveFileDialog fd = new SaveFileDialog(); + fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Single Save File|*.psu|Worms 4: Mayhem XBOX Save File|data"; + fd.Title = "Save Worms 4 Save File"; + fd.FileName = Path.GetFileName(DataManager.LoadedSavePath); + if (fd.ShowDialog() == DialogResult.OK) + { + this.mainTabControl.Enabled = false; - DataManager.SaveAll(); - DataManager.SaveFile.SavePS2(fd.FileName); + DataManager.SaveAll(); + SaveType saveType = (SaveType)(fd.FilterIndex - 1); - this.mainTabControl.Enabled = true; + switch (saveType) + { + case SaveType.PC: + DataManager.SaveFile.SavePC(fd.FileName); + break; + case SaveType.PS2: + DataManager.SaveFile.SavePS2PSU(fd.FileName); + break; + case SaveType.XBOX: + DataManager.SaveFile.SaveXBOX(fd.FileName); + break; + } + + DataManager.LoadedSavePath = fd.FileName; + DataManager.LoadedSaveType = saveType; + + MessageBox.Show("File saved to: " + fd.FileName, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information); + this.mainTabControl.Enabled = true; + } + } + catch (Exception ex) + { + MessageBox.Show("Failed to save: " + ex.Message, "Save failed!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) + private void aboutProgramToolStripMenuItem_Click(object sender, EventArgs e) { - SaveFileDialog fd = new SaveFileDialog(); - fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Single Save File|*.psu|Worms 4: Mayhem XBOX Save File|data"; - fd.Title = "Save Worms 4 Save File"; - fd.FileName = Path.GetFileName(DataManager.LoadedSavePath); - if (fd.ShowDialog() == DialogResult.OK) - { - this.mainTabControl.Enabled = false; - - DataManager.SaveAll(); - SaveType saveType = (SaveType)(fd.FilterIndex-1); - - switch (saveType) - { - case SaveType.PC: - DataManager.SaveFile.SavePC(fd.FileName); - break; - case SaveType.PS2: - DataManager.SaveFile.SavePS2PSU(fd.FileName); - break; - case SaveType.XBOX: - DataManager.SaveFile.SaveXBOX(fd.FileName); - break; - } - - DataManager.LoadedSavePath = fd.FileName; - DataManager.LoadedSaveType = saveType; - - MessageBox.Show("File saved to: " + fd.FileName, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information); - this.mainTabControl.Enabled = true; - } + new AboutW4Gui().ShowDialog(); } } } diff --git a/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user b/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user index 731bca3..b26c3df 100644 --- a/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - True|2023-03-03T16:17:31.1862857Z;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00; + True|2023-03-04T00:33:03.9184567Z;True|2023-03-04T05:17:31.1862857+13:00;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00; \ No newline at end of file diff --git a/W4Gui/Tabs/AwardTab.Designer.cs b/W4Gui/Tabs/AwardTab.Designer.cs index 3ad91b9..e434927 100644 --- a/W4Gui/Tabs/AwardTab.Designer.cs +++ b/W4Gui/Tabs/AwardTab.Designer.cs @@ -33,7 +33,6 @@ // // awardPanel // - this.awardPanel.BackColor = System.Drawing.Color.LightGray; this.awardPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.awardPanel.Location = new System.Drawing.Point(0, 0); this.awardPanel.Name = "awardPanel"; diff --git a/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.Designer.cs b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.Designer.cs new file mode 100644 index 0000000..c5b63fe --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.Designer.cs @@ -0,0 +1,116 @@ +namespace W4Gui.Tabs.StatsTab +{ + partial class StatTypeSelectionTab + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statTypeTabControl = new System.Windows.Forms.TabControl(); + this.teamStatsTab = new System.Windows.Forms.TabPage(); + this.globalStatsTab = new System.Windows.Forms.TabPage(); + this.teamStatsPanel = new W4Gui.Tabs.StatsTab.TeamStatisticsTab(); + this.statsPanel = new W4Gui.Tabs.StatsTab.StatisticsTab(); + this.statTypeTabControl.SuspendLayout(); + this.teamStatsTab.SuspendLayout(); + this.globalStatsTab.SuspendLayout(); + this.SuspendLayout(); + // + // statTypeTabControl + // + this.statTypeTabControl.Controls.Add(this.teamStatsTab); + this.statTypeTabControl.Controls.Add(this.globalStatsTab); + this.statTypeTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.statTypeTabControl.HotTrack = true; + this.statTypeTabControl.Location = new System.Drawing.Point(0, 0); + this.statTypeTabControl.Name = "statTypeTabControl"; + this.statTypeTabControl.SelectedIndex = 0; + this.statTypeTabControl.Size = new System.Drawing.Size(885, 502); + this.statTypeTabControl.TabIndex = 0; + // + // teamStatsTab + // + this.teamStatsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.teamStatsTab.Controls.Add(this.teamStatsPanel); + this.teamStatsTab.Location = new System.Drawing.Point(4, 24); + this.teamStatsTab.Name = "teamStatsTab"; + this.teamStatsTab.Padding = new System.Windows.Forms.Padding(3); + this.teamStatsTab.Size = new System.Drawing.Size(877, 474); + this.teamStatsTab.TabIndex = 1; + this.teamStatsTab.Text = "Team Stats"; + this.teamStatsTab.UseVisualStyleBackColor = true; + // + // globalStatsTab + // + this.globalStatsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.globalStatsTab.Controls.Add(this.statsPanel); + this.globalStatsTab.Location = new System.Drawing.Point(4, 24); + this.globalStatsTab.Name = "globalStatsTab"; + this.globalStatsTab.Padding = new System.Windows.Forms.Padding(3); + this.globalStatsTab.Size = new System.Drawing.Size(877, 474); + this.globalStatsTab.TabIndex = 2; + this.globalStatsTab.Text = "Global Stats"; + this.globalStatsTab.UseVisualStyleBackColor = true; + // + // teamStatsPanel + // + this.teamStatsPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.teamStatsPanel.Location = new System.Drawing.Point(3, 3); + this.teamStatsPanel.Name = "teamStatsPanel"; + this.teamStatsPanel.Size = new System.Drawing.Size(867, 464); + this.teamStatsPanel.TabIndex = 0; + // + // statsPanel + // + this.statsPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.statsPanel.Location = new System.Drawing.Point(3, 3); + this.statsPanel.Name = "statsPanel"; + this.statsPanel.Size = new System.Drawing.Size(867, 464); + this.statsPanel.TabIndex = 0; + // + // StatsTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.statTypeTabControl); + this.Name = "StatsTab"; + this.Size = new System.Drawing.Size(885, 502); + this.statTypeTabControl.ResumeLayout(false); + this.teamStatsTab.ResumeLayout(false); + this.globalStatsTab.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private TabControl statTypeTabControl; + private TabPage teamStatsTab; + private TabPage globalStatsTab; + private TeamStatisticsTab teamStatsPanel; + private StatisticsTab statsPanel; + } +} diff --git a/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.cs b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.cs new file mode 100644 index 0000000..e310806 --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.cs @@ -0,0 +1,20 @@ +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 W4Gui.Tabs.StatsTab +{ + public partial class StatTypeSelectionTab : UserControl + { + public StatTypeSelectionTab() + { + InitializeComponent(); + } + } +} diff --git a/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.resx b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatTypeSelectionTab.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/W4Gui/Tabs/StatsTab/StatisticsTab.Designer.cs b/W4Gui/Tabs/StatsTab/StatisticsTab.Designer.cs new file mode 100644 index 0000000..3c0f99b --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatisticsTab.Designer.cs @@ -0,0 +1,98 @@ +namespace W4Gui.Tabs.StatsTab +{ + partial class StatisticsTab + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statisticsSplitContainer = new System.Windows.Forms.SplitContainer(); + this.statisticsList = new W4Gui.Components.CollectiveListAddDelete(); + this.statisticsPanel = new W4Gui.Components.StatisticsPanel(); + ((System.ComponentModel.ISupportInitialize)(this.statisticsSplitContainer)).BeginInit(); + this.statisticsSplitContainer.Panel1.SuspendLayout(); + this.statisticsSplitContainer.Panel2.SuspendLayout(); + this.statisticsSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // statisticsSplitContainer + // + this.statisticsSplitContainer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.statisticsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.statisticsSplitContainer.Location = new System.Drawing.Point(3, 3); + this.statisticsSplitContainer.Name = "statisticsSplitContainer"; + // + // statisticsSplitContainer.Panel1 + // + this.statisticsSplitContainer.Panel1.Controls.Add(this.statisticsList); + // + // statisticsSplitContainer.Panel2 + // + this.statisticsSplitContainer.Panel2.Controls.Add(this.statisticsPanel); + this.statisticsSplitContainer.Size = new System.Drawing.Size(797, 464); + this.statisticsSplitContainer.SplitterDistance = 265; + this.statisticsSplitContainer.TabIndex = 0; + // + // statisticsList + // + this.statisticsList.Dock = System.Windows.Forms.DockStyle.Fill; + this.statisticsList.Location = new System.Drawing.Point(0, 0); + this.statisticsList.Name = "statisticsList"; + this.statisticsList.Size = new System.Drawing.Size(261, 460); + this.statisticsList.TabIndex = 0; + this.statisticsList.NewButton += new System.EventHandler(this.statisticsList_NewButton); + this.statisticsList.DeleteButton += new System.EventHandler(this.statisticsList_DelButton); + // + // statisticsPanel + // + this.statisticsPanel.BackColor = System.Drawing.Color.LightGray; + this.statisticsPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.statisticsPanel.Location = new System.Drawing.Point(0, 0); + this.statisticsPanel.Name = "statisticsPanel"; + this.statisticsPanel.Size = new System.Drawing.Size(524, 460); + this.statisticsPanel.TabIndex = 0; + // + // StatisticsTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.statisticsSplitContainer); + this.Name = "StatisticsTab"; + this.Size = new System.Drawing.Size(797, 464); + this.statisticsSplitContainer.Panel1.ResumeLayout(false); + this.statisticsSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.statisticsSplitContainer)).EndInit(); + this.statisticsSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private SplitContainer statisticsSplitContainer; + private Components.CollectiveListAddDelete statisticsList; + private Components.StatisticsPanel statisticsPanel; + } +} diff --git a/W4Gui/Tabs/StatsTab/StatisticsTab.cs b/W4Gui/Tabs/StatsTab/StatisticsTab.cs new file mode 100644 index 0000000..d2a0660 --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatisticsTab.cs @@ -0,0 +1,62 @@ +using LibW4M.Data.Stats; +using LibW4M.Data.Teams; +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 W4Gui.Tabs.StatsTab +{ + public partial class StatisticsTab : TabEntry + { + public StatisticsTab() + { + InitializeComponent(); + this.statisticsList.List.Selected += statisticsList_Selected; + this.statisticsList.List.Unselected += statisticsList_Unselected; + + } + + public override void SaveFromControl() + { + if (this.statisticsList.List.IsItemSelected) + statisticsList_Unselected(null, null); + } + + public override void LoadIntoControl() + { + this.statisticsList.List.LoadCollective(DataManager.SaveFile.StatsCollective); + statisticsPanel.Enabled = false; + } + + private void statisticsList_Unselected(object? sender, EventArgs e) + { + StatsContainerData statsData = DataManager.SaveFile.StatsCollective[statisticsList.List.LastSelected] as StatsContainerData; + statisticsPanel.SaveStatsData(ref statsData); + statisticsList.List.UpdateName(statisticsList.List.LastSelected, statsData.FriendlyName); + } + + private void statisticsList_Selected(object? sender, EventArgs e) + { + StatsContainerData statsData = DataManager.SaveFile.StatsCollective[statisticsList.List.CurrentlySelected] as StatsContainerData; + statisticsPanel.LoadStatsData(statsData); + statisticsPanel.Enabled = true; + } + + private void statisticsList_NewButton(object sender, EventArgs e) + { + throw new NotImplementedException("Adding new statistics from here not implemented yet ;)"); + } + + private void statisticsList_DelButton(object sender, EventArgs e) + { + throw new NotImplementedException("Removing statistics from here not implemented yet ;)"); + } + + } +} diff --git a/W4Gui/Tabs/StatsTab/StatisticsTab.resx b/W4Gui/Tabs/StatsTab/StatisticsTab.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/W4Gui/Tabs/StatsTab/StatisticsTab.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/W4Gui/Tabs/StatsTab/TeamStatisticsTab.Designer.cs b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.Designer.cs new file mode 100644 index 0000000..8435ee6 --- /dev/null +++ b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.Designer.cs @@ -0,0 +1,98 @@ +namespace W4Gui.Tabs.StatsTab +{ + partial class TeamStatisticsTab + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.teamStatisticsSplitContainer = new System.Windows.Forms.SplitContainer(); + this.teamStatisticsList = new W4Gui.Components.CollectiveListAddDelete(); + this.teamStatisticsPanel = new W4Gui.Components.StatisticsPanel(); + ((System.ComponentModel.ISupportInitialize)(this.teamStatisticsSplitContainer)).BeginInit(); + this.teamStatisticsSplitContainer.Panel1.SuspendLayout(); + this.teamStatisticsSplitContainer.Panel2.SuspendLayout(); + this.teamStatisticsSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // teamStatisticsSplitContainer + // + this.teamStatisticsSplitContainer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.teamStatisticsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.teamStatisticsSplitContainer.Location = new System.Drawing.Point(3, 3); + this.teamStatisticsSplitContainer.Name = "teamStatisticsSplitContainer"; + // + // teamStatisticsSplitContainer.Panel1 + // + this.teamStatisticsSplitContainer.Panel1.Controls.Add(this.teamStatisticsList); + // + // teamStatisticsSplitContainer.Panel2 + // + this.teamStatisticsSplitContainer.Panel2.Controls.Add(this.teamStatisticsPanel); + this.teamStatisticsSplitContainer.Size = new System.Drawing.Size(797, 464); + this.teamStatisticsSplitContainer.SplitterDistance = 265; + this.teamStatisticsSplitContainer.TabIndex = 0; + // + // teamStatisticsList + // + this.teamStatisticsList.Dock = System.Windows.Forms.DockStyle.Fill; + this.teamStatisticsList.Location = new System.Drawing.Point(0, 0); + this.teamStatisticsList.Name = "teamStatisticsList"; + this.teamStatisticsList.Size = new System.Drawing.Size(261, 460); + this.teamStatisticsList.TabIndex = 0; + this.teamStatisticsList.NewButton += new System.EventHandler(this.teamStatisticsList_NewButton); + this.teamStatisticsList.DeleteButton += new System.EventHandler(this.teamStatisticsList_DelButton); + // + // teamStatisticsPanel + // + this.teamStatisticsPanel.BackColor = System.Drawing.Color.LightGray; + this.teamStatisticsPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.teamStatisticsPanel.Location = new System.Drawing.Point(0, 0); + this.teamStatisticsPanel.Name = "teamStatisticsPanel"; + this.teamStatisticsPanel.Size = new System.Drawing.Size(524, 460); + this.teamStatisticsPanel.TabIndex = 0; + // + // StatisticsTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.teamStatisticsSplitContainer); + this.Name = "TeamStatisticsTab"; + this.Size = new System.Drawing.Size(797, 464); + this.teamStatisticsSplitContainer.Panel1.ResumeLayout(false); + this.teamStatisticsSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.teamStatisticsSplitContainer)).EndInit(); + this.teamStatisticsSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private SplitContainer teamStatisticsSplitContainer; + private Components.CollectiveListAddDelete teamStatisticsList; + private Components.StatisticsPanel teamStatisticsPanel; + } +} diff --git a/W4Gui/Tabs/StatsTab/TeamStatisticsTab.cs b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.cs new file mode 100644 index 0000000..7eb70b4 --- /dev/null +++ b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.cs @@ -0,0 +1,62 @@ +using LibW4M.Data.Stats; +using LibW4M.Data.Teams; +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 W4Gui.Tabs.StatsTab +{ + public partial class TeamStatisticsTab : TabEntry + { + public TeamStatisticsTab() + { + InitializeComponent(); + this.teamStatisticsList.List.Selected += teamStatistics_Selected; + this.teamStatisticsList.List.Unselected += teamStatistics_Unselected; + + } + + public override void SaveFromControl() + { + if (this.teamStatisticsList.List.IsItemSelected) + teamStatistics_Unselected(null, null); + } + + public override void LoadIntoControl() + { + this.teamStatisticsList.List.LoadCollective(DataManager.SaveFile.TeamStatsCollective); + teamStatisticsPanel.Enabled = false; + } + + private void teamStatistics_Unselected(object? sender, EventArgs e) + { + StatsContainerData statsData = DataManager.SaveFile.TeamStatsCollective[teamStatisticsList.List.LastSelected] as StatsContainerData; + teamStatisticsPanel.SaveStatsData(ref statsData); + teamStatisticsList.List.UpdateName(teamStatisticsList.List.LastSelected, statsData.FriendlyName); + } + + private void teamStatistics_Selected(object? sender, EventArgs e) + { + StatsContainerData statsData = DataManager.SaveFile.TeamStatsCollective[teamStatisticsList.List.CurrentlySelected] as StatsContainerData; + teamStatisticsPanel.LoadStatsData(statsData); + teamStatisticsPanel.Enabled = true; + } + + private void teamStatisticsList_NewButton(object sender, EventArgs e) + { + throw new NotImplementedException("Adding new team statistics from here not implemented yet ;)"); + } + + private void teamStatisticsList_DelButton(object sender, EventArgs e) + { + throw new NotImplementedException("Removing team statistics from here not implemented yet ;)"); + } + + } +} diff --git a/W4Gui/Tabs/StatsTab/TeamStatisticsTab.resx b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/W4Gui/Tabs/StatsTab/TeamStatisticsTab.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/W4Gui/W4Gui.csproj b/W4Gui/W4Gui.csproj index eb8804b..af0448d 100644 --- a/W4Gui/W4Gui.csproj +++ b/W4Gui/W4Gui.csproj @@ -4,16 +4,29 @@ WinExe net7.0-windows enable - true + True enable + Worms 4 Mayhem! Save Editor EditorIcon.ico + Li + Non-Binary Inc + Savegame Editor & Converter for "Worms 4: Mayhem!" + Public Domain 2023 + $(AssemblyName) - + + + none + + + + UserControl + UserControl @@ -50,9 +63,9 @@ Resources.resx - - UserControl - + + + UserControl @@ -61,15 +74,12 @@ UserControl - - UserControl - - - UserControl - - + UserControl + + + @@ -80,10 +90,6 @@ - - - - diff --git a/W4Gui/W4Gui.csproj.user b/W4Gui/W4Gui.csproj.user index b99fa13..a2b4967 100644 --- a/W4Gui/W4Gui.csproj.user +++ b/W4Gui/W4Gui.csproj.user @@ -4,48 +4,51 @@ <_LastSelectedProfileId>C:\Users\Li\Documents\git\Worms4Editor\W4Gui\Properties\PublishProfiles\FolderProfile.pubxml - - Component - UserControl + + Component + Component + + Component + Component UserControl + + Component + + + Component + UserControl UserControl - - Component - UserControl - - Component - UserControl - - Component - UserControl UserControl + + Form + Form @@ -64,27 +67,45 @@ UserControl - + UserControl UserControl + + UserControl + + + UserControl + + + UserControl + UserControl UserControl + + UserControl + UserControl + + UserControl + UserControl UserControl + + UserControl + UserControl