expandable_menu_item_widget.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. final backgroundColor =
  39. MediaQuery.of(context).platformBrightness == Brightness.light
  40. ? enteColorScheme.backgroundElevated2
  41. : enteColorScheme.backgroundElevated;
  42. return 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: widget.selectionOptionsWidget,
  66. theme: getExpandableTheme(context),
  67. controller: expandableController,
  68. ),
  69. ),
  70. ),
  71. );
  72. }
  73. }