rawaccel/grapher/DeviceMenuForm.cs
2021-09-23 22:34:51 -04:00

405 lines
13 KiB
C#

using grapher.Models.Devices;
using grapher.Models.Serialized;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace grapher
{
public class DeviceMenuForm : Form
{
#region Constructors
public DeviceMenuForm(SettingsManager sm)
{
Manager = sm;
defaultConfig = Manager.UserConfig.defaultDeviceConfig;
var columns = 3;
var rows = 9;
var tablePanel = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = columns,
RowCount = rows
};
SuspendLayout();
tablePanel.SuspendLayout();
Label MakeConfigLabel(string text)
{
return new Label
{
Text = text,
Anchor = AnchorStyles.Left,
AutoSize = true,
};
}
DpiLabel = MakeConfigLabel("DPI:");
RateLabel = MakeConfigLabel("Polling rate:");
DisableLabel = MakeConfigLabel("Disable:");
OverrideLabel = MakeConfigLabel("Override defaults:");
var maxLabel = OverrideLabel;
tablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 2));
tablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, maxLabel.PreferredSize.Width + maxLabel.Margin.Left + maxLabel.Margin.Right));
tablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 1));
var middleRowCount = rows - 2;
tablePanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
for (int i = 0; i < middleRowCount; i++)
{
tablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 1));
}
tablePanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
var topPanel = new FlowLayoutPanel
{
AutoSize = true,
};
DefaultDisableCheck = new CheckBox
{
Text = "Disable by default",
AutoSize = true,
Checked = defaultConfig.disable,
};
topPanel.Controls.Add(DefaultDisableCheck);
tablePanel.Controls.Add(topPanel, 0, 0);
tablePanel.SetColumnSpan(topPanel, columns);
var bottomPanel = new FlowLayoutPanel
{
AutoSize = true,
Anchor = AnchorStyles.Right | AnchorStyles.Bottom,
};
var applyButton = new Button
{
Text = "Apply",
DialogResult = DialogResult.OK,
};
bottomPanel.Controls.AddRange(new Control[] {
applyButton,
new Button
{
Text = "Cancel",
DialogResult = DialogResult.Cancel,
},
});
tablePanel.Controls.Add(bottomPanel, 0, rows - 1);
tablePanel.SetColumnSpan(bottomPanel, columns);
IdPanel = new Panel
{
Dock = DockStyle.Fill,
};
IdText = new TextBox
{
ReadOnly = true,
BorderStyle = BorderStyle.None,
BackColor = this.BackColor,
TabStop = false,
TextAlign = HorizontalAlignment.Center,
Dock = DockStyle.Fill,
};
IdPanel.Controls.Add(IdText);
IdPanel.Controls.Add(new Label
{
// divider
Height = 2,
BorderStyle = BorderStyle.Fixed3D,
AutoSize = false,
Text = string.Empty,
Dock = DockStyle.Bottom,
});
tablePanel.Controls.Add(IdPanel, 1, 1);
tablePanel.SetColumnSpan(IdPanel, 2);
NumericUpDown MakeNumericInput(int val = 0, int min = 0, int max = 999999)
{
return new NumericUpDown
{
Value = val,
Minimum = min,
Maximum = max,
Dock = DockStyle.Fill,
Anchor = AnchorStyles.Left,
AutoSize = true,
};
}
CheckBox MakeCheck()
{
return new CheckBox
{
Text = string.Empty,
AutoSize = true,
Anchor = AnchorStyles.Left,
};
}
DpiInput = MakeNumericInput();
RateInput = MakeNumericInput();
DisableCheck = MakeCheck();
OverrideCheck = MakeCheck();
tablePanel.Controls.Add(OverrideLabel, 1, 2);
tablePanel.Controls.Add(OverrideCheck, 2, 2);
tablePanel.Controls.Add(DisableLabel, 1, 3);
tablePanel.Controls.Add(DisableCheck, 2, 3);
tablePanel.Controls.Add(DpiLabel, 1, 5);
tablePanel.Controls.Add(DpiInput, 2, 5);
tablePanel.Controls.Add(RateLabel, 1, 6);
tablePanel.Controls.Add(RateInput, 2, 6);
DeviceSelect = new ListBox
{
Dock = DockStyle.Fill,
IntegralHeight = false,
HorizontalScrollbar = true
};
tablePanel.Controls.Add(DeviceSelect, 0, 1);
tablePanel.SetRowSpan(DeviceSelect, middleRowCount);
ResetDataAndSelection();
SetEnabled(false);
SetVisible(false);
applyButton.Click += ApplyButton_Click;
OverrideCheck.Click += OverrideCheck_Click;
OverrideCheck.CheckedChanged += OverrideCheck_Checked;
DefaultDisableCheck.CheckedChanged += DefaultDisableCheck_Checked;
IdText.DoubleClick += SelectAllText;
DeviceSelect.SelectedIndexChanged += DeviceSelect_SelectedIndexChanged;
Manager.DeviceChange += OnDeviceChange;
Disposed += OnDispose;
var toolTip = new ToolTip();
toolTip.SetToolTip(IdText, "Device ID");
var rateTip = "Keep at 0 for automatic adjustment";
toolTip.SetToolTip(RateInput, rateTip);
toolTip.SetToolTip(RateLabel, rateTip);
var dpiTip = "Normalizes sensitivity and input speed to 1000 DPI";
toolTip.SetToolTip(DpiInput, dpiTip);
toolTip.SetToolTip(DpiLabel, dpiTip);
Name = "DeviceMenuForm";
Text = "Devices";
MaximizeBox = false;
MinimizeBox = false;
FormBorderStyle = FormBorderStyle.FixedDialog;
StartPosition = FormStartPosition.CenterParent;
AutoScaleDimensions = new SizeF(6F, 13F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(500, 300);
Controls.Add(tablePanel);
tablePanel.ResumeLayout(false);
ResumeLayout(false);
}
#endregion Constructors
#region Fields
public DeviceConfig defaultConfig;
#endregion Fields
#region Properties
public DeviceDialogItem[] Items { get; private set; }
private DeviceDialogItem Selected
{
get => (DeviceDialogItem)DeviceSelect.SelectedItem;
}
private bool AnySelected
{
get => DeviceSelect.SelectedIndex != -1;
}
private int LastSelectedIndex { get; set; }
private SettingsManager Manager { get; }
private ListBox DeviceSelect { get; }
private CheckBox DefaultDisableCheck { get; }
private TextBox IdText { get; }
private Panel IdPanel { get; }
private Label OverrideLabel { get; }
private CheckBox OverrideCheck { get; }
private Label DisableLabel { get; }
private CheckBox DisableCheck { get; }
private Label DpiLabel { get; }
private NumericUpDown DpiInput { get; }
private Label RateLabel { get; }
private NumericUpDown RateInput { get; }
#endregion Properties
#region Methods
private void ResetDataAndSelection()
{
var count = Manager.SystemDevices.Count;
Items = new DeviceDialogItem[count];
for (int i = 0; i < count; i++)
{
var sysDev = Manager.SystemDevices[i];
var settings = Manager.UserConfig.devices.Find(s => s.id == sysDev.id);
bool found = !(settings is null);
Items[i] = new DeviceDialogItem
{
device = sysDev,
overrideDefaultConfig = found,
oldSettings = settings,
newConfig = found ?
settings.config :
Manager.UserConfig.defaultDeviceConfig,
newProfile = found ?
settings.profile :
Manager.UserConfig.profiles[0].name
};
}
LastSelectedIndex = -1;
DeviceSelect.ClearSelected();
DeviceSelect.Items.Clear();
DeviceSelect.Items.AddRange(Items);
}
private void SetVisible(bool visible)
{
IdPanel.Visible = visible;
OverrideLabel.Visible = visible;
OverrideCheck.Visible = visible;
DisableLabel.Visible = visible;
DisableCheck.Visible = visible;
DpiInput.Visible = visible;
DpiLabel.Visible = visible;
RateInput.Visible = visible;
RateLabel.Visible = visible;
}
private void SetEnabled(bool enable)
{
DisableLabel.Enabled = enable;
DisableCheck.Enabled = enable;
DpiInput.Enabled = enable;
DpiLabel.Enabled = enable;
RateInput.Enabled = enable;
RateLabel.Enabled = enable;
}
private void SetInputsFromNewSelection()
{
IdText.Text = Selected.device.id;
OverrideCheck.Checked = Selected.overrideDefaultConfig;
SetOverrideDependentInputs();
}
private void SetOverrideDependentInputs()
{
var item = Selected;
bool oride = item.overrideDefaultConfig;
DisableCheck.Checked = oride ? item.newConfig.disable : defaultConfig.disable;
DpiInput.Value = oride ? item.newConfig.dpi : defaultConfig.dpi;
RateInput.Value = oride ? item.newConfig.pollingRate : defaultConfig.pollingRate;
}
private void UpdateLastSelected()
{
var item = Items[LastSelectedIndex];
bool oride = OverrideCheck.Checked;
item.overrideDefaultConfig = oride;
item.newConfig.disable = oride ? DisableCheck.Checked : defaultConfig.disable;
item.newConfig.dpi = oride ? (int)DpiInput.Value : defaultConfig.dpi;
item.newConfig.pollingRate = oride ? (int)RateInput.Value : defaultConfig.pollingRate;
}
private void ApplyButton_Click(object sender, EventArgs e)
{
if (AnySelected) UpdateLastSelected();
}
private void OverrideCheck_Checked(object sender, EventArgs e)
{
SetEnabled(OverrideCheck.Checked);
}
private void OverrideCheck_Click(object sender, EventArgs e)
{
UpdateLastSelected();
SetOverrideDependentInputs();
}
private void DefaultDisableCheck_Checked(object sender, EventArgs e)
{
defaultConfig.disable = DefaultDisableCheck.Checked;
if (AnySelected && !Selected.overrideDefaultConfig)
{
DisableCheck.Checked = DefaultDisableCheck.Checked;
}
}
private void DeviceSelect_SelectedIndexChanged(object sender, EventArgs e)
{
if (AnySelected)
{
if (LastSelectedIndex != -1)
{
UpdateLastSelected();
}
SetInputsFromNewSelection();
}
LastSelectedIndex = DeviceSelect.SelectedIndex;
SetVisible(AnySelected);
}
private void OnDeviceChange(object sender, EventArgs e)
{
ResetDataAndSelection();
}
private void OnDispose(object sender, EventArgs e)
{
Manager.DeviceChange -= OnDeviceChange;
}
private static void SelectAllText(object sender, EventArgs e)
{
((TextBoxBase)sender).SelectAll();
}
#endregion Methods
}
}