Skip to content

Commit 8484835

Browse files
committed
Add support for DataTemplate
1 parent d33d4b7 commit 8484835

File tree

7 files changed

+893
-606
lines changed

7 files changed

+893
-606
lines changed

Retronado/Sample.sln.DotSettings

Lines changed: 111 additions & 7 deletions
Large diffs are not rendered by default.

Retronado/Sample/Views/LottieViewsPage.xaml

Lines changed: 73 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,73 @@
2222

2323
<ContentPage.Resources>
2424
<ResourceDictionary>
25+
<DataTemplate x:Key="LoadingLottieDataTemplate">
26+
<lottie:AnimationView x:Name="LoadingLottie"
27+
AbsoluteLayout.LayoutFlags="PositionProportional"
28+
AbsoluteLayout.LayoutBounds="0.5, 0.4, 120, 120"
29+
HorizontalOptions="FillAndExpand"
30+
VerticalOptions="FillAndExpand"
31+
Animation="{Binding Loader.ShowLoader, Converter={StaticResource CyclicLoadingLottieConverter}}"
32+
IsPlaying="True"
33+
Loop="True" />
34+
</DataTemplate>
35+
36+
<DataTemplate x:Key="EmptyLottieDataTemplate">
37+
<StackLayout AbsoluteLayout.LayoutFlags="PositionProportional"
38+
AbsoluteLayout.LayoutBounds="0.5, 0.4, 300, 180"
39+
BindingContext="{Binding Source={RelativeSource AncestorType={x:Type customViews:TaskLoaderView}}, Path=TaskLoaderNotifier}">
40+
41+
<lottie:AnimationView HorizontalOptions="FillAndExpand"
42+
VerticalOptions="FillAndExpand"
43+
Animation="empty_state.json"
44+
IsPlaying="True"
45+
Loop="True" />
46+
47+
<Label Style="{StaticResource TextBody}"
48+
HorizontalOptions="Center"
49+
VerticalOptions="Center"
50+
Text="{loc:Translate Empty_Screen}"
51+
TextColor="White" />
52+
<Button Style="{StaticResource TextBody}"
53+
HeightRequest="40"
54+
Margin="0,20,0,0"
55+
Padding="25,0"
56+
HorizontalOptions="Center"
57+
BackgroundColor="{StaticResource TopElementBackground}"
58+
Command="{Binding ReloadCommand}"
59+
Text="{loc:Translate ErrorButton_Retry}"
60+
TextColor="White" />
61+
</StackLayout>
62+
</DataTemplate>
63+
64+
<DataTemplate x:Key="ErrorLottieDataTemplate">
65+
<StackLayout AbsoluteLayout.LayoutFlags="PositionProportional"
66+
AbsoluteLayout.LayoutBounds="0.5, 0.4, 300, 180"
67+
BindingContext="{Binding Source={RelativeSource AncestorType={x:Type customViews:TaskLoaderView}}, Path=TaskLoaderNotifier}">
68+
69+
<lottie:AnimationView HorizontalOptions="FillAndExpand"
70+
VerticalOptions="FillAndExpand"
71+
Animation="{Binding Error, Converter={StaticResource ExceptionToLottieConverter}}"
72+
IsPlaying="True"
73+
Loop="True" />
74+
75+
<Label Style="{StaticResource TextBody}"
76+
HorizontalOptions="Center"
77+
VerticalOptions="Center"
78+
Text="{Binding Error, Converter={StaticResource ExceptionToErrorMessageConverter}}"
79+
TextColor="White" />
80+
<Button Style="{StaticResource TextBody}"
81+
HeightRequest="40"
82+
Margin="0,20,0,0"
83+
Padding="25,0"
84+
HorizontalOptions="Center"
85+
BackgroundColor="{StaticResource TopElementBackground}"
86+
Command="{Binding ReloadCommand}"
87+
Text="{loc:Translate ErrorButton_Retry}"
88+
TextColor="White" />
89+
</StackLayout>
90+
</DataTemplate>
91+
2592
<Style x:Key="TaskLoaderStyle" TargetType="customViews:TaskLoaderView">
2693
<Setter Property="AccentColor" Value="{StaticResource AccentColor}" />
2794
<Setter Property="FontFamily" Value="{StaticResource FontAtariSt}" />
@@ -34,7 +101,12 @@
34101
<Setter Property="BackgroundColor" Value="{StaticResource LightGreyBackground}" />
35102
<Setter Property="NotificationBackgroundColor" Value="{StaticResource TosWindows}" />
36103
<Setter Property="NotificationTextColor" Value="{StaticResource TextPrimaryColor}" />
104+
105+
<Setter Property="LoadingView" Value="{StaticResource LoadingLottieDataTemplate}" />
106+
<Setter Property="EmptyView" Value="{StaticResource EmptyLottieDataTemplate}" />
107+
<Setter Property="ErrorView" Value="{StaticResource ErrorLottieDataTemplate}" />
37108
</Style>
109+
38110
</ResourceDictionary>
39111
</ContentPage.Resources>
40112

