refactor(ui): 위젯 분리 및 화면 개선

- game_play_screen에서 desktop 패널 위젯 분리
- death_overlay에서 death_buttons, death_combat_log 분리
- mobile_carousel_layout에서 mobile_options_menu 분리
- 아레나 위젯 개선 (arena_hp_bar, result_panel 등)
- settings_screen에서 retro_settings_widgets 분리
- 기타 위젯 리팩토링 및 import 경로 업데이트
This commit is contained in:
JiWoong Sul
2026-02-23 15:49:38 +09:00
parent 6ddbf23816
commit 864a866039
43 changed files with 3338 additions and 3184 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:asciineverdie/l10n/app_localizations.dart';
import 'package:asciineverdie/src/core/model/game_statistics.dart';
import 'package:asciineverdie/src/shared/widgets/retro_dialog.dart';
@@ -52,34 +53,19 @@ class _StatisticsDialogState extends State<StatisticsDialog>
@override
Widget build(BuildContext context) {
final isKorean = Localizations.localeOf(context).languageCode == 'ko';
final isJapanese = Localizations.localeOf(context).languageCode == 'ja';
final title = isKorean
? '통계'
: isJapanese
? '統計'
: 'Statistics';
final tabs = isKorean
? ['세션', '누적']
: isJapanese
? ['セッション', '累積']
: ['Session', 'Total'];
final l10n = L10n.of(context);
return RetroDialog(
title: title,
title: l10n.statsStatistics,
titleIcon: '📊',
maxWidth: 420,
maxHeight: 520,
// accentColor: 테마에서 자동 결정 (goldOf)
child: Column(
children: [
// 탭 바
RetroTabBar(
controller: _tabController,
tabs: tabs,
// accentColor: 테마에서 자동 결정 (goldOf)
tabs: [l10n.statsSession, l10n.statsAccumulated],
),
// 탭 내용
Expanded(
@@ -105,198 +91,109 @@ class _SessionStatisticsView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isKorean = Localizations.localeOf(context).languageCode == 'ko';
final isJapanese = Localizations.localeOf(context).languageCode == 'ja';
final l10n = L10n.of(context);
return ListView(
padding: const EdgeInsets.all(12),
children: [
_StatSection(
title: isKorean
? '전투'
: isJapanese
? '戦闘'
: 'Combat',
title: l10n.statsCombat,
icon: '',
items: [
_StatItem(
label: isKorean
? '플레이 시간'
: isJapanese
? 'プレイ時間'
: 'Play Time',
label: l10n.statsPlayTime,
value: stats.formattedPlayTime,
),
_StatItem(
label: isKorean
? '처치한 몬스터'
: isJapanese
? '倒したモンスター'
: 'Monsters Killed',
label: l10n.statsMonstersKilled,
value: _formatNumber(stats.monstersKilled),
),
_StatItem(
label: isKorean
? '보스 처치'
: isJapanese
? 'ボス討伐'
: 'Bosses Defeated',
label: l10n.statsBossesDefeated,
value: _formatNumber(stats.bossesDefeated),
),
_StatItem(
label: isKorean
? '사망 횟수'
: isJapanese
? '死亡回数'
: 'Deaths',
label: l10n.statsDeaths,
value: _formatNumber(stats.deathCount),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '데미지'
: isJapanese
? 'ダメージ'
: 'Damage',
title: l10n.statsDamage,
icon: '',
items: [
_StatItem(
label: isKorean
? '입힌 데미지'
: isJapanese
? '与えたダメージ'
: 'Damage Dealt',
label: l10n.statsDamageDealt,
value: _formatNumber(stats.totalDamageDealt),
),
_StatItem(
label: isKorean
? '받은 데미지'
: isJapanese
? '受けたダメージ'
: 'Damage Taken',
label: l10n.statsDamageTaken,
value: _formatNumber(stats.totalDamageTaken),
),
_StatItem(
label: isKorean
? '평균 DPS'
: isJapanese
? '平均DPS'
: 'Average DPS',
label: l10n.statsAverageDps,
value: stats.averageDps.toStringAsFixed(1),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '스킬'
: isJapanese
? 'スキル'
: 'Skills',
title: l10n.statsSkills,
icon: '',
items: [
_StatItem(
label: isKorean
? '스킬 사용'
: isJapanese
? 'スキル使用'
: 'Skills Used',
label: l10n.statsSkillsUsed,
value: _formatNumber(stats.skillsUsed),
),
_StatItem(
label: isKorean
? '크리티컬 히트'
: isJapanese
? 'クリティカルヒット'
: 'Critical Hits',
label: l10n.statsCriticalHits,
value: _formatNumber(stats.criticalHits),
),
_StatItem(
label: isKorean
? '최대 연속 크리티컬'
: isJapanese
? '最大連続クリティカル'
: 'Max Critical Streak',
label: l10n.statsMaxCriticalStreak,
value: _formatNumber(stats.maxCriticalStreak),
),
_StatItem(
label: isKorean
? '크리티컬 비율'
: isJapanese
? 'クリティカル率'
: 'Critical Rate',
label: l10n.statsCriticalRate,
value: '${(stats.criticalRate * 100).toStringAsFixed(1)}%',
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '경제'
: isJapanese
? '経済'
: 'Economy',
title: l10n.statsEconomy,
icon: '💰',
items: [
_StatItem(
label: isKorean
? '획득 골드'
: isJapanese
? '獲得ゴールド'
: 'Gold Earned',
label: l10n.statsGoldEarned,
value: _formatNumber(stats.goldEarned),
),
_StatItem(
label: isKorean
? '소비 골드'
: isJapanese
? '消費ゴールド'
: 'Gold Spent',
label: l10n.statsGoldSpent,
value: _formatNumber(stats.goldSpent),
),
_StatItem(
label: isKorean
? '판매 아이템'
: isJapanese
? '売却アイテム'
: 'Items Sold',
label: l10n.statsItemsSold,
value: _formatNumber(stats.itemsSold),
),
_StatItem(
label: isKorean
? '물약 사용'
: isJapanese
? 'ポーション使用'
: 'Potions Used',
label: l10n.statsPotionsUsed,
value: _formatNumber(stats.potionsUsed),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '진행'
: isJapanese
? '進行'
: 'Progress',
title: l10n.statsProgress,
icon: '',
items: [
_StatItem(
label: isKorean
? '레벨업'
: isJapanese
? 'レベルアップ'
: 'Level Ups',
label: l10n.statsLevelUps,
value: _formatNumber(stats.levelUps),
),
_StatItem(
label: isKorean
? '완료한 퀘스트'
: isJapanese
? '完了したクエスト'
: 'Quests Completed',
label: l10n.statsQuestsCompleted,
value: _formatNumber(stats.questsCompleted),
),
],
@@ -314,44 +211,27 @@ class _CumulativeStatisticsView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isKorean = Localizations.localeOf(context).languageCode == 'ko';
final isJapanese = Localizations.localeOf(context).languageCode == 'ja';
final l10n = L10n.of(context);
return ListView(
padding: const EdgeInsets.all(12),
children: [
_StatSection(
title: isKorean
? '기록'
: isJapanese
? '記録'
: 'Records',
title: l10n.statsRecords,
icon: '🏆',
items: [
_StatItem(
label: isKorean
? '최고 레벨'
: isJapanese
? '最高レベル'
: 'Highest Level',
label: l10n.statsHighestLevel,
value: _formatNumber(stats.highestLevel),
highlight: true,
),
_StatItem(
label: isKorean
? '최대 보유 골드'
: isJapanese
? '最大所持ゴールド'
: 'Highest Gold Held',
label: l10n.statsHighestGoldHeld,
value: _formatNumber(stats.highestGoldHeld),
highlight: true,
),
_StatItem(
label: isKorean
? '최고 연속 크리티컬'
: isJapanese
? '最高連続クリティカル'
: 'Best Critical Streak',
label: l10n.statsBestCriticalStreak,
value: _formatNumber(stats.bestCriticalStreak),
highlight: true,
),
@@ -359,191 +239,103 @@ class _CumulativeStatisticsView extends StatelessWidget {
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '총 플레이'
: isJapanese
? '総プレイ'
: 'Total Play',
title: l10n.statsTotalPlay,
icon: '',
items: [
_StatItem(
label: isKorean
? '총 플레이 시간'
: isJapanese
? '総プレイ時間'
: 'Total Play Time',
label: l10n.statsTotalPlayTime,
value: stats.formattedTotalPlayTime,
),
_StatItem(
label: isKorean
? '시작한 게임'
: isJapanese
? '開始したゲーム'
: 'Games Started',
label: l10n.statsGamesStarted,
value: _formatNumber(stats.gamesStarted),
),
_StatItem(
label: isKorean
? '클리어한 게임'
: isJapanese
? 'クリアしたゲーム'
: 'Games Completed',
label: l10n.statsGamesCompleted,
value: _formatNumber(stats.gamesCompleted),
),
_StatItem(
label: isKorean
? '클리어율'
: isJapanese
? 'クリア率'
: 'Completion Rate',
label: l10n.statsCompletionRate,
value: '${(stats.completionRate * 100).toStringAsFixed(1)}%',
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '총 전투'
: isJapanese
? '総戦闘'
: 'Total Combat',
title: l10n.statsTotalCombat,
icon: '',
items: [
_StatItem(
label: isKorean
? '처치한 몬스터'
: isJapanese
? '倒したモンスター'
: 'Monsters Killed',
label: l10n.statsMonstersKilled,
value: _formatNumber(stats.totalMonstersKilled),
),
_StatItem(
label: isKorean
? '보스 처치'
: isJapanese
? 'ボス討伐'
: 'Bosses Defeated',
label: l10n.statsBossesDefeated,
value: _formatNumber(stats.totalBossesDefeated),
),
_StatItem(
label: isKorean
? '총 사망'
: isJapanese
? '総死亡'
: 'Total Deaths',
label: l10n.statsTotalDeaths,
value: _formatNumber(stats.totalDeaths),
),
_StatItem(
label: isKorean
? '총 레벨업'
: isJapanese
? '総レベルアップ'
: 'Total Level Ups',
label: l10n.statsTotalLevelUps,
value: _formatNumber(stats.totalLevelUps),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '총 데미지'
: isJapanese
? '総ダメージ'
: 'Total Damage',
title: l10n.statsTotalDamage,
icon: '',
items: [
_StatItem(
label: isKorean
? '입힌 데미지'
: isJapanese
? '与えたダメージ'
: 'Damage Dealt',
label: l10n.statsDamageDealt,
value: _formatNumber(stats.totalDamageDealt),
),
_StatItem(
label: isKorean
? '받은 데미지'
: isJapanese
? '受けたダメージ'
: 'Damage Taken',
label: l10n.statsDamageTaken,
value: _formatNumber(stats.totalDamageTaken),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '총 스킬'
: isJapanese
? '総スキル'
: 'Total Skills',
title: l10n.statsTotalSkills,
icon: '',
items: [
_StatItem(
label: isKorean
? '스킬 사용'
: isJapanese
? 'スキル使用'
: 'Skills Used',
label: l10n.statsSkillsUsed,
value: _formatNumber(stats.totalSkillsUsed),
),
_StatItem(
label: isKorean
? '크리티컬 히트'
: isJapanese
? 'クリティカルヒット'
: 'Critical Hits',
label: l10n.statsCriticalHits,
value: _formatNumber(stats.totalCriticalHits),
),
],
),
const SizedBox(height: 12),
_StatSection(
title: isKorean
? '총 경제'
: isJapanese
? '総経済'
: 'Total Economy',
title: l10n.statsTotalEconomy,
icon: '💰',
items: [
_StatItem(
label: isKorean
? '획득 골드'
: isJapanese
? '獲得ゴールド'
: 'Gold Earned',
label: l10n.statsGoldEarned,
value: _formatNumber(stats.totalGoldEarned),
),
_StatItem(
label: isKorean
? '소비 골드'
: isJapanese
? '消費ゴールド'
: 'Gold Spent',
label: l10n.statsGoldSpent,
value: _formatNumber(stats.totalGoldSpent),
),
_StatItem(
label: isKorean
? '판매 아이템'
: isJapanese
? '売却アイテム'
: 'Items Sold',
label: l10n.statsItemsSold,
value: _formatNumber(stats.totalItemsSold),
),
_StatItem(
label: isKorean
? '물약 사용'
: isJapanese
? 'ポーション使用'
: 'Potions Used',
label: l10n.statsPotionsUsed,
value: _formatNumber(stats.totalPotionsUsed),
),
_StatItem(
label: isKorean
? '완료 퀘스트'
: isJapanese
? '完了クエスト'
: 'Quests Completed',
label: l10n.statsQuestsCompleted,
value: _formatNumber(stats.totalQuestsCompleted),
),
],
@@ -593,7 +385,6 @@ class _StatItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
// highlightColor: 테마에서 자동 결정 (goldOf)
return RetroStatRow(label: label, value: value, highlight: highlight);
}
}