Fixed channel data not loaded on start; fixed only online not working

This commit is contained in:
Enrico Ludwig 2024-08-26 20:28:42 +02:00
parent fdc717dd77
commit d3cb34e130
4 changed files with 63 additions and 95 deletions

View File

@ -7,7 +7,6 @@ namespace BetterRaid.ViewModels;
public partial class MainWindowViewModel : ViewModelBase public partial class MainWindowViewModel : ViewModelBase
{ {
private string? _filter; private string? _filter;
private bool _onlyOnline;
private BetterRaidDatabase? _db; private BetterRaidDatabase? _db;
@ -23,19 +22,6 @@ public partial class MainWindowViewModel : ViewModelBase
set => SetProperty(ref _filter, value); set => SetProperty(ref _filter, value);
} }
public bool OnlyOnline
{
get => _onlyOnline;
set
{
if (SetProperty(ref _onlyOnline, value))
{
if (Database != null)
Database.OnlyOnline = value;
}
}
}
public void ExitApplication() public void ExitApplication()
{ {
//TODO polish later //TODO polish later

View File

@ -12,16 +12,9 @@ namespace BetterRaid.ViewModels;
public class RaidButtonViewModel : ViewModelBase public class RaidButtonViewModel : ViewModelBase
{ {
private MainWindowViewModel? _mainVm;
private TwitchChannel? _channel; private TwitchChannel? _channel;
private SolidColorBrush _viewerCountColor = new SolidColorBrush(Color.FromRgb(byte.MaxValue, byte.MaxValue, byte.MaxValue)); private SolidColorBrush _viewerCountColor = new SolidColorBrush(Color.FromRgb(byte.MaxValue, byte.MaxValue, byte.MaxValue));
public bool ShowInGrid
{
get;
set;
} = true;
public required string ChannelName public required string ChannelName
{ {
get; get;
@ -36,11 +29,7 @@ public class RaidButtonViewModel : ViewModelBase
set => SetProperty(ref _viewerCountColor, value); set => SetProperty(ref _viewerCountColor, value);
} }
public MainWindowViewModel? MainVm public MainWindowViewModel? MainVm { get; set; }
{
get => _mainVm;
set => SetProperty(ref _mainVm, value);
}
public async Task<bool> GetOrUpdateChannelAsync() public async Task<bool> GetOrUpdateChannelAsync()
{ {

View File

@ -48,7 +48,7 @@
Spacing="5"> Spacing="5">
<CheckBox Content="Only Online" <CheckBox Content="Only Online"
IsChecked="{Binding OnlyOnline, Mode=TwoWay}" /> IsChecked="{Binding Database.OnlyOnline, Mode=TwoWay}" />
<TextBox Grid.Column="1" <TextBox Grid.Column="1"
Grid.Row="0" Grid.Row="0"

View File

@ -31,8 +31,10 @@ public partial class MainWindow : Window
private void OnDatabaseChanged(object? sender, PropertyChangedEventArgs e) private void OnDatabaseChanged(object? sender, PropertyChangedEventArgs e)
{ {
InitializeRaidChannels(); if (e.PropertyName == nameof(BetterRaidDatabase.OnlyOnline))
GenerateRaidGrid(); {
GenerateRaidGrid();
}
} }
private void OnDataContextChanged(object? sender, EventArgs e) private void OnDataContextChanged(object? sender, EventArgs e)
@ -42,7 +44,6 @@ public partial class MainWindow : Window
vm.Database = BetterRaidDatabase.LoadFromFile("db.json"); vm.Database = BetterRaidDatabase.LoadFromFile("db.json");
vm.Database.AutoSave = true; vm.Database.AutoSave = true;
vm.Database.PropertyChanged += OnDatabaseChanged; vm.Database.PropertyChanged += OnDatabaseChanged;
vm.OnlyOnline = vm.Database.OnlyOnline;
vm.PropertyChanged += OnViewModelChanged; vm.PropertyChanged += OnViewModelChanged;
@ -55,48 +56,6 @@ public partial class MainWindow : Window
{ {
if (e.PropertyName == nameof(MainWindowViewModel.Filter)) if (e.PropertyName == nameof(MainWindowViewModel.Filter))
{ {
if (DataContext is MainWindowViewModel mainWindowVm)
{
if (string.IsNullOrEmpty(mainWindowVm.Filter))
{
foreach (var vm in _raidButtonVMs)
{
vm.ShowInGrid = true;
}
}
foreach (var vm in _raidButtonVMs)
{
if (string.IsNullOrEmpty(mainWindowVm.Filter))
continue;
if (string.IsNullOrEmpty(vm.Channel?.DisplayName))
continue;
vm.ShowInGrid = vm.Channel.DisplayName.Contains(mainWindowVm.Filter, StringComparison.OrdinalIgnoreCase);
}
}
GenerateRaidGrid();
}
if (e.PropertyName == nameof(MainWindowViewModel.OnlyOnline))
{
if (DataContext is MainWindowViewModel mainWindowVm)
{
foreach (var vm in _raidButtonVMs)
{
if (mainWindowVm.OnlyOnline)
{
vm.ShowInGrid = vm.Channel.IsLive;
}
else
{
vm.ShowInGrid = true;
}
}
}
GenerateRaidGrid(); GenerateRaidGrid();
} }
} }
@ -115,11 +74,25 @@ public partial class MainWindow : Window
if (string.IsNullOrEmpty(channel)) if (string.IsNullOrEmpty(channel))
continue; continue;
_raidButtonVMs.Add(new RaidButtonViewModel var rbvm = new RaidButtonViewModel
{ {
ChannelName = channel, ChannelName = channel,
MainVm = vm MainVm = vm
}); };
rbvm.PropertyChanged += OnChannelDataChanged;
_raidButtonVMs.Add(rbvm);
}
UpdateChannelData();
}
private void OnChannelDataChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(RaidButtonViewModel.Channel))
{
GenerateRaidGrid();
} }
} }
@ -135,7 +108,31 @@ public partial class MainWindow : Window
raidGrid.Children.Clear(); raidGrid.Children.Clear();
var visibleChannels = _raidButtonVMs.Where(c => c.ShowInGrid).ToList(); var vm = DataContext as MainWindowViewModel;
if (vm?.Database == null)
{
return;
}
var visibleChannels = _raidButtonVMs.Where(channel =>
{
var visible = true;
if (string.IsNullOrWhiteSpace(vm.Filter) == false)
{
if (channel.ChannelName.Contains(vm.Filter, StringComparison.OrdinalIgnoreCase) == false)
{
visible = false;
}
}
if (vm.Database.OnlyOnline && channel.Channel.IsLive == false)
{
visible = false;
}
return visible;
}).ToList();
var rows = (int)Math.Ceiling((visibleChannels.Count + 1) / 3.0); var rows = (int)Math.Ceiling((visibleChannels.Count + 1) / 3.0);
for (var i = 0; i < rows; i++) for (var i = 0; i < rows; i++)
@ -164,9 +161,9 @@ public partial class MainWindow : Window
rowIndex++; rowIndex++;
} }
if (btn.DataContext is RaidButtonViewModel vm) if (btn.DataContext is RaidButtonViewModel rbvm)
{ {
Dispatcher.UIThread.InvokeAsync(vm.GetOrUpdateChannelAsync); Dispatcher.UIThread.InvokeAsync(rbvm.GetOrUpdateChannelAsync);
} }
} }
@ -220,28 +217,24 @@ public partial class MainWindow : Window
dialog.ShowDialog(this); dialog.ShowDialog(this);
} }
public void UpdateAllTiles(object? sender, DoWorkEventArgs e) public void UpdateChannelData()
{
foreach (var vm in _raidButtonVMs)
{
Dispatcher.UIThread.InvokeAsync(async () =>
{
await vm.GetOrUpdateChannelAsync();
}
);
}
}
private void UpdateAllTiles(object? sender, DoWorkEventArgs e)
{ {
while (e.Cancel == false) while (e.Cancel == false)
{ {
Task.Delay(App.AutoUpdateDelay).Wait(); Task.Delay(App.AutoUpdateDelay).Wait();
UpdateChannelData();
if (raidGrid == null || raidGrid.Children.Count == 0)
{
return;
}
foreach (var children in raidGrid.Children)
{
Dispatcher.UIThread.InvokeAsync(async () =>
{
if (children.DataContext is RaidButtonViewModel vm)
{
await vm.GetOrUpdateChannelAsync();
}
}
);
}
} }
} }
} }