using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace DD2Switcher { public partial class SettingsForm : Form { private TabControl tabControl; private TabPage windowsTab; private TabPage sequenceTab; private FlowLayoutPanel windowsPanel; private Label sequenceKeybindLabel; private TextBox sequenceKeybindTextBox; private Label sequenceTimerDelayLabel; private NumericUpDown sequenceTimerDelayNumericUpDown; public SettingsForm() { InitializeComponent(); LoadIcon(); RefreshWindowsList(); } private void InitializeComponent() { this.tabControl = new System.Windows.Forms.TabControl(); this.windowsTab = new System.Windows.Forms.TabPage(); this.windowsPanel = new System.Windows.Forms.FlowLayoutPanel(); this.sequenceTab = new System.Windows.Forms.TabPage(); this.sequenceKeybindTextBox = new System.Windows.Forms.TextBox(); this.sequenceKeybindLabel = new System.Windows.Forms.Label(); this.sequenceTimerDelayNumericUpDown = new System.Windows.Forms.NumericUpDown(); this.sequenceTimerDelayLabel = new System.Windows.Forms.Label(); this.tabControl.SuspendLayout(); this.windowsTab.SuspendLayout(); this.sequenceTab.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.sequenceTimerDelayNumericUpDown)).BeginInit(); this.SuspendLayout(); // // tabControl // this.tabControl.Controls.Add(this.windowsTab); this.tabControl.Controls.Add(this.sequenceTab); this.tabControl.Location = new System.Drawing.Point(12, 12); this.tabControl.Name = "tabControl"; this.tabControl.SelectedIndex = 0; this.tabControl.Size = new System.Drawing.Size(576, 396); this.tabControl.TabIndex = 0; // // windowsTab // this.windowsTab.Controls.Add(this.windowsPanel); this.windowsTab.Location = new System.Drawing.Point(4, 22); this.windowsTab.Name = "windowsTab"; this.windowsTab.Padding = new System.Windows.Forms.Padding(3); this.windowsTab.Size = new System.Drawing.Size(568, 370); this.windowsTab.TabIndex = 0; this.windowsTab.Text = "Windows"; this.windowsTab.UseVisualStyleBackColor = true; // // windowsPanel // this.windowsPanel.AutoScroll = true; this.windowsPanel.BackColor = System.Drawing.Color.White; this.windowsPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.windowsPanel.Location = new System.Drawing.Point(6, 6); this.windowsPanel.Name = "windowsPanel"; this.windowsPanel.Padding = new System.Windows.Forms.Padding(10); this.windowsPanel.Size = new System.Drawing.Size(556, 358); this.windowsPanel.TabIndex = 0; // // sequenceTab // this.sequenceTab.Controls.Add(this.sequenceTimerDelayNumericUpDown); this.sequenceTab.Controls.Add(this.sequenceTimerDelayLabel); this.sequenceTab.Controls.Add(this.sequenceKeybindTextBox); this.sequenceTab.Controls.Add(this.sequenceKeybindLabel); this.sequenceTab.Location = new System.Drawing.Point(4, 22); this.sequenceTab.Name = "sequenceTab"; this.sequenceTab.Padding = new System.Windows.Forms.Padding(3); this.sequenceTab.Size = new System.Drawing.Size(568, 370); this.sequenceTab.TabIndex = 1; this.sequenceTab.Text = "Sequence"; this.sequenceTab.UseVisualStyleBackColor = true; // // sequenceKeybindTextBox // this.sequenceKeybindTextBox.Location = new System.Drawing.Point(126, 17); this.sequenceKeybindTextBox.Name = "sequenceKeybindTextBox"; this.sequenceKeybindTextBox.Size = new System.Drawing.Size(111, 20); this.sequenceKeybindTextBox.TabIndex = 1; this.sequenceKeybindTextBox.Text = Program.SequenceKeybind.ToString(); this.sequenceKeybindTextBox.Leave += new System.EventHandler(this.sequenceKeybindTextBox_Leave); // // sequenceKeybindLabel // this.sequenceKeybindLabel.AutoSize = true; this.sequenceKeybindLabel.Location = new System.Drawing.Point(20, 20); this.sequenceKeybindLabel.Name = "sequenceKeybindLabel"; this.sequenceKeybindLabel.Size = new System.Drawing.Size(100, 13); this.sequenceKeybindLabel.TabIndex = 0; this.sequenceKeybindLabel.Text = "Sequence Keybind:"; // // sequenceTimerDelayLabel // this.sequenceTimerDelayLabel.AutoSize = true; this.sequenceTimerDelayLabel.Location = new System.Drawing.Point(20, 50); this.sequenceTimerDelayLabel.Name = "sequenceTimerDelayLabel"; this.sequenceTimerDelayLabel.Size = new System.Drawing.Size(100, 13); this.sequenceTimerDelayLabel.TabIndex = 2; this.sequenceTimerDelayLabel.Text = "Timer Delay (ms):"; // // sequenceTimerDelayNumericUpDown // this.sequenceTimerDelayNumericUpDown.Location = new System.Drawing.Point(126, 47); this.sequenceTimerDelayNumericUpDown.Name = "sequenceTimerDelayNumericUpDown"; this.sequenceTimerDelayNumericUpDown.Size = new System.Drawing.Size(111, 20); this.sequenceTimerDelayNumericUpDown.TabIndex = 3; this.sequenceTimerDelayNumericUpDown.Minimum = 10; this.sequenceTimerDelayNumericUpDown.Maximum = 10000; this.sequenceTimerDelayNumericUpDown.Value = Program.SequenceTimerDelay; this.sequenceTimerDelayNumericUpDown.ValueChanged += new System.EventHandler(this.sequenceTimerDelayNumericUpDown_ValueChanged); // // SettingsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(600, 420); this.Controls.Add(this.tabControl); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "SettingsForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "DD2Switcher Settings"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SettingsForm_FormClosing); this.tabControl.ResumeLayout(false); this.windowsTab.ResumeLayout(false); this.sequenceTab.ResumeLayout(false); this.sequenceTab.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.sequenceTimerDelayNumericUpDown)).EndInit(); this.ResumeLayout(false); } private void closeButton_Click(object sender, EventArgs e) { this.Close(); } private void refreshButton_Click(object sender, EventArgs e) { RefreshWindowsList(); } private void RefreshWindowsList() { windowsPanel.Controls.Clear(); // Get tracked windows from Program var trackedWindows = GetTrackedWindows(); if (trackedWindows.Count == 0) { var noWindowsLabel = new Label(); noWindowsLabel.Text = "No windows currently tracked"; noWindowsLabel.AutoSize = true; noWindowsLabel.ForeColor = Color.Gray; noWindowsLabel.Font = new Font("Segoe UI", 10F); windowsPanel.Controls.Add(noWindowsLabel); return; } for (int i = 0; i < trackedWindows.Count; i++) { var window = trackedWindows[i]; if (window == null) continue; var windowPanelForm = new WindowPanelForm(); windowPanelForm.WindowIndex = i; windowPanelForm.WindowProcess = window; windowPanelForm.IsFirst = (i == Program.FirstIndex); windowPanelForm.IsLast = (i == Program.LastIndex); windowPanelForm.UpdateDisplay(); windowPanelForm.PickClicked += (sender, index) => { // If clicking on a window that's already first or last, remove that setting if (index == Program.FirstIndex) { Program.FirstIndex = -1; Console.WriteLine($"Removed first index: {index}"); } else if (index == Program.LastIndex) { Program.LastIndex = -1; Console.WriteLine($"Removed last index: {index}"); } else if (Program.FirstIndex == -1) { // First pick - set both first and last Program.FirstIndex = index; Program.LastIndex = index; Console.WriteLine($"Set first and last index: {index}"); } else if (Program.LastIndex == -1) { // Second pick - set last (must be >= first) if (index >= Program.FirstIndex) { Program.LastIndex = index; } else { Program.LastIndex = Program.FirstIndex; Program.FirstIndex = index; } Console.WriteLine($"Set last index: {Program.LastIndex}"); } else { // Subsequent picks - determine which becomes first int distanceToFirst = Math.Abs(index - Program.FirstIndex); int distanceToLast = Math.Abs(index - Program.LastIndex); if (distanceToFirst <= distanceToLast) { // New index is closer to first, so first moves if (index <= Program.LastIndex) { Program.FirstIndex = index; } else { Program.LastIndex = Program.FirstIndex; Program.FirstIndex = index; } } else { // New index is closer to last, so last moves if (index >= Program.FirstIndex) { Program.LastIndex = index; } else { Program.FirstIndex = Program.LastIndex; Program.LastIndex = index; } } Console.WriteLine($"Updated indices: First={Program.FirstIndex}, Last={Program.LastIndex}"); } // Ensure last >= first if (Program.LastIndex < Program.FirstIndex) { int tmp = Program.LastIndex; Program.LastIndex = Program.FirstIndex; Program.FirstIndex = tmp; } RefreshWindowsList(); }; windowPanelForm.UntrackClicked += (sender, index) => { UntrackWindow(index); RefreshWindowsList(); }; windowsPanel.Controls.Add(windowPanelForm); } } private string GetFirstLastText(int index) { if (index == Program.FirstIndex && index == Program.LastIndex) { return "First & Last"; } else if (index == Program.FirstIndex) { return "First"; } else if (index == Program.LastIndex) { return "Last"; } return ""; } private List GetTrackedWindows() { var windows = Program.GetTrackedWindows(); return windows.ToList(); } private void UntrackWindow(int index) { Program.UntrackWindow(index); } private void LoadIcon() { try { this.Icon = new Icon(System.IO.Path.Combine( System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "app.ico")); } catch { // Use default icon if custom icon not found } } private void sequenceKeybindTextBox_Leave(object sender, EventArgs e) { Console.WriteLine($"sequenceKeybindTextBox_Leave called with text: {sequenceKeybindTextBox.Text}"); try { KeysConverter converter = new KeysConverter(); Keys newKey = (Keys)converter.ConvertFromString(sequenceKeybindTextBox.Text); Console.WriteLine($"Converted key: {newKey} (code: {(int)newKey})"); Program.UpdateSequenceHotkey(newKey); Console.WriteLine("Keybind updated successfully!"); } catch (Exception ex) { Console.WriteLine($"Error converting key: {ex.Message}"); sequenceKeybindTextBox.Text = Program.SequenceKeybind.ToString(); } } private void sequenceTimerDelayNumericUpDown_ValueChanged(object sender, EventArgs e) { Console.WriteLine( $"sequenceTimerDelayNumericUpDown_ValueChanged called with value: {sequenceTimerDelayNumericUpDown.Value}"); try { int newDelay = (int)sequenceTimerDelayNumericUpDown.Value; Program.SequenceTimerDelay = newDelay; Program.SaveSettings(); Console.WriteLine($"Timer delay updated to: {newDelay}ms"); } catch (Exception ex) { Console.WriteLine($"Error updating timer delay: {ex.Message}"); } } private void SettingsForm_FormClosing(object sender, FormClosingEventArgs e) { Console.WriteLine("SettingsForm closing - saving keybind"); try { KeysConverter converter = new KeysConverter(); Keys newKey = (Keys)converter.ConvertFromString(sequenceKeybindTextBox.Text); Console.WriteLine($"Saving keybind on close: {newKey}"); Program.UpdateSequenceHotkey(newKey); } catch (Exception ex) { Console.WriteLine($"Error saving keybind on close: {ex.Message}"); } } } }