40 lines
1.4 KiB
Dart
40 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
/// کشِ رنگِ قابها که از سرور میآید (id → گرادیان). با هر بار خواندنِ کاتالوگِ
|
|
/// قابها پر میشود؛ هیچ رنگی سمتِ کلاینت hardcode نیست (تا کش پر نشود، null).
|
|
class FrameStyles {
|
|
FrameStyles._();
|
|
static final FrameStyles I = FrameStyles._();
|
|
|
|
final Map<String, List<Color>> _cache = {};
|
|
|
|
/// کشِ رنگها را از کاتالوگِ سرور پر میکند. هر آیتم باید id و دو رنگِ hex بدهد.
|
|
void setFromCatalog(Iterable<({String id, String c1, String c2})> frames) {
|
|
for (final f in frames) {
|
|
final g = _parse(f.c1, f.c2);
|
|
if (g != null) _cache[f.id] = g;
|
|
}
|
|
}
|
|
|
|
List<Color>? gradient(String id) {
|
|
if (id.isEmpty || id == 'none') return null;
|
|
return _cache[id];
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// گرادیانِ قابِ آواتار (از کشِ سرور). null ⇒ قابِ رتبه.
|
|
List<Color>? frameGradient(String id) => FrameStyles.I.gradient(id);
|