Changeset - 3737f942b229
[Not reviewed]
default
0 2 2
Jason Maltzen - 12 months ago 2023-12-03 06:01:47
jason@hiddenachievement.com
Simulator view now uses a new recipe view element instead of the old content element.
4 files changed with 152 insertions and 15 deletions:
0 comments (0 inline, 0 general)
ViewModels/SimulatorViewModel.cs
Show inline comments
...
 
@@ -20,26 +20,26 @@ namespace DesertPaintCodex.ViewModels
 
        private ViewModelBase? _recipeLibraryActivity;
 
        public ViewModelBase? RecipeLibraryActivity { get => _recipeLibraryActivity; private set => this.RaiseAndSetIfChanged(ref _recipeLibraryActivity, value); }
 

	
 

	
 
        private PaintColor? _paintColor;
 
        public PaintColor? PaintColor
 
        {
 
            get => _paintColor;
 
            set => this.RaiseAndSetIfChanged(ref _paintColor, value);
 
        }
 

	
 
        // Stealing the recipe view from the  paint generator
 
        private GeneratorRecipe? _existingRecipe;
 
        public GeneratorRecipe? ExistingRecipe { get => _existingRecipe; private set => this.RaiseAndSetIfChanged(ref _existingRecipe, value); }
 
        private PaintRecipe? _existingRecipe;
 
        public PaintRecipe? ExistingRecipe { get => _existingRecipe; private set => this.RaiseAndSetIfChanged(ref _existingRecipe, value); }
 

	
 
        private bool _hasMissingReactions;
 
        public bool HasMissingReactions
 
        {
 
            get => _hasMissingReactions;
 
            set => this.RaiseAndSetIfChanged(ref _hasMissingReactions, value);
 
        }
 

	
 
        private bool _isGoodRecipe;
 

	
 
        public bool IsGoodRecipe
 
        {
...
 
@@ -162,37 +162,27 @@ namespace DesertPaintCodex.ViewModels
 
            }
 
        }
 

	
 
        private void UpdateExistingRecipe()
 
        {
 
            if (IsGoodRecipe)
 
            {
 
                string colorName = PaletteService.FindNearest(_currentRecipe.ReactedColor);
 
                if ((ProfileManager.CurrentProfile != null) && (ProfileManager.CurrentProfile.Recipes.TryGetValue(colorName, out PaintRecipe? paintRecipe)))
 
                {
 
                    System.Diagnostics.Debug.WriteLine($"Setting existing recipe for {colorName}.");
 

	
 
                    GeneratorRecipe? existingRecipe = ExistingRecipe;
 
                    if (existingRecipe == null)
 
                    {
 
                        _tempColor.Set(colorName, _currentRecipe.ReactedColor);
 
                        existingRecipe = new GeneratorRecipe(_tempColor);
 
                    }
 
                    else
 
                    {
 
                        existingRecipe.Color.Set(colorName, _currentRecipe.ReactedColor);
 
                    }
 
                    existingRecipe.DraftRecipe(paintRecipe);
 
                    PaintRecipe? existingRecipe = ExistingRecipe;
 
                    ExistingRecipe = null;
 
                    ExistingRecipe = existingRecipe;
 
                    ExistingRecipe = _currentRecipe;
 
                }
 
                else
 
                {
 
                    ExistingRecipe = null;
 
                }
 
            }
 
            else
 
            {
 
                ExistingRecipe = null;
 
            }
 
        }
 

	
Views/RecipeView.axaml
Show inline comments
 
new file 100644
 