@@ -64,72 +136,10 @@
64136
ValueFontFamily="{StaticResource FontAtariSt}" />
65137
</Frame>
66138

139+
<!-- All lottie views are specified in DataTemplates and Style above -->
67140
<customViews:TaskLoaderView Grid.Row="2"
68141
Style="{StaticResource TaskLoaderStyle}"
69142
TaskLoaderNotifier="{Binding Loader}">
70-
<customViews:TaskLoaderView.LoadingView>
71-
<lottie:AnimationView x:Name="LoadingLottie"
72-
AbsoluteLayout.LayoutFlags="PositionProportional"
73-
AbsoluteLayout.LayoutBounds="0.5, 0.4, 120, 120"
74-
HorizontalOptions="FillAndExpand"
75-
VerticalOptions="FillAndExpand"
76-
Animation="{Binding Loader.ShowLoader, Converter={StaticResource CyclicLoadingLottieConverter}}"
77-
AutoPlay="True"
78-
Loop="True" />
79-
</customViews:TaskLoaderView.LoadingView>
80-
81-
<customViews:TaskLoaderView.EmptyView>
82-
<StackLayout AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutBounds="0.5, 0.4, 300, 180">
83-
84-
<lottie:AnimationView HorizontalOptions="FillAndExpand"
85-
VerticalOptions="FillAndExpand"
86-
Animation="empty_state.json"
87-
AutoPlay="True"
88-
Loop="True" />
89-
90-
<Label Style="{StaticResource TextBody}"
91-
HorizontalOptions="Center"
92-
VerticalOptions="Center"
93-
Text="{loc:Translate Empty_Screen}"
94-
TextColor="White" />
95-
<Button Style="{StaticResource TextBody}"
96-
HeightRequest="40"
97-
Margin="0,20,0,0"
98-
Padding="25,0"
99-
HorizontalOptions="Center"
100-
BackgroundColor="{StaticResource TopElementBackground}"
101-
Command="{Binding Loader.ReloadCommand}"
102-
Text="{loc:Translate ErrorButton_Retry}"
103-
TextColor="White" />
104-
</StackLayout>
105-
</customViews:TaskLoaderView.EmptyView>
106-
107-
<customViews:TaskLoaderView.ErrorView>
108-
<StackLayout AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutBounds="0.5, 0.4, 300, 180">
109-
110-
<lottie:AnimationView HorizontalOptions="FillAndExpand"
111-
VerticalOptions="FillAndExpand"
112-
Animation="{Binding Loader.Error, Converter={StaticResource ExceptionToLottieConverter}}"
113-
AutoPlay="True"
114-
Loop="True" />
115-
116-
<Label Style="{StaticResource TextBody}"
117-
HorizontalOptions="Center"
118-
VerticalOptions="Center"
119-
Text="{Binding Loader.Error, Converter={StaticResource ExceptionToErrorMessageConverter}}"
120-
TextColor="White" />
121-
<Button Style="{StaticResource TextBody}"
122-
HeightRequest="40"
123-
Margin="0,20,0,0"
124-
Padding="25,0"
125-
HorizontalOptions="Center"
126-
BackgroundColor="{StaticResource TopElementBackground}"
127-
Command="{Binding Loader.ReloadCommand}"
128-
Text="{loc:Translate ErrorButton_Retry}"
129-
TextColor="White" />
130-
</StackLayout>
131-
</customViews:TaskLoaderView.ErrorView>
132-
133143
<RefreshView Command="{Binding Loader.RefreshCommand}"
134144
IsRefreshing="{Binding Loader.ShowRefresher}"
135145
RefreshColor="{StaticResource AccentColor}">

