52 lines
1.9 KiB
Dart
52 lines
1.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'app_theme.dart';
|
|
|
|
/// کشِ رنگ و برچسبِ رتبهها که از سرور میآید (tier → گرادیان/برچسب). با هر بار
|
|
/// خواندنِ کاتالوگِ قابها پر میشود؛ تا آن لحظه از fallbackِ خنثی استفاده میشود.
|
|
class RankStyles {
|
|
RankStyles._();
|
|
static final RankStyles I = RankStyles._();
|
|
|
|
final Map<String, List<Color>> _grad = {};
|
|
final Map<String, String> _label = {};
|
|
|
|
/// کش را از کاتالوگِ سرور پر میکند. هر آیتم id/label/c1/c2 دارد.
|
|
void setFromCatalog(
|
|
Iterable<({String id, String label, String c1, String c2})> tiers,
|
|
) {
|
|
for (final t in tiers) {
|
|
final g = _parse(t.c1, t.c2);
|
|
if (g != null) _grad[t.id] = g;
|
|
if (t.label.isNotEmpty) _label[t.id] = t.label;
|
|
}
|
|
}
|
|
|
|
/// گرادیانِ رتبه (از سرور، وگرنه fallbackِ خنثیِ طلایی).
|
|
List<Color> gradient(String tier) => _grad[tier] ?? _fallbackGrad;
|
|
|
|
/// برچسبِ فارسیِ رتبه (از سرور، وگرنه خودِ شناسه).
|
|
String label(String tier) => _label[tier] ?? tier;
|
|
|
|
static const _fallbackGrad = [AppColors.gold, AppColors.goldDark];
|
|
|
|
static List<Color>? _parse(String c1, String c2) {
|
|
final a = _hex(c1), b = _hex(c2);
|
|
if (a == null || b == null) return null;
|
|
return [a, b];
|
|
}
|
|
|
|
static Color? _hex(String s) {
|
|
s = s.trim().replaceAll('#', '');
|
|
if (s.length != 6) return null;
|
|
final v = int.tryParse(s, radix: 16);
|
|
return v == null ? null : Color(0xFF000000 | v);
|
|
}
|
|
}
|
|
|
|
/// گرادیانِ رنگیِ رتبه (از کشِ سرور).
|
|
List<Color> rankGradient(String tier) => RankStyles.I.gradient(tier);
|
|
|
|
/// برچسبِ فارسیِ رتبه (از کشِ سرور).
|
|
String rankLabel(String tier) => RankStyles.I.label(tier);
|