Skip to content

Commit d9edcfb

Browse files
committed
Add repair button for items with durability
1 parent 5d53a63 commit d9edcfb

File tree

6 files changed

+157
-75
lines changed

6 files changed

+157
-75
lines changed

Loki/InventorySlot.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel;
2+
using System.Diagnostics;
23
using System.Runtime.CompilerServices;
34
using System.Windows.Input;
45
using JetBrains.Annotations;
@@ -12,14 +13,29 @@ public class InventorySlot: INotifyPropertyChanged
1213
public InventorySlot(Vector2i position)
1314
{
1415
Position = position;
16+
RepairItem = new RelayCommand(RepairExecuted, RepairCanExecute);
17+
DeleteItem = new RelayCommand(_ => Item = null);
1518
if (position.Y == 0) QuickSlotNumber = position.X + 1;
1619
}
1720

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

22-
public ICommand DeleteItem => new RelayCommand(_ => Item = null);
25+
public RelayCommand DeleteItem { get; }
26+
27+
public RelayCommand RepairItem { get; }
28+
29+
private bool RepairCanExecute(object _)
30+
{
31+
return Item != null && Item.Durability < Item.MaxDurability;
32+
}
33+
34+
private void RepairExecuted(object _)
35+
{
36+
Item.Durability = (float) Item.MaxDurability;
37+
RepairItem.OnCanExecuteChanged();
38+
}
2339

