From d84f7deada76809f681402ccf9d84591763ebd61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=97=B0=EC=9A=B0?= Date: Tue, 24 Feb 2026 21:48:08 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=B4=EB=93=9C=20=ED=8A=B8?= =?UTF-8?q?=EB=A6=BC=20=EC=A4=8C/=ED=8C=AC=20=EB=B0=8F=20=EC=BB=A4?= =?UTF-8?q?=EC=84=9C=20=EC=98=A4=EB=B2=84=EB=A0=88=EC=9D=B4=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SoundTrimModal: 마우스 휠 줌 인/아웃 및 미들클릭 드래그 팬 기능 추가 - SoundTrimModal: macOS 오버레이 커서 지원 (ew-resize 핸들 호버) - SoundTrimModal: 뷰포트 기반 위치 계산으로 핸들 드래그 정확도 개선 - SoundManagerModal: UI 디테일 수정 --- .../main/Modal/content/SoundManagerModal.tsx | 31 +- .../main/Modal/content/SoundTrimModal.tsx | 419 ++++++++++++++---- 2 files changed, 350 insertions(+), 100 deletions(-) diff --git a/src/renderer/components/main/Modal/content/SoundManagerModal.tsx b/src/renderer/components/main/Modal/content/SoundManagerModal.tsx index a3e4ac7..24ae849 100644 --- a/src/renderer/components/main/Modal/content/SoundManagerModal.tsx +++ b/src/renderer/components/main/Modal/content/SoundManagerModal.tsx @@ -1,4 +1,5 @@ import React, { + type ChangeEvent, useCallback, useEffect, useLayoutEffect, @@ -40,6 +41,9 @@ export default function SoundManagerModal({ const [showTrimModal, setShowTrimModal] = useState(false); const [editingSoundPath, setEditingSoundPath] = useState(null); + const addFileInputRef = useRef(null); + const [pendingFile, setPendingFile] = useState(null); + const contentRef = useRef(null); const [scrollState, setScrollState] = useState({ hasTopShadow: false, @@ -201,6 +205,20 @@ export default function SoundManagerModal({ [isSaving, loadSounds, normalizedSelectedSound, onSelectSound, t], ); + const handleAddFileChange = useCallback( + (event: ChangeEvent) => { + const file = event.target.files?.[0]; + if (addFileInputRef.current) { + addFileInputRef.current.value = ""; + } + if (!file) return; + setPendingFile(file); + setEditingSoundPath(null); + setShowTrimModal(true); + }, + [], + ); + const handleEditSound = useCallback((item: SoundListItem) => { if (!item.originalPath) return; setEditingSoundPath(item.soundPath); @@ -210,6 +228,7 @@ export default function SoundManagerModal({ const handleCloseTrimModal = useCallback(() => { setShowTrimModal(false); setEditingSoundPath(null); + setPendingFile(null); }, []); const handleTrimSaved = useCallback( @@ -217,6 +236,7 @@ export default function SoundManagerModal({ onSelectSound(soundPath); setShowTrimModal(false); setEditingSoundPath(null); + setPendingFile(null); void loadSounds(); }, [loadSounds, onSelectSound], @@ -329,12 +349,18 @@ export default function SoundManagerModal({ type="button" className="flex items-center justify-center w-[150px] h-[30px] rounded-[7px] text-style-3 text-[#DCDEE7] transition-colors bg-[#2A2A30] hover:bg-[#34343c]" onClick={() => { - setEditingSoundPath(null); - setShowTrimModal(true); + addFileInputRef.current?.click(); }} > {`${t("soundManager.addSound") || "추가"} (${sounds.length})`} +