diff options
| author | a1xd <[email protected]> | 2021-09-24 02:04:43 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-09-24 02:04:43 -0400 |
| commit | 2896b8a09ce42e965705c58593b8738adc454f7f (patch) | |
| tree | 71e4d0cff60b5a1ad11427d78e1f8c7b775e5690 /grapher/DeviceMenuForm.cs | |
| parent | Merge pull request #107 from a1xd/1.5.0-fix (diff) | |
| parent | make note clearer (diff) | |
| download | rawaccel-dark-mode.tar.xz rawaccel-dark-mode.zip | |
v1.6
Diffstat (limited to 'grapher/DeviceMenuForm.cs')
| -rw-r--r-- | grapher/DeviceMenuForm.cs | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/grapher/DeviceMenuForm.cs b/grapher/DeviceMenuForm.cs new file mode 100644 index 0000000..dd946f4 --- /dev/null +++ b/grapher/DeviceMenuForm.cs @@ -0,0 +1,405 @@ +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 + } +} |