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:pointer_interceptor/pointer_interceptor.dart';
typedef OnMenuChanged = void Function(bool isShowing);
class PopupMenuOverlayWidget extends StatelessWidget {
final List<Widget> listButtonAction;
@@ -14,6 +16,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
final bool arrangeAsList;
final PreferredPosition? position;
final EdgeInsetsGeometry? padding;
final OnMenuChanged? onMenuChanged;
const PopupMenuOverlayWidget({
Key? key,
@@ -26,6 +29,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
this.position = PreferredPosition.bottom,
this.arrangeAsList = false,
this.padding,
this.onMenuChanged,
}) : super(key: key);
@override
@@ -59,6 +63,7 @@ class PopupMenuOverlayWidget extends StatelessWidget {
barrierColor: Colors.transparent,
arrowSize: 0.0,
verticalMargin: 2.0,
menuOnChange: onMenuChanged,
child: iconButton,
);
}
@@ -1551,6 +1551,17 @@ class ComposerController extends BaseController
replyToRecipientState.value = PrefixRecipientState.disabled;
}
void clearFocusRecipients() {
toAddressFocusNode?.unfocus();
ccAddressFocusNode?.unfocus();
bccAddressFocusNode?.unfocus();
replyToAddressFocusNode?.unfocus();
}
void clearFocusSubject() {
subjectEmailInputFocusNode?.unfocus();
}
void _closeSuggestionBox() {
if (toEmailAddressController.text.isEmpty) {
keyToEmailTagEditor.currentState?.closeSuggestionBox();
@@ -1899,8 +1910,12 @@ class ComposerController extends BaseController
}
void handleOnFocusHtmlEditorWeb() {
clearFocusRecipients();
clearFocusSubject();
FocusManager.instance.primaryFocus?.unfocus();
richTextWebController?.editorController.setFocus();
if (richTextWebController?.codeViewEnabled != true) {
richTextWebController?.editorController.setFocus();
}
richTextWebController?.closeAllMenuPopup();
if (menuMoreOptionController?.menuIsShowing == true) {
menuMoreOptionController?.hideMenu();
@@ -2428,4 +2443,11 @@ class ComposerController extends BaseController
void onCompleteSetupComposer() {
initEmailDraftHash();
}
void onPopupMenuChanged(bool isShowing) {
if (isShowing) {
clearFocusRecipients();
clearFocusSubject();
}
}
}
@@ -619,6 +619,7 @@ class ComposerView extends GetWidget<ComposerController> {
isEmailChanged: controller.isEmailChanged.isTrue,
toggleCodeViewAction: controller.richTextWebController!.toggleCodeView,
menuMoreOptionController: controller.menuMoreOptionController!,
onPopupMenuChanged: controller.onPopupMenuChanged,
printDraftAction: () => controller.printDraft(context),
toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context),
@@ -940,6 +941,7 @@ class ComposerView extends GetWidget<ComposerController> {
isEmailChanged: controller.isEmailChanged.isTrue,
toggleCodeViewAction: controller.richTextWebController!.toggleCodeView,
menuMoreOptionController: controller.menuMoreOptionController!,
onPopupMenuChanged: controller.onPopupMenuChanged,
printDraftAction: () => controller.printDraft(context),
toggleRequestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
toggleMarkAsImportantAction: () => controller.toggleMarkAsImportant(context),
@@ -30,6 +30,7 @@ class BottomBarComposerWidget extends StatelessWidget {
final VoidCallback printDraftAction;
final VoidCallback toggleMarkAsImportantAction;
final VoidCallback saveAsTemplateAction;
final OnMenuChanged? onPopupMenuChanged;
const BottomBarComposerWidget({
super.key,
@@ -51,6 +52,7 @@ class BottomBarComposerWidget extends StatelessWidget {
required this.printDraftAction,
required this.toggleMarkAsImportantAction,
required this.saveAsTemplateAction,
this.onPopupMenuChanged,
});
@override
@@ -182,6 +184,7 @@ class BottomBarComposerWidget extends StatelessWidget {
],
arrangeAsList: true,
position: null,
onMenuChanged: onPopupMenuChanged,
),
const Spacer(),
TMailButtonWidget.fromIcon(