expandable_menu_item_widget.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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(() {
  26. setState(() {});
  27. });
  28. super.initState();
  29. }
  30. @override
  31. void dispose() {
  32. expandableController.removeListener(() {});
  33. super.dispose();
  34. }
  35. @override
  36. Widget build(BuildContext context) {
  37. final enteColorScheme = Theme.of(context).colorScheme.enteTheme.colorScheme;
  38. return AnimatedContainer(
  39. curve: Curves.ease,
  40. duration: const Duration(milliseconds: 200),
  41. decoration: BoxDecoration(
  42. color: expandableController.value
  43. ? enteColorScheme.backgroundElevated
  44. : null,
  45. borderRadius: BorderRadius.circular(4),
  46. ),
  47. child: ExpandableNotifier(
  48. controller: expandableController,
  49. child: ScrollOnExpand(
  50. child: ExpandablePanel(
  51. header: MenuItemWidget(
  52. captionedTextWidget: CaptionedTextWidget(
  53. title: widget.title,
  54. makeTextBold: true,
  55. ),
  56. isHeaderOfExpansion: true,
  57. leadingIcon: widget.leadingIcon,
  58. trailingIcon: Icons.expand_more,
  59. menuItemColor: enteColorScheme.fillFaint,
  60. expandableController: expandableController,
  61. ),
  62. collapsed: const SizedBox.shrink(),
  63. expanded: widget.selectionOptionsWidget,
  64. theme: getExpandableTheme(context),
  65. controller: expandableController,
  66. ),
  67. ),
  68. ),
  69. );
  70. }
  71. }