- add: popup message

This commit is contained in:
2024-12-26 18:54:37 +03:00
parent a389dd5481
commit 516801840c
14 changed files with 367 additions and 70 deletions

View File

@@ -85,12 +85,12 @@ public partial class AccountInfoViewModel : ViewModelBase
}
}
internal class Ref<T>
public class Ref<T>
{
public T Value = default!;
}
internal class DelegateCommand<T> : ICommand
public class DelegateCommand<T> : ICommand
{
private readonly Action<T> _func;
public readonly Ref<T> TRef = new();

View File

@@ -0,0 +1,22 @@
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using Nebula.Launcher.ViewHelper;
using Nebula.Launcher.Views.Popup;
namespace Nebula.Launcher.ViewModels;
[ViewRegister(typeof(InfoPopupView), false)]
public partial class InfoPopupViewModel : PopupViewModelBase
{
public InfoPopupViewModel()
{
}
public InfoPopupViewModel(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
public override string Title => "Info";
[ObservableProperty]
private string _infoText = "Test";
}

View File

@@ -21,19 +21,39 @@ public partial class MainViewModel : ViewModelBase
{
TryGetViewModel(typeof(AccountInfoViewModel), out var model);
_currentPage = model!;
TryGetViewModel(typeof(MessagePopupViewModel), out var viewModelBase);
_messagePopupViewModel = (MessagePopupViewModel)viewModelBase!;
Items = new ObservableCollection<ListItemTemplate>(_templates);
SelectedListItem = Items.First(vm => vm.ModelType == typeof(AccountInfoViewModel));
}
public MainViewModel(AccountInfoViewModel accountInfoViewModel, IServiceProvider serviceProvider): base(serviceProvider)
public MainViewModel(AccountInfoViewModel accountInfoViewModel, MessagePopupViewModel messagePopupViewModel,
IServiceProvider serviceProvider): base(serviceProvider)
{
_currentPage = accountInfoViewModel;
_messagePopupViewModel = messagePopupViewModel;
Items = new ObservableCollection<ListItemTemplate>(_templates);
_messagePopupViewModel.OnOpenRequired += () => OnOpenRequired();
_messagePopupViewModel.OnCloseRequired += () => OnCloseRequired();
SelectedListItem = Items.First(vm => vm.ModelType == typeof(AccountInfoViewModel));
}
private void OnCloseRequired()
{
IsEnabled = true;
Popup = false;
}
private void OnOpenRequired()
{
IsEnabled = false;
Popup = true;
}
private readonly List<ListItemTemplate> _templates =
[
new ListItemTemplate(typeof(AccountInfoViewModel), "Account", "Account"),
@@ -46,6 +66,11 @@ public partial class MainViewModel : ViewModelBase
[ObservableProperty]
private ViewModelBase _currentPage;
[ObservableProperty] private bool _isEnabled = true;
[ObservableProperty] private bool _popup;
private readonly MessagePopupViewModel _messagePopupViewModel;
[ObservableProperty]
private ListItemTemplate? _selectedListItem;
@@ -59,6 +84,12 @@ public partial class MainViewModel : ViewModelBase
}
CurrentPage = vmb;
var model = GetViewModel<InfoPopupViewModel>();
model.InfoText = "Переключили прикол!";
_messagePopupViewModel.PopupMessage(model);
}
public ObservableCollection<ListItemTemplate> Items { get; }

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;
using Avalonia.Logging;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nebula.Launcher.ViewHelper;
using Nebula.Launcher.Views.Popup;
namespace Nebula.Launcher.ViewModels;
[ViewRegister(typeof(MessagePopupView))]
public partial class MessagePopupViewModel : ViewModelBase
{
public MessagePopupViewModel() : base()
{
}
public MessagePopupViewModel(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
public Action? OnCloseRequired;
public Action? OnOpenRequired;
public Queue<PopupViewModelBase> ViewQueue = new();
[ObservableProperty]
private PopupViewModelBase? _currentPopup;
[ObservableProperty]
private string _currentTitle = "Default";
public void PopupMessage(PopupViewModelBase viewModelBase)
{
Console.WriteLine(viewModelBase.Title);
if (CurrentPopup == null)
{
CurrentPopup = viewModelBase;
CurrentTitle = viewModelBase.Title;
OnOpenRequired?.Invoke();
}
else
{
ViewQueue.Enqueue(viewModelBase);
}
}
[RelayCommand]
private void TriggerClose()
{
ClosePopup();
}
[RelayCommand]
private void ClosePopup()
{
Console.WriteLine("Gadeem");
if (!ViewQueue.TryDequeue(out var viewModelBase))
OnCloseRequired?.Invoke();
else
CurrentTitle = viewModelBase.Title;
CurrentPopup = viewModelBase;
}
}

View File

@@ -0,0 +1,16 @@
using System;
namespace Nebula.Launcher.ViewModels;
public abstract class PopupViewModelBase : ViewModelBase
{
public PopupViewModelBase()
{
}
public PopupViewModelBase(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
public abstract string Title { get; }
}

View File

@@ -30,6 +30,19 @@ public abstract class ViewModelBase : ObservableObject
viewModelBase = vmb;
return true;
}
public bool TryGetViewModel<T>([NotNullWhen(true)] out T? viewModelBase) where T: ViewModelBase
{
var success = TryGetViewModel(typeof(T), out var vmb);
viewModelBase = (T?)vmb;
return success;
}
public T GetViewModel<T>() where T: ViewModelBase
{
TryGetViewModel<T>(out var viewModelBase);
return viewModelBase!;
}
public void AssertDesignMode()
{