fix: toolbar tooltip message is incorrect on Windows (#7572)

* fix: some toolbar text display error

* chore: change string id to enum string id
This commit is contained in:
Morn 2025-03-19 11:23:07 +08:00 committed by GitHub
parent e6b0c8ff05
commit 9db87944f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 61 additions and 55 deletions

View File

@ -10,29 +10,30 @@ import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'custom_placeholder_toolbar_item.dart'; import 'custom_placeholder_toolbar_item.dart';
import 'toolbar_id_enum.dart';
final List<ToolbarItem> customMarkdownFormatItems = [ final List<ToolbarItem> customMarkdownFormatItems = [
_FormatToolbarItem( _FormatToolbarItem(
id: 'bold', id: ToolbarId.bold,
name: 'bold', name: 'bold',
svg: FlowySvgs.toolbar_bold_m, svg: FlowySvgs.toolbar_bold_m,
), ),
group1PaddingItem, group1PaddingItem,
_FormatToolbarItem( _FormatToolbarItem(
id: 'underline', id: ToolbarId.underline,
name: 'underline', name: 'underline',
svg: FlowySvgs.toolbar_underline_m, svg: FlowySvgs.toolbar_underline_m,
), ),
group1PaddingItem, group1PaddingItem,
_FormatToolbarItem( _FormatToolbarItem(
id: 'italic', id: ToolbarId.italic,
name: 'italic', name: 'italic',
svg: FlowySvgs.toolbar_inline_italic_m, svg: FlowySvgs.toolbar_inline_italic_m,
), ),
]; ];
final ToolbarItem customInlineCodeItem = _FormatToolbarItem( final ToolbarItem customInlineCodeItem = _FormatToolbarItem(
id: 'code', id: ToolbarId.code,
name: 'code', name: 'code',
svg: FlowySvgs.toolbar_inline_code_m, svg: FlowySvgs.toolbar_inline_code_m,
group: 2, group: 2,
@ -40,12 +41,12 @@ final ToolbarItem customInlineCodeItem = _FormatToolbarItem(
class _FormatToolbarItem extends ToolbarItem { class _FormatToolbarItem extends ToolbarItem {
_FormatToolbarItem({ _FormatToolbarItem({
required String id, required ToolbarId id,
required String name, required String name,
required FlowySvgData svg, required FlowySvgData svg,
super.group = 1, super.group = 1,
}) : super( }) : super(
id: 'editor.$id', id: id.id,
isActive: showInAnyTextType, isActive: showInAnyTextType,
builder: ( builder: (
context, context,
@ -89,8 +90,8 @@ class _FormatToolbarItem extends ToolbarItem {
if (tooltipBuilder != null) { if (tooltipBuilder != null) {
return tooltipBuilder( return tooltipBuilder(
context, context,
id, id.id,
getTooltipText(id), _getTooltipText(id),
child, child,
); );
} }
@ -99,44 +100,32 @@ class _FormatToolbarItem extends ToolbarItem {
); );
} }
String getTooltipText(String id) { String _getTooltipText(ToolbarId id) {
switch (id) { switch (id) {
case 'underline': case ToolbarId.underline:
return '${LocaleKeys.toolbar_underline.tr()}${shortcutTooltips( return '${LocaleKeys.toolbar_underline.tr()}${shortcutTooltips(
'⌘ + U', '⌘ + U',
'CTRL + U', 'CTRL + U',
'CTRL + U', 'CTRL + U',
)}'; )}';
case 'bold': case ToolbarId.bold:
return '${LocaleKeys.toolbar_bold.tr()}${shortcutTooltips( return '${LocaleKeys.toolbar_bold.tr()}${shortcutTooltips(
'⌘ + B', '⌘ + B',
'CTRL + B', 'CTRL + B',
'CTRL + B', 'CTRL + B',
)}'; )}';
case 'italic': case ToolbarId.italic:
return '${LocaleKeys.toolbar_italic.tr()}${shortcutTooltips( return '${LocaleKeys.toolbar_italic.tr()}${shortcutTooltips(
'⌘ + I', '⌘ + I',
'CTRL + I', 'CTRL + I',
'CTRL + I', 'CTRL + I',
)}'; )}';
case 'strikethrough': case ToolbarId.code:
return '${LocaleKeys.toolbar_strike.tr()}${shortcutTooltips(
'⌘ + SHIFT + S',
'CTRL + SHIFT + S',
'CTRL + SHIFT + S',
)}';
case 'code':
return '${LocaleKeys.document_toolbar_inlineCode.tr()}${shortcutTooltips( return '${LocaleKeys.document_toolbar_inlineCode.tr()}${shortcutTooltips(
'⌘ + E', '⌘ + E',
'CTRL + E', 'CTRL + E',
'CTRL + E', 'CTRL + E',
)}'; )}';
case 'align_left':
return LocaleKeys.document_toolbar_alignLeft.tr();
case 'align_center':
return LocaleKeys.document_toolbar_alignCenter.tr();
case 'align_right':
return LocaleKeys.document_toolbar_alignRight.tr();
default: default:
return ''; return '';
} }

View File

@ -6,11 +6,12 @@ import 'package:appflowy_editor/appflowy_editor.dart' hide ColorPicker;
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const _kHighlightColorItemId = 'editor.highlightColor'; import 'toolbar_id_enum.dart';
String? _customHighlightColorHex; String? _customHighlightColorHex;
final customHighlightColorItem = ToolbarItem( final customHighlightColorItem = ToolbarItem(
id: _kHighlightColorItemId, id: ToolbarId.highlightColor.id,
group: 1, group: 1,
isActive: showInAnyTextType, isActive: showInAnyTextType,
builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) => builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) =>
@ -107,7 +108,7 @@ class _HighlightColorPickerWidgetState
return widget.tooltipBuilder?.call( return widget.tooltipBuilder?.call(
context, context,
_kHighlightColorItemId, ToolbarId.highlightColor.id,
AppFlowyEditorL10n.current.highlightColor, AppFlowyEditorL10n.current.highlightColor,
child, child,
) ?? ) ??

View File

@ -4,10 +4,10 @@ import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const _kLinkItemId = 'editor.link'; import 'toolbar_id_enum.dart';
final customLinkItem = ToolbarItem( final customLinkItem = ToolbarItem(
id: _kLinkItemId, id: ToolbarId.link.id,
group: 4, group: 4,
isActive: onlyShowInSingleSelectionAndTextType, isActive: onlyShowInSingleSelectionAndTextType,
builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) { builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) {
@ -39,7 +39,7 @@ final customLinkItem = ToolbarItem(
if (tooltipBuilder != null) { if (tooltipBuilder != null) {
return tooltipBuilder( return tooltipBuilder(
context, context,
_kLinkItemId, ToolbarId.highlightColor.id,
AppFlowyEditorL10n.current.link, AppFlowyEditorL10n.current.link,
child, child,
); );

View File

@ -4,11 +4,10 @@ import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const placeholderItemId = 'editor.placeholder'; import 'toolbar_id_enum.dart';
const paddingPlaceholderItemId = 'editor.padding_placeholder';
final ToolbarItem customPlaceholderItem = ToolbarItem( final ToolbarItem customPlaceholderItem = ToolbarItem(
id: placeholderItemId, id: ToolbarId.placeholder.id,
group: -1, group: -1,
isActive: (editorState) => true, isActive: (editorState) => true,
builder: (context, __, ___, ____, _____) { builder: (context, __, ___, ____, _____) {
@ -28,7 +27,7 @@ ToolbarItem buildPaddingPlaceholderItem(
bool Function(EditorState editorState)? isActive, bool Function(EditorState editorState)? isActive,
}) => }) =>
ToolbarItem( ToolbarItem(
id: paddingPlaceholderItemId, id: ToolbarId.paddingPlaceHolder.id,
group: group, group: group,
isActive: isActive, isActive: isActive,
builder: (context, __, ___, ____, _____) => HSpace(4), builder: (context, __, ___, ____, _____) => HSpace(4),

View File

@ -6,10 +6,10 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const _kTextAlignItemId = 'editor.text_align'; import 'toolbar_id_enum.dart';
final ToolbarItem customTextAlignItem = ToolbarItem( final ToolbarItem customTextAlignItem = ToolbarItem(
id: _kTextAlignItemId, id: ToolbarId.textAlign.id,
group: 4, group: 4,
isActive: onlyShowInSingleSelectionAndTextType, isActive: onlyShowInSingleSelectionAndTextType,
builder: ( builder: (
@ -114,7 +114,7 @@ class _TextAlignActionListState extends State<TextAlignActionList> {
return widget.tooltipBuilder?.call( return widget.tooltipBuilder?.call(
context, context,
_kTextAlignItemId, ToolbarId.textAlign.id,
LocaleKeys.document_toolbar_textAlign.tr(), LocaleKeys.document_toolbar_textAlign.tr(),
child, child,
) ?? ) ??

View File

@ -7,12 +7,12 @@ import 'package:appflowy_editor/appflowy_editor.dart' hide ColorPicker;
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'toolbar_id_enum.dart';
const _kTextColorItemId = 'editor.textColor';
String? _customColorHex; String? _customColorHex;
final customTextColorItem = ToolbarItem( final customTextColorItem = ToolbarItem(
id: _kTextColorItemId, id: ToolbarId.textColor.id,
group: 1, group: 1,
isActive: showInAnyTextType, isActive: showInAnyTextType,
builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) => builder: (context, editorState, highlightColor, iconColor, tooltipBuilder) =>
@ -106,8 +106,8 @@ class _TextColorPickerWidgetState extends State<TextColorPickerWidget> {
return widget.tooltipBuilder?.call( return widget.tooltipBuilder?.call(
context, context,
_kTextColorItemId, ToolbarId.textColor.id,
AppFlowyEditorL10n.current.textColor, LocaleKeys.document_toolbar_textColor.tr(),
child, child,
) ?? ) ??
child; child;

View File

@ -165,8 +165,8 @@ class _MoreOptionActionListState extends State<MoreOptionActionList> {
rightIcon: FlowyText( rightIcon: FlowyText(
shortcutTooltips( shortcutTooltips(
'⌘⇧S', '⌘⇧S',
'CTRL+SHIFT+S', 'Ctrl⇧S',
'CTRL+SHIFT+S', 'Ctrl⇧S',
).trim(), ).trim(),
color: fontColor, color: fontColor,
fontSize: 12, fontSize: 12,
@ -180,8 +180,8 @@ class _MoreOptionActionListState extends State<MoreOptionActionList> {
rightIcon: FlowyText( rightIcon: FlowyText(
shortcutTooltips( shortcutTooltips(
'⌘⇧E', '⌘⇧E',
'CTRL+SHIFT+E', 'Ctrl⇧E',
'CTRL+SHIFT+E', 'Ctrl⇧E',
).trim(), ).trim(),
color: fontColor, color: fontColor,
fontSize: 12, fontSize: 12,

View File

@ -8,10 +8,10 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const _kTextHeadingItemId = 'editor.text_heading'; import 'toolbar_id_enum.dart';
final ToolbarItem customTextHeadingItem = ToolbarItem( final ToolbarItem customTextHeadingItem = ToolbarItem(
id: _kTextHeadingItemId, id: ToolbarId.textHeading.id,
group: 1, group: 1,
isActive: onlyShowInSingleTextTypeSelectionAndExcludeTable, isActive: onlyShowInSingleTextTypeSelectionAndExcludeTable,
builder: ( builder: (
@ -109,7 +109,7 @@ class _TextHeadingActionListState extends State<TextHeadingActionList> {
return widget.tooltipBuilder?.call( return widget.tooltipBuilder?.call(
context, context,
_kTextHeadingItemId, ToolbarId.textHeading.id,
LocaleKeys.document_toolbar_textSize.tr(), LocaleKeys.document_toolbar_textSize.tr(),
child, child,
) ?? ) ??

View File

@ -14,8 +14,7 @@ import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'text_heading_toolbar_item.dart'; import 'text_heading_toolbar_item.dart';
import 'toolbar_id_enum.dart';
const _kSuggestionsItemId = 'editor.suggestions';
@visibleForTesting @visibleForTesting
const kSuggestionsItemKey = ValueKey('SuggestionsItem'); const kSuggestionsItemKey = ValueKey('SuggestionsItem');
@ -24,7 +23,7 @@ const kSuggestionsItemKey = ValueKey('SuggestionsItem');
const kSuggestionsItemListKey = ValueKey('SuggestionsItemList'); const kSuggestionsItemListKey = ValueKey('SuggestionsItemList');
final ToolbarItem suggestionsItem = ToolbarItem( final ToolbarItem suggestionsItem = ToolbarItem(
id: _kSuggestionsItemId, id: ToolbarId.suggestions.id,
group: 3, group: 3,
isActive: enableSuggestions, isActive: enableSuggestions,
builder: ( builder: (
@ -159,7 +158,7 @@ class _SuggestionsActionListState extends State<SuggestionsActionList> {
return widget.tooltipBuilder?.call( return widget.tooltipBuilder?.call(
context, context,
_kSuggestionsItemId, ToolbarId.suggestions.id,
currentSuggestionItem.title, currentSuggestionItem.title,
child, child,
) ?? ) ??

View File

@ -0,0 +1,19 @@
enum ToolbarId {
bold,
underline,
italic,
code,
highlightColor,
textColor,
link,
placeholder,
paddingPlaceHolder,
textAlign,
moreOption,
textHeading,
suggestions,
}
extension ToolbarIdExtension on ToolbarId {
String get id => 'editor.$name';
}

View File

@ -550,7 +550,7 @@ class EditorStyleCustomizer {
style: context.tooltipTextStyle(), style: context.tooltipTextStyle(),
), ),
TextSpan( TextSpan(
text: (Platform.isMacOS ? '⌘+' : 'Ctrl+\\') + tooltip.$2, text: (Platform.isMacOS ? '⌘+' : 'Ctrl+') + tooltip.$2,
style: context.tooltipTextStyle()?.copyWith( style: context.tooltipTextStyle()?.copyWith(
color: Theme.of(context).hintColor, color: Theme.of(context).hintColor,
), ),

View File

@ -2118,7 +2118,6 @@
"moreOptions": "More options", "moreOptions": "More options",
"font": "Font", "font": "Font",
"inlineCode": "Inline code", "inlineCode": "Inline code",
"suggestions": "Suggestions", "suggestions": "Suggestions",
"turnInto": "Turn into", "turnInto": "Turn into",
"equation": "Equation" "equation": "Equation"