using GsConfigTool.Helpers; using GsConfigTool.Models; using GsConfigTool.Services; using System.Collections.ObjectModel; using System.Windows.Input; namespace GsConfigTool.ViewModels; public class MainViewModel : BaseViewModel { private readonly DatabaseService _db; private BaseViewModel? _currentPage; private string _currentPageName = "Home"; private ServerProject? _activeProject; public MainViewModel() { _db = new DatabaseService(); _ = InitAsync(); NavigateHomeCommand = new RelayCommand(() => NavigateTo("Home")); NavigateProjectsCommand = new RelayCommand(() => NavigateTo("Projects")); OpenProjectCommand = new RelayCommand(OpenProject); NewArkSECommand = new RelayCommand(() => NavigateTo("ArkSE")); NewArkSACommand = new RelayCommand(() => NavigateTo("ArkSA")); NewPalworldCommand = new RelayCommand(() => NavigateTo("Palworld")); } public BaseViewModel? CurrentPage { get => _currentPage; set => SetField(ref _currentPage, value); } public string CurrentPageName { get => _currentPageName; set => SetField(ref _currentPageName, value); } public ServerProject? ActiveProject { get => _activeProject; set => SetField(ref _activeProject, value); } public ICommand NavigateHomeCommand { get; } public ICommand NavigateProjectsCommand { get; } public ICommand OpenProjectCommand { get; } public ICommand NewArkSECommand { get; } public ICommand NewArkSACommand { get; } public ICommand NewPalworldCommand { get; } private async Task InitAsync() { await _db.InitializeAsync(); NavigateTo("Home"); } public void NavigateTo(string page, object? parameter = null) { CurrentPageName = page; CurrentPage = page switch { "Home" => new HomeViewModel(this), "Projects" => new ProjectsViewModel(_db, this), "ArkSE" => new ArkConfigViewModel(_db, this, GameType.ArkSurvivalEvolved, parameter as ServerProject), "ArkSA" => new ArkConfigViewModel(_db, this, GameType.ArkSurvivalAscended, parameter as ServerProject), "Palworld" => new PalworldConfigViewModel(_db, this, parameter as ServerProject), _ => new HomeViewModel(this) }; } public void OpenProject(ServerProject? project) { if (project == null) return; ActiveProject = project; NavigateTo(project.Game switch { GameType.ArkSurvivalEvolved => "ArkSE", GameType.ArkSurvivalAscended => "ArkSA", GameType.Palworld => "Palworld", _ => "Home" }, project); } } public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func? _canExecute; public RelayCommand(Action execute, Func? canExecute = null) { _execute = execute; _canExecute = canExecute; } public event EventHandler? CanExecuteChanged { add => System.Windows.Input.CommandManager.RequerySuggested += value; remove => System.Windows.Input.CommandManager.RequerySuggested -= value; } public bool CanExecute(object? parameter) => _canExecute?.Invoke((T?)parameter) ?? true; public void Execute(object? parameter) => _execute((T?)parameter); }