Files
multiboxer/DD2Switcher/SettingsForm.cs

274 lines
9.8 KiB
C#

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 Label titleLabel;
private FlowLayoutPanel windowsPanel;
private Label statusLabel;
private Button refreshButton;
private Button closeButton;
private int firstIndex = -1;
private int lastIndex = -1;
public SettingsForm() {
InitializeComponent();
LoadIcon();
RefreshWindowsList();
}
private void InitializeComponent() {
this.titleLabel = new Label();
this.windowsPanel = new FlowLayoutPanel();
this.statusLabel = new Label();
this.refreshButton = new Button();
this.closeButton = new Button();
this.SuspendLayout();
//
// titleLabel
//
this.titleLabel.AutoSize = true;
this.titleLabel.Font = new Font("Segoe UI", 14F, FontStyle.Bold);
this.titleLabel.Location = new Point(20, 20);
this.titleLabel.Name = "titleLabel";
this.titleLabel.Size = new Size(200, 25);
this.titleLabel.Text = "DD2Switcher Settings";
//
// windowsPanel
//
this.windowsPanel.AutoScroll = true;
this.windowsPanel.BorderStyle = BorderStyle.FixedSingle;
this.windowsPanel.Location = new Point(20, 60);
this.windowsPanel.Name = "windowsPanel";
this.windowsPanel.Size = new Size(560, 300);
this.windowsPanel.Padding = new Padding(10);
this.windowsPanel.BackColor = Color.White;
//
// statusLabel
//
this.statusLabel.AutoSize = true;
this.statusLabel.Location = new Point(20, 380);
this.statusLabel.Name = "statusLabel";
this.statusLabel.Size = new Size(400, 15);
this.statusLabel.Text = "DD2Switcher is running in the system tray.";
//
// refreshButton
//
this.refreshButton.Location = new Point(450, 375);
this.refreshButton.Name = "refreshButton";
this.refreshButton.Size = new Size(75, 23);
this.refreshButton.Text = "Refresh";
this.refreshButton.Click += new EventHandler(this.refreshButton_Click);
//
// closeButton
//
this.closeButton.Location = new Point(530, 375);
this.closeButton.Name = "closeButton";
this.closeButton.Size = new Size(75, 23);
this.closeButton.Text = "Close";
this.closeButton.Click += new EventHandler(this.closeButton_Click);
//
// SettingsForm
//
this.AutoScaleDimensions = new SizeF(6F, 13F);
this.AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new Size(600, 420);
this.Controls.Add(this.titleLabel);
this.Controls.Add(this.windowsPanel);
this.Controls.Add(this.statusLabel);
this.Controls.Add(this.refreshButton);
this.Controls.Add(this.closeButton);
this.Name = "SettingsForm";
this.Text = "DD2Switcher Settings";
this.StartPosition = FormStartPosition.CenterScreen;
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ResumeLayout(false);
this.PerformLayout();
}
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 windowPanel = CreateWindowPanel(i, window);
windowsPanel.Controls.Add(windowPanel);
}
}
private Panel CreateWindowPanel(int index, Process window) {
var panel = new Panel();
panel.Width = 520;
panel.Height = 80;
panel.BorderStyle = BorderStyle.FixedSingle;
panel.Margin = new Padding(5);
panel.BackColor = Color.LightGray;
// Index label
var indexLabel = new Label();
indexLabel.Text = $"Index: {index}";
indexLabel.Location = new Point(10, 5);
indexLabel.AutoSize = true;
indexLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
panel.Controls.Add(indexLabel);
// Process name
var nameLabel = new Label();
nameLabel.Text = $"Name: {window.ProcessName}";
nameLabel.Location = new Point(10, 25);
nameLabel.AutoSize = true;
nameLabel.Font = new Font("Segoe UI", 9F);
panel.Controls.Add(nameLabel);
// PID
var pidLabel = new Label();
pidLabel.Text = $"PID: {window.Id}";
pidLabel.Location = new Point(10, 45);
pidLabel.AutoSize = true;
pidLabel.Font = new Font("Segoe UI", 9F);
panel.Controls.Add(pidLabel);
// Window title
var titleLabel = new Label();
titleLabel.Text = $"Title: {window.MainWindowTitle}";
titleLabel.Location = new Point(200, 25);
titleLabel.AutoSize = true;
titleLabel.Font = new Font("Segoe UI", 9F);
titleLabel.MaximumSize = new Size(200, 0);
panel.Controls.Add(titleLabel);
// First/Last indicator
var firstLastLabel = new Label();
firstLastLabel.Text = GetFirstLastText(index);
firstLastLabel.Location = new Point(200, 45);
firstLastLabel.AutoSize = true;
firstLastLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
firstLastLabel.ForeColor = Color.DarkBlue;
panel.Controls.Add(firstLastLabel);
// Pick button
var pickButton = new Button();
pickButton.Text = "Pick";
pickButton.Location = new Point(420, 10);
pickButton.Size = new Size(50, 25);
pickButton.Tag = index;
pickButton.Click += PickButton_Click;
panel.Controls.Add(pickButton);
// Untrack button
var untrackButton = new Button();
untrackButton.Text = "Untrack";
untrackButton.Location = new Point(420, 45);
untrackButton.Size = new Size(50, 25);
untrackButton.Tag = index;
untrackButton.Click += UntrackButton_Click;
panel.Controls.Add(untrackButton);
return panel;
}
private string GetFirstLastText(int index) {
if (index == firstIndex && index == lastIndex) {
return "First & Last";
} else if (index == firstIndex) {
return "First";
} else if (index == lastIndex) {
return "Last";
}
return "";
}
private void PickButton_Click(object sender, EventArgs e) {
var button = (Button)sender;
int index = (int)button.Tag;
if (firstIndex == -1) {
// First pick - set both first and last
firstIndex = index;
lastIndex = index;
} else if (lastIndex == -1) {
// Second pick - set last
lastIndex = index;
} else {
// Subsequent picks - determine which becomes first
if (index < firstIndex) {
// New index is lower, so it becomes first
lastIndex = firstIndex;
firstIndex = index;
} else {
// New index is higher, so it becomes last
lastIndex = index;
}
}
RefreshWindowsList();
}
private void UntrackButton_Click(object sender, EventArgs e) {
var button = (Button)sender;
int index = (int)button.Tag;
// Remove from tracked windows
UntrackWindow(index);
// Update first/last indices if needed
if (index == firstIndex) {
firstIndex = -1;
}
if (index == lastIndex) {
lastIndex = -1;
}
RefreshWindowsList();
}
private List<Process> 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
}
}
}
}