Fix cannot focus recipients, subject and open popup menu when code view is enabled and focused

This commit is contained in:
dab246
2025-09-19 12:44:07 +07:00
committed by Dat H. Pham
parent c15353ccad
commit 69c9476379
4 changed files with 33 additions and 1 deletions
@@ -3,6 +3,8 @@ import 'package:custom_pop_up_menu/custom_pop_up_menu.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
typedef OnMenuChanged = void Function(bool isShowing);
class PopupMenuOverlayWidget extends StatelessWidget { class PopupMenuOverlayWidget extends StatelessWidget {
final List<Widget> listButtonAction; final List<Widget> listButtonAction;
@@ -14,6 +16,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
final bool arrangeAsList; final bool arrangeAsList;
final PreferredPosition? position; final PreferredPosition? position;
final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? padding;
final OnMenuChanged? onMenuChanged;
const PopupMenuOverlayWidget({ const PopupMenuOverlayWidget({
Key? key, Key? key,
@@ -26,6 +29,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
this.position = PreferredPosition.bottom, this.position = PreferredPosition.bottom,
this.arrangeAsList = false, this.arrangeAsList = false,
this.padding, this.padding,
this.onMenuChanged,
}) : super(key: key); }) : super(key: key);
@override @override
@@ -59,6 +63,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
barrierColor: Colors.transparent, barrierColor: Colors.transparent,
arrowSize: 0.0, arrowSize: 0.0,
verticalMargin: 2.0, verticalMargin: 2.0,
menuOnChange: onMenuChanged,
child: iconButton, child: iconButton,
); );
} }
@@ -1551,6 +1551,17 @@ class ComposerController extends BaseController
replyToRecipientState.value = PrefixRecipientState.disabled; replyToRecipientState.value = PrefixRecipientState.disabled;
} }
void clearFocusRecipients() {
toAddressFocusNode?.unfocus();
ccAddressFocusNode?.unfocus();
bccAddressFocusNode?.unfocus();
replyToAddressFocusNode?.unfocus();
}
void clearFocusSubject() {
subjectEmailInputFocusNode?.unfocus();
}
void _closeSuggestionBox() { void _closeSuggestionBox() {
if (toEmailAddressController.text.isEmpty) { if (toEmailAddressController.text.isEmpty) {
keyToEmailTagEditor.currentState?.closeSuggestionBox(); keyToEmailTagEditor.currentState?.closeSuggestionBox();
@@ -1899,8 +1910,12 @@ class ComposerController extends BaseController
} }
void handleOnFocusHtmlEditorWeb() { void handleOnFocusHtmlEditorWeb() {
clearFocusRecipients();
clearFocusSubject();
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
richTextWebController?.editorController.setFocus(); if (richTextWebController?.codeViewEnabled != true) {
richTextWebController?.editorController.setFocus();
}
richTextWebController?.closeAllMenuPopup(); richTextWebController?.closeAllMenuPopup();
if (menuMoreOptionController?.menuIsShowing == true) { if (menuMoreOptionController?.menuIsShowing == true) {
menuMoreOptionController?.hideMenu(); menuMoreOptionController?.hideMenu();
@@ -2428,4 +2443,11 @@ class ComposerController extends BaseController
void onCompleteSetupComposer() { void onCompleteSetupComposer() {
initEmailDraftHash(); initEmailDraftHash();
} }
void onPopupMenuChanged(bool isShowing) {
if (isShowing) {
clearFocusRecipients();
clearFocusSubject();
}
}
} }
@@ -619,6 +619,7 @@ class ComposerView extends GetWidget<ComposerController> {
isEmailChanged: controller.isEmailChanged.isTrue, isEmailChanged: controller.isEmailChanged.isTrue,
toggleCodeViewAction: controller.richTextWebController!.toggleCodeView, toggleCodeViewAction: controller.richTextWebController!.toggleCodeView,
menuMoreOptionController: controller.menuMoreOptionController!, menuMoreOptionController: controller.menuMoreOptionController!,
onPopupMenuChanged: controller.onPopupMenuChanged,
printDraftAction: () => controller.printDraft(context), printDraftAction: () => controller.printDraft(context),
toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context), toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context), toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context),
@@ -940,6 +941,7 @@ class ComposerView extends GetWidget<ComposerController> {
isEmailChanged: controller.isEmailChanged.isTrue, isEmailChanged: controller.isEmailChanged.isTrue,
toggleCodeViewAction: controller.richTextWebController!.toggleCodeView, toggleCodeViewAction: controller.richTextWebController!.toggleCodeView,
menuMoreOptionController: controller.menuMoreOptionController!, menuMoreOptionController: controller.menuMoreOptionController!,
onPopupMenuChanged: controller.onPopupMenuChanged,
printDraftAction: () => controller.printDraft(context), printDraftAction: () => controller.printDraft(context),
toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context), toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context), toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context),
@@ -30,6 +30,7 @@ class BottomBarComposerWidget extends StatelessWidget {
final VoidCallback printDraftAction; final VoidCallback printDraftAction;
final VoidCallback toggleMarkAsImportantAction; final VoidCallback toggleMarkAsImportantAction;
final VoidCallback saveAsTemplateAction; final VoidCallback saveAsTemplateAction;
final OnMenuChanged? onPopupMenuChanged;
const BottomBarComposerWidget({ const BottomBarComposerWidget({
super.key, super.key,
@@ -51,6 +52,7 @@ class BottomBarComposerWidget extends StatelessWidget {
required this.printDraftAction, required this.printDraftAction,
required this.toggleMarkAsImportantAction, required this.toggleMarkAsImportantAction,
required this.saveAsTemplateAction, required this.saveAsTemplateAction,
this.onPopupMenuChanged,
}); });
@override @override
@@ -182,6 +184,7 @@ class BottomBarComposerWidget extends StatelessWidget {
], ],
arrangeAsList: true, arrangeAsList: true,
position: null, position: null,
onMenuChanged: onPopupMenuChanged,
), ),
const Spacer(), const Spacer(),
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(