mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-24 16:30:40 +00:00
105 lines
3 KiB
Dart
105 lines
3 KiB
Dart
|
import 'package:flutter/material.dart';
|
||
|
import 'package:lightmeter/res/dimens.dart';
|
||
|
import 'package:lightmeter/utils/text_height.dart';
|
||
|
|
||
|
class TransparentDialog extends StatelessWidget {
|
||
|
final IconData icon;
|
||
|
final String title;
|
||
|
final String? subtitle;
|
||
|
final Widget content;
|
||
|
final bool scrollableContent;
|
||
|
final List<Widget> actions;
|
||
|
|
||
|
const TransparentDialog({
|
||
|
required this.icon,
|
||
|
required this.title,
|
||
|
this.subtitle,
|
||
|
required this.content,
|
||
|
required this.scrollableContent,
|
||
|
this.actions = const [],
|
||
|
super.key,
|
||
|
});
|
||
|
|
||
|
static double height(
|
||
|
BuildContext context, {
|
||
|
required String title,
|
||
|
String? subtitle,
|
||
|
required double contextHeight,
|
||
|
bool scrollableContent = false,
|
||
|
}) {
|
||
|
double height = IconTheme.of(context).size! + Dimens.dialogTitlePadding.vertical;
|
||
|
height += dialogTextHeight(
|
||
|
context,
|
||
|
title,
|
||
|
Theme.of(context).textTheme.headlineSmall,
|
||
|
Dimens.dialogIconTitlePadding.horizontal,
|
||
|
) +
|
||
|
Dimens.dialogIconTitlePadding.vertical;
|
||
|
if (subtitle != null) {
|
||
|
height += dialogTextHeight(
|
||
|
context,
|
||
|
subtitle,
|
||
|
Theme.of(context).textTheme.bodyMedium,
|
||
|
Dimens.dialogIconTitlePadding.horizontal,
|
||
|
) +
|
||
|
Dimens.dialogIconTitlePadding.vertical;
|
||
|
}
|
||
|
height += contextHeight;
|
||
|
if (scrollableContent) height += 1;
|
||
|
return height += 48 + Dimens.dialogActionsPadding.vertical;
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return Column(
|
||
|
mainAxisSize: MainAxisSize.min,
|
||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||
|
children: [
|
||
|
Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||
|
children: [
|
||
|
Padding(
|
||
|
padding: Dimens.dialogTitlePadding,
|
||
|
child: Icon(icon),
|
||
|
),
|
||
|
Padding(
|
||
|
padding: Dimens.dialogIconTitlePadding,
|
||
|
child: Text(
|
||
|
title,
|
||
|
style: Theme.of(context).textTheme.headlineSmall,
|
||
|
textAlign: TextAlign.center,
|
||
|
),
|
||
|
),
|
||
|
if (subtitle != null)
|
||
|
Padding(
|
||
|
padding: Dimens.dialogIconTitlePadding,
|
||
|
child: Text(
|
||
|
subtitle!,
|
||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||
|
textAlign: TextAlign.center,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
if (scrollableContent) const Divider(),
|
||
|
content,
|
||
|
if (scrollableContent) const Divider(),
|
||
|
Padding(
|
||
|
padding: Dimens.dialogActionsPadding,
|
||
|
child: Row(
|
||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||
|
children: _actions().toList(),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Iterable<Widget> _actions() sync* {
|
||
|
for (int i = 0; i < actions.length; i++) {
|
||
|
yield i == 0 ? const Spacer() : const SizedBox(width: Dimens.grid16);
|
||
|
yield actions[i];
|
||
|
}
|
||
|
}
|
||
|
}
|