add support for large amount of programs
This commit is contained in:
@@ -10,6 +10,9 @@
|
|||||||
SelectionMode="Single" Style="{StaticResource ListBoxView}"
|
SelectionMode="Single" Style="{StaticResource ListBoxView}"
|
||||||
SelectedItem="{Binding SelectedItem}" BorderThickness="0"
|
SelectedItem="{Binding SelectedItem}" BorderThickness="0"
|
||||||
SnapsToDevicePixels="True"
|
SnapsToDevicePixels="True"
|
||||||
|
VirtualizingStackPanel.IsVirtualizing="True"
|
||||||
|
VirtualizingStackPanel.VirtualizationMode="Recycling"
|
||||||
|
VirtualizingStackPanel.CacheLength="5"
|
||||||
PreviewMouseDown="ListView_PreviewMouseDown"
|
PreviewMouseDown="ListView_PreviewMouseDown"
|
||||||
PreviewMouseUp="ListView_PreviewMouseUp"
|
PreviewMouseUp="ListView_PreviewMouseUp"
|
||||||
PreviewMouseMove="ListView_MouseMove"
|
PreviewMouseMove="ListView_MouseMove"
|
||||||
|
|||||||
@@ -20,13 +20,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
|
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2" />
|
||||||
<PackageReference Include="LibVLCSharp" Version="3.8.2">
|
<PackageReference Include="LibVLCSharp" Version="3.9.1">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="LibVLCSharp.WPF" Version="3.8.2" />
|
<PackageReference Include="LibVLCSharp.WPF" Version="3.9.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="System.Reactive" Version="6.0.0" />
|
<PackageReference Include="System.Reactive" Version="6.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Reactive.Linq;
|
||||||
|
using System.Reactive;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using TV_Player.ViewModels;
|
using TV_Player.ViewModels;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Reactive.Concurrency;
|
||||||
|
|
||||||
namespace TV_Player
|
namespace TV_Player
|
||||||
{
|
{
|
||||||
public class ProgramsListViewModel : ObservableViewModelBase, IDisposable
|
public class ProgramsListViewModel : ObservableViewModelBase, IDisposable
|
||||||
{
|
{
|
||||||
private List<M3UInfo> _programs;
|
private ObservableCollection<M3UInfo> _programs = new ObservableCollection<M3UInfo>();
|
||||||
public List<M3UInfo> Programs
|
public ObservableCollection<M3UInfo> Programs
|
||||||
{
|
{
|
||||||
get => _programs;
|
get => _programs;
|
||||||
set => SetProperty(ref _programs, value);
|
set => SetProperty(ref _programs, value);
|
||||||
@@ -15,13 +20,17 @@ namespace TV_Player
|
|||||||
|
|
||||||
public M3UInfo SelectedItem { get; set; }
|
public M3UInfo SelectedItem { get; set; }
|
||||||
public ICommand ItemSelectedCommand { get; }
|
public ICommand ItemSelectedCommand { get; }
|
||||||
private IDisposable _programSubscriber;
|
private CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
|
|
||||||
public ProgramsListViewModel(string playlistName,GroupInfo groupInfo)
|
|
||||||
|
public ProgramsListViewModel(string playlistName, GroupInfo groupInfo)
|
||||||
{
|
{
|
||||||
TVPlayerViewModel.Instance.TopPanelVisible(true, groupInfo.Name);
|
TVPlayerViewModel.Instance.TopPanelVisible(true, groupInfo.Name);
|
||||||
ItemSelectedCommand = new RelayCommand(OnItemSelected);
|
ItemSelectedCommand = new RelayCommand(OnItemSelected);
|
||||||
_programSubscriber = TVPlayerViewModel.Instance.CurrentProgrmsData.AllPrograms.Subscribe(x => Programs = x.Where(p => p.GroupTitle == groupInfo.Name).ToList());
|
//_programSubscriber = TVPlayerViewModel.Instance.CurrentProgrmsData.AllPrograms.Subscribe(x => Programs = x.Where(p => p.GroupTitle == groupInfo.Name));
|
||||||
|
|
||||||
|
SubscribeToProgramsData(groupInfo);
|
||||||
|
|
||||||
|
|
||||||
TVPlayerViewModel.Instance.SetBackButtonAction(new Action(() =>
|
TVPlayerViewModel.Instance.SetBackButtonAction(new Action(() =>
|
||||||
{
|
{
|
||||||
@@ -29,6 +38,36 @@ namespace TV_Player
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SubscribeToProgramsData(GroupInfo groupInfo)
|
||||||
|
{
|
||||||
|
TVPlayerViewModel.Instance.CurrentProgrmsData.AllPrograms.ObserveOn(Scheduler.Default)
|
||||||
|
.Subscribe(newPrograms =>
|
||||||
|
{
|
||||||
|
var filteredPrograms = newPrograms.Where(p => p.GroupTitle == groupInfo.Name).ToList();
|
||||||
|
|
||||||
|
Programs.Clear();
|
||||||
|
const int batchSize = 100; // Define the batch size
|
||||||
|
int totalItems = filteredPrograms.Count;
|
||||||
|
|
||||||
|
for (int i = 0; i < totalItems; i += batchSize)
|
||||||
|
{
|
||||||
|
// Take the next batch of 100 items
|
||||||
|
var batch = filteredPrograms.Skip(i).Take(batchSize).ToList();
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
// Add the batch to the collection
|
||||||
|
foreach (var program in batch)
|
||||||
|
{
|
||||||
|
|
||||||
|
Programs.Add(program);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Task.Delay(500, cts.Token).Wait();
|
||||||
|
}
|
||||||
|
}, cts.Token);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnItemSelected()
|
private void OnItemSelected()
|
||||||
{
|
{
|
||||||
TVPlayerViewModel.Instance.ShowPlayerScreen(SelectedItem);
|
TVPlayerViewModel.Instance.ShowPlayerScreen(SelectedItem);
|
||||||
@@ -36,7 +75,7 @@ namespace TV_Player
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_programSubscriber.Dispose();
|
cts.Cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user