diff --git a/Runtime/FlipPage/XericFlipPageIndexVesselBase.cs b/Runtime/FlipPage/XericFlipPageIndexVesselBase.cs index ec329da..03e1cbe 100644 --- a/Runtime/FlipPage/XericFlipPageIndexVesselBase.cs +++ b/Runtime/FlipPage/XericFlipPageIndexVesselBase.cs @@ -165,6 +165,17 @@ namespace XericUI.FlipPage #endregion + + /// + /// 是否通过过滤器 + /// + /// 传入管理器,建议将过滤器放在管理器中,然后具体的通过规则写在这里,根据对象的不同,通过的规则都不一样。 + /// + public virtual bool PassFilter(XericFlipPageIndexVesselBase manager) + { + return true; + } + public override string ToString() { return $"[{nameof(ItemInfo)}] ({name})"; @@ -234,7 +245,8 @@ namespace XericUI.FlipPage private List _backupItemInfos; - + public List BackItemInfos => _backupItemInfos; + #endregion #region 生命周期 @@ -599,6 +611,23 @@ namespace XericUI.FlipPage return itemIndex / DefaultItemCountPerPage; } + /// + /// 获取备份所有数据项目 + /// + /// 是否在本地备份?(默认启用,启用后返回的枚举器内容来自备份数据,允许推迟处理过程,但也会覆盖上一次备份) + /// + /// + public IEnumerable BackupItemsFormPages(bool backupAtLocal = true) + where T : ItemInfo + { + if (backupAtLocal) + { + BackupItemsFormPages(); + return _backupItemInfos.OfType(); + } + return AllItemInfos.OfType(); + } + /// /// 备份所有数据项目 /// @@ -609,26 +638,41 @@ namespace XericUI.FlipPage } /// - /// 保存所有数据项目(强制重排操作) + /// 强制重排所有数据项目(从备份中恢复数据) /// - public void RestoreItemsToPages(List overrideDatas = null) + public void RestoreItemsToPages() { - var od = overrideDatas ?? _backupItemInfos; - if (od == null) + RestoreItemsToPages(_backupItemInfos); + } + /// + /// 强制重排所有数据项目(从备份中通过过滤器恢复数据) + /// + public void RestoreItemsByFilterToPages() + { + RestoreItemsToPages(_backupItemInfos.Where(a => a.PassFilter(this)).ToList()); + } + + /// + /// 强制重排所有数据项目(从给定备份中恢复数据) + /// + public void RestoreItemsToPages(List overrideDatas) + where T : ItemInfo + { + if (overrideDatas == null || overrideDatas.Count <= 0) { - Debug.LogError($"重排数据需要一个有效的数据对象列表", this); + Debug.LogError($"重排数据需要一个有效的数据对象列表,如果希望将数据重置为空,可以使用Clear方法,而不是重排操作。", this); return; } - if (ItemIndex2PageIndex(od.Count - 1) > _pageInfos.Count) + if (ItemIndex2PageIndex(overrideDatas.Count - 1) > _pageInfos.Count) { - Debug.LogError($"重排数据时,原有数据数量({od.Count})超出现有面板数量({_pageInfos.Count}),已拒绝重排", this); + Debug.LogError($"重排数据时,原有数据数量({overrideDatas.Count})超出现有面板数量({_pageInfos.Count}),已拒绝重排", this); return; } // 执行重排 var page = _pageInfos.First; page.Value.itemInfos.Clear(); var pageIndex = 0; - for (int i = 0; i < od.Count; i++) + for (int i = 0; i < overrideDatas.Count; i++) { var newPageIndex = ItemIndex2PageIndex(i); if (pageIndex != newPageIndex) @@ -642,7 +686,7 @@ namespace XericUI.FlipPage } page.Value.itemInfos.Clear(); } - page.Value.itemInfos.Add(od[i]); + page.Value.itemInfos.Add(overrideDatas[i]); } }