💄 Redesign leveling card
This commit is contained in:
@@ -336,6 +336,18 @@
|
||||
"levelingProgress": "Leveling Progress",
|
||||
"levelingProgressExperience": "{} EXP",
|
||||
"levelingProgressLevel": "Level {}",
|
||||
"levelingStage1": "Novice",
|
||||
"levelingStage2": "Apprentice",
|
||||
"levelingStage3": "Journeyman",
|
||||
"levelingStage4": "Adept",
|
||||
"levelingStage5": "Expert",
|
||||
"levelingStage6": "Master",
|
||||
"levelingStage7": "Grandmaster",
|
||||
"levelingStage8": "Legend",
|
||||
"levelingStage9": "Myth",
|
||||
"levelingStage10": "Immortal",
|
||||
"levelingStage11": "Divine",
|
||||
"levelingStage12": "Transcendent",
|
||||
"fileUploadingProgress": "Uploading file #{}: {}%",
|
||||
"removeChatMember": "Remove Chat Room Member",
|
||||
"removeChatMemberHint": "Are you sure to remove this member from the room?",
|
||||
|
@@ -283,6 +283,18 @@
|
||||
"levelingProgress": "等级进度",
|
||||
"levelingProgressExperience": "{} 经验值",
|
||||
"levelingProgressLevel": "等级 {}",
|
||||
"levelingStage1": "新手",
|
||||
"levelingStage2": "学徒",
|
||||
"levelingStage3": "熟练工",
|
||||
"levelingStage4": "行家",
|
||||
"levelingStage5": "专家",
|
||||
"levelingStage6": "大师",
|
||||
"levelingStage7": "宗师",
|
||||
"levelingStage8": "传奇",
|
||||
"levelingStage9": "神话",
|
||||
"levelingStage10": "不朽",
|
||||
"levelingStage11": "神圣",
|
||||
"levelingStage12": "超凡",
|
||||
"fileUploadingProgress": "正在上传文件 #{}: {}%",
|
||||
"removeChatMember": "移除聊天室成员",
|
||||
"removeChatMemberHint": "确定要将此成员从聊天室中移除吗?",
|
||||
|
@@ -141,12 +141,11 @@ class AccountScreen extends HookConsumerWidget {
|
||||
],
|
||||
),
|
||||
).padding(horizontal: 8),
|
||||
GestureDetector(
|
||||
child: LevelingProgressCard(
|
||||
LevelingProgressCard(
|
||||
isCompact: true,
|
||||
level: user.value!.profile.level,
|
||||
experience: user.value!.profile.experience,
|
||||
progress: user.value!.profile.levelingProgress,
|
||||
),
|
||||
onTap: () {
|
||||
context.pushNamed('leveling');
|
||||
},
|
||||
|
@@ -1,6 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
||||
@@ -8,52 +7,152 @@ class LevelingProgressCard extends StatelessWidget {
|
||||
final int level;
|
||||
final int experience;
|
||||
final double progress;
|
||||
final VoidCallback? onTap;
|
||||
final bool isCompact;
|
||||
|
||||
const LevelingProgressCard({
|
||||
super.key,
|
||||
required this.level,
|
||||
required this.experience,
|
||||
required this.progress,
|
||||
this.onTap,
|
||||
this.isCompact = false,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
// Calculate level stage (1-12, each stage covers 10 levels)
|
||||
int stage = ((level - 1) ~/ 10) + 1;
|
||||
stage = stage.clamp(1, 12); // Ensure stage is within 1-12
|
||||
|
||||
// Define colors for each stage
|
||||
const List<Color> stageColors = [
|
||||
Colors.green,
|
||||
Colors.blue,
|
||||
Colors.teal,
|
||||
Colors.cyan,
|
||||
Colors.indigo,
|
||||
Colors.lime,
|
||||
Colors.yellow,
|
||||
Colors.amber,
|
||||
Colors.orange,
|
||||
Colors.deepOrange,
|
||||
Colors.pink,
|
||||
Colors.red,
|
||||
];
|
||||
|
||||
Color stageColor = stageColors[stage - 1];
|
||||
|
||||
// Compact mode adjustments
|
||||
final double levelFontSize = isCompact ? 14 : 18;
|
||||
final double stageFontSize = isCompact ? 13 : 14;
|
||||
final double experienceFontSize = isCompact ? 12 : 14;
|
||||
final double progressHeight = isCompact ? 6 : 10;
|
||||
final double horizontalPadding = isCompact ? 16 : 20;
|
||||
final double verticalPadding = isCompact ? 12 : 16;
|
||||
final double gapSize = isCompact ? 4 : 8;
|
||||
final double rowSpacing = 12;
|
||||
|
||||
final cardContent = Card(
|
||||
margin: EdgeInsets.zero,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
||||
child: InkWell(
|
||||
onTap: onTap,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
stageColor.withOpacity(0.1),
|
||||
Theme.of(context).colorScheme.surface,
|
||||
],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Row(
|
||||
spacing: 8,
|
||||
spacing: rowSpacing,
|
||||
crossAxisAlignment: CrossAxisAlignment.baseline,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
textBaseline: TextBaseline.alphabetic,
|
||||
children: [
|
||||
Text(
|
||||
Expanded(
|
||||
child: Text(
|
||||
'levelingProgressLevel'.tr(args: [level.toString()]),
|
||||
style: GoogleFonts.robotoMono(),
|
||||
).fontSize(13).bold(),
|
||||
style: TextStyle(
|
||||
color: stageColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: levelFontSize,
|
||||
),
|
||||
),
|
||||
),
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
'levelingProgressExperience'.tr(args: [experience.toString()]),
|
||||
style: GoogleFonts.robotoMono(),
|
||||
).fontSize(13),
|
||||
'levelingStage$stage'.tr(),
|
||||
style: TextStyle(
|
||||
color: stageColor.withOpacity(0.7),
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: stageFontSize,
|
||||
),
|
||||
),
|
||||
if (onTap != null) ...[
|
||||
const Gap(4),
|
||||
Icon(
|
||||
Icons.arrow_forward_ios,
|
||||
size: isCompact ? 10 : 12,
|
||||
color: stageColor.withOpacity(0.7),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
const Gap(8),
|
||||
Tooltip(
|
||||
message: '${(progress).toStringAsFixed(1)}%',
|
||||
],
|
||||
),
|
||||
Gap(gapSize),
|
||||
Row(
|
||||
spacing: rowSpacing,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Tooltip(
|
||||
message: '${progress.toStringAsFixed(1)}%',
|
||||
child: LinearProgressIndicator(
|
||||
minHeight: 4,
|
||||
value: progress / 100,
|
||||
minHeight: progressHeight,
|
||||
value: progress,
|
||||
borderRadius: BorderRadius.circular(32),
|
||||
backgroundColor: Theme.of(
|
||||
context,
|
||||
).colorScheme.surfaceContainerLow.withOpacity(0.75),
|
||||
color: stageColor,
|
||||
stopIndicatorRadius: 0,
|
||||
trackGap: 0,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.surfaceContainerHigh,
|
||||
),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
'levelingProgressExperience'.tr(
|
||||
args: [experience.toString()],
|
||||
),
|
||||
style: TextStyle(
|
||||
color: Theme.of(
|
||||
context,
|
||||
).colorScheme.onSurface.withOpacity(0.8),
|
||||
fontSize: experienceFontSize,
|
||||
),
|
||||
),
|
||||
],
|
||||
).padding(horizontal: 16, vertical: 12),
|
||||
),
|
||||
],
|
||||
).padding(horizontal: horizontalPadding, vertical: verticalPadding),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
return cardContent;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user