Files
Teti/Teti/ViewModels/MediaBrowserViewModel.cs
T
Alby96 b3955d8eed Aggiunta Media Browser e restyling UI tema scuro
- Introdotti MediaBrowserViewModel e MediaBrowserPage per esplorazione e gestione media scaricati, con filtri e ricerca
- Aggiornata App.xaml con palette colori, gradienti e nuovi stili scuri per card, bottoni, textbox e titoli
- Restyling completo di Dashboard, Targets e Settings con layout moderni, card, icone e badge
- Aggiornata NavigationView con nuova voce "Esplora Media", header grafico e footer con stato/versione
- Navigazione verso MediaBrowserPage e dimensione finestra iniziale più ampia
- Rimosse risorse legacy "Data" dal progetto, aggiunto launchSettings.json
- Esperienza utente più moderna, coerente e accessibile
2026-01-07 15:28:19 +01:00

135 lines
3.2 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using InstaArchive.Models;
using InstaArchive.Repositories;
namespace InstaArchive.ViewModels;
public partial class MediaBrowserViewModel : ObservableObject
{
private readonly FileBasedMediaRepository _mediaRepository;
private readonly FileBasedUserRepository _userRepository;
[ObservableProperty]
private ObservableCollection<MediaItem> allMedia = new();
[ObservableProperty]
private ObservableCollection<MediaItem> filteredMedia = new();
[ObservableProperty]
private ObservableCollection<InstagramUser> allUsers = new();
[ObservableProperty]
private InstagramUser? selectedUserFilter;
[ObservableProperty]
private string searchQuery = string.Empty;
[ObservableProperty]
private MediaItem? selectedMedia;
public MediaBrowserViewModel(
FileBasedMediaRepository mediaRepository,
FileBasedUserRepository userRepository)
{
_mediaRepository = mediaRepository;
_userRepository = userRepository;
_ = LoadDataAsync();
}
partial void OnSearchQueryChanged(string value)
{
FilterMedia();
}
partial void OnSelectedUserFilterChanged(InstagramUser? value)
{
FilterMedia();
}
private void FilterMedia()
{
var filtered = AllMedia.AsEnumerable();
// Filter by search query
if (!string.IsNullOrWhiteSpace(SearchQuery))
{
var query = SearchQuery.ToLower();
filtered = filtered.Where(m =>
m.FileName.ToLower().Contains(query) ||
m.Caption?.ToLower().Contains(query) == true
);
}
// Filter by user
if (SelectedUserFilter != null)
{
filtered = filtered.Where(m => m.UserId == SelectedUserFilter.UserId);
}
FilteredMedia.Clear();
foreach (var item in filtered)
{
FilteredMedia.Add(item);
}
}
[RelayCommand]
private async Task RefreshAsync()
{
await LoadDataAsync();
}
[RelayCommand]
private void OpenMedia(MediaItem media)
{
if (media == null)
{
return;
}
// Open media in default application
_ = Windows.System.Launcher.LaunchUriAsync(
new System.Uri($"file:///{media.LocalPath}")
);
}
[RelayCommand]
private async Task DeleteMediaAsync(MediaItem media)
{
if (media == null)
{
return;
}
// TODO: Implement delete confirmation and deletion
AllMedia.Remove(media);
FilterMedia();
await Task.CompletedTask;
}
private async Task LoadDataAsync()
{
var mediaList = await _mediaRepository.GetAllMediaAsync();
var userList = await _userRepository.GetAllUsersAsync();
AllMedia.Clear();
foreach (var item in mediaList.OrderByDescending(m => m.DownloadedAt))
{
AllMedia.Add(item);
}
AllUsers.Clear();
foreach (var user in userList)
{
AllUsers.Add(user);
}
FilterMedia();
}
}