tane/apps/app_seeds/lib/ui/seed_glyph.dart
vjrj 7e92410728 refine(quantity): drop handful, reorder scale, potted-plant icon, year dropdown
Feedback from the running app:
- Remove "handful" from the scale (redundant with spoon); keep the enum value.
- Reorder so "packet" (sobre) follows "spoon" (cuchara).
- Use the Material Symbols potted-plant for the plant lot type and plant unit
  (adds material_symbols_icons).
- Harvest year is now a dropdown of recent years instead of free text.

38 tests green; Linux build runs with the new icon font bundled.
2026-07-08 11:03:57 +02:00

95 lines
3.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:commons_core/commons_core.dart';
import 'package:flutter/material.dart';
import 'package:material_symbols_icons/symbols.dart';
/// Renders a glyph from the bundled `seedks` icon font, whose characters `a``k`
/// map to seed-themed pictograms (jar, packet, spoon…). See
/// docs/mockups/seedks-glyphs.png.
class SeedGlyph extends StatelessWidget {
const SeedGlyph(this.char, {this.size = 24, this.color, super.key});
final String char;
final double size;
final Color? color;
@override
Widget build(BuildContext context) {
return Text(
char,
style: TextStyle(
fontFamily: 'seedks',
fontSize: size,
height: 1,
color: color ?? Theme.of(context).colorScheme.primary,
),
);
}
}
/// Named seedks glyphs (the character each pictogram is mapped to).
abstract final class SeedGlyphs {
static const jar = 'a';
static const jars = 'b';
static const search = 'c';
static const share = 'd';
static const sack = 'e';
static const smallSpoon = 'f';
static const bigSpoon = 'g';
static const mug = 'h';
static const envelope = 'i';
static const pouring = 'j';
static const scattered = 'k';
}
/// The seedks character for a quantity [kind], or null for plant-form/precise
/// kinds that have no seed pictogram (they fall back to a Material icon).
String? seedGlyphForKind(QuantityKind kind) => switch (kind) {
QuantityKind.aFew => SeedGlyphs.scattered,
QuantityKind.some => SeedGlyphs.smallSpoon,
QuantityKind.plenty => SeedGlyphs.jars,
QuantityKind.pinch => SeedGlyphs.scattered,
QuantityKind.handful => SeedGlyphs.bigSpoon,
QuantityKind.teaspoon => SeedGlyphs.smallSpoon,
QuantityKind.spoon => SeedGlyphs.bigSpoon,
QuantityKind.cup => SeedGlyphs.mug,
QuantityKind.jar => SeedGlyphs.jar,
QuantityKind.sack => SeedGlyphs.sack,
QuantityKind.packet => SeedGlyphs.envelope,
_ => null,
};
IconData _materialIconForKind(QuantityKind kind) => switch (kind) {
QuantityKind.grams => Icons.scale_outlined,
QuantityKind.count => Icons.tag,
QuantityKind.cob || QuantityKind.ear => Icons.grass,
QuantityKind.head || QuantityKind.seedHead => Icons.filter_vintage_outlined,
QuantityKind.fruit => Icons.local_florist_outlined,
QuantityKind.plant => Symbols.potted_plant,
QuantityKind.pot => Icons.yard_outlined,
QuantityKind.tray => Icons.grid_on_outlined,
QuantityKind.bulb ||
QuantityKind.tuber ||
QuantityKind.bunch => Icons.spa_outlined,
_ => Icons.eco_outlined,
};
/// A consistent icon for a [QuantityKind]: the seed glyph where one exists,
/// otherwise a Material fallback.
class QuantityKindIcon extends StatelessWidget {
const QuantityKindIcon(this.kind, {this.size = 24, this.color, super.key});
final QuantityKind kind;
final double size;
final Color? color;
@override
Widget build(BuildContext context) {
final glyph = seedGlyphForKind(kind);
if (glyph != null) return SeedGlyph(glyph, size: size, color: color);
return Icon(
_materialIconForKind(kind),
size: size,
color: color ?? Theme.of(context).colorScheme.primary,
);
}
}