header_button.dart 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 = _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  26. });
  27. widget.controller.addListener(_didChangeEditingValue);
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. final valueToText = <Attribute, String>{
  32. Attribute.h1: 'H1',
  33. Attribute.h2: 'H2',
  34. Attribute.h3: 'H3',
  35. };
  36. final valueAttribute = <Attribute>[Attribute.h1, Attribute.h2, Attribute.h3];
  37. final valueString = <String>['H1', 'H2', 'H3'];
  38. final attributeImageName = <String>['editor/H1', 'editor/H2', 'editor/H3'];
  39. return Row(
  40. mainAxisSize: MainAxisSize.min,
  41. children: List.generate(3, (index) {
  42. // final child =
  43. // _valueToText[_value] == _valueString[index] ? svg('editor/H1', color: Colors.white) : svg('editor/H1');
  44. final headerTitle = "${LocaleKeys.toolbar_header.tr()} ${index + 1}";
  45. final isToggled = valueToText[_value] == valueString[index];
  46. return ToolbarIconButton(
  47. onPressed: () {
  48. if (isToggled) {
  49. widget.controller.formatSelection(Attribute.header);
  50. } else {
  51. widget.controller.formatSelection(valueAttribute[index]);
  52. }
  53. },
  54. width: widget.iconSize * kIconButtonFactor,
  55. iconName: attributeImageName[index],
  56. isToggled: isToggled,
  57. tooltipText: headerTitle,
  58. );
  59. }),
  60. );
  61. }
  62. void _didChangeEditingValue() {
  63. setState(() {
  64. _value = _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  65. });
  66. }
  67. @override
  68. void didUpdateWidget(covariant FlowyHeaderStyleButton oldWidget) {
  69. super.didUpdateWidget(oldWidget);
  70. if (oldWidget.controller != widget.controller) {
  71. oldWidget.controller.removeListener(_didChangeEditingValue);
  72. widget.controller.addListener(_didChangeEditingValue);
  73. _value = _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
  74. }
  75. }
  76. @override
  77. void dispose() {
  78. widget.controller.removeListener(_didChangeEditingValue);
  79. super.dispose();
  80. }
  81. }