expandable_menu_item_widget.dart 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:expandable/expandable.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/ente_theme_data.dart';
  4. import 'package:photos/ui/components/captioned_text_widget.dart';
  5. import 'package:photos/ui/components/menu_item_widget.dart';
  6. import 'package:photos/ui/settings/common_settings.dart';
  7. class ExpandableMenuItemWidget extends StatefulWidget {
  8. final String title;
  9. final Widget selectionOptionsWidget;
  10. final IconData leadingIcon;
  11. const ExpandableMenuItemWidget({
  12. required this.title,
  13. required this.selectionOptionsWidget,
  14. required this.leadingIcon,
  15. Key? key,
  16. }) : super(key: key);
  17. @override
  18. State<ExpandableMenuItemWidget> createState() =>
  19. _ExpandableMenuItemWidgetState();
  20. }
  21. class _ExpandableMenuItemWidgetState extends State<ExpandableMenuItemWidget> {
  22. final expandableController = ExpandableController(initialExpanded: false);
  23. @override
  24. void initState() {
  25. expandableController.addListener(_expandableControllerListener);
  26. super.initState();
  27. }
  28. @override
  29. void dispose() {
  30. expandableController.removeListener(_expandableControllerListener);
  31. super.dispose();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. final enteColorScheme = Theme.of(context).colorScheme.enteTheme.colorScheme;
  36. final backgroundColor =
  37. MediaQuery.of(context).platformBrightness == Brightness.light
  38. ? enteColorScheme.backgroundElevated2
  39. : enteColorScheme.backgroundElevated;
  40. return Padding(
  41. padding: EdgeInsets.only(bottom: expandableController.value ? 8 : 0),
  42. child: AnimatedContainer(
  43. curve: Curves.ease,
  44. duration: const Duration(milliseconds: 200),
  45. decoration: BoxDecoration(
  46. color: expandableController.value ? backgroundColor : null,
  47. borderRadius: BorderRadius.circular(4),
  48. ),
  49. child: ExpandableNotifier(
  50. controller: expandableController,
  51. child: ScrollOnExpand(
  52. child: ExpandablePanel(
  53. header: MenuItemWidget(
  54. captionedTextWidget: CaptionedTextWidget(
  55. title: widget.title,
  56. makeTextBold: true,
  57. ),
  58. isExpandable: true,
  59. leadingIcon: widget.leadingIcon,
  60. trailingIcon: Icons.expand_more,
  61. menuItemColor: enteColorScheme.fillFaint,
  62. expandableController: expandableController,
  63. ),
  64. collapsed: const SizedBox.shrink(),
  65. expanded: Padding(
  66. padding: const EdgeInsets.only(bottom: 4),
  67. child: widget.selectionOptionsWidget,
  68. ),
  69. theme: getExpandableTheme(),
  70. controller: expandableController,
  71. ),
  72. ),
  73. ),
  74. ),
  75. );
  76. }
  77. void _expandableControllerListener() {
  78. setState(() {});
  79. }
  80. }