import React, { useState, useEffect } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Box, Checkbox, IconButton, Typography, Divider, Select, MenuItem, FormControl, Slider, Popover, TextField, } from '@mui/material'; import { Close as CloseIcon, Edit as EditIcon } from '@mui/icons-material'; import DraggablePaper from './DraggablePaper'; export interface VerticalLineSettings { showLine: boolean; // 라인 extended: boolean; // 확장 (보조지표까지) showLabel: boolean; // 타입 라벨 (날짜) customText?: string; // 커스텀 텍스트 (상단 표시) color: string; lineStyle: 'solid' | 'dashed' | 'dotted'; lineWidth: number; opacity?: number; // 투명도 (0-100) } interface VerticalLineDialogProps { open: boolean; onClose: () => void; settings: VerticalLineSettings; onSave: (settings: VerticalLineSettings) => void; onDelete?: () => void; } export const defaultVerticalLineSettings: VerticalLineSettings = { showLine: true, extended: true, // ✅ 기본값: 보조지표까지 확장 showLabel: true, customText: '', color: '#2962ff', lineStyle: 'solid', lineWidth: 2, opacity: 100, }; const VerticalLineDialog: React.FC = ({ open, onClose, settings, onSave, onDelete, }) => { const [localSettings, setLocalSettings] = useState(settings); const [colorPickerAnchor, setColorPickerAnchor] = useState(null); useEffect(() => { setLocalSettings(settings); }, [settings]); // 색상 팔레트 const colorPalette = [ ['#000000', '#434651', '#666666', '#999999', '#B2B5BE', '#D1D4DC', '#E1E3EB', '#F0F3FA'], ['#F23645', '#FF9800', '#FDD835', '#26A69A', '#00BCD4', '#2196F3', '#3F51B5', '#9C27B0'], ['#880E4F', '#B71C1C', '#E65100', '#F57F17', '#827717', '#33691E', '#1B5E20', '#004D40'], ['#FF5252', '#FF6E40', '#FFAB40', '#FFD740', '#AEEA00', '#69F0AE', '#40C4FF', '#448AFF'], ['#FF80AB', '#FF4081', '#F50057', '#C51162', '#880E4F', '#4A148C', '#311B92', '#1A237E'], ['#EA80FC', '#E040FB', '#D500F9', '#AA00FF', '#6200EA', '#304FFE', '#2962FF', '#0091EA'], ['#8C9EFF', '#536DFE', '#3D5AFE', '#1976D2', '#0277BD', '#006064', '#004D40', '#1B5E20'], ]; const handleColorPickerOpen = (event: React.MouseEvent) => { setColorPickerAnchor(event.currentTarget); }; const handleColorPickerClose = () => { setColorPickerAnchor(null); }; const handleColorSelect = (color: string) => { setLocalSettings({ ...localSettings, color }); }; const handleSave = () => { onSave(localSettings); onClose(); }; const handleReset = () => { setLocalSettings(defaultVerticalLineSettings); }; return ( 세로줄 {/* 라인 체크박스 */} setLocalSettings({ ...localSettings, showLine: e.target.checked })} size="small" /> 라인 {/* 색상 선택 */} {localSettings.showLine && ( )} {/* 선 스타일 */} {localSettings.showLine && ( 스타일: 두께: )} {/* 확장 체크박스 */} setLocalSettings({ ...localSettings, extended: e.target.checked })} size="small" /> 확장 {localSettings.extended ? '보조지표까지 표시' : '캔들차트만 표시'} {/* 타입 라벨 체크박스 */} setLocalSettings({ ...localSettings, showLabel: e.target.checked })} size="small" /> 타입 라벨 {localSettings.showLabel ? '날짜 표시' : '날짜 숨김'} {/* 커스텀 텍스트 입력 */} 수직선 상단 텍스트 setLocalSettings({ ...localSettings, customText: e.target.value })} helperText="입력한 텍스트가 수직선 상단에 표시됩니다" /> {/* 색상 팔레트 팝오버 */} {/* 색상 팔레트 */} {colorPalette.map((row, rowIndex) => ( {row.map((color, colIndex) => ( { handleColorSelect(color); handleColorPickerClose(); }} sx={{ width: 24, height: 24, bgcolor: color, cursor: 'pointer', border: '1px solid rgba(0,0,0,0.1)', '&:hover': { border: '2px solid white', boxShadow: '0 0 4px rgba(0,0,0,0.3)', }, }} /> ))} ))} {/* 투명도 슬라이더 */} 투명도 { setLocalSettings({ ...localSettings, opacity: value as number }); }} min={0} max={100} valueLabelDisplay="auto" valueLabelFormat={(value) => `${value}%`} sx={{ width: '100%' }} /> {/* 커스텀 색상 입력 */} 색상 코드: { const color = e.target.value; if (/^#[0-9A-F]{6}$/i.test(color)) { handleColorSelect(color); } }} style={{ flex: 1, padding: '4px 8px', border: '1px solid #ccc', borderRadius: '4px', fontSize: '12px', }} /> {onDelete && ( )} ); }; export default VerticalLineDialog;