<UserControl xmlns="https://github.com/avaloniaui"
 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 
             mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="60"
 
             xmlns:local="clr-namespace:DesertPaintCodex.Models"
 
             x:Class="DesertPaintCodex.Views.RecipeView">
 

	
 
  <UserControl.Styles>
 
    <Style Selector="TextBlock">
 
      <Setter Property="FontSize" Value="14"/>
 
      <Setter Property="VerticalAlignment" Value="Center"/>
 
    </Style>
 
  </UserControl.Styles>
 
  <Border Classes="ThinFrame">
 
    <DockPanel>
 
      <Grid ColumnDefinitions="45,5,130,5,*" RowDefinitions="Auto" Margin="5">
 
        <Border Grid.Row="0" Grid.Column="0" Classes="ReagentSwatch" Name="ColorSwatch"/>
 
        <StackPanel Grid.Column="2" VerticalAlignment="Center">
 
          <TextBlock TextWrapping="Wrap" Name="ColorName">Black</TextBlock>
 
          <TextBlock TextWrapping="Wrap" Name="Cost">Cost: 0</TextBlock>
 
        </StackPanel>
 
        <TextBlock Grid.Row="0" Grid.Column="4" VerticalAlignment="Center" TextWrapping="Wrap" Name="Ingredients">None</TextBlock>
 
      </Grid>
 
    </DockPanel>
 
  </Border>
 
</UserControl>
Views/RecipeView.axaml.cs
Show inline comments
 
new file 100644
 
using Avalonia;
 
using Avalonia.Controls;
 
using Avalonia.Markup.Xaml;
 
using Avalonia.Media;
 
using DesertPaintCodex.Models;
 
using DesertPaintCodex.Services;
 
using System.Text;
 

	
 
namespace DesertPaintCodex.Views
 
{
 
    public class RecipeView : UserControl
 
    {
 
        private static readonly SolidColorBrush NoColor = new();
 
        public static readonly DirectProperty<RecipeView, PaintColor?> ColorProperty = AvaloniaProperty.RegisterDirect<RecipeView, PaintColor?>(nameof(Color),
 
                o => o.Color,
 
                (o, v) => o.Color = v);
 

	
 
        private PaintColor? _color;
 
        public PaintColor? Color { get => _color; set => SetAndRaise(ColorProperty, ref _color, value); }
 

	
 
        public static readonly StyledProperty<string> IngredientsProperty =
 
            AvaloniaProperty.Register<RecipeView, string>(nameof(Ingredients));
 
        private string _ingredients = string.Empty;
 
        public string Ingredients { get => _ingredients; set => this.SetAndRaise(IngredientsProperty, ref _ingredients, value); }
 

	
 
        public static readonly DirectProperty<RecipeView, PaintRecipe?> RecipeProperty =
 
            AvaloniaProperty.RegisterDirect<RecipeView, PaintRecipe?>(nameof(Recipe),
 
                o => o.Recipe,
 
                (o,v) => o.Recipe = v);
 
        private PaintRecipe? _recipe;
 
        public PaintRecipe? Recipe
 
        {
 
            get => _recipe;
 
            set => this.SetAndRaise(RecipeProperty, ref _recipe, value);
 
        }
 

	
 
        private readonly Border _colorSwatch;
 
        private readonly TextBlock _colorName;
 
        private readonly TextBlock _ingredientList;
 
        private readonly TextBlock _cost;
 

	
 
        public RecipeView()
 
        {
 
            InitializeComponent();
 

	
 
            _colorSwatch = this.FindControl<Border>("ColorSwatch");
 
            _ingredientList = this.FindControl<TextBlock>("Ingredients");
 
            _colorName = this.FindControl<TextBlock>("ColorName");
 
            _cost = this.FindControl<TextBlock>("Cost");
 
            ColorProperty.Changed.AddClassHandler<RecipeView>((x, _) => x.UpdateColor());
 
            RecipeProperty.Changed.AddClassHandler<RecipeView>((x, _) => x.UpdateRecipe());
 
            UpdateRecipe();
 
        }
 

	
 
        private void InitializeComponent()
 
        {
 
            AvaloniaXamlLoader.Load(this);
 
        }
 

	
 
        private void UpdateColor()
 
        {
 
            UpdateColorSwatch();
 
            UpdateColorName();
 
        }
 

	
 
        private void UpdateColorSwatch()
 
        {
 
            _colorSwatch.Background = Color == null ? NoColor : new SolidColorBrush(new Color(0xFF, Color.Red, Color.Green, Color.Blue));
 
        }
 

	
 
        private void UpdateColorName()
 
