rawaccel/grapher/Models/AccelGUI.cs
a1xd ff70490904 update SettingsManager
load active config from driver only when necessary

ignore devices that aren't running the active profile (in mousewatcher)
2021-09-07 19:53:00 -04:00

254 lines
7.5 KiB
C#

using grapher.Models.Calculations;
using grapher.Models.Devices;
using grapher.Models.Mouse;
using grapher.Models.Options;
using grapher.Models.Serialized;
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace grapher
{
public class AccelGUI
{
#region Constructors
public AccelGUI(
RawAcceleration accelForm,
AccelCalculator accelCalculator,
AccelCharts accelCharts,
SettingsManager settings,
ApplyOptions applyOptions,
Button writeButton,
ButtonBase toggleButton,
MouseWatcher mouseWatcher,
ToolStripMenuItem scaleMenuItem)
{
AccelForm = accelForm;
AccelCalculator = accelCalculator;
AccelCharts = accelCharts;
ApplyOptions = applyOptions;
WriteButton = writeButton;
DisableButton = (CheckBox)toggleButton;
ScaleMenuItem = scaleMenuItem;
Settings = settings;
DefaultButtonFont = WriteButton.Font;
SmallButtonFont = new Font(WriteButton.Font.Name, WriteButton.Font.Size * Constants.SmallButtonSizeFactor);
MouseWatcher = mouseWatcher;
ScaleMenuItem.Click += new System.EventHandler(OnScaleMenuItemClick);
WriteButton.Click += new System.EventHandler(OnWriteButtonClick);
DisableButton.Click += new System.EventHandler(DisableDriverEventHandler);
AccelForm.FormClosing += new FormClosingEventHandler(SaveGUISettingsOnClose);
ButtonTimerInterval = Convert.ToInt32(DriverConfig.WriteDelayMs);
ButtonTimer = new Timer();
ButtonTimer.Tick += new System.EventHandler(OnButtonTimerTick);
ChartRefresh = SetupChartTimer();
RefreshUser();
RefreshActive();
SetupButtons();
// TODO: The below removes an overlapping form from the anisotropy panel.
// Figure out why and remove the overlap and below.
ApplyOptions.Directionality.Show();
ApplyOptions.Directionality.Hide();
}
#endregion Constructors
#region Properties
public RawAcceleration AccelForm { get; }
public AccelCalculator AccelCalculator { get; }
public AccelCharts AccelCharts { get; }
public SettingsManager Settings { get; }
public ApplyOptions ApplyOptions { get; }
public Button WriteButton { get; }
public CheckBox DisableButton { get; }
public Timer ButtonTimer { get; }
public MouseWatcher MouseWatcher { get; }
public ToolStripMenuItem ScaleMenuItem { get; }
private Timer ChartRefresh { get; }
private Font SmallButtonFont { get; }
private Font DefaultButtonFont { get; }
private bool SettingsNotDefault { get; set; }
private bool LastToggleChecked { get; set; }
private int ButtonTimerInterval { get; }
#endregion Properties
#region Methods
private void SaveGUISettingsOnClose(Object sender, FormClosingEventArgs e)
{
var guiSettings = Settings.MakeGUISettingsFromFields();
if (!Settings.GuiSettings.Equals(guiSettings))
{
guiSettings.Save();
}
}
public void UpdateActiveSettingsFromFields()
{
var settings = new Profile();
settings.rotation = ApplyOptions.Rotation.Field.Data;
settings.sensitivity = ApplyOptions.Sensitivity.Fields.X;
// TODO - separate sensitivity fields, add new label for ratio
settings.yxSensRatio = ApplyOptions.Sensitivity.Fields.Y;
settings.combineMagnitudes = ApplyOptions.IsWhole;
ApplyOptions.SetArgs(ref settings.argsX, ref settings.argsY);
var (domWeights, lpNorm) = ApplyOptions.Directionality.GetDomainArgs();
settings.domainXY = domWeights;
settings.lpNorm = lpNorm;
settings.rangeXY = ApplyOptions.Directionality.GetRangeXY();
Settings.SetHiddenOptions(settings);
ButtonDelay(WriteButton);
if (!Settings.TryActivate(settings, out string errors))
{
new MessageDialog(errors, "bad input").ShowDialog();
}
else
{
RefreshActive();
}
}
public void RefreshActive()
{
UpdateShownActiveValues(Settings.ActiveProfile);
UpdateGraph();
}
public void RefreshUser()
{
UpdateShownActiveValues(Settings.UserProfile);
}
public void UpdateGraph()
{
AccelCharts.Calculate(Settings.ActiveAccel, Settings.ActiveProfile);
AccelCharts.Bind();
}
public void UpdateShownActiveValues(Profile args)
{
AccelForm.ResetAutoScroll();
AccelCharts.ShowActive(args);
ApplyOptions.SetActiveValues(args);
}
private Timer SetupChartTimer()
{
Timer chartTimer = new Timer();
chartTimer.Enabled = true;
chartTimer.Interval = 10;
chartTimer.Tick += new System.EventHandler(OnChartTimerTick);
return chartTimer;
}
private void SetupButtons()
{
WriteButton.Top = Constants.SensitivityChartAloneHeight - Constants.ButtonVerticalOffset;
DisableButton.Appearance = Appearance.Button;
DisableButton.FlatStyle = FlatStyle.System;
DisableButton.TextAlign = ContentAlignment.MiddleCenter;
DisableButton.Size = WriteButton.Size;
DisableButton.Top = WriteButton.Top;
SetButtonDefaults();
}
private void SetButtonDefaults()
{
DisableButton.Font = DefaultButtonFont;
DisableButton.Text = "Disable";
DisableButton.Enabled = true;
DisableButton.Update();
WriteButton.Font = DefaultButtonFont;
WriteButton.Text = Constants.WriteButtonDefaultText;
WriteButton.Enabled = true;
WriteButton.Update();
}
private void OnScaleMenuItemClick(object sender, EventArgs e)
{
UpdateGraph();
}
private void OnWriteButtonClick(object sender, EventArgs e)
{
UpdateActiveSettingsFromFields();
}
private void DisableDriverEventHandler(object sender, EventArgs e)
{
ButtonDelay(DisableButton);
Settings.DisableDriver();
RefreshActive();
}
private void OnButtonTimerTick(object sender, EventArgs e)
{
ButtonTimer.Stop();
SetButtonDefaults();
}
private void StartButtonTimer()
{
ButtonTimer.Interval = ButtonTimerInterval;
ButtonTimer.Start();
}
private void ButtonDelay(ButtonBase btn)
{
DisableButton.Enabled = false;
WriteButton.Enabled = false;
btn.Font = SmallButtonFont;
btn.Text = $"{Constants.ButtonDelayText} : {ButtonTimerInterval} ms";
DisableButton.Update();
WriteButton.Update();
StartButtonTimer();
}
private void OnChartTimerTick(object sender, EventArgs e)
{
AccelCharts.DrawLastMovement();
MouseWatcher.UpdateLastMove();
}
#endregion Methods
}
}