diff --git a/A00_Common/spreadsheet/spreadsheet_tabs.ts b/A00_Common/spreadsheet/spreadsheet_tabs.ts index ab731679..f4cc8a55 100644 --- a/A00_Common/spreadsheet/spreadsheet_tabs.ts +++ b/A00_Common/spreadsheet/spreadsheet_tabs.ts @@ -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); } diff --git a/A00_Common/spreadsheet/spreadsheet_text.ts b/A00_Common/spreadsheet/spreadsheet_text.ts index 32f8cac4..65c96852 100644 --- a/A00_Common/spreadsheet/spreadsheet_text.ts +++ b/A00_Common/spreadsheet/spreadsheet_text.ts @@ -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"],