Retronado/Sample/Views/UserViewsPage.xaml

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -80,34 +80,36 @@
8080
</sharpnado:TaskLoaderView.LoadingView>
8181

8282
<sharpnado:TaskLoaderView.ErrorView>
83-
<Grid AbsoluteLayout.LayoutFlags="PositionProportional"
84-
AbsoluteLayout.LayoutBounds="0, 0.5, 150, 90"
85-
Padding="15,0,0,0"
86-
BackgroundColor="White">
87-
<Grid.RowDefinitions>
88-
<RowDefinition Height="60" />
89-
<RowDefinition Height="30" />
90-
</Grid.RowDefinitions>
91-
<Grid.ColumnDefinitions>
92-
<ColumnDefinition Width="*" />
93-
<ColumnDefinition Width="*" />
94-
<ColumnDefinition Width="*" />
95-
</Grid.ColumnDefinitions>
96-
<Image Grid.Row="0"
97-
Grid.Column="0"
98-
Style="{StaticResource ErrorBombStyle}" />
99-
<Image Grid.Row="0"
100-
Grid.Column="1"
101-
Style="{StaticResource ErrorBombStyle}" />
102-
<Image Grid.Row="0"
103-
Grid.Column="2"
104-
Style="{StaticResource ErrorBombStyle}" />
105-
<Label Grid.Row="1"
106-
Grid.Column="0"
107-
Grid.ColumnSpan="3"
108-
Style="{StaticResource TextBody}"
109-
Text="{Binding Loader.Error, Converter={StaticResource ExceptionToErrorMessageConverter}}" />
110-
</Grid>
83+
<DataTemplate>
84+
<Grid AbsoluteLayout.LayoutFlags="PositionProportional"
85+
AbsoluteLayout.LayoutBounds="0, 0.5, 150, 90"
86+
Padding="15,0,0,0"
87+
BackgroundColor="White">
88+
<Grid.RowDefinitions>
89+
<RowDefinition Height="60" />
90+
<RowDefinition Height="30" />
91+
</Grid.RowDefinitions>
92+
<Grid.ColumnDefinitions>
93+
<ColumnDefinition Width="*" />
94+
<ColumnDefinition Width="*" />
95+
<ColumnDefinition Width="*" />
96+
</Grid.ColumnDefinitions>
97+
<Image Grid.Row="0"
98+
Grid.Column="0"
99+
Style="{StaticResource ErrorBombStyle}" />
100+
<Image Grid.Row="0"
101+
Grid.Column="1"
102+
Style="{StaticResource ErrorBombStyle}" />
103+
<Image Grid.Row="0"
104+
Grid.Column="2"
105+
Style="{StaticResource ErrorBombStyle}" />
106+
<Label Grid.Row="1"
107+
Grid.Column="0"
108+
Grid.ColumnSpan="3"
109+
Style="{StaticResource TextBody}"
110+
Text="{Binding Loader.Error, Converter={StaticResource ExceptionToErrorMessageConverter}}" />
111+
</Grid>
112+
</DataTemplate>
111113
</sharpnado:TaskLoaderView.ErrorView>
112114

113115
<sharpnado:TaskLoaderView.ErrorNotificationView>

Sharpnado.TaskLoaderView/Sharpnado.TaskLoaderView.csproj

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
<RootNamespace>Sharpnado.Presentation.Forms</RootNamespace>
88

99
<Product>$(AssemblyName) ($(TargetFramework))</Product>
10-
<AssemblyVersion>2.0.1.0</AssemblyVersion>
11-
<AssemblyFileVersion>2.0.1.0</AssemblyFileVersion>
12-
<Version>2.0.1.0</Version>
10+
<AssemblyVersion>2.1.0.0</AssemblyVersion>
11+
<AssemblyFileVersion>2.1.0.0</AssemblyFileVersion>
12+
<Version>2.1.0.0</Version>
1313
<PackOnBuild>true</PackOnBuild>
1414
<NeutralLanguage>en</NeutralLanguage>
1515

