diff --git a/lib/src/models/documents/attribute.dart b/lib/src/models/documents/attribute.dart index 13b6b482..2ec7d7f2 100644 --- a/lib/src/models/documents/attribute.dart +++ b/lib/src/models/documents/attribute.dart @@ -10,7 +10,7 @@ enum AttributeScope { } class Attribute { - Attribute(this.key, this.scope, this.value); + const Attribute(this.key, this.scope, this.value); /// Unique key of this attribute. final String key; @@ -44,53 +44,53 @@ class Attribute { Attribute.script.key: Attribute.script, }); - static final BoldAttribute bold = BoldAttribute(); + static const BoldAttribute bold = BoldAttribute(); - static final ItalicAttribute italic = ItalicAttribute(); + static const ItalicAttribute italic = ItalicAttribute(); - static final SmallAttribute small = SmallAttribute(); + static const SmallAttribute small = SmallAttribute(); - static final UnderlineAttribute underline = UnderlineAttribute(); + static const UnderlineAttribute underline = UnderlineAttribute(); - static final StrikeThroughAttribute strikeThrough = StrikeThroughAttribute(); + static const StrikeThroughAttribute strikeThrough = StrikeThroughAttribute(); - static final InlineCodeAttribute inlineCode = InlineCodeAttribute(); + static const InlineCodeAttribute inlineCode = InlineCodeAttribute(); - static final FontAttribute font = FontAttribute(null); + static const FontAttribute font = FontAttribute(null); - static final SizeAttribute size = SizeAttribute(null); + static const SizeAttribute size = SizeAttribute(null); - static final LinkAttribute link = LinkAttribute(null); + static const LinkAttribute link = LinkAttribute(null); - static final ColorAttribute color = ColorAttribute(null); + static const ColorAttribute color = ColorAttribute(null); - static final BackgroundAttribute background = BackgroundAttribute(null); + static const BackgroundAttribute background = BackgroundAttribute(null); - static final PlaceholderAttribute placeholder = PlaceholderAttribute(); + static const PlaceholderAttribute placeholder = PlaceholderAttribute(); - static final HeaderAttribute header = HeaderAttribute(); + static const HeaderAttribute header = HeaderAttribute(); - static final IndentAttribute indent = IndentAttribute(); + static const IndentAttribute indent = IndentAttribute(); - static final AlignAttribute align = AlignAttribute(null); + static const AlignAttribute align = AlignAttribute(null); - static final ListAttribute list = ListAttribute(null); + static const ListAttribute list = ListAttribute(null); - static final CodeBlockAttribute codeBlock = CodeBlockAttribute(); + static const CodeBlockAttribute codeBlock = CodeBlockAttribute(); - static final BlockQuoteAttribute blockQuote = BlockQuoteAttribute(); + static const BlockQuoteAttribute blockQuote = BlockQuoteAttribute(); - static final DirectionAttribute direction = DirectionAttribute(null); + static const DirectionAttribute direction = DirectionAttribute(null); - static final WidthAttribute width = WidthAttribute(null); + static const WidthAttribute width = WidthAttribute(null); - static final HeightAttribute height = HeightAttribute(null); + static const HeightAttribute height = HeightAttribute(null); - static final StyleAttribute style = StyleAttribute(null); + static const StyleAttribute style = StyleAttribute(null); - static final TokenAttribute token = TokenAttribute(''); + static const TokenAttribute token = TokenAttribute(''); - static final ScriptAttribute script = ScriptAttribute(''); + static const ScriptAttribute script = ScriptAttribute(''); static const String mobileWidth = 'mobileWidth'; @@ -138,47 +138,47 @@ class Attribute { Attribute.blockQuote.key, }); - static Attribute get h1 => HeaderAttribute(level: 1); + static const Attribute h1 = HeaderAttribute(level: 1); - static Attribute get h2 => HeaderAttribute(level: 2); + static const Attribute h2 = HeaderAttribute(level: 2); - static Attribute get h3 => HeaderAttribute(level: 3); + static const Attribute h3 = HeaderAttribute(level: 3); // "attributes":{"align":"left"} - static Attribute get leftAlignment => AlignAttribute('left'); + static const Attribute leftAlignment = AlignAttribute('left'); // "attributes":{"align":"center"} - static Attribute get centerAlignment => AlignAttribute('center'); + static const Attribute centerAlignment = AlignAttribute('center'); // "attributes":{"align":"right"} - static Attribute get rightAlignment => AlignAttribute('right'); + static const Attribute rightAlignment = AlignAttribute('right'); // "attributes":{"align":"justify"} - static Attribute get justifyAlignment => AlignAttribute('justify'); + static const Attribute justifyAlignment = AlignAttribute('justify'); // "attributes":{"list":"bullet"} - static Attribute get ul => ListAttribute('bullet'); + static const Attribute ul = ListAttribute('bullet'); // "attributes":{"list":"ordered"} - static Attribute get ol => ListAttribute('ordered'); + static const Attribute ol = ListAttribute('ordered'); // "attributes":{"list":"checked"} - static Attribute get checked => ListAttribute('checked'); + static const Attribute checked = ListAttribute('checked'); // "attributes":{"list":"unchecked"} - static Attribute get unchecked => ListAttribute('unchecked'); + static const Attribute unchecked = ListAttribute('unchecked'); // "attributes":{"direction":"rtl"} - static Attribute get rtl => DirectionAttribute('rtl'); + static const Attribute rtl = DirectionAttribute('rtl'); // "attributes":{"indent":1"} - static Attribute get indentL1 => IndentAttribute(level: 1); + static const Attribute indentL1 = IndentAttribute(level: 1); // "attributes":{"indent":2"} - static Attribute get indentL2 => IndentAttribute(level: 2); + static const Attribute indentL2 = IndentAttribute(level: 2); // "attributes":{"indent":3"} - static Attribute get indentL3 => IndentAttribute(level: 3); + static const Attribute indentL3 = IndentAttribute(level: 3); static Attribute getIndentLevel(int? level) { if (level == 1) { @@ -244,101 +244,109 @@ class Attribute { } class BoldAttribute extends Attribute { - BoldAttribute() : super('bold', AttributeScope.INLINE, true); + const BoldAttribute() : super('bold', AttributeScope.INLINE, true); } class ItalicAttribute extends Attribute { - ItalicAttribute() : super('italic', AttributeScope.INLINE, true); + const ItalicAttribute() : super('italic', AttributeScope.INLINE, true); } class SmallAttribute extends Attribute { - SmallAttribute() : super('small', AttributeScope.INLINE, true); + const SmallAttribute() : super('small', AttributeScope.INLINE, true); } class UnderlineAttribute extends Attribute { - UnderlineAttribute() : super('underline', AttributeScope.INLINE, true); + const UnderlineAttribute() : super('underline', AttributeScope.INLINE, true); } class StrikeThroughAttribute extends Attribute { - StrikeThroughAttribute() : super('strike', AttributeScope.INLINE, true); + const StrikeThroughAttribute() : super('strike', AttributeScope.INLINE, true); } class InlineCodeAttribute extends Attribute { - InlineCodeAttribute() : super('code', AttributeScope.INLINE, true); + const InlineCodeAttribute() : super('code', AttributeScope.INLINE, true); } class FontAttribute extends Attribute { - FontAttribute(String? val) : super('font', AttributeScope.INLINE, val); + const FontAttribute(String? val) : super('font', AttributeScope.INLINE, val); } class SizeAttribute extends Attribute { - SizeAttribute(String? val) : super('size', AttributeScope.INLINE, val); + const SizeAttribute(String? val) : super('size', AttributeScope.INLINE, val); } class LinkAttribute extends Attribute { - LinkAttribute(String? val) : super('link', AttributeScope.INLINE, val); + const LinkAttribute(String? val) : super('link', AttributeScope.INLINE, val); } class ColorAttribute extends Attribute { - ColorAttribute(String? val) : super('color', AttributeScope.INLINE, val); + const ColorAttribute(String? val) + : super('color', AttributeScope.INLINE, val); } class BackgroundAttribute extends Attribute { - BackgroundAttribute(String? val) + const BackgroundAttribute(String? val) : super('background', AttributeScope.INLINE, val); } /// This is custom attribute for hint class PlaceholderAttribute extends Attribute { - PlaceholderAttribute() : super('placeholder', AttributeScope.INLINE, true); + const PlaceholderAttribute() + : super('placeholder', AttributeScope.INLINE, true); } class HeaderAttribute extends Attribute { - HeaderAttribute({int? level}) : super('header', AttributeScope.BLOCK, level); + const HeaderAttribute({int? level}) + : super('header', AttributeScope.BLOCK, level); } class IndentAttribute extends Attribute { - IndentAttribute({int? level}) : super('indent', AttributeScope.BLOCK, level); + const IndentAttribute({int? level}) + : super('indent', AttributeScope.BLOCK, level); } class AlignAttribute extends Attribute { - AlignAttribute(String? val) : super('align', AttributeScope.BLOCK, val); + const AlignAttribute(String? val) : super('align', AttributeScope.BLOCK, val); } class ListAttribute extends Attribute { - ListAttribute(String? val) : super('list', AttributeScope.BLOCK, val); + const ListAttribute(String? val) : super('list', AttributeScope.BLOCK, val); } class CodeBlockAttribute extends Attribute { - CodeBlockAttribute() : super('code-block', AttributeScope.BLOCK, true); + const CodeBlockAttribute() : super('code-block', AttributeScope.BLOCK, true); } class BlockQuoteAttribute extends Attribute { - BlockQuoteAttribute() : super('blockquote', AttributeScope.BLOCK, true); + const BlockQuoteAttribute() : super('blockquote', AttributeScope.BLOCK, true); } class DirectionAttribute extends Attribute { - DirectionAttribute(String? val) + const DirectionAttribute(String? val) : super('direction', AttributeScope.BLOCK, val); } class WidthAttribute extends Attribute { - WidthAttribute(String? val) : super('width', AttributeScope.IGNORE, val); + const WidthAttribute(String? val) + : super('width', AttributeScope.IGNORE, val); } class HeightAttribute extends Attribute { - HeightAttribute(String? val) : super('height', AttributeScope.IGNORE, val); + const HeightAttribute(String? val) + : super('height', AttributeScope.IGNORE, val); } class StyleAttribute extends Attribute { - StyleAttribute(String? val) : super('style', AttributeScope.IGNORE, val); + const StyleAttribute(String? val) + : super('style', AttributeScope.IGNORE, val); } class TokenAttribute extends Attribute { - TokenAttribute(String val) : super('token', AttributeScope.IGNORE, val); + const TokenAttribute(String val) : super('token', AttributeScope.IGNORE, val); } // `script` is supposed to be inline attribute but it is not supported yet class ScriptAttribute extends Attribute { - ScriptAttribute(String val) : super('script', AttributeScope.IGNORE, val); + const ScriptAttribute(String val) + : super('script', AttributeScope.IGNORE, val); } diff --git a/lib/src/translations/toolbar.i18n.dart b/lib/src/translations/toolbar.i18n.dart index 32329f2d..5db33bbe 100644 --- a/lib/src/translations/toolbar.i18n.dart +++ b/lib/src/translations/toolbar.i18n.dart @@ -337,11 +337,11 @@ extension Localization on String { 'Width': 'Largura', 'Height': 'Altura', 'Size': 'Tamanho', - 'Small': 'Small', - 'Large': 'Large', - 'Huge': 'Huge', - 'Clear': 'Clear', - 'Font': 'Font', + 'Small': 'Pequeno', + 'Large': 'Grande', + 'Huge': 'Gigante', + 'Clear': 'Limpar', + 'Font': 'Fonte', }, 'pl': { 'Paste a link': 'Wklej link', diff --git a/lib/src/widgets/toolbar/select_header_style_button.dart b/lib/src/widgets/toolbar/select_header_style_button.dart index 015cb02c..3ab4ae94 100644 --- a/lib/src/widgets/toolbar/select_header_style_button.dart +++ b/lib/src/widgets/toolbar/select_header_style_button.dart @@ -12,13 +12,19 @@ class SelectHeaderStyleButton extends StatefulWidget { required this.controller, this.iconSize = kDefaultIconSize, this.iconTheme, + this.attributes = const [ + Attribute.header, + Attribute.h1, + Attribute.h2, + Attribute.h3, + ], Key? key, }) : super(key: key); final QuillController controller; final double iconSize; - final QuillIconTheme? iconTheme; + final List attributes; @override _SelectHeaderStyleButtonState createState() => @@ -26,35 +32,32 @@ class SelectHeaderStyleButton extends StatefulWidget { } class _SelectHeaderStyleButtonState extends State { - Attribute? _value; + Attribute? _selectedAttribute; Style get _selectionStyle => widget.controller.getSelectionStyle(); + final _valueToText = { + Attribute.header: 'N', + Attribute.h1: 'H1', + Attribute.h2: 'H2', + Attribute.h3: 'H3', + }; + @override void initState() { super.initState(); setState(() { - _value = _getHeaderValue(); + _selectedAttribute = _getHeaderValue(); }); widget.controller.addListener(_didChangeEditingValue); } @override Widget build(BuildContext context) { - final _valueToText = { - Attribute.header: 'N', - Attribute.h1: 'H1', - Attribute.h2: 'H2', - Attribute.h3: 'H3', - }; - - final _valueAttribute = [ - Attribute.header, - Attribute.h1, - Attribute.h2, - Attribute.h3 - ]; - final _valueString = ['N', 'H1', 'H2', 'H3']; + assert( + widget.attributes.every((element) => _valueToText.keys.contains(element)), + 'All attributes must be one of them: header, h1, h2 or h3', + ); final theme = Theme.of(context); final style = TextStyle( @@ -64,7 +67,8 @@ class _SelectHeaderStyleButtonState extends State { return Row( mainAxisSize: MainAxisSize.min, - children: List.generate(4, (index) { + children: widget.attributes.map((attribute) { + final isSelected = _selectedAttribute == attribute; return Padding( // ignore: prefer_const_constructors padding: EdgeInsets.symmetric(horizontal: !kIsWeb ? 1.0 : 5.0), @@ -81,17 +85,21 @@ class _SelectHeaderStyleButtonState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular( widget.iconTheme?.borderRadius ?? 2)), - fillColor: _valueToText[_value] == _valueString[index] + fillColor: isSelected ? (widget.iconTheme?.iconSelectedFillColor ?? theme.toggleableActiveColor) : (widget.iconTheme?.iconUnselectedFillColor ?? theme.canvasColor), - onPressed: () => - widget.controller.formatSelection(_valueAttribute[index]), + onPressed: () { + final _attribute = _selectedAttribute == attribute + ? Attribute.header + : attribute; + widget.controller.formatSelection(_attribute); + }, child: Text( - _valueString[index], + _valueToText[attribute] ?? '', style: style.copyWith( - color: _valueToText[_value] == _valueString[index] + color: isSelected ? (widget.iconTheme?.iconSelectedColor ?? theme.primaryIconTheme.color) : (widget.iconTheme?.iconUnselectedColor ?? @@ -101,13 +109,13 @@ class _SelectHeaderStyleButtonState extends State { ), ), ); - }), + }).toList(), ); } void _didChangeEditingValue() { setState(() { - _value = _getHeaderValue(); + _selectedAttribute = _getHeaderValue(); }); } @@ -127,7 +135,7 @@ class _SelectHeaderStyleButtonState extends State { if (oldWidget.controller != widget.controller) { oldWidget.controller.removeListener(_didChangeEditingValue); widget.controller.addListener(_didChangeEditingValue); - _value = _getHeaderValue(); + _selectedAttribute = _getHeaderValue(); } }