alterNERDtive-base: configuration GUI now has an “Apply” button

This commit is contained in:
alterNERDtive 2022-05-29 21:32:43 +02:00
parent e73b8c04f9
commit 999d2b6883
6 changed files with 103 additions and 36 deletions

View file

@ -1,5 +1,9 @@
# devel # devel
### Added
* The Configuration GUI now has an “Apply” button.
## EliteAttack 8.4 ## EliteAttack 8.4
### Added ### Added

View file

@ -0,0 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("StyleCop.CSharp.NamingRules", "SA1300:Element should begin with upper-case letter", Justification = "<Pending>", Scope = "namespace", Target = "~N:alterNERDtive")]

View file

@ -16,8 +16,9 @@
<TabItem Name="StreamAttack" Header="StreamAttack"></TabItem> <TabItem Name="StreamAttack" Header="StreamAttack"></TabItem>
</TabControl> </TabControl>
<WrapPanel VerticalAlignment="Bottom" HorizontalAlignment="Right"> <WrapPanel VerticalAlignment="Bottom" HorizontalAlignment="Right">
<Button Name="cancelButton" Click="cancelButton_Click" Padding="5" Margin="5">Cancel</Button> <Button Name="applyButton" Click="ApplyButton_Click" Padding="5" Margin="5">Apply</Button>
<Button Name="okButton" Click="okButton_Click" Padding="5" Margin="5">OK</Button> <Button Name="okButton" Click="OkButton_Click" Padding="5" Margin="5">Done</Button>
<Button Name="cancelButton" Click="CancelButton_Click" Padding="5" Margin="5">Cancel</Button>
</WrapPanel> </WrapPanel>
</StackPanel> </StackPanel>
</Grid> </Grid>

View file

