From b75e01185b1b495f16b5406abeed3e74e45b1c03 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 15 Jan 2023 12:04:27 +0100 Subject: [PATCH] minor fixes --- lib/widgets/common/identity/aves_app_bar.dart | 110 +++++++++--------- .../entry_editors/edit_date_dialog.dart | 54 +++++++-- .../filter_editors/rename_album_dialog.dart | 4 +- 3 files changed, 105 insertions(+), 63 deletions(-) diff --git a/lib/widgets/common/identity/aves_app_bar.dart b/lib/widgets/common/identity/aves_app_bar.dart index 24568a98c..7ad74c6f4 100644 --- a/lib/widgets/common/identity/aves_app_bar.dart +++ b/lib/widgets/common/identity/aves_app_bar.dart @@ -1,5 +1,4 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -32,71 +31,72 @@ class AvesAppBar extends StatelessWidget { @override Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; return Selector( selector: (context, mq) => mq.padding.top, builder: (context, mqPaddingTop, child) { - final useTvLayout = settings.useTvLayout; return SliverPersistentHeader( floating: !useTvLayout, pinned: pinned, delegate: _SliverAppBarDelegate( height: mqPaddingTop + appBarHeightForContentHeight(contentHeight), - child: DirectionalSafeArea( - start: !useTvLayout, - bottom: false, - child: AvesFloatingBar( - builder: (context, backgroundColor, child) => Material( - color: backgroundColor, - child: child, - ), - child: Column( - children: [ - SizedBox( - height: kToolbarHeight, - child: Row( - children: [ - leading != null - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Hero( - tag: leadingHeroTag, - flightShuttleBuilder: _flightShuttleBuilder, - transitionOnUserGestures: true, - child: leading!, - ), - ) - : const SizedBox(width: 16), - Expanded( - child: DefaultTextStyle( - style: context.select((v) => Theme.of(context).appBarTheme.titleTextStyle!), - child: Hero( - tag: titleHeroTag, - flightShuttleBuilder: _flightShuttleBuilder, - transitionOnUserGestures: true, - child: AnimatedSwitcher( - duration: context.read().iconAnimation, - child: Row( - key: ValueKey(transitionKey), - children: [ - Expanded(child: title), - ...actions, - ], - ), - ), - ), - ), - ), - ], - ), - ), - if (bottom != null) bottom!, - ], - ), - ), - ), + child: child!, ), ); }, + child: DirectionalSafeArea( + start: !useTvLayout, + bottom: false, + child: AvesFloatingBar( + builder: (context, backgroundColor, child) => Material( + color: backgroundColor, + child: child, + ), + child: Column( + children: [ + SizedBox( + height: kToolbarHeight, + child: Row( + children: [ + leading != null + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Hero( + tag: leadingHeroTag, + flightShuttleBuilder: _flightShuttleBuilder, + transitionOnUserGestures: true, + child: leading!, + ), + ) + : const SizedBox(width: 16), + Expanded( + child: DefaultTextStyle( + style: Theme.of(context).appBarTheme.titleTextStyle!, + child: Hero( + tag: titleHeroTag, + flightShuttleBuilder: _flightShuttleBuilder, + transitionOnUserGestures: true, + child: AnimatedSwitcher( + duration: context.read().iconAnimation, + child: Row( + key: ValueKey(transitionKey), + children: [ + Expanded(child: title), + ...actions, + ], + ), + ), + ), + ), + ), + ], + ), + ), + if (bottom != null) bottom!, + ], + ), + ), + ), ); } diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index bc531ee54..f8c784d10 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -15,8 +15,8 @@ import 'package:aves/widgets/common/basic/wheel.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; -import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; import 'package:aves/widgets/dialogs/item_picker.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -43,6 +43,7 @@ class _EditEntryDateDialogState extends State { late ValueNotifier _shiftSign; bool _showOptions = false; final Set _fields = {...DateModifier.writableFields}; + final ValueNotifier _isValidNotifier = ValueNotifier(false); DateTime get copyItemDate => _copyItemSource.bestDate ?? DateTime.now(); @@ -52,6 +53,13 @@ class _EditEntryDateDialogState extends State { _initCustom(); _initCopyItem(); _initShift(minutesInHour); + _validate(); + } + + @override + void dispose() { + _isValidNotifier.dispose(); + super.dispose(); } void _initCustom() { @@ -88,7 +96,11 @@ class _EditEntryDateDialogState extends State { values: DateEditAction.values, valueText: (v) => v.getText(context), value: _action, - onChanged: (v) => setState(() => _action = v!), + onChanged: (v) { + _action = v!; + _validate(); + setState(() {}); + }, isExpanded: true, dropdownColor: Themes.thirdLayerColor(context), ), @@ -113,9 +125,14 @@ class _EditEntryDateDialogState extends State { ], actions: [ const CancelButton(), - TextButton( - onPressed: () => _submit(context), - child: Text(l10n.applyButtonLabel), + ValueListenableBuilder( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.applyButtonLabel), + ); + }, ), ], ); @@ -265,7 +282,11 @@ class _EditEntryDateDialogState extends State { children: DateModifier.writableFields .map((field) => SwitchListTile( value: _fields.contains(field), - onChanged: (selected) => setState(() => selected ? _fields.add(field) : _fields.remove(field)), + onChanged: (selected) { + selected ? _fields.add(field) : _fields.remove(field); + _validate(); + setState(() {}); + }, title: Text(field.title), )) .toList(), @@ -346,5 +367,24 @@ class _EditEntryDateDialogState extends State { } } - void _submit(BuildContext context) => Navigator.pop(context, _getModifier()); + void _validate() { + switch (_action) { + case DateEditAction.setCustom: + case DateEditAction.copyField: + case DateEditAction.copyItem: + case DateEditAction.extractFromTitle: + _isValidNotifier.value = true; + break; + case DateEditAction.shift: + case DateEditAction.remove: + _isValidNotifier.value = _fields.isNotEmpty; + break; + } + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.pop(context, _getModifier()); + } + } } diff --git a/lib/widgets/dialogs/filter_editors/rename_album_dialog.dart b/lib/widgets/dialogs/filter_editors/rename_album_dialog.dart index 991df0d64..e18abe61e 100644 --- a/lib/widgets/dialogs/filter_editors/rename_album_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/rename_album_dialog.dart @@ -36,6 +36,8 @@ class _RenameAlbumDialogState extends State { @override void dispose() { _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); super.dispose(); } @@ -66,7 +68,7 @@ class _RenameAlbumDialogState extends State { child: Text(context.l10n.applyButtonLabel), ); }, - ) + ), ], ); }