| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | import 'package:flutter_quill/flutter_quill.dart';import 'package:flutter_quill/models/documents/style.dart';import 'package:flutter/material.dart';import 'package:app_flowy/generated/locale_keys.g.dart';import 'package:easy_localization/easy_localization.dart';import 'toolbar_icon_button.dart';class FlowyHeaderStyleButton extends StatefulWidget {  const FlowyHeaderStyleButton({    required this.controller,    this.iconSize = defaultIconSize,    Key? key,  }) : super(key: key);  final QuillController controller;  final double iconSize;  @override  FlowyHeaderStyleButtonState createState() => FlowyHeaderStyleButtonState();}class FlowyHeaderStyleButtonState extends State<FlowyHeaderStyleButton> {  Attribute? _value;  Style get _selectionStyle => widget.controller.getSelectionStyle();  @override  void initState() {    super.initState();    setState(() {      _value =          _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;    });    widget.controller.addListener(_didChangeEditingValue);  }  @override  Widget build(BuildContext context) {    final valueToText = <Attribute, String>{      Attribute.h1: 'H1',      Attribute.h2: 'H2',      Attribute.h3: 'H3',    };    final valueAttribute = <Attribute>[      Attribute.h1,      Attribute.h2,      Attribute.h3    ];    final valueString = <String>['H1', 'H2', 'H3'];    final attributeImageName = <String>['editor/H1', 'editor/H2', 'editor/H3'];    return Row(      mainAxisSize: MainAxisSize.min,      children: List.generate(3, (index) {        // final child =        //     _valueToText[_value] == _valueString[index] ? svg('editor/H1', color: Colors.white) : svg('editor/H1');        final headerTitle = "${LocaleKeys.toolbar_header.tr()} ${index + 1}";        final isToggled = valueToText[_value] == valueString[index];        return ToolbarIconButton(          onPressed: () {            if (isToggled) {              widget.controller.formatSelection(Attribute.header);            } else {              widget.controller.formatSelection(valueAttribute[index]);            }          },          width: widget.iconSize * kIconButtonFactor,          iconName: attributeImageName[index],          isToggled: isToggled,          tooltipText: headerTitle,        );      }),    );  }  void _didChangeEditingValue() {    setState(() {      _value =          _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;    });  }  @override  void didUpdateWidget(covariant FlowyHeaderStyleButton oldWidget) {    super.didUpdateWidget(oldWidget);    if (oldWidget.controller != widget.controller) {      oldWidget.controller.removeListener(_didChangeEditingValue);      widget.controller.addListener(_didChangeEditingValue);      _value =          _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;    }  }  @override  void dispose() {    widget.controller.removeListener(_didChangeEditingValue);    super.dispose();  }}
 |