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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user