header_button.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import 'package:flutter_quill/flutter_quill.dart';
  2. import 'package:flutter_quill/models/documents/style.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:app_flowy/generated/locale_keys.g.dart';
  5. import 'package:easy_localization/easy_localization.dart';
  6. import 'toolbar_icon_button.dart';
  7. class FlowyHeaderStyleButton extends StatefulWidget {
  8. const FlowyHeaderStyleButton({
  9. required this.controller,
  10. this.iconSize = defaultIconSize,
  11. Key? key,
  12. }) : super(key: key);
  13. final QuillController controller;
  14. final double iconSize;
  15. @override
  16. FlowyHeaderStyleButtonState createState() => FlowyHeaderStyleButtonState();
  17. }
  18. class FlowyHeaderStyleButtonState extends State<FlowyHeaderStyleButton> {
  19. Attribute? _value;
  20. Style get _selectionStyle => widget.controller.getSelectionStyle();
  21. @override
  22. void initState() {
  23. super.initState();
  24. setState(() {
  25. _value =
  26. _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  27. });
  28. widget.controller.addListener(_didChangeEditingValue);
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. final valueToText = <Attribute, String>{
  33. Attribute.h1: 'H1',
  34. Attribute.h2: 'H2',
  35. Attribute.h3: 'H3',
  36. };
  37. final valueAttribute = <Attribute>[
  38. Attribute.h1,
  39. Attribute.h2,
  40. Attribute.h3
  41. ];
  42. final valueString = <String>['H1', 'H2', 'H3'];
  43. final attributeImageName = <String>['editor/H1', 'editor/H2', 'editor/H3'];
  44. return Row(
  45. mainAxisSize: MainAxisSize.min,
  46. children: List.generate(3, (index) {
  47. // final child =
  48. // _valueToText[_value] == _valueString[index] ? svg('editor/H1', color: Colors.white) : svg('editor/H1');
  49. final headerTitle = "${LocaleKeys.toolbar_header.tr()} ${index + 1}";
  50. final isToggled = valueToText[_value] == valueString[index];
  51. return ToolbarIconButton(
  52. onPressed: () {
  53. if (isToggled) {
  54. widget.controller.formatSelection(Attribute.header);
  55. } else {
  56. widget.controller.formatSelection(valueAttribute[index]);
  57. }
  58. },
  59. width: widget.iconSize * kIconButtonFactor,
  60. iconName: attributeImageName[index],
  61. isToggled: isToggled,
  62. tooltipText: headerTitle,
  63. );
  64. }),
  65. );
  66. }
  67. void _didChangeEditingValue() {
  68. setState(() {
  69. _value =
  70. _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  71. });
  72. }
  73. @override
  74. void didUpdateWidget(covariant FlowyHeaderStyleButton oldWidget) {
  75. super.didUpdateWidget(oldWidget);
  76. if (oldWidget.controller != widget.controller) {
  77. oldWidget.controller.removeListener(_didChangeEditingValue);
  78. widget.controller.addListener(_didChangeEditingValue);
  79. _value =
  80. _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  81. }
  82. }
  83. @override
  84. void dispose() {
  85. widget.controller.removeListener(_didChangeEditingValue);
  86. super.dispose();
  87. }
  88. }