폴더창 보이기/숨기기 버튼 추가

This commit is contained in:
2026-05-22 17:06:13 +09:00
parent 48f86566d0
commit 48d5cfb7e3
6 changed files with 44 additions and 3 deletions
+9
View File
@@ -79,6 +79,15 @@ function register(mainWindow) {
updateConfig(cfg => { cfg.sidebarWidth = width; }); updateConfig(cfg => { cfg.sidebarWidth = width; });
}); });
ipcMain.handle('get-file-explorer-visible', () => {
const cfg = readConfig();
return cfg.fileExplorerVisible !== false; // 기본값 true
});
ipcMain.handle('set-file-explorer-visible', (_e, visible) => {
updateConfig(cfg => { cfg.fileExplorerVisible = visible; });
});
ipcMain.handle('get-thumb-size', () => { ipcMain.handle('get-thumb-size', () => {
const cfg = readConfig(); const cfg = readConfig();
return Number.isFinite(cfg.thumbSize) ? cfg.thumbSize : null; return Number.isFinite(cfg.thumbSize) ? cfg.thumbSize : null;
+2
View File
@@ -27,6 +27,8 @@ contextBridge.exposeInMainWorld('api', {
setPreviewOn: (on) => ipcRenderer.invoke('set-preview-on', on), setPreviewOn: (on) => ipcRenderer.invoke('set-preview-on', on),
getSidebarWidth: () => ipcRenderer.invoke('get-sidebar-width'), getSidebarWidth: () => ipcRenderer.invoke('get-sidebar-width'),
setSidebarWidth: (width) => ipcRenderer.invoke('set-sidebar-width', width), setSidebarWidth: (width) => ipcRenderer.invoke('set-sidebar-width', width),
getFileExplorerVisible: () => ipcRenderer.invoke('get-file-explorer-visible'),
setFileExplorerVisible: (visible) => ipcRenderer.invoke('set-file-explorer-visible', visible),
getThumbSize: () => ipcRenderer.invoke('get-thumb-size'), getThumbSize: () => ipcRenderer.invoke('get-thumb-size'),
setThumbSize: (size) => ipcRenderer.invoke('set-thumb-size', size), setThumbSize: (size) => ipcRenderer.invoke('set-thumb-size', size),
checkFilesExist: (folder, names) => ipcRenderer.invoke('check-files-exist', folder, names), checkFilesExist: (folder, names) => ipcRenderer.invoke('check-files-exist', folder, names),
+3 -1
View File
@@ -15,11 +15,13 @@
<section class="app-workspace" aria-label="사진 이름 변경 작업 영역"> <section class="app-workspace" aria-label="사진 이름 변경 작업 영역">
<nav class="workspace-nav" aria-label="작업 도구"> <nav class="workspace-nav" aria-label="작업 도구">
<div class="workspace-actions"> <div class="workspace-actions">
<button class="btn btn-accent active" id="btn-file-explorer-toggle" aria-pressed="true">🗂️ (D)</button>
<div class="separator"></div>
<button class="btn btn-warning" id="btn-open">폴더 열기 (⌘O)</button> <button class="btn btn-warning" id="btn-open">폴더 열기 (⌘O)</button>
<button class="btn btn-success" id="btn-rename" disabled>이름 변경 실행 (⌘S)</button> <button class="btn btn-success" id="btn-rename" disabled>이름 변경 실행 (⌘S)</button>
</div> </div>
<div class="workspace-controls"> <div class="workspace-controls">
<button class="btn btn-info" id="btn-preview-toggle">미리보기</button> <button class="btn btn-info" id="btn-preview-toggle">미리보기 (SPACE)</button>
<div class="separator"></div> <div class="separator"></div>
<button class="btn btn-ghost" id="btn-undo" disabled>↩ 되돌리기</button> <button class="btn btn-ghost" id="btn-undo" disabled>↩ 되돌리기</button>
<button class="btn btn-ghost" id="btn-redo" disabled>↪ 다시하기</button> <button class="btn btn-ghost" id="btn-redo" disabled>↪ 다시하기</button>
+4
View File
@@ -5,6 +5,7 @@ export function initKeyboardShortcuts({
btnOpen, btnOpen,
btnRename, btnRename,
btnPreviewToggle, btnPreviewToggle,
btnFileExplorerToggle,
deleteSelected, deleteSelected,
performUndo, performUndo,
performRedo, performRedo,
@@ -38,6 +39,9 @@ export function initKeyboardShortcuts({
} else if (e.code === 'Space') { } else if (e.code === 'Space') {
e.preventDefault(); e.preventDefault();
btnPreviewToggle.click(); btnPreviewToggle.click();
} else if (e.code === 'KeyD' && !e.metaKey && !e.ctrlKey && !e.altKey) {
e.preventDefault();
btnFileExplorerToggle.click();
} else if (e.code === 'Backspace' || e.code === 'Delete') { } else if (e.code === 'Backspace' || e.code === 'Delete') {
deleteSelected(); deleteSelected();
} else if (isNavigationKey(e.code) && !e.metaKey && !e.ctrlKey && !e.altKey) { } else if (isNavigationKey(e.code) && !e.metaKey && !e.ctrlKey && !e.altKey) {
+18 -2
View File
@@ -36,9 +36,11 @@ const gridContainer = document.getElementById('grid-container');
const dragGhostEl = document.getElementById('drag-ghost'); const dragGhostEl = document.getElementById('drag-ghost');
const thumbSizeHint = document.getElementById('thumb-size-hint'); const thumbSizeHint = document.getElementById('thumb-size-hint');
const btnPreviewToggle = document.getElementById('btn-preview-toggle'); const btnPreviewToggle = document.getElementById('btn-preview-toggle');
const btnFileExplorerToggle = document.getElementById('btn-file-explorer-toggle');
const btnUndo = document.getElementById('btn-undo'); const btnUndo = document.getElementById('btn-undo');
const btnRedo = document.getElementById('btn-redo'); const btnRedo = document.getElementById('btn-redo');
const fileExplorerContainer = document.querySelector('.file-explorer'); const fileExplorerContainer = document.querySelector('.file-explorer');
const appWorkspace = document.querySelector('.app-workspace');
const aside = document.querySelector('aside'); const aside = document.querySelector('aside');
const sidebarResizer = document.getElementById('sidebar-resizer'); const sidebarResizer = document.getElementById('sidebar-resizer');
@@ -79,18 +81,20 @@ window.api.onFullscreenChange((isFullscreen) => {
// ── 앱 시작 ─────────────────────────────────────── // ── 앱 시작 ───────────────────────────────────────
(async () => { (async () => {
log('startup', 'init start'); log('startup', 'init start');
const [lastFolder, homeDir, previewOn, sidebarWidth, thumbSize] = await Promise.all([ const [lastFolder, homeDir, previewOn, sidebarWidth, fileExplorerVisible, thumbSize] = await Promise.all([
window.api.getLastFolder(), window.api.getLastFolder(),
window.api.getHomeDir(), window.api.getHomeDir(),
window.api.getPreviewOn(), window.api.getPreviewOn(),
window.api.getSidebarWidth(), window.api.getSidebarWidth(),
window.api.getFileExplorerVisible(),
window.api.getThumbSize(), window.api.getThumbSize(),
]); ]);
log('startup', 'settings loaded', { lastFolder, homeDir, previewOn, sidebarWidth, thumbSize }); log('startup', 'settings loaded', { lastFolder, homeDir, previewOn, sidebarWidth, fileExplorerVisible, thumbSize });
folderController.setHomeDir(homeDir); folderController.setHomeDir(homeDir);
btnPreviewToggle.classList.toggle('active', previewOn); btnPreviewToggle.classList.toggle('active', previewOn);
hoverPreview.setEnabled(previewOn); hoverPreview.setEnabled(previewOn);
setFileExplorerVisible(fileExplorerVisible, { persist: false });
sidebarResize.init({ sidebarResize.init({
aside, aside,
handle: sidebarResizer, handle: sidebarResizer,
@@ -129,11 +133,16 @@ btnPreviewToggle.addEventListener('click', () => {
hoverPreview.setEnabled(on); hoverPreview.setEnabled(on);
window.api.setPreviewOn(on); window.api.setPreviewOn(on);
}); });
btnFileExplorerToggle.addEventListener('click', () => {
const visible = appWorkspace.classList.contains('file-explorer-hidden');
setFileExplorerVisible(visible);
});
initKeyboardShortcuts({ initKeyboardShortcuts({
btnOpen, btnOpen,
btnRename, btnRename,
btnPreviewToggle, btnPreviewToggle,
btnFileExplorerToggle,
deleteSelected: deleteHandler.deleteSelected, deleteSelected: deleteHandler.deleteSelected,
performUndo: historyController.performUndo, performUndo: historyController.performUndo,
performRedo: historyController.performRedo, performRedo: historyController.performRedo,
@@ -151,3 +160,10 @@ function updatePreview() {
previewName.textContent = buildSequentialName(fileName, 0, format); previewName.textContent = buildSequentialName(fileName, 0, format);
updateNewNameLabels(); updateNewNameLabels();
} }
function setFileExplorerVisible(visible, { persist = true } = {}) {
appWorkspace.classList.toggle('file-explorer-hidden', !visible);
btnFileExplorerToggle.classList.toggle('active', visible);
btnFileExplorerToggle.setAttribute('aria-pressed', String(visible));
if (persist) window.api.setFileExplorerVisible(visible);
}
+8
View File
@@ -103,6 +103,10 @@ header h1 {
.workspace-controls { .workspace-controls {
margin-left: auto; margin-left: auto;
} }
.app-workspace.file-explorer-hidden aside,
.app-workspace.file-explorer-hidden #sidebar-resizer {
display: none;
}
/* ── 앱 레이아웃 ── */ /* ── 앱 레이아웃 ── */
.app-layout { .app-layout {
@@ -181,6 +185,10 @@ main {
.btn-info:hover { background: #132e42; } .btn-info:hover { background: #132e42; }
.btn-info:disabled { opacity: .4; cursor: not-allowed; } .btn-info:disabled { opacity: .4; cursor: not-allowed; }
.btn-info:not(.active) { opacity: .4; } .btn-info:not(.active) { opacity: .4; }
.btn-accent { background: rgba(124,106,247,.16); color: var(--accent); border: 1px solid rgba(124,106,247,.38); }
.btn-accent:hover { background: rgba(124,106,247,.24); }
.btn-accent:disabled { opacity: .4; cursor: not-allowed; }
.btn-accent:not(.active) { opacity: .4; }
.sort-group { .sort-group {
display: flex; display: flex;
background: #0d2535; background: #0d2535;