import { state } from './state.js'; import { showLoading, hideLoading, setStatus } from './ui.js'; import { renderGrid, showEmptyGrid } from './grid.js'; import * as history from './history.js'; import * as fileExplorer from './handlers/file-explorer.js'; import { error, log } from './logger.js'; export function createFolderController({ btnRename, btnSortName, btnSortDate, dirPath, inputPrefix, updatePreview, }) { let homeDir = null; async function openFolder() { log('folder', 'openFolder start', { homeDir }); let folder = null; try { folder = await window.api.selectFolder(); } catch (e) { error('folder', 'selectFolder failed', e); setStatus(`폴더 열기 실패: ${e.message}`, false); return; } log('folder', 'openFolder selected', { folder }); if (!folder) return; if (homeDir && folder.startsWith(homeDir)) { await fileExplorer.loadTree(homeDir, folder); } else { await fileExplorer.loadTree(folder, folder); } await loadFolder(folder); } async function loadFolder(folder) { log('folder', 'loadFolder start', { folder }); if (!folder) return; state.currentFolder = folder; dirPath.textContent = folder; await window.api.setLastFolder(folder); await fileExplorer.setSelectedPath(folder); showLoading('이미지 목록 불러오는 중...'); let list = []; try { list = await window.api.listImages(folder); hideLoading(); log('folder', 'loadFolder listImages complete', { folder, count: list.length }); if (!list.length) { state.files.length = 0; state.selectedIdxs.clear(); showEmptyGrid(); btnRename.disabled = true; setStatus('이미지 파일 없음', false); log('folder', 'loadFolder empty', { folder }); return; } state.files.length = 0; state.files.push(...list); state.selectedIdxs.clear(); state.sortMode = 'name'; updateSortButtons(); setStatus(`${state.files.length}개 파일 로드됨`, true); const folderName = folder.replace(/\\/g, '/').split('/').pop(); if (folderName) inputPrefix.value = `${folderName}_`; renderGrid(); updatePreview(); btnRename.disabled = false; history.reset(); history.pushReorder(state.files); log('folder', 'loadFolder done', { folder, count: state.files.length }); } catch (e) { hideLoading(); error('folder', `loadFolder failed: ${folder}`, e); showEmptyGrid(); btnRename.disabled = true; setStatus(`폴더 로드 실패: ${e.message}`, false); } } async function sortFiles(mode) { if (!state.files.length) return; if (mode === 'name') state.files.sort((a, b) => a.name.localeCompare(b.name, 'ko')); else state.files.sort((a, b) => a.mtime - b.mtime); state.sortMode = mode; state.selectedIdxs.clear(); updateSortButtons(); await renderGrid(); setStatus(`${mode === 'name' ? '이름순' : '날짜순'}으로 정렬됨`, true); history.pushReorder(state.files); } function updateSortButtons() { btnSortName.classList.toggle('active', state.sortMode === 'name'); btnSortDate.classList.toggle('active', state.sortMode === 'date'); } return { loadFolder, openFolder, setHomeDir: value => { homeDir = value; }, sortFiles, updateSortButtons, }; }