fix: double side printing
This commit is contained in:
parent
4b08a738a7
commit
984b8aa1c8
|
|
@ -55,13 +55,13 @@ export function usePageLayout(store: DeckStore): UsePageLayoutReturn {
|
||||||
const result: PageData[] = [];
|
const result: PageData[] = [];
|
||||||
|
|
||||||
if (doubleSided()) {
|
if (doubleSided()) {
|
||||||
// 双面打印模式:每张卡牌需要 2 页(正面 + 背面)
|
// 双面打印模式:每页多张卡牌,正面和背面分别在相邻的两页
|
||||||
// 背面卡牌顺序在长边方向上逆转
|
|
||||||
const totalCards = cards.length;
|
const totalCards = cards.length;
|
||||||
|
const totalPages = Math.ceil(totalCards / cardsPerPage);
|
||||||
|
|
||||||
for (let i = 0; i < totalCards; i++) {
|
for (let pageIndex = 0; pageIndex < totalPages; pageIndex++) {
|
||||||
const frontPageIndex = i * 2;
|
const frontPageIndex = pageIndex * 2;
|
||||||
const backPageIndex = i * 2 + 1;
|
const backPageIndex = pageIndex * 2 + 1;
|
||||||
|
|
||||||
// 确保页面数组有足够长度
|
// 确保页面数组有足够长度
|
||||||
while (result.length <= backPageIndex) {
|
while (result.length <= backPageIndex) {
|
||||||
|
|
@ -76,37 +76,47 @@ export function usePageLayout(store: DeckStore): UsePageLayoutReturn {
|
||||||
const frontPage = result[frontPageIndex];
|
const frontPage = result[frontPageIndex];
|
||||||
const backPage = result[backPageIndex];
|
const backPage = result[backPageIndex];
|
||||||
|
|
||||||
// 正面:正常顺序排列
|
// 计算当前正面页的卡牌范围
|
||||||
const frontRow = Math.floor(i / cardsPerRow);
|
const startCardIndex = pageIndex * cardsPerPage;
|
||||||
const frontCol = i % cardsPerRow;
|
const endCardIndex = Math.min(startCardIndex + cardsPerPage, totalCards);
|
||||||
const frontX = baseOffsetX + frontCol * cardWidth + frontOddPageOffsetX();
|
|
||||||
const frontY = baseOffsetY + frontRow * cardHeight + frontOddPageOffsetY();
|
|
||||||
|
|
||||||
frontPage.cards.push({ data: cards[i], x: frontX, y: frontY, side: 'front' as const });
|
for (let i = startCardIndex; i < endCardIndex; i++) {
|
||||||
frontPage.bounds.minX = Math.min(frontPage.bounds.minX, frontX);
|
// 正面:正常顺序排列
|
||||||
frontPage.bounds.minY = Math.min(frontPage.bounds.minY, frontY);
|
const indexInPage = i - startCardIndex;
|
||||||
frontPage.bounds.maxX = Math.max(frontPage.bounds.maxX, frontX + cardWidth);
|
const row = Math.floor(indexInPage / cardsPerRow);
|
||||||
frontPage.bounds.maxY = Math.max(frontPage.bounds.maxY, frontY + cardHeight);
|
const col = indexInPage % cardsPerRow;
|
||||||
|
// 双面打印时,所有正面页都在奇数物理页上,所以都应用偏移
|
||||||
|
const pageOffsetX = frontOddPageOffsetX();
|
||||||
|
const pageOffsetY = frontOddPageOffsetY();
|
||||||
|
|
||||||
// 背面:逆转顺序排列(长边方向)
|
const frontX = baseOffsetX + col * cardWidth + pageOffsetX;
|
||||||
// 对于竖向打印,长边是垂直方向,所以逆转行
|
const frontY = baseOffsetY + row * cardHeight + pageOffsetY;
|
||||||
// 对于横向打印,长边是水平方向,所以逆转列
|
|
||||||
const backIndex = totalCards - 1 - i;
|
|
||||||
const backRow = orientation() === 'portrait'
|
|
||||||
? Math.floor(backIndex / cardsPerRow)
|
|
||||||
: Math.floor(i / cardsPerRow);
|
|
||||||
const backCol = orientation() === 'portrait'
|
|
||||||
? backIndex % cardsPerRow
|
|
||||||
: (cardsPerRow - 1 - (i % cardsPerRow));
|
|
||||||
|
|
||||||
const backX = baseOffsetX + backCol * cardWidth;
|
frontPage.cards.push({ data: cards[i], x: frontX, y: frontY, side: 'front' as const });
|
||||||
const backY = baseOffsetY + backRow * cardHeight;
|
frontPage.bounds.minX = Math.min(frontPage.bounds.minX, frontX);
|
||||||
|
frontPage.bounds.minY = Math.min(frontPage.bounds.minY, frontY);
|
||||||
|
frontPage.bounds.maxX = Math.max(frontPage.bounds.maxX, frontX + cardWidth);
|
||||||
|
frontPage.bounds.maxY = Math.max(frontPage.bounds.maxY, frontY + cardHeight);
|
||||||
|
|
||||||
backPage.cards.push({ data: cards[i], x: backX, y: backY, side: 'back' as const });
|
// 背面:逆转顺序排列(长边方向)
|
||||||
backPage.bounds.minX = Math.min(backPage.bounds.minX, backX);
|
// 对于竖向打印,长边是垂直方向,所以逆转行
|
||||||
backPage.bounds.minY = Math.min(backPage.bounds.minY, backY);
|
// 对于横向打印,长边是水平方向,所以逆转列
|
||||||
backPage.bounds.maxX = Math.max(backPage.bounds.maxX, backX + cardWidth);
|
const backRow = orientation() === 'portrait'
|
||||||
backPage.bounds.maxY = Math.max(backPage.bounds.maxY, backY + cardHeight);
|
? (rowsPerPage - 1 - row)
|
||||||
|
: row;
|
||||||
|
const backCol = orientation() === 'portrait'
|
||||||
|
? col
|
||||||
|
: (cardsPerRow - 1 - col);
|
||||||
|
|
||||||
|
const backX = baseOffsetX + backCol * cardWidth;
|
||||||
|
const backY = baseOffsetY + backRow * cardHeight;
|
||||||
|
|
||||||
|
backPage.cards.push({ data: cards[i], x: backX, y: backY, side: 'back' as const });
|
||||||
|
backPage.bounds.minX = Math.min(backPage.bounds.minX, backX);
|
||||||
|
backPage.bounds.minY = Math.min(backPage.bounds.minY, backY);
|
||||||
|
backPage.bounds.maxX = Math.max(backPage.bounds.maxX, backX + cardWidth);
|
||||||
|
backPage.bounds.maxY = Math.max(backPage.bounds.maxY, backY + cardHeight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 单面打印模式:原有逻辑
|
// 单面打印模式:原有逻辑
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue