- add: popup message
This commit is contained in:
@@ -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();
|
||||
|
||||
22
Nebula.Launcher/ViewModels/InfoPopupViewModel.cs
Normal file
22
Nebula.Launcher/ViewModels/InfoPopupViewModel.cs
Normal 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";
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
68
Nebula.Launcher/ViewModels/MessagePopupViewModel.cs
Normal file
68
Nebula.Launcher/ViewModels/MessagePopupViewModel.cs
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
16
Nebula.Launcher/ViewModels/PopupViewModelBase.cs
Normal file
16
Nebula.Launcher/ViewModels/PopupViewModelBase.cs
Normal 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; }
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user