feat(spreadsheet): 탭에 숨긴 시트 · 탭 색 반영(sub4 spreadsheet_sheet_extra 잇기)

- 숨긴 시트(Sheet.숨김)는 탭 목록에서 뺌
- 탭 우클릭에 [숨기기] · 숨긴 시트가 있으면 [숨긴 시트 보이기] 하위 목록(이름 눌러 바로 보임)
- Sheet.탭색 은 탭 밑줄 색으로
- ORCA 실 엔진 확인 — 숨기기 → 탭 사라짐 → 하위 목록에서 보이기 → 다시 나타남 · 탭색 지정 → 밑줄 반영
This commit is contained in:
2026-09-27 21:29:39 +09:00
parent c6e826fe1f
commit ddfff14fb6
2 changed files with 27 additions and 2 deletions
+25 -2
View File
@@ -1,8 +1,11 @@
/* =============================================================================
* spreadsheet_tabs.ts (주인 E)
* 시트 탭 — 고르기(`ctx.showSheet`) · 더하기 · 이름 바꾸기(두 번 누르기) · 지우기 ·
* 시트 탭 — 고르기(`ctx.showSheet`) · 더하기 · 이름 바꾸기(두 번 누르기) · 지우기 · 숨기기 ·
* 끌어 옮기기 · 복사. 우클릭 메뉴는 `ui_template_context_menu.ts` 재사용.
* 이름 바꾸기 · 지우기 · 옮기기는 명령(`시트이름` · `시트지우기` · `시트옮기기` · `시트더하기`).
* 숨김 · 탭 색은 `spreadsheet_sheet_extra.ts`(sub4)의 `hideSheet` · `unhideSheet` 를 부름 —
* `Sheet.숨김` 인 시트는 탭을 안 그림 · 숨긴 시트 목록은 우클릭 [숨긴 시트 보이기] 하위 메뉴 ·
* `Sheet.탭색` 은 탭 밑줄 색.
*
* 이음(D `spreadsheet.ts` 잇는 자리) — `mountTabs(ctx)` 한 번 부르고 `root` 를 탭 자리(격자 아래)에
* 붙임. `ctx.showSheet` 로 활성 시트가 바뀌면(다른 길로도) `refresh()` 를 불러 다시 그림.
@@ -11,6 +14,7 @@
import { createMapContextMenu, type MapContextMenuItem } from "@ui/ui_template_context_menu";
import { el, showConfirmDialog, showToast } from "@ui/ui_template_elements";
import { emptySheet } from "./spreadsheet_commands";
import { hideSheet, unhideSheet } from "./spreadsheet_sheet_extra";
import { st } from "./spreadsheet_text";
import type { Sheet, Workbook } from "./spreadsheet_types";
import type { PartHandle, SpreadsheetContext } from "./spreadsheet_view_types";
@@ -45,7 +49,11 @@ export function mountTabs(ctx: SpreadsheetContext): PartHandle {
}
function render(): void {
root.replaceChildren(menu.element, ...ctx.book.시트.map(renderTab), addButton());
root.replaceChildren(
menu.element,
...ctx.book.시트.filter((s) => !s.숨김).map(renderTab),
addButton(),
);
}
function renderTab(sheet: Sheet): HTMLElement {
@@ -55,6 +63,7 @@ export function mountTabs(ctx: SpreadsheetContext): PartHandle {
attrs: { "data-sheet-id": sheet.id },
});
tab.draggable = true;
if (sheet.탭색) tab.style.borderBottom = `3px solid ${sheet.탭색}`;
tab.addEventListener("click", () => ctx.showSheet(sheet.id));
tab.addEventListener("dblclick", () => beginRename(sheet));
@@ -136,7 +145,21 @@ export function mountTabs(ctx: SpreadsheetContext): PartHandle {
}
},
],
[
st("SheetHide"),
() => {
const err = hideSheet(ctx, sheet.id);
if (err) showToast(err, "error");
},
],
];
const hidden = ctx.book.시트.filter((s) => s.숨김);
if (hidden.length) {
items.push({
label: st("SheetUnhideMenu"),
children: hidden.map((s): [string, () => void] => [s.이름, () => unhideSheet(ctx, s.id)]),
});
}
menu.open(x, y, items);
}
@@ -72,6 +72,8 @@ const TEXT = {
"Delete this sheet? This cannot be undone.",
],
SheetDeleteLastError: ["마지막 시트는 지울 수 없음", "Cannot delete the last sheet"],
SheetHide: ["숨기기", "Hide"],
SheetUnhideMenu: ["숨긴 시트 보이기", "Show hidden sheets"],
MenuCut: ["잘라내기", "Cut"],
MenuCopy: ["복사", "Copy"],
MenuPasteHint: ["Ctrl+V 를 쓸 것", "Use Ctrl+V"],