using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reactive; using System.Threading; using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.LayerBrushes; using Artemis.Core.Services; using Artemis.UI.Avalonia.Services.Interfaces; using Artemis.UI.Avalonia.Shared; using ReactiveUI; using Serilog.Events; namespace Artemis.UI.Avalonia.Screens.Settings.Tabs.ViewModels { public class GeneralTabViewModel : ActivatableViewModelBase { private readonly PluginSetting _defaultLayerBrushDescriptor; private readonly ISettingsService _settingsService; private readonly IDebugService _debugService; public GeneralTabViewModel(ISettingsService settingsService, IPluginManagementService pluginManagementService, IDebugService debugService) { DisplayName = "General"; _settingsService = settingsService; _debugService = debugService; List layerBrushProviders = pluginManagementService.GetFeaturesOfType(); LayerBrushDescriptors = new ObservableCollection(layerBrushProviders.SelectMany(l => l.LayerBrushDescriptors)); _defaultLayerBrushDescriptor = _settingsService.GetSetting("ProfileEditor.DefaultLayerBrushDescriptor", new LayerBrushReference { LayerBrushProviderId = "Artemis.Plugins.LayerBrushes.Color.ColorBrushProvider-92a9d6ba", BrushType = "SolidBrush" }); ShowLogs = ReactiveCommand.Create(ExecuteShowLogs); CheckForUpdate = ReactiveCommand.CreateFromTask(ExecuteCheckForUpdate); ShowSetupWizard = ReactiveCommand.Create(ExecuteShowSetupWizard); ShowDebugger = ReactiveCommand.Create(ExecuteShowDebugger); ShowDataFolder = ReactiveCommand.Create(ExecuteShowDataFolder); } public ReactiveCommand ShowLogs { get; } public ReactiveCommand CheckForUpdate { get; } public ReactiveCommand ShowSetupWizard { get; } public ReactiveCommand ShowDebugger { get; } public ReactiveCommand ShowDataFolder { get; } public ObservableCollection LayerBrushDescriptors { get; } public ObservableCollection GraphicsContexts { get; } = new() { "Software", "Vulkan" }; public ObservableCollection<(string, double)> RenderScales { get; } = new() { new ValueTuple("25%", 0.25), new ValueTuple("50%", 0.5), new ValueTuple("100%", 1) }; public ObservableCollection<(string, int)> TargetFrameRates { get; } = new() { new ValueTuple("10 FPS", 10), new ValueTuple("20 FPS", 20), new ValueTuple("30 FPS", 30), new ValueTuple("45 FPS", 45), new ValueTuple("60 FPS (lol)", 60), new ValueTuple("144 FPS (omegalol)", 144) }; public LayerBrushDescriptor? SelectedLayerBrushDescriptor { get => LayerBrushDescriptors.FirstOrDefault(d => d.MatchesLayerBrushReference(_defaultLayerBrushDescriptor.Value)); set { if (value != null) _defaultLayerBrushDescriptor.Value = new LayerBrushReference(value); } } public (string, double)? SelectedRenderScale { get => RenderScales.FirstOrDefault(s => Math.Abs(s.Item2 - CoreRenderScale.Value) < 0.01); set { if (value != null) CoreRenderScale.Value = value.Value.Item2; } } public (string, int)? SelectedTargetFrameRate { get => TargetFrameRates.FirstOrDefault(s => s.Item2 == CoreTargetFrameRate.Value); set { if (value != null) CoreTargetFrameRate.Value = value.Value.Item2; } } public PluginSetting UIAutoRun => _settingsService.GetSetting("UI.AutoRun", false); public PluginSetting UIAutoRunDelay => _settingsService.GetSetting("UI.AutoRunDelay", 15); public PluginSetting UIShowOnStartup => _settingsService.GetSetting("UI.ShowOnStartup", true); public PluginSetting UICheckForUpdates => _settingsService.GetSetting("UI.CheckForUpdates", true); public PluginSetting UIColorScheme => _settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic); public PluginSetting ProfileEditorShowDataModelValues => _settingsService.GetSetting("ProfileEditor.ShowDataModelValues", false); public PluginSetting CoreLoggingLevel => _settingsService.GetSetting("Core.LoggingLevel", LogEventLevel.Information); public PluginSetting CorePreferredGraphicsContext => _settingsService.GetSetting("Core.PreferredGraphicsContext", "Vulkan"); public PluginSetting CoreRenderScale => _settingsService.GetSetting("Core.RenderScale", 0.25); public PluginSetting CoreTargetFrameRate => _settingsService.GetSetting("Core.TargetFrameRate", 30); public PluginSetting WebServerPort => _settingsService.GetSetting("WebServer.Port", 9696); #region General private void ExecuteShowLogs() { OpenFolder(Constants.LogsFolder); } #endregion #region Updating private Task ExecuteCheckForUpdate(CancellationToken cancellationToken) { return Task.CompletedTask; } #endregion #region Tools private void ExecuteShowSetupWizard() { } private void ExecuteShowDebugger() { _debugService.ShowDebugger(); } private void ExecuteShowDataFolder() { OpenFolder(Constants.DataFolder); } #endregion private void OpenFolder(string path) { if (OperatingSystem.IsWindows()) { Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", path); } } } public enum ApplicationColorScheme { Light, Dark, Automatic } }