icon_button_widget.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import 'package:flutter/material.dart';
  2. import 'package:photos/theme/colors.dart';
  3. import 'package:photos/theme/ente_theme.dart';
  4. enum IconButtonType {
  5. primary,
  6. secondary,
  7. rounded,
  8. }
  9. class IconButtonWidget extends StatefulWidget {
  10. final IconButtonType iconButtonType;
  11. final IconData icon;
  12. final bool disableGestureDetector;
  13. final VoidCallback? onTap;
  14. final Color? defaultColor;
  15. final Color? pressedColor;
  16. final Color? iconColor;
  17. const IconButtonWidget({
  18. required this.icon,
  19. required this.iconButtonType,
  20. this.disableGestureDetector = false,
  21. this.onTap,
  22. this.defaultColor,
  23. this.pressedColor,
  24. this.iconColor,
  25. super.key,
  26. });
  27. @override
  28. State<IconButtonWidget> createState() => _IconButtonWidgetState();
  29. }
  30. class _IconButtonWidgetState extends State<IconButtonWidget> {
  31. Color? iconStateColor;
  32. @override
  33. void didChangeDependencies() {
  34. setState(() {
  35. iconStateColor = null;
  36. });
  37. super.didChangeDependencies();
  38. }
  39. @override
  40. Widget build(BuildContext context) {
  41. final colorTheme = getEnteColorScheme(context);
  42. iconStateColor ??
  43. (iconStateColor = widget.defaultColor ??
  44. (widget.iconButtonType == IconButtonType.rounded
  45. ? colorTheme.fillFaint
  46. : null));
  47. return widget.disableGestureDetector
  48. ? _iconButton(colorTheme)
  49. : GestureDetector(
  50. onTapDown: _onTapDown,
  51. onTapUp: _onTapUp,
  52. onTapCancel: _onTapCancel,
  53. onTap: widget.onTap,
  54. child: _iconButton(colorTheme),
  55. );
  56. }
  57. Widget _iconButton(EnteColorScheme colorTheme) {
  58. return Padding(
  59. padding: const EdgeInsets.all(4.0),
  60. child: AnimatedContainer(
  61. duration: const Duration(milliseconds: 20),
  62. padding: const EdgeInsets.all(8),
  63. decoration: BoxDecoration(
  64. borderRadius: BorderRadius.circular(20),
  65. color: iconStateColor,
  66. ),
  67. child: Icon(
  68. widget.icon,
  69. color: widget.iconColor ??
  70. (widget.iconButtonType == IconButtonType.secondary
  71. ? colorTheme.strokeMuted
  72. : colorTheme.strokeBase),
  73. size: 24,
  74. ),
  75. ),
  76. );
  77. }
  78. _onTapDown(details) {
  79. final colorTheme = getEnteColorScheme(context);
  80. setState(() {
  81. iconStateColor = widget.pressedColor ??
  82. (widget.iconButtonType == IconButtonType.rounded
  83. ? colorTheme.fillMuted
  84. : colorTheme.fillFaint);
  85. });
  86. }
  87. _onTapUp(details) {
  88. Future.delayed(const Duration(milliseconds: 100), () {
  89. setState(() {
  90. iconStateColor = null;
  91. });
  92. });
  93. }
  94. _onTapCancel() {
  95. setState(() {
  96. iconStateColor = null;
  97. });
  98. }
  99. }