Skip to content

Commit 3fb5b7a

Browse files
Style custom toolbar buttons like builtins (singerdmx#1267)
1 parent ba809c8 commit 3fb5b7a

File tree

6 files changed

+93
-19
lines changed

6 files changed

+93
-19
lines changed

lib/src/widgets/toolbar.dart

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import 'embeds.dart';
1111
import 'toolbar/arrow_indicated_button_list.dart';
1212
import 'toolbar/clear_format_button.dart';
1313
import 'toolbar/color_button.dart';
14+
import 'toolbar/custom_button.dart';
1415
import 'toolbar/enum.dart';
1516
import 'toolbar/history_button.dart';
1617
import 'toolbar/indent_button.dart';
1718
import 'toolbar/link_style_button.dart';
1819
import 'toolbar/quill_font_family_button.dart';
1920
import 'toolbar/quill_font_size_button.dart';
20-
import 'toolbar/quill_icon_button.dart';
2121
import 'toolbar/search_button.dart';
2222
import 'toolbar/select_alignment_button.dart';
2323
import 'toolbar/select_header_style_button.dart';
@@ -26,6 +26,7 @@ import 'toolbar/toggle_style_button.dart';
2626

2727
export 'toolbar/clear_format_button.dart';
2828
export 'toolbar/color_button.dart';
29+
export 'toolbar/custom_button.dart';
2930
export 'toolbar/history_button.dart';
3031
export 'toolbar/indent_button.dart';
3132
export 'toolbar/link_style_button.dart';
@@ -566,19 +567,14 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
566567
QuillDivider(axis,
567568
color: sectionDividerColor, space: sectionDividerSpace),
568569
for (var customButton in customButtons)
569-
QuillIconButton(
570-
highlightElevation: 0,
571-
hoverElevation: 0,
572-
size: toolbarIconSize * kIconButtonFactor,
573-
icon: Icon(
574-
customButton.icon,
575-
size: toolbarIconSize,
576-
color: customButton.iconColor,
577-
),
578-
tooltip: customButton.tooltip,
579-
borderRadius: iconTheme?.borderRadius ?? 2,
570+
CustomButton(
580571
onPressed: customButton.onTap,
581-
afterPressed: afterButtonPressed,
572+
icon: customButton.icon,
573+
iconColor: customButton.iconColor,
574+
iconSize: toolbarIconSize,
575+
iconTheme: iconTheme,
576+
afterButtonPressed: afterButtonPressed,
577+
tooltip: customButton.tooltip,
582578
),
583579
],
584580
);
@@ -650,7 +646,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
650646
/// The divider which is used for separation of buttons in the toolbar.
651647
///
652648
/// It can be used outside of this package, for example when user does not use
653-
/// [QuillToolbar.basic] and compose toolbat's children on its own.
649+
/// [QuillToolbar.basic] and compose toolbar's children on its own.
654650
class QuillDivider extends StatelessWidget {
655651
const QuillDivider(
656652
this.axis, {
@@ -659,11 +655,11 @@ class QuillDivider extends StatelessWidget {
659655
this.space,
660656
}) : super(key: key);
661657

662-
/// Provides a horizonal divider for vertical toolbar.
658+
/// Provides a horizontal divider for vertical toolbar.
663659
const QuillDivider.horizontal({Color? color, double? space})
664660
: this(Axis.horizontal, color: color, space: space);
665661

666-
/// Provides a horizonal divider for horizontal toolbar.
662+
/// Provides a horizontal divider for horizontal toolbar.
667663
const QuillDivider.vertical({Color? color, double? space})
668664
: this(Axis.vertical, color: color, space: space);
669665

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'package:flutter/material.dart';
2+
3+
import '../../models/themes/quill_icon_theme.dart';
4+
import '../toolbar.dart';
5+
6+
class CustomButton extends StatelessWidget {
7+
const CustomButton({
8+
required this.onPressed,
9+
required this.icon,
10+
this.iconColor,
11+
this.iconSize = kDefaultIconSize,
12+
this.iconTheme,
13+
this.afterButtonPressed,
14+
this.tooltip,
15+
Key? key,
16+
}) : super(key: key);
17+
18+
final VoidCallback? onPressed;
19+
final IconData? icon;
20+
final Color? iconColor;
21+
final double iconSize;
22+
final QuillIconTheme? iconTheme;
23+
final VoidCallback? afterButtonPressed;
24+
final String? tooltip;
25+
26+
@override
27+
Widget build(BuildContext context) {
28+
final theme = Theme.of(context);
29+
30+
final iconColor = iconTheme?.iconUnselectedColor ?? theme.iconTheme.color;
31+
return QuillIconButton(
32+
highlightElevation: 0,
33+
hoverElevation: 0,
34+
size: iconSize * kIconButtonFactor,
35+
icon: Icon(icon, size: iconSize, color: iconColor),
36+
tooltip: tooltip,
37+
borderRadius: iconTheme?.borderRadius ?? 2,
38+
onPressed: onPressed,
39+
afterPressed: afterButtonPressed,
40+
fillColor: iconTheme?.iconUnselectedFillColor ?? theme.canvasColor,
41+
);
42+
}
43+
}

lib/src/widgets/toolbar/history_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class _HistoryButtonState extends State<HistoryButton> {
4646
tooltip: widget.tooltip,
4747
highlightElevation: 0,
4848
hoverElevation: 0,
49-
size: widget.iconSize * 1.77,
49+
size: widget.iconSize * kIconButtonFactor,
5050
icon: Icon(widget.icon, size: widget.iconSize, color: _iconColor),
5151
fillColor: fillColor,
5252
borderRadius: widget.iconTheme?.borderRadius ?? 2,

lib/src/widgets/toolbar/indent_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class _IndentButtonState extends State<IndentButton> {
4242
tooltip: widget.tooltip,
4343
highlightElevation: 0,
4444
hoverElevation: 0,
45-
size: widget.iconSize * 1.77,
45+
size: widget.iconSize * kIconButtonFactor,
4646
icon: Icon(widget.icon, size: widget.iconSize, color: iconColor),
4747
fillColor: iconFillColor,
4848
borderRadius: widget.iconTheme?.borderRadius ?? 2,

lib/src/widgets/toolbar/search_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class SearchButton extends StatelessWidget {
4343
icon: Icon(icon, size: iconSize, color: iconColor),
4444
highlightElevation: 0,
4545
hoverElevation: 0,
46-
size: iconSize * 1.77,
46+
size: iconSize * kIconButtonFactor,
4747
fillColor: iconFillColor,
4848
borderRadius: iconTheme?.borderRadius ?? 2,
4949
onPressed: () => _onPressedHandler(context),

test/bug_fix_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,41 @@ import 'package:flutter_test/flutter_test.dart';
55

66
void main() {
77
group('Bug fix', () {
8+
group(
9+
'1266 - QuillToolbar.basic() custom buttons do not have correct fill'
10+
'color set', () {
11+
testWidgets('fillColor of custom buttons and builtin buttons match',
12+
(tester) async {
13+
const tooltip = 'custom button';
14+
15+
await tester.pumpWidget(MaterialApp(
16+
home: QuillToolbar.basic(
17+
showRedo: false,
18+
controller: QuillController.basic(),
19+
customButtons: [const QuillCustomButton(tooltip: tooltip)],
20+
)));
21+
22+
final builtinFinder = find.descendant(
23+
of: find.byType(HistoryButton),
24+
matching: find.byType(QuillIconButton),
25+
matchRoot: true);
26+
expect(builtinFinder, findsOneWidget);
27+
final builtinButton =
28+
builtinFinder.evaluate().first.widget as QuillIconButton;
29+
30+
final customFinder = find.descendant(
31+
of: find.byType(QuillToolbar),
32+
matching: find.byWidgetPredicate((widget) =>
33+
widget is QuillIconButton && widget.tooltip == tooltip),
34+
matchRoot: true);
35+
expect(customFinder, findsOneWidget);
36+
final customButton =
37+
customFinder.evaluate().first.widget as QuillIconButton;
38+
39+
expect(customButton.fillColor, equals(builtinButton.fillColor));
40+
});
41+
});
42+
843
group('1189 - The provided text position is not in the current node', () {
944
late QuillController controller;
1045
late QuillEditor editor;

0 commit comments

Comments
 (0)