/// 약속: 작업 기록을 보여 준다 (넓은 화면은 아래 칸, 좁은 화면은 한 줄 - 누르면 전체). library; import 'package:flutter/material.dart'; import '../theme.dart'; import '../../l10n/tr.dart'; class LogPanel extends StatelessWidget { final List logs; final VoidCallback onClose; const LogPanel({super.key, required this.logs, required this.onClose}); /// 폰 세로에서 기록이 비었을 때의 높이 (안내 한 줄) static const emptyHeight = 40.0; @override Widget build(BuildContext context) => Container( color: JjColors.bg, child: Stack(children: [ // 15 지적: 기록이 없으면 ✕ 하나만 있는 빈 칸으로 보였다 - 무엇이 들어오는 칸인지 적는다 if (logs.isEmpty) Positioned.fill( child: Padding( padding: const EdgeInsets.fromLTRB(16, 12, 44, 0), child: Text(tr('작업 기록이 아직 없습니다. MKV 만들기 · 자막 · 다운로드를 하면 여기에 차례로 남습니다.'), maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 12, color: JjColors.textDim)), ), ), Positioned.fill( child: ListView.builder( reverse: true, padding: const EdgeInsets.fromLTRB(16, 8, 44, 8), itemCount: logs.length, itemBuilder: (_, i) => SelectableText( logs[logs.length - 1 - i], style: TextStyle( fontSize: 12, fontFamily: 'Consolas', color: JjColors.textDim), ), ), ), // 오른쪽 위 ✕: 작업 기록 숨기기 Positioned( top: 2, right: 4, child: IconButton( tooltip: tr('작업 기록 숨기기'), iconSize: 16, visualDensity: VisualDensity.compact, icon: Icon(Icons.close, color: JjColors.textDim), onPressed: onClose, ), ), ]), ); } /// 작업 기록을 숨겼을 때 맨 아래 얇은 줄: 마지막 기록 + 다시 보기 class LogStrip extends StatelessWidget { final String last; final VoidCallback onOpen; const LogStrip({super.key, required this.last, required this.onOpen}); @override Widget build(BuildContext context) => Material( color: JjColors.bg, child: InkWell( onTap: onOpen, child: SizedBox( height: 26, child: Row(children: [ const SizedBox(width: 16), Expanded( child: Text(last, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 11, fontFamily: 'Consolas', color: JjColors.textDim)), ), Text(tr('작업 기록 보기'), style: TextStyle(fontSize: 11, color: JjColors.accent)), Icon(Icons.expand_less, size: 16, color: JjColors.accent), const SizedBox(width: 12), ]), ), ), ); }