Optimized filtering / data handling, started working on adding channels

This commit is contained in:
Enrico Ludwig 2024-08-22 16:06:50 +02:00
parent 1d0b109fcf
commit 832f1fd150
9 changed files with 219 additions and 62 deletions

View File

@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterRaid", "BetterRaid.csproj", "{7AB75970-30DB-496E-960C-535708A65EC6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterRaid", "BetterRaid.csproj", "{C36B7D6A-D155-4AED-8A75-4D947FD7E4D2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -11,10 +11,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7AB75970-30DB-496E-960C-535708A65EC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7AB75970-30DB-496E-960C-535708A65EC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7AB75970-30DB-496E-960C-535708A65EC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7AB75970-30DB-496E-960C-535708A65EC6}.Release|Any CPU.Build.0 = Release|Any CPU
{C36B7D6A-D155-4AED-8A75-4D947FD7E4D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C36B7D6A-D155-4AED-8A75-4D947FD7E4D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C36B7D6A-D155-4AED-8A75-4D947FD7E4D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C36B7D6A-D155-4AED-8A75-4D947FD7E4D2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -40,7 +40,7 @@
Orientation="Vertical">
<Label HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
Content="{Binding Channel.Name}" />
Content="{Binding Channel.DisplayName}" />
<Label HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
Foreground="{Binding ViewerCountColor}"

View File

@ -0,0 +1,9 @@
namespace BetterRaid.ViewModels;
public class AddChannelWindowViewModel : ViewModelBase
{
public void AddChannel()
{
System.Console.WriteLine("BLABLABLA");
}
}

View File

@ -6,18 +6,18 @@ namespace BetterRaid.ViewModels;
public partial class MainWindowViewModel : ViewModelBase
{
private string? _filter;
private bool _onlyOnline;
public string? Filter
{
get => _filter;
set
{
if (value == _filter)
return;
set => SetProperty(ref _filter, value);
}
_filter = value;
OnPropertyChanged();
}
public bool OnlyOnline
{
get => _onlyOnline;
set => SetProperty(ref _onlyOnline, value);
}
public void ExitApplication()

View File

@ -15,6 +15,12 @@ public class RaidButtonViewModel : ViewModelBase
private TwitchChannel? _channel;
private SolidColorBrush _viewerCountColor = new SolidColorBrush(Color.FromRgb(byte.MaxValue, byte.MaxValue, byte.MaxValue));
public bool ShowInGrid
{
get;
set;
} = true;
public required string ChannelName
{
get;
@ -56,7 +62,9 @@ public class RaidButtonViewModel : ViewModelBase
_channel.DisplayName = currentChannelData.DisplayName;
_channel.IsLive = currentChannelData.IsLive;
_channel.ThumbnailUrl = currentChannelData.ThumbnailUrl;
_channel.ViewerCount = currentStreamData?.ViewerCount.ToString() ?? "(Offline)";
_channel.ViewerCount = currentStreamData?.ViewerCount == null
? "(Offline)"
: $"{currentStreamData?.ViewerCount} Viewers";
if (_channel.IsLive)
{

View File

@ -0,0 +1,37 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:BetterRaid.ViewModels"
mc:Ignorable="d" d:DesignWidth="100" d:DesignHeight="50"
x:Class="BetterRaid.Views.AddChannelWindow"
x:DataType="vm:AddChannelWindowViewModel"
Width="200"
Height="80"
MaxWidth="200"
MaxHeight="80"
Title="Add Channel">
<Design.DataContext>
<vm:AddChannelWindowViewModel/>
</Design.DataContext>
<StackPanel Orientation="Vertical"
Margin="5"
Spacing="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBox HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
x:Name="channelNameTxt"
Watermark="Enter Channelname" />
<Button HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="OK"
x:Name="okBtn"
IsEnabled="True" />
</StackPanel>
</Window>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace BetterRaid.Views;
public partial class AddChannelWindow : Window
{
public AddChannelWindow()
{
InitializeComponent();
}
}

View File

@ -9,7 +9,8 @@
x:Class="BetterRaid.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="BetterRaid">
Title="BetterRaid"
WindowStartupLocation="CenterScreen">
<Design.DataContext>
<vm:MainWindowViewModel/>
@ -40,13 +41,23 @@
</MenuItem>
</Menu>
<TextBox Grid.Column="1"
Grid.Row="0"
Width="200"
Margin="2"
Watermark="Filter Channels"
Text="{Binding Filter, Mode=TwoWay}"
HorizontalAlignment="Right" />
<StackPanel Grid.Column="1"
Grid.Row="0"
Orientation="Horizontal"
Spacing="5">
<CheckBox Content="Only Online"
IsChecked="{Binding OnlyOnline, Mode=TwoWay}" />
<TextBox Grid.Column="1"
Grid.Row="0"
Width="200"
Margin="2"
Watermark="Filter Channels"
Text="{Binding Filter, Mode=TwoWay}"
HorizontalAlignment="Right" />
</StackPanel>
<ScrollViewer Grid.Column="0"
Grid.ColumnSpan="2"

View File

@ -1,7 +1,10 @@
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Threading;
using BetterRaid.ViewModels;
@ -9,6 +12,7 @@ namespace BetterRaid.Views;
public partial class MainWindow : Window
{
private ObservableCollection<RaidButtonViewModel> _raidButtonVMs;
private BackgroundWorker _autoUpdater;
private string[] _channelNames = [
@ -26,12 +30,17 @@ public partial class MainWindow : Window
public MainWindow()
{
_autoUpdater = new BackgroundWorker();
_raidButtonVMs = [];
_autoUpdater = new();
InitializeComponent();
InitializeRaidChannels();
GenerateRaidGrid();
DataContextChanged += OnDataContextChanged;
_autoUpdater.DoWork += UpdateAllTiles;
_autoUpdater.RunWorkerAsync();
}
private void OnDataContextChanged(object? sender, EventArgs e)
@ -50,56 +59,91 @@ public partial class MainWindow : Window
{
if (string.IsNullOrEmpty(mainWindowVm.Filter))
{
foreach (var child in raidGrid.Children)
foreach (var vm in _raidButtonVMs)
{
child.IsVisible = true;
vm.ShowInGrid = true;
}
return;
}
foreach (var child in raidGrid.Children)
foreach (var vm in _raidButtonVMs)
{
if (child.DataContext is RaidButtonViewModel vm)
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)
{
if (string.IsNullOrEmpty(vm.Channel?.DisplayName))
continue;
if (string.IsNullOrEmpty(mainWindowVm.Filter))
continue;
if (vm.Channel.DisplayName.Contains(mainWindowVm.Filter, StringComparison.OrdinalIgnoreCase) == false)
{
child.IsVisible = false;
}
vm.ShowInGrid = vm.Channel.IsLive;
}
else
{
vm.ShowInGrid = true;
}
}
}
GenerateRaidGrid();
}
}
private void GenerateRaidGrid()
private void InitializeRaidChannels()
{
var rows = (int)Math.Ceiling(_channelNames.Length / 3.0);
_raidButtonVMs.Clear();
for (var i = 0; i < rows; i++)
{
raidGrid.RowDefinitions.Add(new RowDefinition(GridLength.Parse("*")));
}
var colIndex = 0;
var rowIndex = 0;
foreach (var channel in _channelNames)
{
if (string.IsNullOrEmpty(channel))
continue;
_raidButtonVMs.Add(new RaidButtonViewModel
{
ChannelName = channel
});
}
}
private void GenerateRaidGrid()
{
foreach (var child in raidGrid.Children)
{
if (child is Button btn)
{
btn.Click -= OnAddChannelButtonClicked;
}
}
raidGrid.Children.Clear();
var visibleChannels = _raidButtonVMs.Where(c => c.ShowInGrid).ToList();
var rows = (int)Math.Ceiling((visibleChannels.Count + 1) / 3.0);
for (var i = 0; i < rows; i++)
{
raidGrid.RowDefinitions.Add(new RowDefinition(GridLength.Parse("Auto")));
}
var colIndex = 0;
var rowIndex = 0;
foreach (var channel in visibleChannels)
{
var btn = new RaidButton
{
DataContext = new RaidButtonViewModel
{
ChannelName = channel
}
DataContext = channel
};
Grid.SetColumn(btn, colIndex);
@ -120,8 +164,45 @@ public partial class MainWindow : Window
}
}
_autoUpdater.DoWork += UpdateAllTiles;
_autoUpdater.RunWorkerAsync();
var addButton = new Button
{
Content = "+",
FontSize = 36,
Margin = new Avalonia.Thickness(5),
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch,
VerticalAlignment = Avalonia.Layout.VerticalAlignment.Stretch,
HorizontalContentAlignment = Avalonia.Layout.HorizontalAlignment.Center,
VerticalContentAlignment = Avalonia.Layout.VerticalAlignment.Center
};
addButton.Click += OnAddChannelButtonClicked;
Grid.SetColumn(addButton, colIndex);
Grid.SetRow(addButton, rowIndex);
raidGrid.Children.Add(addButton);
}
private void OnAddChannelButtonClicked(object? sender, RoutedEventArgs e)
{
var dialog = new AddChannelWindow();
dialog.Position = new Avalonia.PixelPoint(
(int)(Position.X + Width / 2 - dialog.Width / 2),
(int)(Position.Y + Height / 2 - dialog.Height / 2)
);
// TODO Button Command not working, Button remains disabled
// This is a dirty workaround
dialog.okBtn.Click += (sender, args) => {
Array.Resize(ref _channelNames, _channelNames.Length + 1);
_channelNames[^1] = dialog?.channelNameTxt.Text ?? "";
dialog?.Close();
InitializeRaidChannels();
GenerateRaidGrid();
};
dialog.ShowDialog(this);
}
public void UpdateAllTiles(object? sender, DoWorkEventArgs e)
@ -138,16 +219,14 @@ public partial class MainWindow : Window
foreach (var children in raidGrid.Children)
{
Dispatcher.UIThread.InvokeAsync(async () =>
{
if (children.DataContext is RaidButtonViewModel vm)
{
await vm.GetOrUpdateChannelAsync();
if (children.DataContext is RaidButtonViewModel vm)
{
await vm.GetOrUpdateChannelAsync();
}
}
}
);
);
}
Console.WriteLine("Data Update");
}
}
}