@ -1,4 +1,23 @@
using System; // <copyright file="SettingsDialog.xaml.cs" company="alterNERDtive">
// Copyright 20192022 alterNERDtive.
//
// This file is part of alterNERDtive VoiceAttack profiles for Elite Dangerous.
//
// alterNERDtive VoiceAttack profiles for Elite Dangerous is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// alterNERDtive VoiceAttack profiles for Elite Dangerous is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with alterNERDtive VoiceAttack profiles for Elite Dangerous. If not, see &lt;https://www.gnu.org/licenses/&gt;.
// </copyright>
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -6,40 +25,34 @@ using System.Windows.Controls;
namespace alterNERDtive namespace alterNERDtive
{ {
/// <summary> /// <summary>
/// Interaction logic for SettingsDialog.xaml /// Interaction logic for SettingsDialog.xaml.
/// </summary> /// </summary>
public partial class SettingsDialog : UserControl public partial class SettingsDialog : UserControl
{ {
private struct Setting private readonly List<Setting> values = new List<Setting>();
{
public string Profile { get; }
public dynamic Option { get; }
public dynamic Value { get; }
public dynamic UiElement { get; }
public Setting(string profile, dynamic option, dynamic value, dynamic uiElement)
=> (Profile, Option, Value, UiElement) = (profile, option, value, uiElement);
}
private List<Setting> values = new List<Setting>();
private util.Configuration config; private util.Configuration config;
private util.VoiceAttackLog log; private util.VoiceAttackLog log;
/// <summary>
/// Initializes a new instance of the <see cref="SettingsDialog"/> class.
/// </summary>
/// <param name="config">The plugin Configuration.</param>
/// <param name="log">The plugin Log.</param>
public SettingsDialog(util.Configuration config, util.VoiceAttackLog log) public SettingsDialog(util.Configuration config, util.VoiceAttackLog log)
{ {
InitializeComponent(); this.InitializeComponent();
this.config = config; this.config = config;
this.log = log; this.log = log;
foreach (TabItem tab in tabs.Items) foreach (TabItem tab in this.tabs.Items)
{ {
string profile = tab.Name; string profile = tab.Name;
if (profile == "general") if (profile == "general")
{ {
profile = "alterNERDtive-base"; profile = "alterNERDtive-base";
} }
tab.IsEnabled = BasePlugin.IsProfileActive(profile); tab.IsEnabled = BasePlugin.IsProfileActive(profile);
StackPanel panel = new StackPanel(); StackPanel panel = new StackPanel();
@ -57,7 +70,7 @@ namespace alterNERDtive
checkBox.IsChecked = value; checkBox.IsChecked = value;
checkBox.VerticalAlignment = VerticalAlignment.Center; checkBox.VerticalAlignment = VerticalAlignment.Center;
row.Children.Add(checkBox); row.Children.Add(checkBox);
values.Add(new Setting(profile, option, value, checkBox)); this.values.Add(new Setting(profile, option, value, checkBox));
Label label = new Label(); Label label = new Label();
label.Content = option.Description; label.Content = option.Description;
@ -76,7 +89,7 @@ namespace alterNERDtive
TextBox input = new TextBox(); TextBox input = new TextBox();
input.Text = value.ToString(); input.Text = value.ToString();
row.Children.Add(input); row.Children.Add(input);
values.Add(new Setting(profile, option, value, input)); this.values.Add(new Setting(profile, option, value, input));
panel.Children.Add(row); panel.Children.Add(row);
} }
@ -86,17 +99,11 @@ namespace alterNERDtive
} }
} }
private void cancelButton_Click(object sender, RoutedEventArgs e) private bool ApplySettings()
{ {
Window.GetWindow(this).Close(); bool success = true;
log.Log("Settings dialog cancelled.", util.LogLevel.DEBUG);
}
private void okButton_Click(object sender, RoutedEventArgs reargs) foreach (Setting setting in this.values)
{
bool error = false;
foreach (Setting setting in values)
{ {
dynamic state = null; dynamic state = null;
@ -129,21 +136,51 @@ namespace alterNERDtive
if (state != setting.Value) if (state != setting.Value)
{ {
log.Log($@"Configuration changed via settings dialog: ""{setting.Profile}.{setting.Option.Name}"" → ""{state}""", util.LogLevel.DEBUG); this.log.Log($@"Configuration changed via settings dialog: ""{setting.Profile}.{setting.Option.Name}"" → ""{state}""", util.LogLevel.DEBUG);
config.SetConfig(setting.Profile, setting.Option.Name, state); this.config.SetConfig(setting.Profile, setting.Option.Name, state);
} }
} }
catch (Exception e) when (e is ArgumentNullException || e is FormatException || e is OverflowException) catch (Exception e) when (e is ArgumentNullException || e is FormatException || e is OverflowException)
{ {
log.Log($@"Invalid value for ""{setting.Profile}.{setting.Option.Name}"": ""{((TextBox)setting.UiElement).Text}""", util.LogLevel.ERROR); this.log.Log($@"Invalid value for ""{setting.Profile}.{setting.Option.Name}"": ""{((TextBox)setting.UiElement).Text}""", util.LogLevel.ERROR);
error = true; success = false;
} }
} }
if (!error) return success;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
Window.GetWindow(this).Close();
this.log.Log("Settings dialog cancelled.", util.LogLevel.DEBUG);
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
if (this.ApplySettings())
{ {
Window.GetWindow(this).Close(); Window.GetWindow(this).Close();
} }
} }
private void ApplyButton_Click(object sender, RoutedEventArgs reeargs)
{
this.ApplySettings();
}
private struct Setting
{
public Setting(string profile, dynamic option, dynamic value, dynamic uiElement)
=> (this.Profile, this.Option, this.Value, this.UiElement) = (profile, option, value, uiElement);
public string Profile { get; }
public dynamic Option { get; }
public dynamic Value { get; }
public dynamic UiElement { get; }
}
} }
} }

View file

@ -57,6 +57,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="base.cs" /> <Compile Include="base.cs" />
<Compile Include="edts.cs" /> <Compile Include="edts.cs" />
<Compile Include="GlobalSuppressions.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SettingsDialog.xaml.cs"> <Compile Include="SettingsDialog.xaml.cs">
<DependentUpon>SettingsDialog.xaml</DependentUpon> <DependentUpon>SettingsDialog.xaml</DependentUpon>
@ -73,4 +74,4 @@
</Page> </Page>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>

16
stylecop.json Normal file
View file

@ -0,0 +1,16 @@
{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"orderingRules": {
"usingDirectivesPlacement": "outsideNamespace"
},
"documentationRules": {
"companyName": "alterNERDtive",
"copyrightText": "Copyright {year} {companyName}.\n\nThis file is part of {application}.\n\n{application} is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\n{application} is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with {application}. If not, see <https://www.gnu.org/licenses/>.",
"variables": {
"application": "alterNERDtive VoiceAttack profiles for Elite Dangerous",
"year": "20192022"
}
}
}
}