diff --git a/AppSettings.cs b/AppSettings.cs new file mode 100644 index 0000000..cd223f5 --- /dev/null +++ b/AppSettings.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Configuration; +using System.Drawing; + +namespace SCJMapper_V2 +{ + sealed class AppSettings : ApplicationSettingsBase + { + // Control bound settings + [UserScopedSettingAttribute( )] + [DefaultSettingValueAttribute( "1000, 900" )] + public Size FormSize + { + get { return ( Size )this["FormSize"]; } + set { this["FormSize"] = value; } + } + + [UserScopedSettingAttribute( )] + [DefaultSettingValueAttribute( "10, 10" )] + public Point FormLocation + { + get { return ( Point )this["FormLocation"]; } + set { this["FormLocation"] = value; } + } + + // User Config Settings + [UserScopedSettingAttribute( )] + [DefaultSettingValueAttribute( "defaultProfile" )] // from Game Bundle + public String DefProfileName + { + get { return ( String )this["DefProfileName"]; } + set { this["DefProfileName"] = value; } + } + + [UserScopedSettingAttribute( )] + [DefaultSettingValueAttribute( "Reset empty" )] // defaults to one of the ResetMode Settings below + public String ResetMode + { + get { return ( String )this["ResetMode"]; } + set { this["ResetMode"] = value; } + } + + // Application Settings + [ApplicationScopedSetting( )] + [DefaultSettingValueAttribute( "Reset empty" )] + public String ResetModeEmpty + { + get { return ( String )this["ResetModeEmpty"]; } + set { ; } // cannot be changed + } + + [ApplicationScopedSetting( )] + [DefaultSettingValueAttribute( "Reset defaults" )] + public String ResetModeDefault + { + get { return ( String )this["ResetModeDefault"]; } + set { ; } // cannot be changed + } + + + + + } +} diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 61acd90..bccd7f4 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -34,7 +34,6 @@ this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.btDumpList = new System.Windows.Forms.Button(); - this.btReset = new System.Windows.Forms.Button(); this.label3 = new System.Windows.Forms.Label(); this.rtb = new System.Windows.Forms.RichTextBox(); this.cmCopyPaste = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -79,7 +78,10 @@ this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); - this.btResetDefaults = new System.Windows.Forms.Button(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.tsDDbtProfiles = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsDDbtResetMode = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsBtReset = new System.Windows.Forms.ToolStripSplitButton(); this.UC_JoyPanel = new SCJMapper_V2.UC_JoyPanel(); this.cmCopyPaste.SuspendLayout(); this.panel3.SuspendLayout(); @@ -91,6 +93,7 @@ this.flowLayoutPanel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); + this.statusStrip1.SuspendLayout(); this.SuspendLayout(); // // btDumpList @@ -103,19 +106,10 @@ this.btDumpList.UseVisualStyleBackColor = true; this.btDumpList.Click += new System.EventHandler(this.btDumpList_Click); // - // btReset - // - this.btReset.Location = new System.Drawing.Point(3, 72); - this.btReset.Name = "btReset"; - this.btReset.Size = new System.Drawing.Size(120, 24); - this.btReset.TabIndex = 23; - this.btReset.Text = "Reset"; - this.btReset.Click += new System.EventHandler(this.btReset_Click); - // // label3 // this.label3.Dock = System.Windows.Forms.DockStyle.Fill; - this.label3.Location = new System.Drawing.Point(606, 828); + this.label3.Location = new System.Drawing.Point(606, 834); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(372, 25); this.label3.TabIndex = 22; @@ -133,7 +127,7 @@ this.rtb.Location = new System.Drawing.Point(606, 81); this.rtb.Name = "rtb"; this.tlpanel.SetRowSpan(this.rtb, 3); - this.rtb.Size = new System.Drawing.Size(372, 744); + this.rtb.Size = new System.Drawing.Size(372, 750); this.rtb.TabIndex = 21; this.rtb.Text = ""; this.rtb.WordWrap = false; @@ -408,7 +402,7 @@ this.treeView1.Name = "treeView1"; this.tlpanel.SetRowSpan(this.treeView1, 3); this.treeView1.SelectedImageKey = "Selected"; - this.treeView1.Size = new System.Drawing.Size(294, 744); + this.treeView1.Size = new System.Drawing.Size(294, 750); this.treeView1.TabIndex = 16; this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); // @@ -492,7 +486,7 @@ // buttonExit // this.buttonExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonExit.Location = new System.Drawing.Point(171, 72); + this.buttonExit.Location = new System.Drawing.Point(171, 75); this.buttonExit.Name = "buttonExit"; this.buttonExit.Size = new System.Drawing.Size(120, 24); this.buttonExit.TabIndex = 13; @@ -541,7 +535,7 @@ this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); - this.tlpanel.Size = new System.Drawing.Size(984, 856); + this.tlpanel.Size = new System.Drawing.Size(984, 862); this.tlpanel.TabIndex = 25; // // flowLayoutPanel1 @@ -580,28 +574,61 @@ this.tableLayoutPanel2.ColumnCount = 2; this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel2.Controls.Add(this.btReset, 0, 2); this.tableLayoutPanel2.Controls.Add(this.buttonExit, 1, 2); - this.tableLayoutPanel2.Controls.Add(this.btResetDefaults, 0, 1); this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel2.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize; - this.tableLayoutPanel2.Location = new System.Drawing.Point(306, 726); + this.tableLayoutPanel2.Location = new System.Drawing.Point(306, 729); this.tableLayoutPanel2.Name = "tableLayoutPanel2"; this.tableLayoutPanel2.RowCount = 3; this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel2.Size = new System.Drawing.Size(294, 99); + this.tableLayoutPanel2.Size = new System.Drawing.Size(294, 102); this.tableLayoutPanel2.TabIndex = 24; // - // btResetDefaults - // - this.btResetDefaults.Location = new System.Drawing.Point(3, 42); - this.btResetDefaults.Name = "btResetDefaults"; - this.btResetDefaults.Size = new System.Drawing.Size(120, 24); - this.btResetDefaults.TabIndex = 24; - this.btResetDefaults.Text = "Reset to defaults"; - this.btResetDefaults.Click += new System.EventHandler(this.btResetDefaults_Click); + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsDDbtProfiles, + this.tsDDbtResetMode, + this.tsBtReset}); + this.statusStrip1.Location = new System.Drawing.Point(0, 840); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(984, 22); + this.statusStrip1.TabIndex = 26; + this.statusStrip1.Text = "statusStrip1"; + // + // tsDDbtProfiles + // + this.tsDDbtProfiles.AutoSize = false; + this.tsDDbtProfiles.Image = ((System.Drawing.Image)(resources.GetObject("tsDDbtProfiles.Image"))); + this.tsDDbtProfiles.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsDDbtProfiles.Name = "tsDDbtProfiles"; + this.tsDDbtProfiles.Size = new System.Drawing.Size(250, 20); + this.tsDDbtProfiles.Text = "Available Profiles"; + this.tsDDbtProfiles.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.tsDDbtProfiles_DropDownItemClicked); + // + // tsDDbtResetMode + // + this.tsDDbtResetMode.AutoSize = false; + this.tsDDbtResetMode.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.tsDDbtResetMode.Image = ((System.Drawing.Image)(resources.GetObject("tsDDbtResetMode.Image"))); + this.tsDDbtResetMode.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsDDbtResetMode.Name = "tsDDbtResetMode"; + this.tsDDbtResetMode.Size = new System.Drawing.Size(150, 20); + this.tsDDbtResetMode.Text = "Reset Mode"; + this.tsDDbtResetMode.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.tsDDbtResetMode_DropDownItemClicked); + // + // tsBtReset + // + this.tsBtReset.AutoSize = false; + this.tsBtReset.Image = ((System.Drawing.Image)(resources.GetObject("tsBtReset.Image"))); + this.tsBtReset.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsBtReset.Name = "tsBtReset"; + this.tsBtReset.Size = new System.Drawing.Size(100, 20); + this.tsBtReset.Text = "Reset"; + this.tsBtReset.ToolTipText = "Reset with chosen options"; + this.tsBtReset.ButtonClick += new System.EventHandler(this.tsBtReset_ButtonClick); // // UC_JoyPanel // @@ -614,12 +641,14 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(984, 856); + this.ClientSize = new System.Drawing.Size(984, 862); + this.Controls.Add(this.statusStrip1); this.Controls.Add(this.tlpanel); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(1000, 894); + this.MinimumSize = new System.Drawing.Size(1000, 900); this.Name = "MainForm"; this.Text = "SC Joystick Mapper"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); this.cmCopyPaste.ResumeLayout(false); this.panel3.ResumeLayout(false); @@ -633,14 +662,16 @@ this.flowLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel2.ResumeLayout(false); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.Button btDumpList; - private System.Windows.Forms.Button btReset; private System.Windows.Forms.Label label3; private System.Windows.Forms.RichTextBox rtb; private System.Windows.Forms.Button btGrab; @@ -686,7 +717,10 @@ private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; - private System.Windows.Forms.Button btResetDefaults; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripDropDownButton tsDDbtProfiles; + private System.Windows.Forms.ToolStripDropDownButton tsDDbtResetMode; + private System.Windows.Forms.ToolStripSplitButton tsBtReset; } } diff --git a/Form1.cs b/Form1.cs index 8571c5e..5afd9ec 100644 --- a/Form1.cs +++ b/Form1.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Text; using System.Windows.Forms; -//using SharpDX; using SharpDX.DirectInput; using System.IO; @@ -16,6 +15,7 @@ namespace SCJMapper_V2 { public partial class MainForm : Form { + AppSettings m_AppSettings = new AppSettings( ); /// /// Holds the DXInput Joystick List @@ -44,13 +44,6 @@ namespace SCJMapper_V2 InitializeComponent( ); - // some applic initialization - rtb.SelectionTabs = new int[] { 10, 20, 30, 40, 50, 60 }; // short tabs - rtb.DragEnter +=new DragEventHandler(rtb_DragEnter); - rtb.DragDrop +=new DragEventHandler(rtb_DragDrop); - rtb.AllowDrop = true; // add Drop to rtb - String version = Application.ProductVersion; // get the version information - lblTitle.Text += " - V " + version.Substring( 0, version.IndexOf( ".", version.IndexOf( "." ) + 1 ) ); // get the first two elements } @@ -61,9 +54,36 @@ namespace SCJMapper_V2 /// private void MainForm_Load( object sender, System.EventArgs e ) { + // some applic initialization + // Assign Size property, since databinding to Size doesn't work well. + + this.Size = m_AppSettings.FormSize; + this.Location = m_AppSettings.FormLocation; + + // XML RTB + rtb.SelectionTabs = new int[] { 10, 20, 30, 40, 50, 60 }; // short tabs + rtb.DragEnter += new DragEventHandler( rtb_DragEnter ); + rtb.DragDrop += new DragEventHandler( rtb_DragDrop ); + rtb.AllowDrop = true; // add Drop to rtb + String version = Application.ProductVersion; // get the version information + lblTitle.Text += " - V " + version.Substring( 0, version.IndexOf( ".", version.IndexOf( "." ) + 1 ) ); // get the first two elements + + // load profiles + foreach ( String s in SCDefaultProfile.DefaultProfileNames ) { + tsDDbtProfiles.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ) ); + } + tsDDbtProfiles.Text = m_AppSettings.DefProfileName; + + // load ResetMode + tsDDbtResetMode.DropDownItems.Add( m_AppSettings.ResetModeEmpty ); + tsDDbtResetMode.DropDownItems.Add( m_AppSettings.ResetModeDefault ); + tsDDbtResetMode.Text = m_AppSettings.ResetMode; + + // Init X things if ( !InitDirectInput( ) ) Close( ); + // poll the XInput timer1.Start( ); // this one polls the joysticks to show the props } @@ -151,7 +171,7 @@ namespace SCJMapper_V2 // build TreeView and the ActionMaps m_AT = new ActionTree( ); m_AT.Ctrl = treeView1; // the ActionTree owns the TreeView control - m_AT.LoadTree( addDefaultBinding ); // Init with default profile filepath + m_AT.LoadTree( m_AppSettings.DefProfileName, addDefaultBinding ); // Init with default profile filepath // default JS to Joystick mapping - can be changed and reloaded from XML if ( tc1.TabCount > 0 ) { cbJs1.SelectedIndex = 0; m_AT.ActionMaps.js1 = cbJs1.Text; } @@ -186,7 +206,7 @@ namespace SCJMapper_V2 } else { // setup the further tab contents along the reference one in TabPage[0] (the control named UC_JoyPanel) - tc1.TabPages.Add("Joystick " + (tabs+1).ToString()); + tc1.TabPages.Add( "Joystick " + ( tabs + 1 ).ToString( ) ); UC_JoyPanel uUC_JoyPanelNew = new UC_JoyPanel( ); tc1.TabPages[tabs].Controls.Add( uUC_JoyPanelNew ); uUC_JoyPanelNew.Size = UC_JoyPanel.Size; @@ -215,7 +235,8 @@ namespace SCJMapper_V2 return false; } - InitActionTree( false ); + // load the profile items from the XML + InitActionTree( ( m_AppSettings.ResetMode == m_AppSettings.ResetModeDefault ) ); return true; } @@ -226,15 +247,22 @@ namespace SCJMapper_V2 /// private String JSStr( ) { - if ( (String)tc1.SelectedTab.Tag == ( string )cbJs1.SelectedItem ) return JoystickCls.JSTag( 1 ); + if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs1.SelectedItem ) return JoystickCls.JSTag( 1 ); if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs2.SelectedItem ) return JoystickCls.JSTag( 2 ); if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs3.SelectedItem ) return JoystickCls.JSTag( 3 ); - return JoystickCls.JSTag( tc1.SelectedIndex+1 ); // return the Joystick number + return JoystickCls.JSTag( tc1.SelectedIndex + 1 ); // return the Joystick number } #region Event Handling + private void MainForm_FormClosing( object sender, FormClosingEventArgs e ) + { + m_AppSettings.FormSize = this.Size; + m_AppSettings.FormLocation = this.Location; + m_AppSettings.Save( ); + } + private void timer1_Tick( object sender, System.EventArgs e ) { @@ -302,16 +330,28 @@ namespace SCJMapper_V2 btGrab.BackColor = btClear.BackColor; btGrab.UseVisualStyleBackColor = btClear.UseVisualStyleBackColor; // neutral again } - private void btReset_Click( object sender, EventArgs e ) + private void tsBtReset_ButtonClick( object sender, EventArgs e ) { - InitActionTree( false ); // start over + // start over and if chosen, load defaults from SC game + InitActionTree( ( m_AppSettings.ResetMode == m_AppSettings.ResetModeDefault ) ); } - private void btResetDefaults_Click( object sender, EventArgs e ) + private void tsDDbtProfiles_DropDownItemClicked( object sender, ToolStripItemClickedEventArgs e ) { - InitActionTree( true ); // start over and load defaults from SC game + tsDDbtProfiles.Text = e.ClickedItem.Text; + m_AppSettings.DefProfileName = e.ClickedItem.Text; + m_AppSettings.Save( ); + // InitActionTree( ( Settings.Default.ResetMode == Settings.Default.ResetModeDefault ) ); // start over } + private void tsDDbtResetMode_DropDownItemClicked( object sender, ToolStripItemClickedEventArgs e ) + { + tsDDbtResetMode.Text = e.ClickedItem.Text; + m_AppSettings.ResetMode = e.ClickedItem.Text; + m_AppSettings.Save( ); + } + + private void tsiCopy_Click( object sender, EventArgs e ) { rtb.Focus( ); @@ -395,14 +435,13 @@ namespace SCJMapper_V2 { // Loads the file into the control. string[] droppedFilenames = e.Data.GetData( DataFormats.FileDrop, true ) as string[]; - if ( droppedFilenames.Length>0 ) rtb.LoadFile( droppedFilenames[0], System.Windows.Forms.RichTextBoxStreamType.PlainText ); - } + if ( droppedFilenames.Length > 0 ) rtb.LoadFile( droppedFilenames[0], System.Windows.Forms.RichTextBoxStreamType.PlainText ); + } #endregion - } } diff --git a/Form1.resx b/Form1.resx index eb36c16..f6b47d9 100644 --- a/Form1.resx +++ b/Form1.resx @@ -118,8 +118,79 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 602, 17 + 296, 17 + + 494, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ + DgAAAk1TRnQBSQFMAgEBBwEAAYgBBgGIAQYBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/yYAAXQFRgHyFQAB/wH0 + CwABBxUAAUYHJQHyFAACQwEVCQABQwEVAUMCAAHwCwAB8AQAAUYJJQHyEwABQwIVCAAB8gFDARUBQwEA + AgcB7QgAAf8BkgG8Ae8CAAFGAiUB/wFMAyUCGgIlARsRAAEHAUMBFQETAUMB9AUAAQcBFQEUARUBQwEA + AfcBvAHtCQAB9wHwAZIBAAF0AiUB9gL/AUwBJQH2Av8DJREAAfQBQwEVAeoB+QIPAx8BQwEUAR8BFAEV + AUMB/wHtAfAB7AHqAW0B7wMAAe8BDgHsAe8B8AHsAQABRgIlAUYD/wH2A/8DJRIAAUMBbQHqAUQCEAMg + AQ4BbQEUAhABEQEAAewBvAH3AeoB6wESAewBBwHsARIB6wFtAgcB6wEAAUYDKwFMBf8EKxIAAUMBFQES + ASABDgEPAR8CIAIVAREBFAEQAUMBAAFtAuwB7QEUAW0BkgHsAZIBbQHqAe0B7AHtAQ4BAAFGBEwB9gP/ + AXQETBIAAUMB7AEUAQ8CHwEAAQ4BDwEBAR4BRAFDARABEQIAAfcB7wHrAu8B7QGSAe0B7wH3AZEC7wIA + AUYDTAH2Bf8BdANMEgABvAEUAQ4BEAFDAUUBHgEBAUMBHgFvAQ4CEAMAAuwBvAHsAQcBvAFtArwBjQG8 + ARUBvAIAAUYCTAEaA/8BTAP/A0wTAAFDARABbQEVAQEBEQEVAQ4BHgELAR8CDgMAAfIB8wHsAfIF9AHy + ARIB8gHzAgAB8wFTAUwBmgL/A0wC/wJMAU0TAAEVAhEBHgEABw4FAAG8AvAFAALwAbwBEQMAAfMBUwpN + FQAB7AEQAQ8BFQMAAUMCDwH0BQABEQcAAf8BAAETBQAB8wlTNwAB8wdTlAAg/wcAAUMBAAHyFgAB/w7x + AfAG/wH0AygG/wUAAQ4BkQGuApEB6gH/BwAL/wIAAf8B8QNrAYsBkQGLBIoBSQFKAZEB8Qb/ASgDKQEo + Bf8EAAFDAZoBegFSAZEBtQESAfEGAAH3AQcBvAIHAu8DBwHwAfIBBwEAAf8B8QIGAYsBkAG7BYsCUAFr + AfEG/wFQBCkBKAT/AwABDwEHAZECcwGRAbUBtAFDAfQEAAH/AbwB7wO8AwcBvAEHAfAB8gHxAQAB/wHx + AgYBiwGQAbsEkAFsAVABUQFrAfEH/wVQAXMD/wEAARQBUgHzArwBBwH3AZECtAEOAfQEAAH/AbwB7wPw + ArwC8AG8AfEB8gHwAQAB/wHxAosBkAGzAbsBKQGzAXEDUAGQAWsB8QL/AXMFKAVQAXMC/wIAARoB9AH3 + ARIBQwERAbsBkQF6AewB/wLxAfMBAAH/Ae8B9wG8BvABvALxAbwBAAH/AfIDkAGzAbsCswNRASkBswFr + AfIB/w1QAZkB/wIAAQ4B7wETAeoBFQEPAZEBDwEOBfEBAAH/Ae0BvAnyAfABBwEAAf8B8gSzAboBiwEp + BHgBUQFrAfIB/w5QAf8EAAFtAREBQwEQARUB8QL/AfQC/wIAAf8B9wHxCPIB8QHwAbwBAAH/AfIEswG6 + AbsBKAJ4AVABeAEoAWsB8gH/ASkMUAEoAf8EAAG7AbQBkQFtCQAB/wGSAfEB8gbzAfIC8QHwAQAB/wHz + BLMBuQG6AdwBtAFJAlABSQFrAfMC/wFQBXgBVwRRASkC/wMAAfMBAAGRARMLAAGSAfEB8gbzAfIB8QHy + AfMBAAH/AfMGuQG6AdsD3AHbAWsB8wf/ASgEVwFQA/8DAAHwAQ4B7AEVCwAB7QHxAfIG8wHyAfEB8gH/ + AQAB/wHzDNoBiwHzBv8BmQR4AVcE/wEAAfEBAAEHAe0B7AGuAfIKAAEHAvIG8wHyAfEB8gIAAf8P8wb/ + ASkEeAX/AQABbgF5AbwB9wETAfAMAALyBvMB8gHxAfQCAAH/CPMB8gH3AfIB9wHyAfcB8wb/ARwDeAb/ + Ae0B6wG8Au8OAALxBvIC8QMAAf8B8w3/Ae8H/wGZAVAI/wETAfAB6hwAIP8CAAHzAfcB/xsAAUIBTQE+ + BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAT/AfgBDwIAAZ8B/QL/AfABBwIAAY8B+AHf + Af0B4AEDAgABjwHwAY8B8AHAAQECAAEDAeABBwHwAYABAQUAAoABAQIAAYABAAGAAQABgAEBAgABgAEA + AYABAAGAAQECAAGAAQABgAEAAYABAQIAAYABAQGAAQABgAEBAgABwAEBAcABAQGAAQECAAHAAQEBwwHh + AcABAwIAAeABAwHnAeMB4AEHAgAE/wHwAQ8CAAb/AgAG/wYAAfwBPwL/BAAB+AEPAeABAwQAAfABDwHA + AQEEAAHAAQcBgAEBBAABgAEHAYABAQQAAYABAAGAAQEEAAHAAQABgAEBBAAB4AEBAYABAQQAAeAB/wGA + AQEEAAHgAf8BwAEBBAAB4QH/AcABAQQAAYAB/wHAAQMEAAGBAf8B4AEDBAABAwH/AeABBwQAAQcD/wQA + AccD/ws= + + @@ -382,88 +453,103 @@ u459AcHtFiFpohCyiCKghgx2LMobzjENaYBSg7xUjpjyOWWq2lCmMw53SBq6H00dRjdybJJ3o8hMmseA Y77zcj3gqae8LoFeYJow8wzVPeFzWvMDVj3mdpXmW8CvMpXS46wHi4zaxlRDxRL9I94NwPeMKM95pmwZ x1//2Q== - - - - 800, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ - DgAAAk1TRnQBSQFMAgEBBwEAAZABBQGQAQUBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo - AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA - AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 - AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA - AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm - AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM - AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA - ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz - AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ - AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM - AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA - AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA - AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ - AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ - AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA - AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm - ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ - Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz - AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA - AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM - AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM - ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM - Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA - AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM - AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ - AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz - AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm - AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw - AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/yYAAXQFRgHyFQAB/wH0 - CwABBxUAAUYHJQHyFAACQwEVCQABQwEVAUMCAAHwCwAB8AQAAUYJJQHyEwABQwIVCAAB8gFDARUBQwEA - AgcB7QgAAf8BkgG8Ae8CAAFGAiUB/wFMAyUCGgIlARsRAAEHAUMBFQETAUMB9AUAAQcBFQEUARUBQwEA - AfcBvAHtCQAB9wHwAZIBAAF0AiUB9gL/AUwBJQH2Av8DJREAAfQBQwEVAeoB+QIPAx8BQwEUAR8BFAEV - AUMB/wHtAfAB7AHqAW0B7wMAAe8BDgHsAe8B8AHsAQABRgIlAUYD/wH2A/8DJRIAAUMBbQHqAUQCEAMg - AQ4BbQEUAhABEQEAAewBvAH3AeoB6wESAewBBwHsARIB6wFtAgcB6wEAAUYDKwFMBf8EKxIAAUMBFQES - ASABDgEPAR8CIAIVAREBFAEQAUMBAAFtAuwB7QEUAW0BkgHsAZIBbQHqAe0B7AHtAQ4BAAFGBEwB9gP/ - AXQETBIAAUMB7AEUAQ8CHwEAAQ4BDwEBAR4BRAFDARABEQIAAfcB7wHrAu8B7QGSAe0B7wH3AZEC7wIA - AUYDTAH2Bf8BdANMEgABvAEUAQ4BEAFDAUUBHgEBAUMBHgFvAQ4CEAMAAuwBvAHsAQcBvAFtArwBjQG8 - ARUBvAIAAUYCTAEaA/8BTAP/A0wTAAFDARABbQEVAQEBEQEVAQ4BHgELAR8CDgMAAfIB8wHsAfIF9AHy - ARIB8gHzAgAB8wFTAUwBmgL/A0wC/wJMAU0TAAEVAhEBHgEABw4FAAG8AvAFAALwAbwBEQMAAfMBUwpN - FQAB7AEQAQ8BFQMAAUMCDwH0BQABEQcAAf8BAAETBQAB8wlTNwAB8wdTlAAg/wcAAUMBAAHyFgAB/w7x - AfAG/wH0AygG/wUAAQ4BkQGuApEB6gH/BwAL/wIAAf8B8QNrAYsBkQGLBIoBSQFKAZEB8Qb/ASgDKQEo - Bf8EAAFDAZoBegFSAZEBtQESAfEGAAH3AQcBvAIHAu8DBwHwAfIBBwEAAf8B8QIGAYsBkAG7BYsCUAFr - AfEG/wFQBCkBKAT/AwABDwEHAZECcwGRAbUBtAFDAfQEAAH/AbwB7wO8AwcBvAEHAfAB8gHxAQAB/wHx - AgYBiwGQAbsEkAFsAVABUQFrAfEH/wVQAXMD/wEAARQBUgHzArwBBwH3AZECtAEOAfQEAAH/AbwB7wPw - ArwC8AG8AfEB8gHwAQAB/wHxAosBkAGzAbsBKQGzAXEDUAGQAWsB8QL/AXMFKAVQAXMC/wIAARoB9AH3 - ARIBQwERAbsBkQF6AewB/wLxAfMBAAH/Ae8B9wG8BvABvALxAbwBAAH/AfIDkAGzAbsCswNRASkBswFr - AfIB/w1QAZkB/wIAAQ4B7wETAeoBFQEPAZEBDwEOBfEBAAH/Ae0BvAnyAfABBwEAAf8B8gSzAboBiwEp - BHgBUQFrAfIB/w5QAf8EAAFtAREBQwEQARUB8QL/AfQC/wIAAf8B9wHxCPIB8QHwAbwBAAH/AfIEswG6 - AbsBKAJ4AVABeAEoAWsB8gH/ASkMUAEoAf8EAAG7AbQBkQFtCQAB/wGSAfEB8gbzAfIC8QHwAQAB/wHz - BLMBuQG6AdwBtAFJAlABSQFrAfMC/wFQBXgBVwRRASkC/wMAAfMBAAGRARMLAAGSAfEB8gbzAfIB8QHy - AfMBAAH/AfMGuQG6AdsD3AHbAWsB8wf/ASgEVwFQA/8DAAHwAQ4B7AEVCwAB7QHxAfIG8wHyAfEB8gH/ - AQAB/wHzDNoBiwHzBv8BmQR4AVcE/wEAAfEBAAEHAe0B7AGuAfIKAAEHAvIG8wHyAfEB8gIAAf8P8wb/ - ASkEeAX/AQABbgF5AbwB9wETAfAMAALyBvMB8gHxAfQCAAH/CPMB8gH3AfIB9wHyAfcB8wb/ARwDeAb/ - Ae0B6wG8Au8OAALxBvIC8QMAAf8B8w3/Ae8H/wGZAVAI/wETAfAB6hwAIP8CAAHzAfcB/xsAAUIBTQE+ - BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAT/AfgBDwIAAZ8B/QL/AfABBwIAAY8B+AHf - Af0B4AEDAgABjwHwAY8B8AHAAQECAAEDAeABBwHwAYABAQUAAoABAQIAAYABAAGAAQABgAEBAgABgAEA - AYABAAGAAQECAAGAAQABgAEAAYABAQIAAYABAQGAAQABgAEBAgABwAEBAcABAQGAAQECAAHAAQEBwwHh - AcABAwIAAeABAwHnAeMB4AEHAgAE/wHwAQ8CAAb/AgAG/wYAAfwBPwL/BAAB+AEPAeABAwQAAfABDwHA - AQEEAAHAAQcBgAEBBAABgAEHAYABAQQAAYABAAGAAQEEAAHAAQABgAEBBAAB4AEBAYABAQQAAeAB/wGA - AQEEAAHgAf8BwAEBBAAB4QH/AcABAQQAAYAB/wHAAQMEAAGBAf8B4AEDBAABAwH/AeABBwQAAQcD/wQA - AccD/ws= - 439, 17 + 133, 17 - 515, 17 + 209, 17 - 727, 17 + 421, 17 + + + 17, 17 + + + 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 + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + 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 diff --git a/Joystick/ActionTree.cs b/Joystick/ActionTree.cs index d304923..833d9bd 100644 --- a/Joystick/ActionTree.cs +++ b/Joystick/ActionTree.cs @@ -4,6 +4,7 @@ using System.Text; using System.Windows.Forms; using System.IO; using System.Drawing; +using SCJMapper_V2.Properties; namespace SCJMapper_V2 { @@ -15,7 +16,7 @@ namespace SCJMapper_V2 // Load MappingVars.csv into the ActionList and create the Control TreeView - public void LoadTree( Boolean addDefaultBinding ) + public void LoadTree( String defaultProfileName, Boolean applyDefaults ) { TreeNode tn = null; TreeNode[] cnl = { }; @@ -33,7 +34,7 @@ namespace SCJMapper_V2 DProfileReader dpReader = new DProfileReader( ); // we may read a profile TextReader txReader = null; - dpReader.fromXML( SCDefaultProfile.DefaultProfile( ) ); + dpReader.fromXML( SCDefaultProfile.DefaultProfile( defaultProfileName + ".xml" ) ); if ( dpReader.ValidContent ) { txReader = new StringReader( dpReader.CSVMap ); } @@ -61,7 +62,7 @@ namespace SCJMapper_V2 ac = new ActionCls( ); ac.key = cn.Name; ac.name = action; ac.device = device; ac.defBinding = defBinding; acm.Add( ac ); // add to our map - if ( addDefaultBinding ) { + if ( applyDefaults ) { // right now this application only works with joysticks if ( JoystickCls.IsJoystick( ac.device ) ) { int jNum = JoystickCls.JSNum( ac.defBinding ); diff --git a/Joystick/DProfileReader.cs b/Joystick/DProfileReader.cs index cd46797..5136f62 100644 --- a/Joystick/DProfileReader.cs +++ b/Joystick/DProfileReader.cs @@ -28,7 +28,8 @@ namespace SCJMapper_V2 { public String name { get; set; } // the action name public String input { get; set; } // the input method K,J,X,P - public String defBinding { get; set; } // the default binding - may be useful + private String m_defBinding = ""; + public String defBinding { get { return m_defBinding;} set { m_defBinding = value.Trim();} } // need to clean this one, found spaces... public String keyName { get { return input + name; } } // prep for TreView usage - create a key from input+name } @@ -71,6 +72,45 @@ namespace SCJMapper_V2 } + /// + /// Assumes to be in an action element + /// retrieves the attributes and collects the various control=binding pairs + /// + /// An XML reader @ StartElement + private void CollectActions( XmlReader xr, Dictionary attr ) + { + // we collect actions for each input ie for K,J,X and P + if ( attr.ContainsKey( "joystick" ) ) { + Action ac = new Action( ); + ac.name = attr["name"]; + ac.input = "J"; + ac.defBinding = attr["joystick"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + if ( attr.ContainsKey( "keyboard" ) ) { + Action ac = new Action( ); + ac.name = attr["name"]; + ac.input = "K"; + ac.defBinding = attr["keyboard"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + if ( attr.ContainsKey( "xboxpad" ) ) { + Action ac = new Action( ); + ac.name = attr["name"]; + ac.input = "X"; + ac.defBinding = attr["xboxpad"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + if ( attr.ContainsKey( "ps3pad" ) ) { + Action ac = new Action( ); + ac.name = attr["name"]; + ac.input = "P"; + ac.defBinding = attr["ps3pad"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + } + + /// /// Read one 'empty' XML element /// @@ -94,40 +134,10 @@ namespace SCJMapper_V2 // processing a valid action map - collect actions if ( eName.ToLower( ) == "action" ) { // this is an action.. - collect it - // we collect actions for each input ie for K,J,X and P - if ( attr.ContainsKey( "joystick" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "J"; - ac.defBinding = attr["joystick"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "keyboard" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "K"; - ac.defBinding = attr["keyboard"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "xboxpad" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "X"; - ac.defBinding = attr["xboxpad"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "ps3pad" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "P"; - ac.defBinding = attr["ps3pad"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - + CollectActions( xr, attr ); } }// if inmap //Console.Write( ">\n" ); - m_nodeNameStack.Pop( ); break; case XmlNodeType.Text: @@ -141,6 +151,55 @@ namespace SCJMapper_V2 return true; } + /// + /// Reads an action sub element + /// + /// An XML reader @ StartElement + private void ReadActionSub( XmlReader xr, String actionName ) + { + // + // + // + // + //or + // + // + // + // + // + Boolean done = false; + do { + xr.Read( ); // get next element + Dictionary attr = new Dictionary( ); + String eName = xr.Name; + while ( xr.MoveToNextAttribute( ) ) { + attr.Add( xr.Name, xr.Value ); // save the attributes + //Console.Write( " {0}='{1}'", xr.Name, xr.Value ); + } + xr.MoveToElement( ); // backup + Action ac = new Action( ); + ac.name = actionName; + // the element name is a control + if ( xr.NodeType == XmlNodeType.EndElement ) { + done = ( xr.Name == "action" ); + } + else if ( xr.IsEmptyElement ) { + // an attribute only element + ac.input = ActionCls.DevID( eName ); + ac.defBinding = attr["input"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + else { + // one with subelements again + xr.Read( ); + ac.input = ActionCls.DevID( eName ); + ac.defBinding = xr["input"]; + if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound + } + } while ( !done ); + m_nodeNameStack.Pop( ); // action is finished + } + /// /// Read one XML element /// @@ -183,35 +242,8 @@ namespace SCJMapper_V2 // processing a valid action map - collect actions if ( eName.ToLower( ) == "action" ) { // this is an action.. - collect it - // we collect actions for each input ie for K,J,X and P - if ( attr.ContainsKey( "joystick" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "J"; - ac.defBinding = attr["joystick"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "keyboard" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "K"; - ac.defBinding = attr["keyboard"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "xboxpad" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "X"; - ac.defBinding = attr["xboxpad"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } - if ( attr.ContainsKey( "ps3pad" ) ) { - Action ac = new Action( ); - ac.name = attr["name"]; - ac.input = "P"; - ac.defBinding = attr["ps3pad"]; - if ( !String.IsNullOrEmpty( ac.defBinding ) ) m_currentMap.Add( ac ); // finally add it to the current map if it was bound - } + CollectActions( xr, attr ); + ReadActionSub( xr, attr["name"] ); // a non empty action element may have a sub element } } //Console.Write( ">\n" ); @@ -236,28 +268,37 @@ namespace SCJMapper_V2 { Boolean retVal = true; - do { - if ( xr.IsStartElement( ) ) { - m_nodeNameStack.Push( xr.Name ); - if ( xr.IsEmptyElement ) - retVal = retVal && ReadEmptyElement( xr ); - else { - retVal = retVal && ReadElement( xr ); + try { + do { + if ( xr.IsStartElement( ) ) { + m_nodeNameStack.Push( xr.Name ); + if ( xr.IsEmptyElement ) { + retVal = retVal && ReadEmptyElement( xr ); + m_nodeNameStack.Pop( ); // empty ones end inline + } + else { + retVal = retVal && ReadElement( xr ); + } } - } - else if ( xr.NodeType == XmlNodeType.EndElement ) { - //Console.Write( "\n", xr.Name ); - String exitElement = m_nodeNameStack.Pop( ); - if ( m_state == EState.inActionMap ) - if ( exitElement.ToLower( ) == "actionmap" ) m_state = EState.idle; // finished - } + else if ( xr.NodeType == XmlNodeType.EndElement ) { + //Console.Write( "\n", xr.Name ); + String exitElement = m_nodeNameStack.Pop( ); + if ( m_state == EState.inActionMap ) + if ( exitElement.ToLower( ) == "actionmap" ) m_state = EState.idle; // finished + } + + } while ( xr.Read( ) ); - } while ( xr.Read( ) ); + if ( m_nodeNameStack.Count == 0 ) + return retVal && true; + else + return false; - if ( m_nodeNameStack.Count == 0 ) - return retVal && true; - else + } + catch { + // get any exceptions from reading return false; + } } /// diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 002631a..7cf9013 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion( "1.4.0.10" )] -[assembly: AssemblyFileVersion( "1.4.0.10" )] +[assembly: AssemblyVersion( "1.5.0.15" )] +[assembly: AssemblyFileVersion( "1.5.0.15" )] diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 6789bc3..5f87ec0 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34014 +// Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +12,7 @@ namespace SCJMapper_V2.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/Properties/Settings.settings b/Properties/Settings.settings index 3964565..8e615f2 100644 --- a/Properties/Settings.settings +++ b/Properties/Settings.settings @@ -1,7 +1,5 @@  - - - + - + \ No newline at end of file diff --git a/SC/SCDefaultProfile.cs b/SC/SCDefaultProfile.cs index 876c38c..b286ef9 100644 --- a/SC/SCDefaultProfile.cs +++ b/SC/SCDefaultProfile.cs @@ -15,16 +15,45 @@ namespace SCJMapper_V2 class SCDefaultProfile { - static public String DefaultProfile( ) + /// + /// Returns a list of files found that match 'defaultProfile*.xml' + /// + /// A list of filenames - can be empty + static public List DefaultProfileNames + { + get + { + List retVal = new List( ); + if ( File.Exists( SCPath.SCGameData_pak ) ) { + using ( ZipFile zip = ZipFile.Read( SCPath.SCGameData_pak ) ) { + zip.CaseSensitiveRetrieval = false; + ICollection gdpak = zip.SelectEntries( "name = " + "'" + SCPath.DefaultProfileName + "*.xml'", SCPath.DefaultProfilePath_rel ); + if ( gdpak != null ) { + foreach ( ZipEntry ze in gdpak ) { + retVal.Add( ze.FileName ); + } + } + } + } + return retVal; + } + } + + /// + /// Returns the sought default profile as string from GameData.pak + /// + /// The filename of the profile to be extracted + /// A string containing the file contents + static public String DefaultProfile( String defaultProfileName ) { String retVal = ""; // first try to get the SC defaultProfile from the GameData.pak - retVal = ExtractDefaultProfile( ); + retVal = ExtractDefaultProfile( defaultProfileName ); if ( String.IsNullOrEmpty( retVal ) ) { // second choice a defaultProfile.xml in the app dir distributed with the application ??? to be deleted ??? - if ( File.Exists( SCPath.DefaultProfileName ) ) { - using ( StreamReader sr = new StreamReader( SCPath.DefaultProfileName ) ) { + if ( File.Exists( SCPath.DefaultProfileName + ".xml" ) ) { + using ( StreamReader sr = new StreamReader( SCPath.DefaultProfileName + ".xml" ) ) { retVal = sr.ReadToEnd( ); } } @@ -37,15 +66,16 @@ namespace SCJMapper_V2 } /// - /// Extracts the file to the internal string + /// Zip Extracts the file to a string /// - static private String ExtractDefaultProfile( ) + static private String ExtractDefaultProfile( String defaultProfileName ) { String retVal = ""; if ( File.Exists( SCPath.SCGameData_pak ) ) { using ( ZipFile zip = ZipFile.Read( SCPath.SCGameData_pak ) ) { zip.CaseSensitiveRetrieval = false; - ICollection gdpak = zip.SelectEntries( "name = " + SCPath.DefaultProfileName, SCPath.DefaultProfilePath_rel ); + + ICollection gdpak = zip.SelectEntries( "name = " + "'" + defaultProfileName+"'", SCPath.DefaultProfilePath_rel ); if ( gdpak != null ) { try { MemoryStream mst = new MemoryStream( ); diff --git a/SC/SCPath.cs b/SC/SCPath.cs index bf33985..b4d37e3 100644 --- a/SC/SCPath.cs +++ b/SC/SCPath.cs @@ -141,13 +141,13 @@ namespace SCJMapper_V2 } /// - /// Returns the name of the DefaultProfile.xml + /// Returns the name part of the DefaultProfile w/o extension... /// static public String DefaultProfileName { get { - return @"defaultProfile.xml"; + return @"defaultProfile"; } } diff --git a/SCJMapper-V2.csproj b/SCJMapper-V2.csproj index b087cf7..442027f 100644 --- a/SCJMapper-V2.csproj +++ b/SCJMapper-V2.csproj @@ -15,6 +15,21 @@ 512 3422add1 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 15 + 1.5.0.%2a + false + false + true x86 @@ -63,6 +78,7 @@ + Form @@ -131,6 +147,28 @@ + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + diff --git a/app.config b/app.config index e365603..3ba7ae9 100644 --- a/app.config +++ b/app.config @@ -1,3 +1,6 @@ - + + + + diff --git a/graphics/Home.png b/graphics/Home.png new file mode 100644 index 0000000..4c68cdf Binary files /dev/null and b/graphics/Home.png differ diff --git a/graphics/Joystick.png b/graphics/Joystick.png new file mode 100644 index 0000000..030913a Binary files /dev/null and b/graphics/Joystick.png differ