Skip to content

Commit

Permalink
Merge branch 'main' into dependabot/pub/optimus/flutter_slidable-4.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
witwash authored Feb 8, 2025
2 parents eb73e9d + c532451 commit 3451e2d
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 47 deletions.
98 changes: 63 additions & 35 deletions optimus/lib/src/lists/list_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class OptimusListTile extends StatelessWidget {
this.onTap,
this.fontVariant = FontVariant.normal,
this.contentPadding,
this.prefixSize = OptimusPrefixSize.medium,
this.prefixVerticalAlignment,
});

/// Communicates the subject of the list item.
Expand All @@ -43,6 +45,14 @@ class OptimusListTile extends StatelessWidget {
/// The Widget to be displayed on the leading position. Typically an [Icon].
final Widget? prefix;

/// The size of the prefix widget. Defaults to [OptimusPrefixSize.medium].
final OptimusPrefixSize prefixSize;

/// The vertical alignment of the prefix. By default it would align to the top,
/// but if there is a [suffix] is would align to the center. Providing
/// prefixVerticalAlignment will override the alignment.
final OptimusPrefixVerticalAlignment? prefixVerticalAlignment;

/// The Widget to be displayed on the tailoring position. Typically an [Icon].
final Widget? suffix;

Expand All @@ -65,6 +75,12 @@ class OptimusListTile extends StatelessWidget {
/// will be used.
final EdgeInsets? contentPadding;

OptimusPrefixVerticalAlignment get _prefixVerticalAlignment =>
prefixVerticalAlignment ??
(subtitle != null
? OptimusPrefixVerticalAlignment.start
: OptimusPrefixVerticalAlignment.center);

EdgeInsets _getContentPadding(OptimusTokens tokens) =>
contentPadding ??
EdgeInsets.symmetric(
Expand All @@ -75,8 +91,6 @@ class OptimusListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = context.tokens;
final info = this.info;
final subtitle = this.subtitle;

return BaseListTile(
onTap: onTap,
Expand All @@ -85,47 +99,47 @@ class OptimusListTile extends StatelessWidget {
child: Stack(
children: [
if (prefix case final prefix?)
Padding(
padding: EdgeInsetsDirectional.only(
top: subtitle != null ? tokens.spacing100 : tokens.spacing25,
),
child: _Prefix(prefix: prefix),
Positioned(
top: tokens.spacing0,
bottom: _prefixVerticalAlignment.getBottom(tokens),
child: _Prefix(prefix: prefix, size: prefixSize),
),
Row(
children: <Widget>[
if (prefix != null) SizedBox(width: context.prefixWidth),
children: [
if (prefix != null)
SizedBox(width: prefixSize.getWidth(tokens)),
Expanded(
child: Padding(
padding: EdgeInsets.only(right: tokens.spacing100),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
children: [
Flexible(
flex: 8,
child: _Title(
title: title,
fontVariant: fontVariant,
),
),
if (info != null)
Flexible(flex: 2, child: _Info(info: info)),
if (info case final info?)
Flexible(child: _Info(info: info)),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(
child: subtitle != null
? _Subtitle(
subtitle: subtitle,
fontVariant: fontVariant,
)
: const SizedBox.shrink(),
),
children: [
if (subtitle case final subtitle?)
Expanded(
child: _Subtitle(
subtitle: subtitle,
fontVariant: fontVariant,
),
)
else
const Spacer(),
if (infoWidget case final infoWidget?) infoWidget,
],
),
Expand All @@ -143,17 +157,25 @@ class OptimusListTile extends StatelessWidget {
}
}

enum OptimusPrefixVerticalAlignment { center, start }

enum OptimusPrefixSize { medium, large }

class _Prefix extends StatelessWidget {
const _Prefix({required this.prefix});
const _Prefix({
required this.prefix,
this.size = OptimusPrefixSize.medium,
});

final Widget prefix;
final OptimusPrefixSize size;

@override
Widget build(BuildContext context) {
final tokens = context.tokens;

return SizedBox(
width: context.prefixWidth,
width: size.getWidth(tokens),
child: Padding(
padding: EdgeInsets.only(right: tokens.spacing100),
child: OptimusTypography(
Expand Down Expand Up @@ -188,14 +210,10 @@ class _Title extends StatelessWidget {
final FontVariant fontVariant;

@override
Widget build(BuildContext context) {
final tokens = context.tokens;

return OptimusTypography(
resolveStyle: (_) => fontVariant.getPrimaryStyle(tokens),
child: title,
);
}
Widget build(BuildContext context) => OptimusTypography(
resolveStyle: (_) => fontVariant.getPrimaryStyle(context.tokens),
child: title,
);
}

class _Info extends StatelessWidget {
Expand Down Expand Up @@ -226,6 +244,16 @@ class _Subtitle extends StatelessWidget {
);
}

extension on BuildContext {
double get prefixWidth => tokens.spacing400;
extension on OptimusPrefixSize {
double getWidth(OptimusTokens tokens) => switch (this) {
OptimusPrefixSize.medium => tokens.sizing400,
OptimusPrefixSize.large => tokens.sizing600,
};
}

extension on OptimusPrefixVerticalAlignment {
double? getBottom(OptimusTokens tokens) => switch (this) {
OptimusPrefixVerticalAlignment.center => tokens.spacing0,
OptimusPrefixVerticalAlignment.start => null,
};
}
21 changes: 17 additions & 4 deletions optimus_widgetbook/lib/components/list/list_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,18 @@ Widget createDefaultStyle(BuildContext context) {
label: 'Font variant',
initialOption: FontVariant.normal,
options: FontVariant.values,
labelBuilder: (value) => value.name,
labelBuilder: enumLabelBuilder,
);
final prefixSize = k.list(
label: 'Prefix Size',
options: OptimusPrefixSize.values,
initialOption: OptimusPrefixSize.medium,
labelBuilder: enumLabelBuilder,
);
final prefixAlignment = k.listOrNull(
label: 'Prefix Alignment',
options: OptimusPrefixVerticalAlignment.values,
labelBuilder: enumOrNullLabelBuilder,
);

return SingleChildScrollView(
Expand All @@ -38,10 +49,12 @@ Widget createDefaultStyle(BuildContext context) {
: null,
info: info.isNotEmpty ? Text(info) : null,
fontVariant: fontVariant,
prefix: prefix != null ? Icon(prefix.data) : null,
suffix: suffix != null ? Icon(suffix.data) : null,
infoWidget: infoWidget != null ? Icon(infoWidget.data) : null,
prefix: iconOrNull(prefix),
suffix: iconOrNull(suffix),
infoWidget: iconOrNull(infoWidget),
onTap: ignore,
prefixSize: prefixSize,
prefixVerticalAlignment: prefixAlignment,
),
)
.toList(),
Expand Down
18 changes: 10 additions & 8 deletions optimus_widgetbook/lib/utils.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:dfunc/dfunc.dart';
import 'package:flutter/widgets.dart';
import 'package:optimus/optimus.dart';
import 'package:widgetbook/widgetbook.dart';
Expand All @@ -13,17 +14,18 @@ final List<AlignmentGeometry> alignments = [
Alignment.bottomRight,
];

const longText = '''
Nascetur nec convallis tempor sagittis ligula. Mauris aenean curae vestibulum
aenean fames posuere consequat turpis. Cursus lectus rutrum dolor condimentum
rhoncus tincidunt rutrum. Hac amet class vivamus rhoncus condimentum; penatibus
risus magnis. Penatibus nulla venenatis nulla praesent mauris. Morbi feugiat
rhoncus ridiculus varius faucibus commodo tincidunt ipsum molestie. Volutpat
semper aptent viverra facilisi nam nibh suscipit purus himenaeos. Himenaeos
quisque ultrices condimentum mauris a diam.''';
const longText =
'Nascetur nec convallis tempor sagittis ligula. Mauris aenean curae vestibulum aenean fames posuere consequat turpis. Cursus lectus rutrumdolor condimentum rhoncus tincidunt rutrum. Hac amet class vivamus rhoncus condimentum; penatibus risus magnis. Penatibus nulla venenatis nulla praesent mauris. Morbi feugiat rhoncus ridiculus varius faucibus commodo tincidunt ipsum molestie. Volutpat semper aptent viverra facilisi nam nibh suscipit purus himenaeos. Himenaeos quisque ultrices condimentum mauris a diam.';

final stubDate = DateTime(2012, 4, 3);

String enumOrNullLabelBuilder<T extends Enum>(T? value) => value?.name ?? '';

String enumLabelBuilder<T extends Enum>(T value) => value.name;

Icon? iconOrNull(IconDetails? details) =>
details?.let((details) => Icon(details.data));

extension KnobsBuilderExt on KnobsBuilder {
OptimusWidgetSize get widgetSizeKnob => list(
label: 'Size',
Expand Down

0 comments on commit 3451e2d

Please sign in to comment.