Started UI Rework for target game setup, started adding a Game master record and a CSV Loader service
This commit is contained in:
		
							
								
								
									
										34
									
								
								Stars Assistant/Model/Game.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Stars Assistant/Model/Game.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
 | 
			
		||||
namespace StarsAssistant.Model;
 | 
			
		||||
 | 
			
		||||
public class Game (string gamePath, string baseName)
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The base path in which all game files reside.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public string GamePath { get; private set; } = gamePath;
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The base name without extensions of your game, inside the GamePath folder.
 | 
			
		||||
    /// All dependant files are resolved using this name.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public string BaseName { get; private set; } = baseName;
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The number of the player, for example identifying the pxx planet file.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public int PlayerId { get; private set; }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Combine into the DatabaseName
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public string DatabaseName => Path.Combine(GamePath, $"{BaseName}.sqlite");
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Search for Planet files using this pattern, will give you all pxx files.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public string PlanetFileSearchPattern => Path.Combine(GamePath, $"{BaseName}.p*");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -34,5 +34,10 @@ public class StarsDatabase(string DbPath) : DbContext
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public DbSet<Race> Race { get; set; }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The record with all game metadata, will only contain a single line at all times.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public DbSet<Game> Game { get; set; }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
}
 | 
			
		||||
@@ -21,6 +21,7 @@ sealed class Program
 | 
			
		||||
    public static void Main(string[] args) 
 | 
			
		||||
    {
 | 
			
		||||
        ModeDetector.OverrideModeDetector(Splat.ModeDetection.Mode.Run);
 | 
			
		||||
        
 | 
			
		||||
        Locator.CurrentMutable.Register(
 | 
			
		||||
            () => new StarsDatabase("stars.sqlite"),
 | 
			
		||||
            typeof(StarsDatabase)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								Stars Assistant/Services/CSVDataLoader.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Stars Assistant/Services/CSVDataLoader.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
using System;
 | 
			
		||||
using CsvHelper.Configuration;
 | 
			
		||||
using CsvHelper;
 | 
			
		||||
using Splat;
 | 
			
		||||
 | 
			
		||||
namespace StarsAssistant.Services;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CSVDataLoader
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Reference to the game metadata, retrieved by DI
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    protected Model.Game game;
 | 
			
		||||
 | 
			
		||||
    public CSVDataLoader()
 | 
			
		||||
    {
 | 
			
		||||
        game = Locator.Current.GetService<Model.Game>()!;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,8 @@ using System.Reactive.Disposables;
 | 
			
		||||
using System.Reactive.Linq;
 | 
			
		||||
using ReactiveUI;
 | 
			
		||||
using ReactiveUI.SourceGenerators;
 | 
			
		||||
using Splat;
 | 
			
		||||
using StarsAssistant.Model;
 | 
			
		||||
 | 
			
		||||
namespace StarsAssistant.ViewModels;
 | 
			
		||||
 | 
			
		||||
@@ -11,13 +13,13 @@ public partial class MainWindowViewModel : ViewModelBase, IActivatableViewModel
 | 
			
		||||
    public ViewModelActivator Activator { get; } = new ViewModelActivator();
 | 
			
		||||
 | 
			
		||||
    [ObservableAsProperty]
 | 
			
		||||
    private string _welcomeMessage;
 | 
			
		||||
    private string _dbPath = "";
 | 
			
		||||
 | 
			
		||||
    public MainWindowViewModel()
 | 
			
		||||
    {
 | 
			
		||||
        _welcomeMessage = "Lorem Ipsum";
 | 
			
		||||
        _welcomeMessageHelper = Observable.Return("Dolor sit amet")
 | 
			
		||||
            .ToProperty(this, x => x.WelcomeMessage);
 | 
			
		||||
        using var db = Locator.Current.GetService<StarsDatabase>()!;
 | 
			
		||||
        _dbPathHelper = Observable.Return(Path.GetFullPath(db.DbPath))
 | 
			
		||||
            .ToProperty(this, x => x.DbPath);
 | 
			
		||||
 | 
			
		||||
        this.WhenActivated((CompositeDisposable disposables) => 
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@ namespace StarsAssistant.ViewModels;
 | 
			
		||||
 | 
			
		||||
public partial class PlanetViewModel(Planet planet) : ViewModelBase
 | 
			
		||||
{
 | 
			
		||||
    public static ObservableCollection<PlanetViewModel> LoadAll() {
 | 
			
		||||
    public static ObservableCollection<PlanetViewModel>  LoadAll() 
 | 
			
		||||
    {
 | 
			
		||||
        using var db = Locator.Current.GetService<StarsDatabase>()!;
 | 
			
		||||
        var result = new ObservableCollection<PlanetViewModel>();
 | 
			
		||||
        foreach (Planet planet in db.Planet.Where(p => p.OwnerId == "Atlantis").ToList())
 | 
			
		||||
 
 | 
			
		||||
@@ -18,31 +18,24 @@
 | 
			
		||||
    </Design.DataContext>
 | 
			
		||||
 | 
			
		||||
    <TabControl>
 | 
			
		||||
        <TabItem Header="Home">
 | 
			
		||||
            <TextBlock x:Name="WelcomeText">Hi</TextBlock>
 | 
			
		||||
        <TabItem Header="Stars Assistant">
 | 
			
		||||
            <Grid ColumnDefinitions="Auto, *" RowDefinitions="Auto, Auto">
 | 
			
		||||
                <Label Grid.Row="0" Grid.Column="0" Margin="0,5,5,5" Padding="3">Database Path:</Label>
 | 
			
		||||
                <TextBlock x:Name="DbPath" Grid.Row="0" Grid.Column="1" Margin="0 5" Padding="3"/>
 | 
			
		||||
            </Grid>
 | 
			
		||||
        </TabItem>
 | 
			
		||||
        <TabItem Header="DataGrid">
 | 
			
		||||
            <DataGrid x:Name="PlanetsGrid"
 | 
			
		||||
                AutoGenerateColumns="True" IsReadOnly="True" 
 | 
			
		||||
                ItemsSource="{Binding Planets}"
 | 
			
		||||
                IsReadOnly="True" 
 | 
			
		||||
                GridLinesVisibility="All"
 | 
			
		||||
                FrozenColumnCount="1"
 | 
			
		||||
                BorderThickness="1" BorderBrush="Gray">
 | 
			
		||||
                <DataGrid.Columns>
 | 
			
		||||
                    <DataGridTextColumn Header="Planet" Binding="{Binding Name}" />
 | 
			
		||||
                    <DataGridTextColumn Header="Value" Binding="{Binding Value}" />
 | 
			
		||||
                </DataGrid.Columns>
 | 
			
		||||
            </DataGrid>
 | 
			
		||||
        </TabItem>
 | 
			
		||||
        <TabItem Header="ScrollViewer">
 | 
			
		||||
            <ScrollViewer>
 | 
			
		||||
                <ItemsControl ItemsSource="{Binding Planets}">
 | 
			
		||||
                    <ItemsControl.ItemTemplate>
 | 
			
		||||
                        <DataTemplate DataType="vm:PlanetViewModel">
 | 
			
		||||
                            <Grid ColumnDefinitions="200, 100, 50">
 | 
			
		||||
                                <TextBlock Grid.Column="0" Text="{Binding Name}"/>
 | 
			
		||||
                                <TextBlock Grid.Column="1" Text="{Binding Owner}"/>
 | 
			
		||||
                                <TextBlock Grid.Column="2" Text="{Binding Value}"/>
 | 
			
		||||
                            </Grid>
 | 
			
		||||
                        </DataTemplate>
 | 
			
		||||
                    </ItemsControl.ItemTemplate>
 | 
			
		||||
                </ItemsControl>
 | 
			
		||||
            </ScrollViewer>
 | 
			
		||||
        </TabItem>
 | 
			
		||||
    </TabControl>
 | 
			
		||||
</Window>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,19 +13,11 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
 | 
			
		||||
{
 | 
			
		||||
    public MainWindow()
 | 
			
		||||
    {
 | 
			
		||||
        this.WhenActivated(
 | 
			
		||||
 | 
			
		||||
            disposables => {
 | 
			
		||||
                this.OneWayBind(ViewModel,
 | 
			
		||||
                        viewModel => viewModel.Planets,
 | 
			
		||||
                        view => view.PlanetsGrid.ItemsSource)
 | 
			
		||||
                    .DisposeWith(disposables);
 | 
			
		||||
                this.OneWayBind(ViewModel, 
 | 
			
		||||
                        vm => vm.WelcomeMessage, 
 | 
			
		||||
                        v => v.WelcomeText.Text)
 | 
			
		||||
                    .DisposeWith(disposables);
 | 
			
		||||
            }
 | 
			
		||||
        );
 | 
			
		||||
        this.WhenActivated(disposables => 
 | 
			
		||||
        {
 | 
			
		||||
            this.OneWayBind(ViewModel, vm => vm.DbPath, v => v.DbPath.Text)
 | 
			
		||||
                .DisposeWith(disposables);
 | 
			
		||||
        });
 | 
			
		||||
        
 | 
			
		||||
        InitializeComponent();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user