2440
public Item Item
2541
{

Loki/InventorySlotEditor.xaml

Lines changed: 109 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,51 @@
119119
</MultiTrigger>
120120
</Style.Triggers>
121121
</Style>
122+
<Style x:Key="CoolButton" TargetType="Button">
123+
<Style.Setters>
124+
<Setter Property="Template">
125+
<Setter.Value>
126+
<!-- This is a cool template we should probably move it to be some shared resource to use elsewhere -->
127+
<ControlTemplate TargetType="Button">
128+
<Border x:Name="MrBorder" Background="{TemplateBinding Background}" CornerRadius="4" RenderTransformOrigin="0.5,0.5">
129+
<Border.RenderTransform>
130+
<ScaleTransform x:Name="BorderScale"/>
131+
</Border.RenderTransform>
132+
<VisualStateManager.VisualStateGroups>
133+
<VisualStateGroup Name="CommonStates">
134+
<VisualStateGroup.Transitions>
135+
<VisualTransition GeneratedDuration="0:0:0.25">
136+
<VisualTransition.GeneratedEasingFunction>
137+
<QuadraticEase/>
138+
</VisualTransition.GeneratedEasingFunction>
139+
</VisualTransition>
140+
</VisualStateGroup.Transitions>
141+
<VisualState Name="Disabled">
142+
<Storyboard>
143+
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="Opacity" To="0.25" Duration="0"/>
144+
</Storyboard>
145+
</VisualState>
146+
<VisualState Name="Normal"/>
147+
<VisualState Name="MouseOver">
148+
<Storyboard>
149+
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.2" Duration="0"/>
150+
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.2" Duration="0"/>
151+
</Storyboard>
152+
</VisualState>
153+
</VisualStateGroup>
154+
</VisualStateManager.VisualStateGroups>
155+
<ContentPresenter Margin="4"/>
156+
</Border>
157+
</ControlTemplate>
158+
</Setter.Value>
159+
</Setter>
160+
</Style.Setters>
161+
</Style>
162+
<Style x:Key="LittleSquareCoolButton" BasedOn="{StaticResource CoolButton}" TargetType="Button">
163+
<Setter Property="Width" Value="24"/>
164+
<Setter Property="Height" Value="24"/>
165+
<Setter Property="Focusable" Value="False"/>
166+
</Style>
122167
</UserControl.Resources>
123168

124169

@@ -203,80 +248,72 @@
203248
</Border>
204249

205250

206-
207-
<!-- Delete button cross thing -->
208-
<Button HorizontalAlignment="Right" VerticalAlignment="Top" Padding="0" Cursor="Hand"
209-
Margin="6" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
210-
Command="{Binding DeleteItem}" Width="24" Height="24"
211-
KeyboardNavigation.TabNavigation="None" Focusable="False">
212-
<Button.Template>
213-
<!-- This is a cool template we should probably move it to be some shared resource to use elsewhere -->
214-
<ControlTemplate TargetType="Button">
215-
<Border x:Name="MrBorder" Background="{TemplateBinding Background}" CornerRadius="4" RenderTransformOrigin="0.5,0.5">
216-
<Border.RenderTransform>
217-
<ScaleTransform x:Name="BorderScale"/>
218-
</Border.RenderTransform>
219-
<VisualStateManager.VisualStateGroups>
220-
<VisualStateGroup Name="CommonStates">
221-
<VisualStateGroup.Transitions>
222-
<VisualTransition GeneratedDuration="0:0:0.25">
223-
<VisualTransition.GeneratedEasingFunction>
224-
<QuadraticEase/>
225-
</VisualTransition.GeneratedEasingFunction>
226-
</VisualTransition>
227-
</VisualStateGroup.Transitions>
228-
<VisualState Name="Normal"/>
229-
<VisualState Name="MouseOver">
230-
<Storyboard>
231-
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.2" Duration="0"/>
232-
<DoubleAnimation Storyboard.TargetName="MrBorder" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.2" Duration="0"/>
233-
</Storyboard>
234-
</VisualState>
235-
</VisualStateGroup>
236-
</VisualStateManager.VisualStateGroups>
237-
<ContentPresenter Margin="4"/>
238-
</Border>
239-
</ControlTemplate>
240-
</Button.Template>
241-
<Button.Style>
242-
<Style TargetType="Button">
243-
<Style.Setters>
244-
<Setter Property="Opacity" Value="0.0"/>
245-
</Style.Setters>
246-
<Style.Triggers>
247-
<DataTrigger Binding="{Binding ElementName=LayoutRoot, Path=IsMouseOver}" Value="True">
248-
<DataTrigger.EnterActions>
249-
<BeginStoryboard>
250-
<Storyboard>
251-
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1"
252-
Duration="0:0:0.5">
253-
<DoubleAnimation.EasingFunction>
254-
<CubicEase />
255-
</DoubleAnimation.EasingFunction>
256-
</DoubleAnimation>
257-
</Storyboard>
258-
</BeginStoryboard>
259-
</DataTrigger.EnterActions>
260-
<DataTrigger.ExitActions>
261-
<BeginStoryboard>
262-
<Storyboard>
263-
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0"
264-
Duration="0:0:0.5">
265-
<DoubleAnimation.EasingFunction>
266-
<CubicEase />
267-
</DoubleAnimation.EasingFunction>
268-
</DoubleAnimation>
269-
</Storyboard>
270-
</BeginStoryboard>
271-
</DataTrigger.ExitActions>
251+
<!-- Layer fade in/out with mouse over-->
252+
<Grid>
253+
<Grid.Style>
254+
<Style TargetType="Grid">
255+
<Style.Setters>
256+
<Setter Property="Opacity" Value="0"/>
257+
</Style.Setters>
258+
<Style.Triggers>
259+
<DataTrigger Binding="{Binding ElementName=LayoutRoot, Path=IsMouseOver}"
260+
Value="True">
261+
<DataTrigger.EnterActions>
262+
<BeginStoryboard>
263+
<Storyboard>
264+
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1"
265+
Duration="0:0:0.5">
266+
<DoubleAnimation.EasingFunction>
267+
<CubicEase />
268+
</DoubleAnimation.EasingFunction>
269+
</DoubleAnimation>
270+
</Storyboard>
271+
</BeginStoryboard>
272+
</DataTrigger.EnterActions>
273+
<DataTrigger.ExitActions>
274+
<BeginStoryboard>
275+
<Storyboard>
276+
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0"
277+
Duration="0:0:0.5">
278+
<DoubleAnimation.EasingFunction>
279+
<CubicEase />
280+
</DoubleAnimation.EasingFunction>
281+
</DoubleAnimation>
282+
</Storyboard>
283+
</BeginStoryboard>
284+
</DataTrigger.ExitActions>
272285
</DataTrigger>
273-
</Style.Triggers>
274-
</Style>
275-
</Button.Style>
286+
</Style.Triggers>
287+
</Style>
288+
</Grid.Style>
289+
290+
<!-- Buttons in the top right -->
291+
<StackPanel HorizontalAlignment="Right" VerticalAlignment="Top" Margin="6">
292+
<!-- Delete button -->
293+
<Button Padding="0" Cursor="Hand"
294+
ToolTip="Delete"
295+
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
296+
Command="{Binding DeleteItem}"
297+
Style="{StaticResource LittleSquareCoolButton}">
298+
<Path Data="M2,2 L10,10 M2,10 L10,2" Stroke="Red" Stretch="Fill"
299+
StrokeThickness="4" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />
300+
</Button>
301+
302+
<!-- Repair button -->
303+
<Button Padding="0" Cursor="Hand" Margin="0,2,0,0"
304+
ToolTip="Repair"
305+
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
306+
Command="{Binding RepairItem}"
307+
Style="{StaticResource LittleSquareCoolButton}"
308+
Visibility="{Binding Item.SharedData.UsesDurability, Converter={StaticResource BoolToVis}}">
309+
<Image Source="Resources/wrench-32.ico" />
310+
</Button>
311+
</StackPanel>
312+
313+
314+
315+
</Grid>
276316

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

281318
</Grid>
282319

Loki/Item.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,44 @@
11
using System;
2+
using System.ComponentModel;
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
25

36
namespace Loki
47
{
5-
public class Item
8+
public class Item: INotifyPropertyChanged
69
{
710
private int _stack;
11+
private float _durability;
812
public string Name { get; }
913

1014
public int Stack
1115
{
1216
get => _stack;
1317
set
1418
{
19+
if (value == _stack) return;
1520
if (SharedData != null)
1621
{
1722
if (value > SharedData.MaxStack)
1823
value = SharedData.MaxStack;
1924
}
2025
if (value < 0) value = 0;
2126
_stack = value;
27+
OnPropertyChanged();
28+
}
29+
}
30+
31+
public float Durability
32+
{
33+
get => _durability;
34+
set
35+
{
36+
if (value.Equals(_durability)) return;
37+
_durability = value;
38+
OnPropertyChanged();
2239
}
2340
}
2441

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

6682
public override string ToString() => $"{Name} [{Stack}]";
83+
public event PropertyChangedEventHandler PropertyChanged;
84+
85+
[NotifyPropertyChangedInvocator]
86+
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
87+
{
88+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
89+
}
6790
}
6891
}

Loki/Loki.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<None Remove="Resources\calander-16.ico" />
2020
<None Remove="Resources\clock-16.ico" />
2121
<None Remove="Resources\loki.ico" />
22+
<None Remove="Resources\wrench-32.ico" />
2223
</ItemGroup>
2324

2425
<ItemGroup>
@@ -36,6 +37,7 @@
3637
<Resource Include="Resources\calander-16.ico" />
3738
<Resource Include="Resources\clock-16.ico" />
3839
<Resource Include="Resources\loki.ico" />
40+
<Resource Include="Resources\wrench-32.ico" />
3941
</ItemGroup>
4042

4143
</Project>

Loki/RelayCommand.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Windows.Input;
3+
using JetBrains.Annotations;
34

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

1718
public bool CanExecute(object param) => _canExecute?.Invoke(param) ?? true;
1819
public void Execute(object param) => _execute(param);
20+
21+
[UsedImplicitly]
1922
public event EventHandler CanExecuteChanged;
23+
public virtual void OnCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
2024
}
2125
}

Loki/Resources/wrench-32.ico

4.19 KB
Binary file not shown.

0 commit comments

Comments
 (0)