TF-1573: Cursor auto move while typing
(cherry picked from commit 64240b7fac51d66311ee308fe6287f3ddab40ac9)
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
@@ -118,6 +119,10 @@ class ComposerController extends BaseController {
|
|||||||
final GlobalKey<TagsEditorState> keyToEmailTagEditor = GlobalKey<TagsEditorState>();
|
final GlobalKey<TagsEditorState> keyToEmailTagEditor = GlobalKey<TagsEditorState>();
|
||||||
final GlobalKey<TagsEditorState> keyCcEmailTagEditor = GlobalKey<TagsEditorState>();
|
final GlobalKey<TagsEditorState> keyCcEmailTagEditor = GlobalKey<TagsEditorState>();
|
||||||
final GlobalKey<TagsEditorState> keyBccEmailTagEditor = GlobalKey<TagsEditorState>();
|
final GlobalKey<TagsEditorState> keyBccEmailTagEditor = GlobalKey<TagsEditorState>();
|
||||||
|
final GlobalKey headerEditorMobileWidgetKey = GlobalKey();
|
||||||
|
final double defaultPaddingCoordinateYCursorEditor = 8;
|
||||||
|
final double maxKeyBoardHeight = 500;
|
||||||
|
final double richTextBarHeight = 200;
|
||||||
|
|
||||||
FocusNode? subjectEmailInputFocusNode;
|
FocusNode? subjectEmailInputFocusNode;
|
||||||
FocusNode? toAddressFocusNode;
|
FocusNode? toAddressFocusNode;
|
||||||
@@ -346,7 +351,8 @@ class ComposerController extends BaseController {
|
|||||||
editorApi,
|
editorApi,
|
||||||
onEnterKeyDown: _onEnterKeyDown,
|
onEnterKeyDown: _onEnterKeyDown,
|
||||||
context: context,
|
context: context,
|
||||||
onFocus: _onEditorFocusOnMobile
|
onFocus: _onEditorFocusOnMobile,
|
||||||
|
onChangeCursor: _onChangeCursorOnMobile,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1505,6 +1511,30 @@ class ComposerController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onChangeCursorOnMobile(List<int>? coordinates) {
|
||||||
|
|
||||||
|
final headerEditorMobileWidgetRenderObject = headerEditorMobileWidgetKey.currentContext?.findRenderObject();
|
||||||
|
|
||||||
|
if (headerEditorMobileWidgetRenderObject is RenderBox?) {
|
||||||
|
final headerEditorMobileSize = headerEditorMobileWidgetRenderObject?.size;
|
||||||
|
if (coordinates?[1] != null && coordinates?[1] != 0) {
|
||||||
|
final coordinateY = max((coordinates?[1] ?? 0) - defaultPaddingCoordinateYCursorEditor, 0);
|
||||||
|
final realCoordinateY = coordinateY + (headerEditorMobileSize?.height ?? 0);
|
||||||
|
if (scrollController.position.pixels >= realCoordinateY) {
|
||||||
|
scrollController.jumpTo(
|
||||||
|
realCoordinateY.toDouble() - (headerEditorMobileSize?.height ?? 0) / 2,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((realCoordinateY) >= max(Get.height - maxKeyBoardHeight - richTextBarHeight, 0) + scrollController.position.pixels) {
|
||||||
|
scrollController.jumpTo(
|
||||||
|
realCoordinateY.toDouble(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _onEnterKeyDown() {
|
void _onEnterKeyDown() {
|
||||||
if(scrollController.position.pixels < scrollController.position.maxScrollExtent) {
|
if(scrollController.position.pixels < scrollController.position.maxScrollExtent) {
|
||||||
scrollController.animateTo(
|
scrollController.animateTo(
|
||||||
|
|||||||
@@ -467,29 +467,41 @@ class ComposerView extends GetWidget<ComposerController>
|
|||||||
),
|
),
|
||||||
richTextController: controller.keyboardRichTextController,
|
richTextController: controller.keyboardRichTextController,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
controller: controller.scrollController,
|
controller: controller.scrollController,
|
||||||
physics: const ClampingScrollPhysics(),
|
physics: const ClampingScrollPhysics(),
|
||||||
child: Column(children: [
|
child: Column(
|
||||||
Obx(() => controller.identitySelected.value != null
|
children: [
|
||||||
? _buildFromEmailAddress(context)
|
_buildHeaderEditorMobile(context),
|
||||||
: const SizedBox.shrink()),
|
|
||||||
Obx(() => controller.identitySelected.value != null
|
|
||||||
? const Divider(color: AppColor.colorDividerComposer, height: 1)
|
|
||||||
: const SizedBox.shrink()),
|
|
||||||
_buildEmailAddress(context),
|
|
||||||
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
||||||
child: _buildSubjectEmail(context)),
|
|
||||||
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
|
||||||
_buildAttachmentsWidget(context),
|
|
||||||
buildInlineLoadingView(controller),
|
|
||||||
_buildComposerEditor(context),
|
_buildComposerEditor(context),
|
||||||
])
|
SizedBox(height: controller.maxKeyBoardHeight),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildHeaderEditorMobile(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
key: controller.headerEditorMobileWidgetKey,
|
||||||
|
children: [
|
||||||
|
Obx(() => controller.identitySelected.value != null
|
||||||
|
? _buildFromEmailAddress(context)
|
||||||
|
: const SizedBox.shrink()),
|
||||||
|
Obx(() => controller.identitySelected.value != null
|
||||||
|
? const Divider(color: AppColor.colorDividerComposer, height: 1)
|
||||||
|
: const SizedBox.shrink()),
|
||||||
|
_buildEmailAddress(context),
|
||||||
|
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||||
|
child: _buildSubjectEmail(context)),
|
||||||
|
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
||||||
|
_buildAttachmentsWidget(context),
|
||||||
|
buildInlineLoadingView(controller),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildBodyTablet(BuildContext context) {
|
Widget _buildBodyTablet(BuildContext context) {
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
controller: controller.scrollController,
|
controller: controller.scrollController,
|
||||||
|
|||||||
Reference in New Issue
Block a user