okane/lib/ui/widgets/piechart_card.dart

84 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:okane/screen.dart';
import 'package:okane/ui/widgets/piechart.dart';
class ResponsiveCard extends StatelessWidget {
final String titleText;
final String? subtitleText;
final Widget child;
const ResponsiveCard({
super.key,
required this.titleText,
required this.child,
this.subtitleText,
});
@override
Widget build(BuildContext context) {
final screenSize = getScreenSize(context);
final card = Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(top: 8, left: 8, right: 8),
child: Text(
titleText,
style: Theme.of(
context,
).textTheme.titleLarge!.copyWith(fontWeight: FontWeight.bold),
),
),
child,
if (subtitleText != null)
Padding(padding: EdgeInsets.all(8), child: Text(subtitleText!)),
],
),
);
return switch (screenSize) {
ScreenSize.small => Row(children: [Expanded(child: card)]),
ScreenSize.normal => Container(
constraints: BoxConstraints(maxWidth: ScreenSize.normal.size),
child: card,
),
};
}
}
class PieChartCard extends StatelessWidget {
final String titleText;
// Text to display when items is empty.
final String fallbackText;
final OkanePieChartValueConverter valueConverter;
final List<OkanePieChartSection> items;
const PieChartCard({
super.key,
this.valueConverter = numToString,
required this.items,
required this.fallbackText,
required this.titleText,
});
@override
Widget build(BuildContext context) {
final child =
items.isEmpty
? SizedBox(
width: 150,
height: 150,
child: Center(child: Text(fallbackText)),
)
: OkanePieChart(valueConverter: valueConverter, items: items);
return ResponsiveCard(titleText: titleText, child: child);
}
}