mirror of
https://github.com/claunia/marechai.git
synced 2025-12-16 11:04:25 +00:00
Add pages for sound synthesizers.
This commit is contained in:
@@ -22,6 +22,8 @@ using NewsViewModel = Marechai.App.Presentation.ViewModels.NewsViewModel;
|
||||
using PhotoDetailViewModel = Marechai.App.Presentation.ViewModels.PhotoDetailViewModel;
|
||||
using ProcessorDetailViewModel = Marechai.App.Presentation.ViewModels.ProcessorDetailViewModel;
|
||||
using ProcessorsListViewModel = Marechai.App.Presentation.ViewModels.ProcessorsListViewModel;
|
||||
using SoundSynthDetailViewModel = Marechai.App.Presentation.ViewModels.SoundSynthDetailViewModel;
|
||||
using SoundSynthsListViewModel = Marechai.App.Presentation.ViewModels.SoundSynthsListViewModel;
|
||||
|
||||
namespace Marechai.App;
|
||||
|
||||
@@ -128,6 +130,7 @@ public partial class App : Application
|
||||
services.AddSingleton<MachineViewViewModel>();
|
||||
services.AddSingleton<GpusService>();
|
||||
services.AddSingleton<ProcessorsService>();
|
||||
services.AddSingleton<SoundSynthsService>();
|
||||
services.AddTransient<PhotoDetailViewModel>();
|
||||
|
||||
services
|
||||
@@ -144,6 +147,8 @@ public partial class App : Application
|
||||
services.AddTransient<GpuDetailViewModel>();
|
||||
services.AddTransient<ProcessorsListViewModel>();
|
||||
services.AddTransient<ProcessorDetailViewModel>();
|
||||
services.AddTransient<SoundSynthsListViewModel>();
|
||||
services.AddTransient<SoundSynthDetailViewModel>();
|
||||
})
|
||||
.UseNavigation(RegisterRoutes));
|
||||
|
||||
@@ -174,6 +179,8 @@ public partial class App : Application
|
||||
new ViewMap<GpuDetailPage, GpuDetailViewModel>(),
|
||||
new ViewMap<ProcessorListPage, ProcessorsListViewModel>(),
|
||||
new ViewMap<ProcessorDetailPage, ProcessorDetailViewModel>(),
|
||||
new ViewMap<SoundSynthListPage, SoundSynthsListViewModel>(),
|
||||
new ViewMap<SoundSynthDetailPage, SoundSynthDetailViewModel>(),
|
||||
new DataViewMap<SecondPage, SecondViewModel, Entity>());
|
||||
|
||||
routes.Register(new RouteMap("",
|
||||
@@ -231,6 +238,17 @@ public partial class App : Application
|
||||
views.FindByViewModel<
|
||||
ProcessorDetailViewModel>())
|
||||
]),
|
||||
new RouteMap("sound-synths",
|
||||
views.FindByViewModel<SoundSynthsListViewModel>(),
|
||||
Nested:
|
||||
[
|
||||
new RouteMap("sound-synth-details",
|
||||
views.FindByViewModel<
|
||||
SoundSynthDetailViewModel>()),
|
||||
new RouteMap("machine-view",
|
||||
views.FindByViewModel<
|
||||
MachineViewViewModel>())
|
||||
]),
|
||||
new RouteMap("Second",
|
||||
views.FindByViewModel<SecondViewModel>())
|
||||
])
|
||||
|
||||
@@ -195,6 +195,20 @@ public partial class MachineViewViewModel : ObservableObject
|
||||
return;
|
||||
}
|
||||
|
||||
// If we came from SoundSynthDetailViewModel, navigate back to sound synth details
|
||||
if(_navigationSource is SoundSynthDetailViewModel soundSynthDetailVm)
|
||||
{
|
||||
var navParam = new SoundSynthDetailNavigationParameter
|
||||
{
|
||||
SoundSynthId = soundSynthDetailVm.SoundSynthId,
|
||||
NavigationSource = this
|
||||
};
|
||||
|
||||
await _navigator.NavigateViewModelAsync<SoundSynthDetailViewModel>(this, data: navParam);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Otherwise, try to go back in the navigation stack
|
||||
await _navigator.GoBack(this);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public partial class MainViewModel : ObservableObject
|
||||
NavigateToPeopleCommand = new AsyncRelayCommand(() => NavigateTo("people"));
|
||||
NavigateToProcessorsCommand = new AsyncRelayCommand(() => NavigateTo("processors"));
|
||||
NavigateToSoftwareCommand = new AsyncRelayCommand(() => NavigateTo("software"));
|
||||
NavigateToSoundSynthesizersCommand = new AsyncRelayCommand(() => NavigateTo("soundsynthesizers"));
|
||||
NavigateToSoundSynthesizersCommand = new AsyncRelayCommand(() => NavigateTo("sound-synths"));
|
||||
NavigateToSettingsCommand = new AsyncRelayCommand(() => NavigateTo("settings"));
|
||||
LoginLogoutCommand = new RelayCommand(HandleLoginLogout);
|
||||
ToggleSidebarCommand = new RelayCommand(() => IsSidebarOpen = !IsSidebarOpen);
|
||||
|
||||
@@ -0,0 +1,308 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
using Marechai.App.Presentation.Models;
|
||||
using Marechai.App.Services;
|
||||
using Uno.Extensions.Navigation;
|
||||
|
||||
namespace Marechai.App.Presentation.ViewModels;
|
||||
|
||||
public partial class SoundSynthDetailViewModel : ObservableObject
|
||||
{
|
||||
private readonly CompaniesService _companiesService;
|
||||
private readonly IStringLocalizer _localizer;
|
||||
private readonly ILogger<SoundSynthDetailViewModel> _logger;
|
||||
private readonly INavigator _navigator;
|
||||
private readonly SoundSynthsService _soundSynthsService;
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<MachineItem> _computers = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private string _computersFilterText = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _consoelsFilterText = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<MachineItem> _consoles = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private string _errorMessage = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<MachineItem> _filteredComputers = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<MachineItem> _filteredConsoles = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _hasComputers;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _hasConsoles;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _hasError;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isDataLoaded;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isLoading;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _manufacturerName = string.Empty;
|
||||
private object? _navigationSource;
|
||||
|
||||
[ObservableProperty]
|
||||
private SoundSynthDto? _soundSynth;
|
||||
|
||||
[ObservableProperty]
|
||||
private int _soundSynthId;
|
||||
|
||||
public SoundSynthDetailViewModel(SoundSynthsService soundSynthsService, CompaniesService companiesService,
|
||||
IStringLocalizer localizer, ILogger<SoundSynthDetailViewModel> logger,
|
||||
INavigator navigator)
|
||||
{
|
||||
_soundSynthsService = soundSynthsService;
|
||||
_companiesService = companiesService;
|
||||
_localizer = localizer;
|
||||
_logger = logger;
|
||||
_navigator = navigator;
|
||||
LoadData = new AsyncRelayCommand(LoadDataAsync);
|
||||
GoBackCommand = new AsyncRelayCommand(GoBackAsync);
|
||||
SelectMachineCommand = new AsyncRelayCommand<int>(SelectMachineAsync);
|
||||
ComputersFilterCommand = new RelayCommand(() => FilterComputers());
|
||||
ConsolesFilterCommand = new RelayCommand(() => FilterConsoles());
|
||||
}
|
||||
|
||||
public IAsyncRelayCommand LoadData { get; }
|
||||
public ICommand GoBackCommand { get; }
|
||||
public IAsyncRelayCommand SelectMachineCommand { get; }
|
||||
public ICommand ComputersFilterCommand { get; }
|
||||
public ICommand ConsolesFilterCommand { get; }
|
||||
|
||||
public string Title { get; } = "Sound Synthesizer Details";
|
||||
|
||||
/// <summary>
|
||||
/// Loads Sound Synthesizer details including computers and consoles
|
||||
/// </summary>
|
||||
private async Task LoadDataAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
IsLoading = true;
|
||||
ErrorMessage = string.Empty;
|
||||
HasError = false;
|
||||
IsDataLoaded = false;
|
||||
Computers.Clear();
|
||||
Consoles.Clear();
|
||||
|
||||
if(SoundSynthId <= 0)
|
||||
{
|
||||
ErrorMessage = _localizer["Invalid Sound Synthesizer ID"].Value;
|
||||
HasError = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.LogInformation("Loading Sound Synthesizer details for ID: {SoundSynthId}", SoundSynthId);
|
||||
|
||||
// Load Sound Synthesizer details
|
||||
SoundSynth = await _soundSynthsService.GetSoundSynthByIdAsync(SoundSynthId);
|
||||
|
||||
if(SoundSynth is null)
|
||||
{
|
||||
ErrorMessage = _localizer["Sound Synthesizer not found"].Value;
|
||||
HasError = true;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Set manufacturer name (from Company field or fetch by CompanyId if empty)
|
||||
ManufacturerName = SoundSynth.Company ?? string.Empty;
|
||||
|
||||
if(string.IsNullOrEmpty(ManufacturerName) && SoundSynth.CompanyId.HasValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
CompanyDto? company = await _companiesService.GetCompanyByIdAsync(SoundSynth.CompanyId.Value);
|
||||
if(company != null) ManufacturerName = company.Name ?? string.Empty;
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Failed to load company for Sound Synthesizer {SoundSynthId}", SoundSynthId);
|
||||
}
|
||||
}
|
||||
|
||||
_logger.LogInformation("Sound Synthesizer loaded: {Name}, Company: {Company}",
|
||||
SoundSynth.Name,
|
||||
ManufacturerName);
|
||||
|
||||
// Load machines and separate into computers and consoles
|
||||
try
|
||||
{
|
||||
List<MachineDto>? machines = await _soundSynthsService.GetMachinesBySoundSynthAsync(SoundSynthId);
|
||||
|
||||
if(machines != null && machines.Count > 0)
|
||||
{
|
||||
Computers.Clear();
|
||||
Consoles.Clear();
|
||||
|
||||
foreach(MachineDto machine in machines)
|
||||
{
|
||||
var machineItem = new MachineItem
|
||||
{
|
||||
Id = machine.Id ?? 0,
|
||||
Name = machine.Name ?? string.Empty,
|
||||
Manufacturer = machine.Company ?? string.Empty,
|
||||
Year = machine.Introduced?.Year ?? 0
|
||||
};
|
||||
|
||||
// Distinguish between computers and consoles based on Type
|
||||
if(machine.Type == 2) // MachineType.Console
|
||||
Consoles.Add(machineItem);
|
||||
else // MachineType.Computer or Unknown
|
||||
Computers.Add(machineItem);
|
||||
}
|
||||
|
||||
HasComputers = Computers.Count > 0;
|
||||
HasConsoles = Consoles.Count > 0;
|
||||
|
||||
// Initialize filtered collections
|
||||
FilterComputers();
|
||||
FilterConsoles();
|
||||
|
||||
_logger.LogInformation("Loaded {ComputerCount} computers and {ConsoleCount} consoles for Sound Synthesizer {SoundSynthId}",
|
||||
Computers.Count,
|
||||
Consoles.Count,
|
||||
SoundSynthId);
|
||||
}
|
||||
else
|
||||
{
|
||||
HasComputers = false;
|
||||
HasConsoles = false;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Failed to load machines for Sound Synthesizer {SoundSynthId}", SoundSynthId);
|
||||
HasComputers = false;
|
||||
HasConsoles = false;
|
||||
}
|
||||
|
||||
IsDataLoaded = true;
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error loading Sound Synthesizer details: {Exception}", ex.Message);
|
||||
ErrorMessage = _localizer["Failed to load Sound Synthesizer details. Please try again later."].Value;
|
||||
HasError = true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Filters computers based on search text
|
||||
/// </summary>
|
||||
private void FilterComputers()
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(ComputersFilterText))
|
||||
{
|
||||
FilteredComputers.Clear();
|
||||
foreach(MachineItem computer in Computers) FilteredComputers.Add(computer);
|
||||
}
|
||||
else
|
||||
{
|
||||
var filtered = Computers
|
||||
.Where(c => c.Name.Contains(ComputersFilterText, StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
|
||||
FilteredComputers.Clear();
|
||||
foreach(MachineItem computer in filtered) FilteredComputers.Add(computer);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Filters consoles based on search text
|
||||
/// </summary>
|
||||
private void FilterConsoles()
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(ConsoelsFilterText))
|
||||
{
|
||||
FilteredConsoles.Clear();
|
||||
foreach(MachineItem console in Consoles) FilteredConsoles.Add(console);
|
||||
}
|
||||
else
|
||||
{
|
||||
var filtered = Consoles.Where(c => c.Name.Contains(ConsoelsFilterText, StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
|
||||
FilteredConsoles.Clear();
|
||||
foreach(MachineItem console in filtered) FilteredConsoles.Add(console);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigates back to the Sound Synthesizer list
|
||||
/// </summary>
|
||||
private async Task GoBackAsync()
|
||||
{
|
||||
// If we came from a machine view, go back to machine view
|
||||
if(_navigationSource is MachineViewViewModel machineVm)
|
||||
{
|
||||
await _navigator.NavigateViewModelAsync<MachineViewViewModel>(this);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Default: go back to Sound Synthesizer list
|
||||
await _navigator.NavigateViewModelAsync<SoundSynthsListViewModel>(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigates to machine detail view
|
||||
/// </summary>
|
||||
private async Task SelectMachineAsync(int machineId)
|
||||
{
|
||||
if(machineId <= 0) return;
|
||||
|
||||
var navParam = new MachineViewNavigationParameter
|
||||
{
|
||||
MachineId = machineId,
|
||||
NavigationSource = this
|
||||
};
|
||||
|
||||
await _navigator.NavigateViewModelAsync<MachineViewViewModel>(this, data: navParam);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the navigation source (where we came from).
|
||||
/// </summary>
|
||||
public void SetNavigationSource(object? source)
|
||||
{
|
||||
_navigationSource = source;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Machine item for displaying computers or consoles that use the Sound Synthesizer
|
||||
/// </summary>
|
||||
public class MachineItem
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Manufacturer { get; set; } = string.Empty;
|
||||
public int Year { get; set; }
|
||||
|
||||
public string YearDisplay => Year > 0 ? Year.ToString() : "Unknown";
|
||||
}
|
||||
}
|
||||
103
Marechai.App/Presentation/ViewModels/SoundSynthsListViewModel.cs
Normal file
103
Marechai.App/Presentation/ViewModels/SoundSynthsListViewModel.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Marechai.App.Presentation.Models;
|
||||
using Marechai.App.Services;
|
||||
using Uno.Extensions.Navigation;
|
||||
|
||||
namespace Marechai.App.Presentation.ViewModels;
|
||||
|
||||
public partial class SoundSynthsListViewModel : ObservableObject
|
||||
{
|
||||
private readonly ILogger<SoundSynthsListViewModel> _logger;
|
||||
private readonly INavigator _navigator;
|
||||
private readonly SoundSynthsService _soundSynthsService;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _errorMessage = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _hasError;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isDataLoaded;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isLoading = true;
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<SoundSynthListItem> _soundSynths = [];
|
||||
|
||||
public SoundSynthsListViewModel(SoundSynthsService soundSynthsService, INavigator navigator,
|
||||
ILogger<SoundSynthsListViewModel> logger)
|
||||
{
|
||||
_soundSynthsService = soundSynthsService;
|
||||
_navigator = navigator;
|
||||
_logger = logger;
|
||||
LoadData = new AsyncRelayCommand(LoadDataAsync);
|
||||
NavigateToSoundSynthCommand = new AsyncRelayCommand<SoundSynthListItem>(NavigateToSoundSynthAsync);
|
||||
}
|
||||
|
||||
public IAsyncRelayCommand LoadData { get; }
|
||||
public IAsyncRelayCommand<SoundSynthListItem> NavigateToSoundSynthCommand { get; }
|
||||
|
||||
private async Task LoadDataAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
IsLoading = true;
|
||||
IsDataLoaded = false;
|
||||
HasError = false;
|
||||
ErrorMessage = string.Empty;
|
||||
|
||||
List<SoundSynthDto> soundSynths = await _soundSynthsService.GetAllSoundSynthsAsync();
|
||||
|
||||
SoundSynths = new ObservableCollection<SoundSynthListItem>(soundSynths.Select(ss => new SoundSynthListItem
|
||||
{
|
||||
Id = ss.Id ?? 0,
|
||||
Name = ss.Name ?? "Unknown",
|
||||
Company = ss.Company ?? "Unknown"
|
||||
})
|
||||
.OrderBy(ss => ss.Company)
|
||||
.ThenBy(ss => ss.Name));
|
||||
|
||||
_logger.LogInformation("Successfully loaded {Count} Sound Synthesizers", SoundSynths.Count);
|
||||
IsDataLoaded = true;
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error loading Sound Synthesizers");
|
||||
ErrorMessage = "Failed to load Sound Synthesizers. Please try again later.";
|
||||
HasError = true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task NavigateToSoundSynthAsync(SoundSynthListItem? item)
|
||||
{
|
||||
if(item == null) return;
|
||||
|
||||
_logger.LogInformation("Navigating to Sound Synthesizer {SoundSynthId}", item.Id);
|
||||
|
||||
await _navigator.NavigateViewModelAsync<SoundSynthDetailViewModel>(this,
|
||||
data: new SoundSynthDetailNavigationParameter
|
||||
{
|
||||
SoundSynthId = item.Id,
|
||||
NavigationSource = this
|
||||
});
|
||||
}
|
||||
|
||||
public class SoundSynthListItem
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string? Company { get; set; }
|
||||
}
|
||||
}
|
||||
310
Marechai.App/Presentation/Views/SoundSynthDetailPage.xaml
Normal file
310
Marechai.App/Presentation/Views/SoundSynthDetailPage.xaml
Normal file
@@ -0,0 +1,310 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Page x:Class="Marechai.App.Presentation.Views.SoundSynthDetailPage"
|
||||
x:Name="PageRoot"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:utu="using:Uno.Toolkit.UI"
|
||||
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
|
||||
NavigationCacheMode="Required"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||
|
||||
<Page.Resources>
|
||||
</Page.Resources>
|
||||
|
||||
<Grid utu:SafeArea.Insets="VisibleBounds">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Header -->
|
||||
<utu:NavigationBar Grid.Row="0"
|
||||
Content="{Binding Path=Title}"
|
||||
MainCommandMode="Action">
|
||||
<utu:NavigationBar.MainCommand>
|
||||
<AppBarButton Icon="Back"
|
||||
Label="Back"
|
||||
Command="{Binding GoBackCommand}"
|
||||
AutomationProperties.Name="Go back" />
|
||||
</utu:NavigationBar.MainCommand>
|
||||
</utu:NavigationBar>
|
||||
|
||||
<!-- Content -->
|
||||
<ScrollViewer Grid.Row="1">
|
||||
<StackPanel Padding="16"
|
||||
Spacing="16">
|
||||
|
||||
<!-- Loading State -->
|
||||
<StackPanel Visibility="{Binding IsLoading}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center"
|
||||
Padding="32"
|
||||
Spacing="16">
|
||||
<ProgressRing IsActive="True"
|
||||
IsIndeterminate="True"
|
||||
Height="48"
|
||||
Width="48" />
|
||||
<TextBlock Text="Loading..."
|
||||
TextAlignment="Center"
|
||||
FontSize="14" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Error State -->
|
||||
<StackPanel Visibility="{Binding HasError}"
|
||||
Padding="16"
|
||||
Background="{ThemeResource SystemErrorBackgroundColor}"
|
||||
CornerRadius="8"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Error"
|
||||
FontWeight="Bold"
|
||||
Foreground="{ThemeResource SystemErrorTextForegroundColor}" />
|
||||
<TextBlock Text="{Binding ErrorMessage}"
|
||||
Foreground="{ThemeResource SystemErrorTextForegroundColor}"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Sound Synthesizer Details -->
|
||||
<StackPanel Visibility="{Binding IsDataLoaded}"
|
||||
Spacing="16">
|
||||
|
||||
<!-- Sound Synthesizer Name -->
|
||||
<TextBlock Text="{Binding SoundSynth.Name}"
|
||||
FontSize="28"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<!-- Company/Manufacturer -->
|
||||
<StackPanel Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Manufacturer"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding ManufacturerName}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Model Code -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.ModelCode, Converter={StaticResource StringToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Model Code"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.ModelCode}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Introduced Date -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.Introduced, Converter={StaticResource ObjectToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Introduced"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.Introduced}"
|
||||
FontSize="14" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Voices -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.Voices, Converter={StaticResource ObjectToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Voices"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.Voices}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Frequency -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.Frequency, Converter={StaticResource ObjectToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Frequency (Hz)"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.Frequency}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Depth -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.Depth, Converter={StaticResource ObjectToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Depth (bit)"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.Depth}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Type -->
|
||||
<StackPanel Visibility="{Binding SoundSynth.Type, Converter={StaticResource StringToVisibilityConverter}}"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="12"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Type"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding SoundSynth.Type}"
|
||||
FontSize="14"
|
||||
TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Computers Section -->
|
||||
<StackPanel Visibility="{Binding HasComputers}"
|
||||
Spacing="8">
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Computers"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding Computers.Count}"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
Foreground="{ThemeResource SystemAccentColor}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Filter Box -->
|
||||
<AutoSuggestBox PlaceholderText="Filter computers..."
|
||||
Text="{Binding ComputersFilterText, Mode=TwoWay}"
|
||||
TextChanged="ComputersSearchBox_TextChanged"
|
||||
BorderThickness="1"
|
||||
BorderBrush="{ThemeResource ControlElevationBorderBrush}" />
|
||||
|
||||
<!-- Scrollable Computers List -->
|
||||
<ScrollViewer Height="200"
|
||||
BorderThickness="1"
|
||||
BorderBrush="{ThemeResource ControlElevationBorderBrush}"
|
||||
CornerRadius="8">
|
||||
<ItemsRepeater ItemsSource="{Binding FilteredComputers}"
|
||||
Margin="0">
|
||||
<ItemsRepeater.Layout>
|
||||
<StackLayout Spacing="4" />
|
||||
</ItemsRepeater.Layout>
|
||||
<ItemsRepeater.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Button Click="Computer_Click"
|
||||
Tag="{Binding Id}"
|
||||
HorizontalAlignment="Stretch"
|
||||
HorizontalContentAlignment="Left"
|
||||
Padding="12"
|
||||
Margin="0,4">
|
||||
<StackPanel Spacing="4"
|
||||
HorizontalAlignment="Left">
|
||||
<TextBlock Text="{Binding Name}"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold" />
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Spacing="8">
|
||||
<TextBlock Text="{Binding Manufacturer}"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding YearDisplay}"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</DataTemplate>
|
||||
</ItemsRepeater.ItemTemplate>
|
||||
</ItemsRepeater>
|
||||
</ScrollViewer>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Consoles Section -->
|
||||
<StackPanel Visibility="{Binding HasConsoles}"
|
||||
Spacing="8">
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Spacing="8">
|
||||
<TextBlock Text="Consoles"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding Consoles.Count}"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
Foreground="{ThemeResource SystemAccentColor}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Filter Box -->
|
||||
<AutoSuggestBox PlaceholderText="Filter consoles..."
|
||||
Text="{Binding ConsoelsFilterText, Mode=TwoWay}"
|
||||
TextChanged="ConsolesSearchBox_TextChanged"
|
||||
BorderThickness="1"
|
||||
BorderBrush="{ThemeResource ControlElevationBorderBrush}" />
|
||||
|
||||
<!-- Scrollable Consoles List -->
|
||||
<ScrollViewer Height="200"
|
||||
BorderThickness="1"
|
||||
BorderBrush="{ThemeResource ControlElevationBorderBrush}"
|
||||
CornerRadius="8">
|
||||
<ItemsRepeater ItemsSource="{Binding FilteredConsoles}"
|
||||
Margin="0">
|
||||
<ItemsRepeater.Layout>
|
||||
<StackLayout Spacing="4" />
|
||||
</ItemsRepeater.Layout>
|
||||
<ItemsRepeater.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Button Click="Console_Click"
|
||||
Tag="{Binding Id}"
|
||||
HorizontalAlignment="Stretch"
|
||||
HorizontalContentAlignment="Left"
|
||||
Padding="12"
|
||||
Margin="0,4">
|
||||
<StackPanel Spacing="4"
|
||||
HorizontalAlignment="Left">
|
||||
<TextBlock Text="{Binding Name}"
|
||||
FontSize="14"
|
||||
FontWeight="SemiBold" />
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Spacing="8">
|
||||
<TextBlock Text="{Binding Manufacturer}"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
<TextBlock Text="{Binding YearDisplay}"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</DataTemplate>
|
||||
</ItemsRepeater.ItemTemplate>
|
||||
</ItemsRepeater>
|
||||
</ScrollViewer>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Page>
|
||||
100
Marechai.App/Presentation/Views/SoundSynthDetailPage.xaml.cs
Normal file
100
Marechai.App/Presentation/Views/SoundSynthDetailPage.xaml.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
#nullable enable
|
||||
|
||||
using Marechai.App.Presentation.Models;
|
||||
using Marechai.App.Presentation.ViewModels;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Navigation;
|
||||
|
||||
namespace Marechai.App.Presentation.Views;
|
||||
|
||||
/// <summary>
|
||||
/// Sound Synthesizer detail page showing all information, computers, and consoles
|
||||
/// </summary>
|
||||
public sealed partial class SoundSynthDetailPage : Page
|
||||
{
|
||||
private object? _navigationSource;
|
||||
private int? _pendingSoundSynthId;
|
||||
|
||||
public SoundSynthDetailPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContextChanged += SoundSynthDetailPage_DataContextChanged;
|
||||
}
|
||||
|
||||
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||
{
|
||||
base.OnNavigatedTo(e);
|
||||
|
||||
int? soundSynthId = null;
|
||||
|
||||
// Handle both int and SoundSynthDetailNavigationParameter
|
||||
if(e.Parameter is int intId)
|
||||
soundSynthId = intId;
|
||||
else if(e.Parameter is SoundSynthDetailNavigationParameter navParam)
|
||||
{
|
||||
soundSynthId = navParam.SoundSynthId;
|
||||
_navigationSource = navParam.NavigationSource;
|
||||
}
|
||||
|
||||
if(soundSynthId.HasValue)
|
||||
{
|
||||
_pendingSoundSynthId = soundSynthId;
|
||||
|
||||
if(DataContext is SoundSynthDetailViewModel viewModel)
|
||||
{
|
||||
viewModel.SoundSynthId = soundSynthId.Value;
|
||||
if(_navigationSource != null) viewModel.SetNavigationSource(_navigationSource);
|
||||
_ = viewModel.LoadData.ExecuteAsync(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SoundSynthDetailPage_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
|
||||
{
|
||||
if(DataContext is SoundSynthDetailViewModel viewModel && _pendingSoundSynthId.HasValue)
|
||||
{
|
||||
viewModel.SoundSynthId = _pendingSoundSynthId.Value;
|
||||
if(_navigationSource != null) viewModel.SetNavigationSource(_navigationSource);
|
||||
_ = viewModel.LoadData.ExecuteAsync(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void ComputersSearchBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
|
||||
{
|
||||
if(DataContext is SoundSynthDetailViewModel vm) vm.ComputersFilterCommand.Execute(null);
|
||||
}
|
||||
|
||||
private void ComputersSearchBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
|
||||
{
|
||||
if(args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
|
||||
{
|
||||
if(DataContext is SoundSynthDetailViewModel vm) vm.ComputersFilterCommand.Execute(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void ConsolesSearchBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
|
||||
{
|
||||
if(DataContext is SoundSynthDetailViewModel vm) vm.ConsolesFilterCommand.Execute(null);
|
||||
}
|
||||
|
||||
private void ConsolesSearchBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
|
||||
{
|
||||
if(args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
|
||||
{
|
||||
if(DataContext is SoundSynthDetailViewModel vm) vm.ConsolesFilterCommand.Execute(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void Computer_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(sender is Button button && button.Tag is int machineId && DataContext is SoundSynthDetailViewModel vm)
|
||||
_ = vm.SelectMachineCommand.ExecuteAsync(machineId);
|
||||
}
|
||||
|
||||
private void Console_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(sender is Button button && button.Tag is int machineId && DataContext is SoundSynthDetailViewModel vm)
|
||||
_ = vm.SelectMachineCommand.ExecuteAsync(machineId);
|
||||
}
|
||||
}
|
||||
207
Marechai.App/Presentation/Views/SoundSynthListPage.xaml
Normal file
207
Marechai.App/Presentation/Views/SoundSynthListPage.xaml
Normal file
@@ -0,0 +1,207 @@
|
||||
<?xml version="1.0"
|
||||
encoding="utf-8"?>
|
||||
|
||||
<Page x:Class="Marechai.App.Presentation.Views.SoundSynthListPage"
|
||||
x:Name="PageRoot"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:utu="using:Uno.Toolkit.UI"
|
||||
NavigationCacheMode="Required"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||
|
||||
<Grid utu:SafeArea.Insets="VisibleBounds">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" /> <RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Header -->
|
||||
<utu:NavigationBar Grid.Row="0"
|
||||
Content="Sound Synthesizers">
|
||||
</utu:NavigationBar>
|
||||
|
||||
<!-- Main Content -->
|
||||
<Grid Grid.Row="1">
|
||||
|
||||
<!-- Loading State -->
|
||||
<StackPanel Visibility="{Binding IsLoading}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center"
|
||||
Padding="32"
|
||||
Spacing="16">
|
||||
<ProgressRing IsActive="True"
|
||||
IsIndeterminate="True"
|
||||
Height="64"
|
||||
Width="64"
|
||||
Foreground="{ThemeResource SystemAccentColor}" />
|
||||
<TextBlock Text="Loading sound synthesizers..."
|
||||
FontSize="14"
|
||||
TextAlignment="Center"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Error State -->
|
||||
<StackPanel Visibility="{Binding HasError}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center"
|
||||
Padding="24"
|
||||
Spacing="16"
|
||||
MaxWidth="400">
|
||||
<InfoBar IsOpen="True"
|
||||
Severity="Error"
|
||||
Title="Unable to Load Sound Synthesizers"
|
||||
Message="{Binding ErrorMessage}"
|
||||
IsClosable="False" />
|
||||
<Button Content="Retry"
|
||||
Command="{Binding LoadData}"
|
||||
HorizontalAlignment="Center"
|
||||
Style="{ThemeResource AccentButtonStyle}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Sound Synthesizers List -->
|
||||
<Grid Visibility="{Binding IsDataLoaded}">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto"
|
||||
HorizontalScrollBarVisibility="Disabled">
|
||||
<Grid Padding="8">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" /> <RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Count Header -->
|
||||
<StackPanel Grid.Row="0"
|
||||
Padding="16,12"
|
||||
Orientation="Horizontal"
|
||||
Spacing="4">
|
||||
<TextBlock FontSize="12"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}"
|
||||
Text="RESULTS:" />
|
||||
<TextBlock FontSize="12"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}"
|
||||
Text="{Binding SoundSynths.Count}" />
|
||||
<TextBlock FontSize="12"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}"
|
||||
Text="sound synthesizers" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Sound Synthesizers List -->
|
||||
<ItemsControl Grid.Row="1"
|
||||
ItemsSource="{Binding SoundSynths}"
|
||||
Padding="0"
|
||||
Margin="0,8,0,0"
|
||||
HorizontalAlignment="Stretch">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<StackPanel Orientation="Vertical"
|
||||
Spacing="0"
|
||||
HorizontalAlignment="Stretch" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Button Padding="0"
|
||||
Margin="0,0,0,8"
|
||||
MinHeight="80"
|
||||
HorizontalContentAlignment="Stretch"
|
||||
VerticalContentAlignment="Stretch"
|
||||
HorizontalAlignment="Stretch"
|
||||
Command="{Binding DataContext.NavigateToSoundSynthCommand, ElementName=PageRoot}"
|
||||
CommandParameter="{Binding}"
|
||||
Background="Transparent"
|
||||
BorderThickness="0">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Grid MinHeight="80"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch">
|
||||
<!-- Shadow effect -->
|
||||
<Border x:Name="ShadowBorder"
|
||||
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8"
|
||||
Padding="16,12"
|
||||
Translation="0, 0, 4"
|
||||
VerticalAlignment="Stretch">
|
||||
<Border.Shadow>
|
||||
<ThemeShadow />
|
||||
</Border.Shadow>
|
||||
|
||||
<Grid ColumnSpacing="16">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Sound Synth Info -->
|
||||
<StackPanel Grid.Column="0"
|
||||
Spacing="8"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Stretch">
|
||||
<TextBlock Text="{Binding Name}"
|
||||
FontSize="16"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{ThemeResource TextControlForeground}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Spacing="6"
|
||||
VerticalAlignment="Center">
|
||||
<FontIcon Glyph=""
|
||||
FontSize="14"
|
||||
Foreground="{ThemeResource SystemAccentColor}" />
|
||||
<TextBlock Text="{Binding Company}"
|
||||
FontSize="13"
|
||||
Foreground="{ThemeResource SystemBaseMediumColor}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Navigation Arrow -->
|
||||
<StackPanel Grid.Column="1"
|
||||
VerticalAlignment="Center">
|
||||
<FontIcon Glyph=""
|
||||
FontSize="18"
|
||||
Foreground="{ThemeResource SystemAccentColor}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<VisualStateManager.VisualStateGroups>
|
||||
<VisualStateGroup x:Name="CommonStates">
|
||||
<VisualState x:Name="Normal" />
|
||||
<VisualState x:Name="PointerOver">
|
||||
<VisualState.Setters>
|
||||
<Setter Target="ShadowBorder.Background"
|
||||
Value="{ThemeResource CardBackgroundFillColorSecondaryBrush}" />
|
||||
<Setter Target="ShadowBorder.Translation"
|
||||
Value="0, -2, 8" />
|
||||
</VisualState.Setters>
|
||||
</VisualState>
|
||||
<VisualState x:Name="Pressed">
|
||||
<VisualState.Setters>
|
||||
<Setter Target="ShadowBorder.Background"
|
||||
Value="{ThemeResource CardBackgroundFillColorTertiaryBrush}" />
|
||||
<Setter Target="ShadowBorder.Translation"
|
||||
Value="0, 0, 2" />
|
||||
</VisualState.Setters>
|
||||
</VisualState>
|
||||
</VisualStateGroup>
|
||||
</VisualStateManager.VisualStateGroups>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
</Button>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Page>
|
||||
33
Marechai.App/Presentation/Views/SoundSynthListPage.xaml.cs
Normal file
33
Marechai.App/Presentation/Views/SoundSynthListPage.xaml.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using Marechai.App.Presentation.ViewModels;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
namespace Marechai.App.Presentation.Views;
|
||||
|
||||
public sealed partial class SoundSynthListPage : Page
|
||||
{
|
||||
public SoundSynthListPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += SoundSynthListPage_Loaded;
|
||||
DataContextChanged += SoundSynthListPage_DataContextChanged;
|
||||
}
|
||||
|
||||
private void SoundSynthListPage_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
|
||||
{
|
||||
if(DataContext is SoundSynthsListViewModel vm)
|
||||
{
|
||||
// Load data when DataContext is set
|
||||
vm.LoadData.Execute(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void SoundSynthListPage_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(DataContext is SoundSynthsListViewModel vm)
|
||||
{
|
||||
// Load data when page is loaded (fallback)
|
||||
vm.LoadData.Execute(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user