shift method
(NavCtntPair<T> , NavigatableList<T> )
shift(
- NavCtntPair<
T> currentPages, - Navigatable<
T> insertPage
Implementation
(NavCtntPair<T>, NavigatableList<T>) shift(NavCtntPair<T> currentPages, Navigatable<T> insertPage){
var navigates = currentPages.$1;
var contents = currentPages.$2;
var insertPageClass = insertPage.$1;
var newColumnNumber = insertPage.$2;
var isContentPage = insertPage.$1 <= contentPageClass;
NavigatableList<T> removeList = [];
var newpageInsertStartIndex = !isContentPage ? navigates.indexWhere((page)=>insertPageClass >= page.$1) : -1;
// List<int, int, T?> mapDecline(List<int, int, T?> willMap, ){
// return willMap.map((item){
// if(willFoldColumnNumber > 0){
// willFoldColumnNumber --;
// return (item.$1, item.$2 - 1, item.$3);
// } else {
// return item;
// }
// }).toList();
// }
//// https://immvpc32u2.feishu.cn/docx/R427dV9WbonppxxMv1xc1Jt4n8c#share-HA0odkwJsoOSmYxTx0ZcK4MfnLf
//// 剔除算法
if(newpageInsertStartIndex != -1){
removeList.addAll(navigates.getRange(newpageInsertStartIndex, navigates.length));
navigates.removeRange(newpageInsertStartIndex, navigates.length);
}
var current = [...navigates, ...contents ];
int currentColumnsNum = current.fold<int>(0, (count, item)=>count + item.$2);
/// 逻辑最小和逻辑最大不一定可用
// int foldedColumnsNum = current.length;
// int expandColumnsNum = current.fold(0, (count, item)=>count + item.$1);
int foldedColumnsNum = current.fold<int>(0, (count, item)=>count + (availableColumns(item.$3.availableColumns, item.$1).lastOrNull ?? item.$2));
// int minExpandNum = current.map((item){
// var next = nextColumnLess(item.$3.availableColumns, item.$2 + 1, item.$1);
// return next != null ? next - item.$2 : -1;
// }).where((i)=>i > 0).sorted((a, b)=>b.compareTo(a)).lastOrNull ?? 0;
// bool canExpand = minExpandNum > 0;
// int expandMinColumnsNum = currentColumnsNum + minExpandNum;
// int expandMaxColumnsNum = current.fold<int>(0, (count, item)=>count + (availableColumns(item.$3.availableColumns, item.$1).firstOrNull ?? item.$2));
///
if(newColumnNumber + foldedColumnsNum >= screenColumn){
var count = newColumnNumber + foldedColumnsNum - screenColumn;
if(count > 0){
var popIndex = contents.length - count;
/// 执行退栈
removeList.addAll(contents.getRange(popIndex, contents.length));
contents.removeRange(popIndex, contents.length);
}
/// 执行最大折叠
// navigates = navigates.map((willFold)=>(willFold.$1, 1, willFold.$3)).toList();
// contents = contents.map((willFold)=>(willFold.$1, 1, willFold.$3)).toList();
navigates = navigates.map((willFold)=>(willFold.$1, availableColumns(willFold.$3.availableColumns, willFold.$1).last, willFold.$3)).toList();
contents = contents.map((willFold)=>(willFold.$1, availableColumns(willFold.$3.availableColumns, willFold.$1).last, willFold.$3)).toList();
}else
if(newColumnNumber + currentColumnsNum > screenColumn){
/// 执行折叠算法-决定折叠谁 叠多少(必然有没折叠的)
var willFoldColumnNumber = newColumnNumber + currentColumnsNum - screenColumn;
/// 先将导航栈按照从大到小折叠,再将内容栈从旧到新折叠(逐一折叠:一次折一列(不一定是一列但最少是一列))
while(willFoldColumnNumber > 0){
navigates = navigates.map((nv){
var next = nextColumnLess(nv.$3.availableColumns, nv.$2, nv.$1);
if(willFoldColumnNumber > 0 && next != null){
// if(willFoldColumnNumber > 0 && nv.$2 > 1){
// willFoldColumnNumber --;
// return (nv.$1, nv.$2 - 1, nv.$3);
willFoldColumnNumber -= nv.$2 - next;
return (nv.$1, next, nv.$3);
} else {
return nv;
}
}).toList();
if(willFoldColumnNumber > 0){
contents = contents.reversed.map((ct){
var next = nextColumnLess(ct.$3.availableColumns, ct.$2, ct.$1);
if(willFoldColumnNumber > 0 && next != null){
// if(willFoldColumnNumber > 0 && ct.$2 > 1){
// willFoldColumnNumber --;
// return (ct.$1, ct.$2 - 1, ct.$3);
willFoldColumnNumber -= ct.$2 - next;
return (ct.$1, next, ct.$3);
} else {
return ct;
}
}).toList().reversed.toList();
}
}
}
// else
// /// 扩展算法有个前提: 最小扩展 > 0 最小扩展栏目数 <= screenColumn
// if(newColumnNumber + currentColumnsNum < screenColumn && canExpand && expandMinColumnsNum <= screenColumn){
// /// 内容扩展算法(同时受到 可以展开的最大值 和 屏幕最大值两个限制)
// var willExpandColumnNumber = min(screenColumn - newColumnNumber - currentColumnsNum, expandMaxColumnsNum - currentColumnsNum);
// /// 先将内容栈按照从新到旧扩展,再从导航栈按照从小到大扩展
// while(willExpandColumnNumber > 0){
// contents = contents.map((ct){
// if(willExpandColumnNumber > 0 && ct.$2 <= ct.$1){
// willExpandColumnNumber --;
// return (ct.$1, ct.$2 + 1, ct.$3);
// } else {
// return ct;
// }
// }).toList();
// if(willExpandColumnNumber > 0){
// navigates = navigates.reversed.map((nv){
// if(willExpandColumnNumber > 0 && nv.$2 <= nv.$1){
// willExpandColumnNumber --;
// return (nv.$1, nv.$2 + 1, nv.$3);
// } else {
// return nv;
// }
// }).toList().reversed.toList();
// }
// }
// }
/// 插入元素
if(isContentPage){
return ((navigates, contents ..insert(0, insertPage)), removeList);
}else
if(newpageInsertStartIndex != -1){
return ((navigates ..insert(newpageInsertStartIndex, insertPage), contents), removeList);
}else{
return ((navigates ..add(insertPage), contents), removeList);
}
}