Skip to content

Commit

Permalink
Add repair button for items with durability
Browse files Browse the repository at this point in the history
  • Loading branch information
Wufflez committed Mar 12, 2021
1 parent 5d53a63 commit d9edcfb
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 75 deletions.
18 changes: 17 additions & 1 deletion Loki/InventorySlot.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using JetBrains.Annotations;
Expand All @@ -12,14 +13,29 @@ public class InventorySlot: INotifyPropertyChanged
public InventorySlot(Vector2i position)
{
Position = position;
RepairItem = new RelayCommand(RepairExecuted, RepairCanExecute);
DeleteItem = new RelayCommand(_ => Item = null);
if (position.Y == 0) QuickSlotNumber = position.X + 1;
}

public Vector2i Position { get; }
public int? QuickSlotNumber { get; }
public bool IsEmpty => Item == null;

public ICommand DeleteItem => new RelayCommand(_ => Item = null);
public RelayCommand DeleteItem { get; }

public RelayCommand RepairItem { get; }

private bool RepairCanExecute(object _)
{
return Item != null && Item.Durability < Item.MaxDurability;
}

private void RepairExecuted(object _)
{
Item.Durability = (float) Item.MaxDurability;
RepairItem.OnCanExecuteChanged();
}

public Item Item
{
Expand Down
181 changes: 109 additions & 72 deletions Loki/InventorySlotEditor.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,51 @@
</MultiTrigger>
</Style.Triggers>
</Style>
<Style x:Key="CoolButton" TargetType="Button">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<!-- This is a cool template we should probably move it to be some shared resource to use elsewhere -->
<ControlTemplate TargetType="Button">
<Border x:Name="MrBorder" Background="{TemplateBinding Background}" CornerRadius="4" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="BorderScale"/>
</Border.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.25">
<VisualTransition.GeneratedEasingFunction>
<QuadraticEase/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState Name="Disabled">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="Opacity" To="0.25" Duration="0"/>
</Storyboard>
</VisualState>
<VisualState Name="Normal"/>
<VisualState Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.2" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.2" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter Margin="4"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
<Style x:Key="LittleSquareCoolButton" BasedOn="{StaticResource CoolButton}" TargetType="Button">
<Setter Property="Width" Value="24"/>
<Setter Property="Height" Value="24"/>
<Setter Property="Focusable" Value="False"/>
</Style>
</UserControl.Resources>


Expand Down Expand Up @@ -203,80 +248,72 @@
</Border>



<!-- Delete button cross thing -->
<Button HorizontalAlignment="Right" VerticalAlignment="Top" Padding="0" Cursor="Hand"
Margin="6" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
Command="{Binding DeleteItem}" Width="24" Height="24"
KeyboardNavigation.TabNavigation="None" Focusable="False">
<Button.Template>
<!-- This is a cool template we should probably move it to be some shared resource to use elsewhere -->
<ControlTemplate TargetType="Button">
<Border x:Name="MrBorder" Background="{TemplateBinding Background}" CornerRadius="4" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="BorderScale"/>
</Border.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.25">
<VisualTransition.GeneratedEasingFunction>
<QuadraticEase/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState Name="Normal"/>
<VisualState Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.2" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.2" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter Margin="4"/>
</Border>
</ControlTemplate>
</Button.Template>
<Button.Style>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Opacity" Value="0.0"/>
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=LayoutRoot, Path=IsMouseOver}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1"
Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0"
Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
<!-- Layer fade in/out with mouse over-->
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Setters>
<Setter Property="Opacity" Value="0"/>
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=LayoutRoot, Path=IsMouseOver}"
Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1"
Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0"
Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Style.Triggers>
</Style>
</Grid.Style>

<!-- Buttons in the top right -->
<StackPanel HorizontalAlignment="Right" VerticalAlignment="Top" Margin="6">
<!-- Delete button -->
<Button Padding="0" Cursor="Hand"
ToolTip="Delete"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
Command="{Binding DeleteItem}"
Style="{StaticResource LittleSquareCoolButton}">
<Path Data="M2,2 L10,10 M2,10 L10,2" Stroke="Red" Stretch="Fill"
StrokeThickness="4" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />
</Button>

<!-- Repair button -->
<Button Padding="0" Cursor="Hand" Margin="0,2,0,0"
ToolTip="Repair"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
Command="{Binding RepairItem}"
Style="{StaticResource LittleSquareCoolButton}"
Visibility="{Binding Item.SharedData.UsesDurability, Converter={StaticResource BoolToVis}}">
<Image Source="Resources/wrench-32.ico" />
</Button>
</StackPanel>



</Grid>

<Path Data="M2,2 L10,10 M2,10 L10,2" Stroke="Red" Stretch="Fill"
StrokeThickness="4" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />
</Button>

</Grid>

Expand Down
27 changes: 25 additions & 2 deletions Loki/Item.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,44 @@
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using JetBrains.Annotations;

namespace Loki
{
public class Item
public class Item: INotifyPropertyChanged
{
private int _stack;
private float _durability;
public string Name { get; }

public int Stack
{
get => _stack;
set
{
if (value == _stack) return;
if (SharedData != null)
{
if (value > SharedData.MaxStack)
value = SharedData.MaxStack;
}
if (value < 0) value = 0;
_stack = value;
OnPropertyChanged();
}
}

public float Durability
{
get => _durability;
set
{
if (value.Equals(_durability)) return;
_durability = value;
OnPropertyChanged();
}
}

public float Durability { get; }
public Vector2i Pos { get; }
public bool Equiped { get; }
public int Quality { get; }
Expand Down Expand Up @@ -64,5 +80,12 @@ public Item(string name, int stack, float durability, Vector2i pos, bool equiped
public bool CanStack => SharedData.MaxStack > 1;

public override string ToString() => $"{Name} [{Stack}]";
public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
2 changes: 2 additions & 0 deletions Loki/Loki.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<None Remove="Resources\calander-16.ico" />
<None Remove="Resources\clock-16.ico" />
<None Remove="Resources\loki.ico" />
<None Remove="Resources\wrench-32.ico" />
</ItemGroup>

<ItemGroup>
Expand All @@ -36,6 +37,7 @@
<Resource Include="Resources\calander-16.ico" />
<Resource Include="Resources\clock-16.ico" />
<Resource Include="Resources\loki.ico" />
<Resource Include="Resources\wrench-32.ico" />
</ItemGroup>

</Project>
4 changes: 4 additions & 0 deletions Loki/RelayCommand.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Windows.Input;
using JetBrains.Annotations;

namespace Loki
{
Expand All @@ -16,6 +17,9 @@ public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null

public bool CanExecute(object param) => _canExecute?.Invoke(param) ?? true;
public void Execute(object param) => _execute(param);

[UsedImplicitly]
public event EventHandler CanExecuteChanged;
public virtual void OnCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
Binary file added Loki/Resources/wrench-32.ico
Binary file not shown.

0 comments on commit d9edcfb

Please sign in to comment.