Started working on ReactiveUI implementation

This commit is contained in:
Enrico Ludwig 2024-09-07 00:04:55 +02:00
parent 6373a47cf6
commit 8fec3171df
5 changed files with 35 additions and 18 deletions

View File

@ -19,12 +19,13 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AsyncImageLoader.Avalonia" Version="3.3.0" /> <PackageReference Include="AsyncImageLoader.Avalonia" Version="3.3.0" />
<PackageReference Include="Avalonia" Version="11.1.0" /> <PackageReference Include="Avalonia" Version="11.1.3" />
<PackageReference Include="Avalonia.Desktop" Version="11.1.0" /> <PackageReference Include="Avalonia.Desktop" Version="11.1.3" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.0" /> <PackageReference Include="Avalonia.ReactiveUI" Version="11.1.3" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.1.0" /> <PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.3" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.1.3" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.--> <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.0" /> <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.3" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />

View File

@ -1,5 +1,6 @@
using Avalonia; using Avalonia;
using System; using System;
using Avalonia.ReactiveUI;
namespace BetterRaid; namespace BetterRaid;
@ -18,5 +19,6 @@ sealed class Program
=> AppBuilder.Configure<App>() => AppBuilder.Configure<App>()
.UsePlatformDetect() .UsePlatformDetect()
.WithInterFont() .WithInterFont()
.LogToTrace(); .LogToTrace()
.UseReactiveUI();
} }

View File

@ -9,6 +9,7 @@ using BetterRaid.Models;
using BetterRaid.Services; using BetterRaid.Services;
using BetterRaid.Views; using BetterRaid.Views;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using ReactiveUI;
namespace BetterRaid.ViewModels; namespace BetterRaid.ViewModels;
@ -29,15 +30,17 @@ public class MainWindowViewModel : ViewModelBase
public ObservableCollection<TwitchChannel> Channels public ObservableCollection<TwitchChannel> Channels
{ {
get => _channels; get => _channels;
set => SetProperty(ref _channels, value); set => this.RaiseAndSetIfChanged(ref _channels, value);
} }
public ObservableCollection<TwitchChannel> FilteredChannels => GetFilteredChannels();
public string? Filter public string? Filter
{ {
get => _filter; get => _filter;
set set
{ {
SetProperty(ref _filter, value); this.RaiseAndSetIfChanged(ref _filter, value);
LoadChannelsFromDb(); LoadChannelsFromDb();
} }
} }
@ -47,7 +50,7 @@ public class MainWindowViewModel : ViewModelBase
get => _db.OnlyOnline; get => _db.OnlyOnline;
set set
{ {
SetProperty(ref _onlyOnline, value); this.RaiseAndSetIfChanged(ref _onlyOnline, value);
LoadChannelsFromDb(); LoadChannelsFromDb();
} }
} }
@ -93,7 +96,7 @@ public class MainWindowViewModel : ViewModelBase
private void OnTwitchLoginCallback() private void OnTwitchLoginCallback()
{ {
OnPropertyChanged(nameof(IsLoggedIn)); this.RaisePropertyChanged(nameof(IsLoggedIn));
} }
private void LoadChannelsFromDb() private void LoadChannelsFromDb()
@ -112,10 +115,10 @@ public class MainWindowViewModel : ViewModelBase
Channels.Clear(); Channels.Clear();
var channels = _db.Database.Channels var channels = _db.Database.Channels
.ToList() //.ToList()
.OrderByDescending(c => c.IsLive) //.OrderByDescending(c => c.IsLive)
.Where(c => OnlyOnline && c.IsLive || !OnlyOnline) //.Where(c => OnlyOnline && c.IsLive || !OnlyOnline)
.Where(c => string.IsNullOrWhiteSpace(Filter) || c.Name?.Contains(Filter, StringComparison.CurrentCultureIgnoreCase) == true) //.Where(c => string.IsNullOrWhiteSpace(Filter) || c.Name?.Contains(Filter, StringComparison.CurrentCultureIgnoreCase) == true)
.ToList(); .ToList();
foreach (var channel in channels) foreach (var channel in channels)
@ -137,6 +140,16 @@ public class MainWindowViewModel : ViewModelBase
private void OnUserLoginChanged(object? sender, EventArgs e) private void OnUserLoginChanged(object? sender, EventArgs e)
{ {
OnPropertyChanged(nameof(IsLoggedIn)); this.RaisePropertyChanged(nameof(IsLoggedIn));
}
private ObservableCollection<TwitchChannel> GetFilteredChannels()
{
var filteredChannels = Channels
.Where(channel => OnlyOnline == false || channel.IsLive)
.Where(channel => string.IsNullOrWhiteSpace(Filter) || channel.Name?.Contains(Filter, StringComparison.OrdinalIgnoreCase) == true)
.ToList();
return new ObservableCollection<TwitchChannel>(filteredChannels);
} }
} }

View File

@ -1,8 +1,9 @@
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using ReactiveUI;
namespace BetterRaid.ViewModels; namespace BetterRaid.ViewModels;
public class ViewModelBase : ObservableObject public class ViewModelBase : ReactiveObject
{ {
} }

View File

@ -115,7 +115,7 @@
IsScrollInertiaEnabled="True" /> IsScrollInertiaEnabled="True" />
</ScrollViewer.GestureRecognizers> </ScrollViewer.GestureRecognizers>
<ListBox Items="{Binding Channels, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" <!--<ListBox Items="{Binding FilteredChannels, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
SelectionMode="Single" SelectionMode="Single"
SelectionChanged="SelectingItemsControl_OnSelectionChanged"> SelectionChanged="SelectingItemsControl_OnSelectionChanged">
@ -240,7 +240,7 @@
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>-->
</ScrollViewer> </ScrollViewer>