Skip to content

Commit

Permalink
tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
retailcoder committed Mar 24, 2024
1 parent 298c67d commit 396f19d
Show file tree
Hide file tree
Showing 22 changed files with 298 additions and 94 deletions.
2 changes: 1 addition & 1 deletion Client/Rubberduck.Editor/NLog-editor.config
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="file" />
<logger name="*" minlevel="Debug" writeTo="file" />
<logger name="*" minlevel="Warn" writeTo="fileAsException" />
</rules>
</nlog>
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
using Rubberduck.InternalApi.Extensions;
using Rubberduck.InternalApi.ServerPlatform.LanguageServer;
using Rubberduck.InternalApi.Settings.Model.Editor;
using Rubberduck.UI.Command.SharedHandlers;
using Rubberduck.UI.Shell.Document;
using Rubberduck.UI.Shell.StatusBar;
Expand Down Expand Up @@ -40,6 +41,7 @@ public DocumentTabViewModel(DocumentState state, bool isReadOnly,
_lsp = lsp;

Title = state.Name;
SettingKey = nameof(EditorSettings);

DocumentState = state;
TextContent = state.Text;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using OmniSharp.Extensions.LanguageServer.Protocol.Client;
using Rubberduck.InternalApi.Extensions;
using Rubberduck.InternalApi.ServerPlatform.LanguageServer;
using Rubberduck.InternalApi.Settings.Model.Editor;
using Rubberduck.UI.Command.SharedHandlers;
Expand All @@ -21,7 +20,7 @@ public MarkdownDocumentTabViewModel(DocumentState state, bool isReadOnly,
Func<ILanguageClient> lsp)
: base(state, isReadOnly, showSettingsCommand, closeToolWindowCommand, activeDocumentStatus, lsp)
{
SettingKey = nameof(EditorSettings);
SettingKey = nameof(ShowWelcomeTabSetting);
}

public override SupportedDocumentType DocumentType => SupportedDocumentType.MarkdownDocument;
Expand Down
1 change: 1 addition & 0 deletions Client/Rubberduck.UI/Command/Abstract/CommandBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public bool CanExecute(object? parameter)

public void Execute(object? parameter)
{
_service.LogDebug($"Executing command: {GetType().Name}");
_service.TryRunAction(() =>
{
_ = OnExecuteAsync(parameter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ protected async override Task OnExecuteAsync(object? parameter)
if (parameter is ILanguageServerTraceViewModel)
{
path = Service.Settings.LanguageServerSettings.StartupSettings.ServerExecutablePath;
if (!_fileSystem.Directory.Exists(path))
{
path = null;
}
}
// TODO parameter is IUpdateServerTraceViewModel, ITelemetryServerTraceViewModel

Expand All @@ -39,7 +43,7 @@ protected async override Task OnExecuteAsync(object? parameter)
Key = nameof(OpenLogFileCommand) + "_NoServerPath",
Level = LogLevel.Error,
Title = "Invalid Configuration",
Message = "**ServerExecutablePath** configuration is unexpectedly null; could not locate log directory.",
Message = "ServerExecutablePath configuration is invalid; could not locate log directory.",
});
return;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Rubberduck.InternalApi.Settings.Model;
using Rubberduck.Resources.v3;
using Rubberduck.UI.Command.Abstract;
using Rubberduck.UI.Services;
using Rubberduck.UI.Services.Settings;
using Rubberduck.UI.Shared.Message;

namespace Rubberduck.UI.Command.SharedHandlers
{
public class ShowRubberduckSettingsCommand : CommandBase
{
private readonly ISettingsDialogService _settingsDialog;
private readonly IMessageService _message;

public ShowRubberduckSettingsCommand(UIServiceHelper service, ISettingsDialogService settingsDialog)
public ShowRubberduckSettingsCommand(UIServiceHelper service,
ISettingsDialogService settingsDialog,
IMessageService message)
: base(service)
{
_settingsDialog = settingsDialog;
_message = message;
}

protected async override Task OnExecuteAsync(object? parameter)
Expand All @@ -26,21 +35,45 @@ protected async override Task OnExecuteAsync(object? parameter)
}
else
{
if (!_settingsDialog.ShowDialog(out vm))
if (!_settingsDialog.ShowDialog(out vm)
|| vm?.SelectedAction is null
|| vm.SelectedAction == MessageAction.CancelAction)
{
return;
}
}

if (vm != null)
if (vm?.SelectedAction?.IsDefaultAction == true)
{
var model = (RubberduckSettings)vm.Settings.ToSetting();
Service.SettingsProvider.Write(model);
}
else
{
// how?
Debug.Assert(false);
var oldSettings = Service.SettingsProvider.Settings;
var newSettings = (RubberduckSettings)vm.Settings.ToSetting();
var diff = oldSettings.Diff(newSettings);

if (diff.Any())
{
Service.SettingsProvider.Write(newSettings);

var details = new StringBuilder();
foreach (var item in diff)
{
var itemTitle = SettingsUI.ResourceManager.GetString($"{item.Key}_Title");
if (item.SettingDataType == SettingDataType.ListSetting)
{
var nbReferenceValues = item.ReferenceValue is null ? 0 : ((object[])item.ReferenceValue.Value!).Length;
var nbComparableValues = item.ComparableValue is null ? 0 : ((object[])item.ComparableValue.Value!).Length;
details.AppendLine($"•{itemTitle}: {nbReferenceValues} items -> {nbComparableValues} items");
}
else
{
details.AppendLine($"•{itemTitle}: {item.ReferenceValue?.Value ?? "(added)"} -> {item.ComparableValue?.Value ?? "(removed)"}");
}
}

var msgKey = "SettingsSaved";
var message = SettingsUI.ResourceManager.GetString($"{msgKey}_Message") ?? $"[missing key:{msgKey}_Message]";
var title = SettingsUI.ResourceManager.GetString($"{msgKey}_Title") ?? $"[missing key:{msgKey}_Title]";
_message.ShowMessage(new() { Key = msgKey, Level = LogLevel.Information, Title = title, Message = message, Verbose = $"Modified settings:\n{details}" });
}
}
}
}
Expand Down
100 changes: 52 additions & 48 deletions Client/Rubberduck.UI/Services/Settings/SettingsDialogService.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
using Microsoft.Extensions.Logging;
using Rubberduck.UI.Shared.Settings;
using Rubberduck.UI.Shared.Message;
using Rubberduck.UI.Windows;
using System;
using System.Linq;
using Rubberduck.InternalApi.Services;
using Rubberduck.InternalApi.Settings;
using Rubberduck.InternalApi.Settings.Model;
using Rubberduck.InternalApi.Services;
using Rubberduck.UI.Shared.Settings.Abstract;
using Rubberduck.UI.Chrome;
using Rubberduck.UI.Shared.Message;
using Rubberduck.UI.Shared.Settings;
using Rubberduck.UI.Shared.Settings.Abstract;
using Rubberduck.UI.Windows;
using System.Linq;

namespace Rubberduck.UI.Services.Settings
{
Expand Down Expand Up @@ -45,62 +44,67 @@ public SettingsDialogService(ILogger<SettingsDialogService> logger,
_factory = factory;
}

protected override SettingsWindowViewModel CreateViewModel(RubberduckSettings settings, MessageActionsProvider actions)
{
var vm = new SettingsWindowViewModel(_service, actions.OkCancel(), _chrome, _messageService, _vmFactory);
return vm;
}
protected override SettingsWindowViewModel CreateViewModel(RubberduckSettings settings, MessageActionsProvider actions) =>
new(_service, actions.OkCancel(), _chrome, _messageService, _vmFactory);

private ISettingGroupViewModel GetSettingGroup(string key)
private SettingsWindowViewModel SetViewModelState(SettingsWindowViewModel vm, string key)
{
var flattened = Settings.Flatten();

// if the key is a top-level setting group, we return it immediately
// because there is no need to figure out the parent.
var groups = Settings.TypedValue.OfType<TypedSettingGroup>().ToDictionary(e => e.Key, e => e);
if (groups.TryGetValue(key, out var settingGroup))
{
return _vmFactory.CreateViewModel(settingGroup);
}
var keyItem = vm.FlattenedSettings?.SingleOrDefault(e => e.Key == key);

// first find the key we're looking for
var item = flattened.Single(e => e.Key == key);
if (keyItem is ISettingGroupViewModel keySettingGroup)
{
var parent = vm.FlattenedSettings?.OfType<ISettingGroupViewModel>()
.SingleOrDefault(e => e.Key == keyItem.SettingGroupKey);
vm.Selection = parent!;

// now find its parent
var parent = flattened.OfType<TypedSettingGroup>().SingleOrDefault(e => e.TypedValue.Any(e => e.Key == key));
var parentViewModel = (ISettingGroupViewModel)CreateViewModel(Settings, _actionsProvider);
keySettingGroup.IsExpanded = true;
vm.Selection = keySettingGroup;
}
else
{
var settingGroup = vm.FlattenedSettings?
.OfType<ISettingGroupViewModel>()
.SingleOrDefault(e => e.Key == keyItem?.SettingGroupKey);
vm.Selection = settingGroup ?? vm.Settings;
}

// push parent to nav stack, then push vm
return parentViewModel;
return vm;
}

public SettingsWindowViewModel ShowDialog(string key)
{
SettingsWindowViewModel viewModel = default!;
SettingsWindow view = default!;

var actions = _actionsProvider;
var verbosity = TraceLevel;
var viewModel = CreateViewModel(Settings, _actionsProvider);
SetViewModelState(viewModel, key);

if (TryRunAction(() =>
{
viewModel = CreateViewModel(Settings, actions)
?? throw new InvalidOperationException($"CreateViewModel returned null.");

var settingGroup = viewModel.Settings.Items.OfType<ISettingGroupViewModel>()
.Select(e => (VM: e, e.Key)).SingleOrDefault(e => e.Key == key).VM;
var view = CreateDialog(viewModel);
return ShowDialog(view, viewModel);
}

viewModel.Selection = settingGroup ?? viewModel.Settings;
private SettingsWindow CreateDialog(SettingsWindowViewModel viewModel) => _factory.Create(viewModel);

view = _factory.Create(viewModel)
?? throw new InvalidOperationException($"ViewFactory.Create returned null.");
}))
private SettingsWindowViewModel ShowDialog(SettingsWindow view, SettingsWindowViewModel viewModel)
{
if (!TryRunAction(() => view.ShowDialog(), out var exception) && exception != null)
{
TryRunAction(() => view.ShowDialog());
return viewModel;
_messageService.ShowError($"{GetType().Name}.{nameof(ShowDialog)}", exception);
}
else
{
LogDebug($"Dialog was closed. Selected action: {viewModel.SelectedAction?.ResourceKey ?? "(none)"}");
}

return viewModel;
}

throw new InvalidOperationException();
protected override void OnDialogAccept(SettingsWindowViewModel model)
{
LogInformation($"{GetType().Name}: User accepts dialog action.");
}

protected override void OnDialogCancel(SettingsWindowViewModel model)
{
LogInformation($"{GetType().Name}: User cancels dialog action.");
model.SelectedAction = MessageAction.CancelAction;
}
}
}
24 changes: 18 additions & 6 deletions Client/Rubberduck.UI/Services/Settings/SettingsWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ public SettingsWindowViewModel(UIServiceHelper service, MessageActionCommand[] a
_factory = factory;
_service = service;

SettingGroups = factory.CreateViewModel(service.Settings).Items.OfType<ISettingGroupViewModel>().ToList();

ShowSettingsCommand = new DelegateCommand(service, parameter => ResetToDefaults());
service.RunOnMainThread(() => Settings = _factory.CreateViewModel(_service.Settings));
service.RunOnMainThread(() => Settings = factory.CreateViewModel(service.Settings));
SettingGroups = Settings.Items.OfType<ISettingGroupViewModel>().ToList();
Selection = SettingGroups.FirstOrDefault()!;

ExpandSettingGroupCommand = new DelegateCommand(service, parameter =>
{
Expand All @@ -57,13 +56,20 @@ public SettingsWindowViewModel(UIServiceHelper service, MessageActionCommand[] a
});
ClearSearchTextCommand = new DelegateCommand(service, parameter =>
{
Selection.SearchString = null!;
if (Selection != null)
{
Selection.SearchString = null!;
}
});
var searchCommand = new DelegateCommand(service, parameter =>
{
if (parameter is string text)
{
var results = _flattenedSettings ??= Flatten(_settings!).ToList();
if (_flattenedSettings is null)
{
_flattenedSettings = Flatten(_settings!).ToList();
}
var results = _flattenedSettings;
var filteredResults = results.Where(e => e.IsSearchResult(text)).ToList();
var vm = new SettingGroupViewModel(service.Settings.WithKey("SearchResults"), filteredResults);
vm.SearchString = text;
Expand All @@ -83,24 +89,30 @@ public SettingsWindowViewModel(UIServiceHelper service, MessageActionCommand[] a
private IEnumerable<ISettingViewModel>? _flattenedSettings;
private static IEnumerable<ISettingViewModel> Flatten(ISettingGroupViewModel group)
{
group.SettingGroupKey = group.Key;
var results = new HashSet<ISettingViewModel>();
foreach (var item in group.Items.Where(e => e is not ISettingGroupViewModel))
{
item.SettingGroupKey = group.Key;
results.Add(item);
}
foreach (var subgroup in group.Items.OfType<ISettingGroupViewModel>())
{
subgroup.SettingGroupKey = group.Key;
results.Add(subgroup);

var flattenedSubgroup = Flatten(subgroup); // recursive
foreach (var item in flattenedSubgroup)
{
item.SettingGroupKey = subgroup.Key;
results.Add(item);
}
}
return results;
}

public IEnumerable<ISettingViewModel> FlattenedSettings => _flattenedSettings ??= Flatten(_settings!).ToList();

public override IEnumerable<CommandBinding> CommandBindings { get; }

public bool ShowPinButton => false;
Expand Down
4 changes: 4 additions & 0 deletions Client/Rubberduck.UI/Shared/Message/OokiiMessageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public void ShowError(string key, Exception exception, LogLevel level = LogLevel
};

dialog.Buttons.Add(new TaskDialogButton(ButtonType.Ok));

Logger.LogInformation("Showing error message key {key}", key);
dialog.ShowDialog();

if (dialog.IsVerificationChecked)
Expand Down Expand Up @@ -151,6 +153,7 @@ public MessageActionResult ShowMessage(MessageModel model, Func<MessageActionsPr
}
}

Logger.LogInformation("Showing message key {key}", model.Key);
var result = dialog.ShowDialog();
if (result != null)
{
Expand Down Expand Up @@ -224,6 +227,7 @@ public MessageActionResult ShowMessageRequest(MessageRequestModel model, Func<Me
}
}

Logger.LogInformation("Showing message prompt key {key}", model.Key);
var result = dialog.ShowDialog();
if (result != null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ protected EnumValueSettingViewModel(RubberduckSetting setting)
public SettingDataType SettingDataType => _setting.SettingDataType;
public bool IsSettingGroup => false;
public string Key => _setting.Key;
public string SettingGroupKey { get; set; }
public string Name => SettingsUI.ResourceManager.GetString($"{_setting.Key}_Title")!;
public string Description => SettingsUI.ResourceManager.GetString($"{_setting.Key}_Description")!;
public SettingTags Tags => _setting.Tags;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,7 @@ public interface ISettingGroupViewModel : ISettingViewModel, ISearchable
ObservableCollection<ISettingViewModel> Items { get; }
bool IsExpanded { get; set; }
string SearchString { get; set; }

ISettingViewModel Selection { get; set; }
}
}
Loading

0 comments on commit 396f19d

Please sign in to comment.