From ddfff14fb6deb5bea02b1c4afbb5c0ce1233a146 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 27 Sep 2026 21:29:39 +0900 Subject: [PATCH] =?UTF-8?q?feat(spreadsheet):=20=ED=83=AD=EC=97=90=20?= =?UTF-8?q?=EC=88=A8=EA=B8=B4=20=EC=8B=9C=ED=8A=B8=20=C2=B7=20=ED=83=AD=20?= =?UTF-8?q?=EC=83=89=20=EB=B0=98=EC=98=81(sub4=20spreadsheet=5Fsheet=5Fext?= =?UTF-8?q?ra=20=EC=9E=87=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숨긴 시트(Sheet.숨김)는 탭 목록에서 뺌 - 탭 우클릭에 [숨기기] · 숨긴 시트가 있으면 [숨긴 시트 보이기] 하위 목록(이름 눌러 바로 보임) - Sheet.탭색 은 탭 밑줄 색으로 - ORCA 실 엔진 확인 — 숨기기 → 탭 사라짐 → 하위 목록에서 보이기 → 다시 나타남 · 탭색 지정 → 밑줄 반영 --- A00_Common/spreadsheet/spreadsheet_tabs.ts | 27 ++++++++++++++++++++-- A00_Common/spreadsheet/spreadsheet_text.ts | 2 ++ 2 files changed, 27 insertions(+), 2 deletions(-) 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"],