@@ -50,7 +50,13 @@ Featuring:
5050
<PrivateAssets>all</PrivateAssets>
5151
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5252
</PackageReference>
53-
<PackageReference Include="Xamarin.Forms" Version="4.7.0.968" />
53+
<PackageReference Include="Xamarin.Forms" Version="3.6.0.220655" />
54+
</ItemGroup>
55+
56+
<ItemGroup>
57+
<Compile Update="TaskLoaderView.Updates.cs">
58+
<DependentUpon>%(Filename)</DependentUpon>
59+
</Compile>
5460
</ItemGroup>
5561

5662
<ItemGroup>

Sharpnado.TaskLoaderView/TaskLoaderNotifier.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
namespace Sharpnado.Presentation.Forms
1212
{
13-
public interface ITaskLoaderNotifier
13+
public interface ITaskLoaderNotifier : INotifyPropertyChanged
1414
{
1515
ICommand ResetCommand { get; }
1616

17-
ICommand ReloadCommand { get; }
17+
ICommand ReloadCommand { get; set; }
1818

19-
ICommand RefreshCommand { get; }
19+
ICommand RefreshCommand { get; set; }
2020

2121
bool IsCompleted { get; }
2222

@@ -53,7 +53,7 @@ public interface ITaskLoaderNotifier
5353
void Reset();
5454
}
5555

56-
public abstract class TaskLoaderNotifierBase : INotifyPropertyChanged, ITaskLoaderNotifier
56+
public abstract class TaskLoaderNotifierBase : ITaskLoaderNotifier
5757
{
5858
private bool _showLoader;
5959
private bool _showRefresher;
@@ -66,18 +66,20 @@ public abstract class TaskLoaderNotifierBase : INotifyPropertyChanged, ITaskLoad
6666

6767
private Exception _error;
6868

69-
protected TaskLoaderNotifierBase()
69+
protected TaskLoaderNotifierBase(bool disableEmptyState = false)
7070
{
71+
DisableEmptyState = disableEmptyState;
72+
7173
ResetCommand = new Command(Reset);
7274
}
7375

7476
public event PropertyChangedEventHandler PropertyChanged;
7577

7678
public ICommand ResetCommand { get; }
7779

78-
public ICommand ReloadCommand { get; protected set; }
80+
public ICommand ReloadCommand { get; set; }
7981

80-
public ICommand RefreshCommand { get; protected set; }
82+
public ICommand RefreshCommand { get; set; }
8183

8284
public bool IsCompleted => CurrentLoadingTask.IsCompleted;
8385

@@ -141,6 +143,8 @@ public Exception Error
141143

142144
public ITaskMonitor CurrentLoadingTask { get; protected set; }
143145

146+
protected bool DisableEmptyState { get; }
147+
144148
protected object SyncRoot { get; } = new object();
145149

146150
public abstract void Load();
@@ -308,15 +312,16 @@ public class TaskLoaderNotifier<TData> : TaskLoaderNotifierBase
308312

309313
private TData _result;
310314

311-
public TaskLoaderNotifier()
315+
public TaskLoaderNotifier(bool disableEmptyState = false)
316+
: base(disableEmptyState)
312317
{
313318
CurrentLoadingTask = TaskMonitor<TData>.NotStartedTask;
314319
ReloadCommand = new Command(() => Load(_loadingTaskSource));
315320
RefreshCommand = new Command(() => Load(_loadingTaskSource, isRefreshing: true));
316321
}
317322

318-
public TaskLoaderNotifier(Func<Task<TData>> loadingTaskSource)
319-
: this()
323+
public TaskLoaderNotifier(Func<Task<TData>> loadingTaskSource, bool disableEmptyState = false)
324+
: this(disableEmptyState)
320325
{
321326
_loadingTaskSource = loadingTaskSource;
322327
}
@@ -410,7 +415,7 @@ protected override void OnTaskSuccessfullyCompleted(ITaskMonitor task)
410415
// Log.Info("Task successfully completed");
411416
RaisePropertyChanged(nameof(IsSuccessfullyCompleted));
412417

413-
if (Result == null || (Result is ICollection collection && collection.Count == 0))
418+
if (!DisableEmptyState && (Result == null || (Result is ICollection collection && collection.Count == 0)))
414419
{
415420
// Log.Info("Showing empty state");
416421
ShowEmptyState = true;

0 commit comments

Comments
 (0)