Files
asciinevrdie/lib/src/features/game/widgets/dialogs/retro_sound_dialog.dart
JiWoong Sul c5eaecfa6a refactor(ui): mobile_carousel_layout.dart 분할 (1220→689 LOC)
- RetroSelectDialog, RetroOptionItem: 선택 다이얼로그
- RetroSoundDialog: 사운드 설정 다이얼로그
- RetroConfirmDialog: 확인 다이얼로그
- RetroMenuSection, RetroMenuItem, RetroSpeedChip: 메뉴 위젯
2026-01-21 17:33:52 +09:00

147 lines
4.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:asciineverdie/l10n/app_localizations.dart';
import 'package:asciineverdie/src/shared/retro_colors.dart';
import 'package:asciineverdie/src/shared/widgets/retro_widgets.dart';
/// 레트로 스타일 사운드 설정 다이얼로그
class RetroSoundDialog extends StatelessWidget {
const RetroSoundDialog({
super.key,
required this.bgmVolume,
required this.sfxVolume,
required this.onBgmChanged,
required this.onSfxChanged,
});
final double bgmVolume;
final double sfxVolume;
final ValueChanged<double> onBgmChanged;
final ValueChanged<double> onSfxChanged;
@override
Widget build(BuildContext context) {
final background = RetroColors.backgroundOf(context);
final gold = RetroColors.goldOf(context);
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
constraints: const BoxConstraints(maxWidth: 360),
decoration: BoxDecoration(
color: background,
border: Border.all(color: gold, width: 2),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 타이틀
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
color: gold.withValues(alpha: 0.2),
child: Text(
L10n.of(context).soundTitle,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 10,
color: gold,
),
textAlign: TextAlign.center,
),
),
// 슬라이더
Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
_buildVolumeSlider(
context,
icon: bgmVolume == 0 ? Icons.music_off : Icons.music_note,
label: L10n.of(context).bgmLabel,
value: bgmVolume,
onChanged: onBgmChanged,
),
const SizedBox(height: 16),
_buildVolumeSlider(
context,
icon: sfxVolume == 0 ? Icons.volume_off : Icons.volume_up,
label: L10n.of(context).sfxLabel,
value: sfxVolume,
onChanged: onSfxChanged,
),
],
),
),
// 확인 버튼
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: SizedBox(
width: double.infinity,
child: RetroTextButton(
text: L10n.of(context).ok,
onPressed: () => Navigator.pop(context),
),
),
),
],
),
),
);
}
Widget _buildVolumeSlider(
BuildContext context, {
required IconData icon,
required String label,
required double value,
required ValueChanged<double> onChanged,
}) {
final gold = RetroColors.goldOf(context);
final border = RetroColors.borderOf(context);
final percentage = (value * 100).round();
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(icon, size: 18, color: gold),
const SizedBox(width: 8),
Text(
label,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 16,
color: RetroColors.textPrimaryOf(context),
),
),
const Spacer(),
Text(
'$percentage%',
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 16,
color: gold,
),
),
],
),
const SizedBox(height: 8),
SliderTheme(
data: SliderThemeData(
trackHeight: 8,
activeTrackColor: gold,
inactiveTrackColor: border,
thumbColor: RetroColors.goldLightOf(context),
thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8),
overlayColor: gold.withValues(alpha: 0.2),
trackShape: const RectangularSliderTrackShape(),
),
child: Slider(value: value, onChanged: onChanged, divisions: 10),
),
],
);
}
}