MainViewModel.cs 3.4 KB
git clone https://xarmina.eu/git/gsconfigtool Raw Download
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<ServerProject>(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<T> : ICommand
{
    private readonly Action<T?> _execute;
    private readonly Func<T?, bool>? _canExecute;

    public RelayCommand(Action<T?> execute, Func<T?, bool>? 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);
}
24Fire Wuppertaler Tafel Romeo