        {
 
            _colorName.Text = Color == null ? "[Unknown]" : PaletteService.FindNearest(Color);
 
        }
 

	
 
        private void UpdateIngredients()
 
        {
 
            string ingredients = string.Empty;
 
            if (Recipe != null)
 
            {
 
                StringBuilder sb = new();
 
                for (int i = 0; i < Recipe.Reagents.Count; i++)
 
                {
 
                    sb.Append(Recipe.Reagents[i].Quantity);
 
                    sb.Append(' ');
 
                    sb.Append(Recipe.Reagents[i].Name);
 
                    if (i != Recipe.Reagents.Count - 1)
 
                    {
 
                        sb.Append(", ");
 
                    }
 
                }
 

	
 
                ingredients = sb.ToString();
 
            }
 

	
 
            _ingredientList.Text = ingredients;
 
        }
 

	
 
        private void UpdateCost()
 
        {
 
            _cost.Text = Recipe == null ? "Cost: 0" : $"Cost: {Recipe.Cost}";
 
        }
 

	
 
        private void UpdateRecipe()
 
        {
 
            if (Recipe != null)
 
            {
 
                // Update components from recipe
 
                Color = Recipe.ReactedColor;
 
            }
 
            else
 
            {
 
                Color = null;
 
            }
 
            UpdateIngredients();
 
            UpdateCost();
 
        }
 

	
 
    }
 
}
Views/SimulatorView.axaml
Show inline comments
...
 
@@ -37,25 +37,25 @@
 
        </Style>
 
    </UserControl.Styles>
 

	
 
  <DockPanel Classes="Activity">
 
        <Button DockPanel.Dock="Bottom" VerticalAlignment="Center" Margin="0 10 0 0" IsEnabled="{Binding IsGoodRecipe}" Command="{Binding CopyToClipboard}">📋 Copy Recipe to Clipboard</Button>
 

	
 
      <views:EmbeddedWarningBox DockPanel.Dock="Bottom" Title="🛇 INSUFFICIENT CONCENTRATION" Message="The current recipe does not have sufficient concentration of reagents." IsVisible="{Binding !IsValidConcentration}" />
 
      <views:EmbeddedWarningBox DockPanel.Dock="Bottom" Title="🛇 INSUFFICIENT DATA" Message="You are missing reaction data necessary for simulating this recipe." Message2="{Binding MissingReactionList}" IsVisible="{Binding HasMissingReactions}" />
 

	
 
    <Border Classes="ThinFrame" DockPanel.Dock="Bottom" IsVisible="{Binding ExistingRecipe, Converter={x:Static ObjectConverters.IsNotNull}}" Margin="0,0,0,10">
 
      <Grid ColumnDefinitions="*,50" RowDefinitions="20,*" HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" >
 
          <TextBlock Classes="BlockHeader" Grid.Row="0" Grid.Column="0" DockPanel.Dock="Top" Margin="0 0 0 5">CURRENT RECIPE</TextBlock>
 
          <ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding ExistingRecipe}"/>
 
          <views:RecipeView Grid.Row="1" Grid.Column="0" Recipe="{Binding ExistingRecipe}"/>
 
      </Grid>
 
    </Border>
 

	
 
    <Grid ColumnDefinitions="*,120" RowDefinitions="*" HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" Margin="0,0,0,10">
 
      <views:PaintSwatchView Grid.Row="0" Grid.Column="0" ShowName="True" Color="{Binding PaintColor}"  IsVisible="true"/>
 
      <Button Grid.Row="0" Grid.Column="1" Margin="10 10 10 10" IsEnabled="{Binding IsGoodRecipe}"  Command="{Binding ReplaceRecipe}">
 
        <Panel>
 
        <TextBlock TextAlignment="Center" IsVisible="{Binding ExistingRecipe, Converter={x:Static ObjectConverters.IsNull}}">
 
Save
 
Recipe
 
        </TextBlock>
 
        <TextBlock TextAlignment="Center" IsVisible="{Binding ExistingRecipe, Converter={x:Static ObjectConverters.IsNotNull}}">
0 comments (0 inline, 0 general)