Files
qhmes/yy-admin-master/YY.Admin/Module/TabItemModel.cs

247 lines
7.1 KiB
C#
Raw Normal View History

using System.Collections.ObjectModel;
using YY.Admin.Core;
using YY.Admin.Event;
namespace YY.Admin.Module
{
/// <summary>
/// 单个标签的数据模型
/// </summary>
public class TabItemModel : BindableBase
{
public ObservableCollection<TabItemModel>? OpenTabs { get; set; }
public IEventAggregator? EventAggregator { get; set; }
private string? _id;
public string? Id
{
get => _id;
set => SetProperty(ref _id, value);
}
private string? _header;
public string? Header
{
get => _header;
set => SetProperty(ref _header, value);
}
private string? _icon = string.Empty;
public string? Icon
{
get => _icon;
set => SetProperty(ref _icon, value);
}
private IconTypeEnum? _iconType;
public IconTypeEnum IconType {
get {
return _iconType ?? IconTypeEnum.AntDesign;
}
set => SetProperty(ref _iconType, value);
}
private string? _viewName = string.Empty;
public string? ViewName
{
get => _viewName;
set => SetProperty(ref _viewName, value);
}
/// <summary>
/// Tab是否允许关闭
/// </summary>
private bool _isClosable = true;
public bool IsClosable
{
get => _isClosable;
set => SetProperty(ref _isClosable, value);
}
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set => SetProperty(ref _isSelected, value);
}
// 添加对Tab源的引用
public TabSource? TabSource { get; set; }
/// <summary>
/// 左侧是否有可关闭Tab
/// </summary>
public bool HasClosableLeft => OpenTabs != null && OpenTabs
.Take(OpenTabs.IndexOf(this))
.Any(t => t.IsClosable);
/// <summary>
/// 右侧是否有可关闭Tab
/// </summary>
public bool HasClosableRight => OpenTabs != null && OpenTabs
.Skip(OpenTabs.IndexOf(this) + 1)
.Any(t => t.IsClosable);
/// <summary>
/// 其他Tab除当前是否有可关闭Tab
/// </summary>
public bool HasClosableOther => OpenTabs != null && OpenTabs
.Where(t => t != this)
.Any(t => t.IsClosable);
/// <summary>
/// 是否有任意可关闭Tab全部
///</summary>
public bool HasClosableAny => OpenTabs != null && OpenTabs
.Any(t => t.IsClosable);
public DelegateCommand<TabItemModel> RefreshTabCommand { get; }
public DelegateCommand<TabItemModel> CloseTabCommand { get; }
public DelegateCommand<TabItemModel> CloseLeftTabsCommand { get; }
public DelegateCommand<TabItemModel> CloseRightTabsCommand { get; }
public DelegateCommand<TabItemModel> CloseOtherTabsCommand { get; }
public DelegateCommand<TabItemModel> CloseAllTabsCommand { get; }
public TabItemModel()
{
Id = $"TabRegion_{Guid.NewGuid():N}"; // 保证唯一
RefreshTabCommand = new DelegateCommand<TabItemModel>(RefreshTab);
CloseTabCommand = new DelegateCommand<TabItemModel>(CloseTab);
CloseLeftTabsCommand = new DelegateCommand<TabItemModel>(CloseLeftTabs);
CloseRightTabsCommand = new DelegateCommand<TabItemModel>(CloseRightTabs);
CloseOtherTabsCommand = new DelegateCommand<TabItemModel>(CloseOtherTabs);
CloseAllTabsCommand = new DelegateCommand<TabItemModel>(CloseAllTabs);
}
/// <summary>
/// 刷新当前Tab
/// </summary>
/// <param name="tabItemModel"></param>
private void RefreshTab(TabItemModel tabItemModel)
{
if (tabItemModel?.TabSource == null)
{
return;
}
// 发布事件
EventAggregator?.GetEvent<TabRefreshEvent>().Publish(tabItemModel);
}
/// <summary>
/// 关闭当前Tab
/// </summary>
/// <param name="tabItemModel"></param>
private void CloseTab(TabItemModel tabItemModel)
{
if (tabItemModel?.IsClosable != true || OpenTabs?.Any() != true)
{
return;
}
// 发布事件
EventAggregator?.GetEvent<TabClosedEvent>().Publish(tabItemModel);
// 从集合中移除标签
OpenTabs.Remove(tabItemModel);
}
/// <summary>
/// 关闭左侧Tab
/// </summary>
private void CloseLeftTabs(TabItemModel tabItemModel)
{
if (OpenTabs?.Any() != true)
{
return;
}
// 找到当前 Tab 的索引
int currentIndex = OpenTabs.IndexOf(tabItemModel);
// 左侧没有 Tab
if (currentIndex <= 0)
{
return;
}
// 找出左侧所有可关闭的 Tab
var leftTabs = OpenTabs
.Take(currentIndex) // 取前面所有 Tab
.Where(t => t.IsClosable) // 只关闭可关闭的
.ToList(); // 先 ToList 避免集合修改时报错
foreach (var tab in leftTabs)
{
CloseTab(tab);
}
}
/// <summary>
/// 关闭右侧Tab
/// </summary>
private void CloseRightTabs(TabItemModel tabItemModel)
{
if (OpenTabs?.Any() != true)
{
return;
}
int currentIndex = OpenTabs.IndexOf(tabItemModel);
if (currentIndex < 0 || currentIndex >= OpenTabs.Count - 1)
{
return;
}
var rightTabs = OpenTabs
.Skip(currentIndex + 1)
.Where(t => t.IsClosable)
.ToList();
foreach (var tab in rightTabs)
{
CloseTab(tab);
}
}
/// <summary>
/// 关闭其他Tab仅保留当前
/// </summary>
private void CloseOtherTabs(TabItemModel tabItemModel)
{
if (OpenTabs?.Any() != true)
{
return;
}
var otherTabs = OpenTabs
.Where(t => t != tabItemModel && t.IsClosable)
.ToList();
foreach (var tab in otherTabs)
{
CloseTab(tab);
}
}
/// <summary>
/// 关闭全部(包括当前)
/// </summary>
private void CloseAllTabs(TabItemModel tabItemModel)
{
if (OpenTabs?.Any() != true)
{
return;
}
var allClosableTabs = OpenTabs
.Where(t => t.IsClosable)
.ToList();
foreach (var tab in allClosableTabs)
{
CloseTab(tab);
}
}
}
}