TF-1156: [Presentation] Auto scroll mailbox list while dragging and drop
This commit is contained in:
@@ -1162,4 +1162,25 @@ class MailboxController extends BaseMailboxController {
|
||||
_cancelSelectMailbox();
|
||||
mailboxDashBoardController.closeMailboxMenuDrawer();
|
||||
}
|
||||
|
||||
void autoScrollTop() {
|
||||
mailboxListScrollController.animateTo(
|
||||
mailboxListScrollController.position.minScrollExtent,
|
||||
duration: const Duration(seconds: 1),
|
||||
curve: Curves.easeInToLinear);
|
||||
}
|
||||
|
||||
void autoScrollBottom() {
|
||||
mailboxListScrollController.animateTo(
|
||||
mailboxListScrollController.position.maxScrollExtent,
|
||||
duration: const Duration(seconds: 1),
|
||||
curve: Curves.easeInToLinear);
|
||||
}
|
||||
|
||||
void stopAutoScroll() {
|
||||
mailboxListScrollController.animateTo(
|
||||
mailboxListScrollController.offset,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.fastOutSlowIn);
|
||||
}
|
||||
}
|
||||
@@ -150,50 +150,72 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
|
||||
}
|
||||
|
||||
Widget _buildListMailbox(BuildContext context) {
|
||||
return SingleChildScrollView(
|
||||
controller: controller.mailboxListScrollController,
|
||||
key: const PageStorageKey('mailbox_list'),
|
||||
physics: const ClampingScrollPhysics(),
|
||||
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0),
|
||||
child: Column(children: [
|
||||
Obx(() {
|
||||
if (controller.isSelectionEnabled() || _responsiveUtils.isDesktop(context)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
return _buildUserInformation(context);
|
||||
}),
|
||||
_buildLoadingView(),
|
||||
AppConfig.appGridDashboardAvailable && _responsiveUtils.isWebNotDesktop(context)
|
||||
? Column(children: [
|
||||
_buildAppGridDashboard(context),
|
||||
const SizedBox(height: 8),
|
||||
const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2),
|
||||
const SizedBox(height: 8),
|
||||
])
|
||||
: const SizedBox.shrink(),
|
||||
Obx(() => controller.defaultMailboxHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode)
|
||||
: const SizedBox.shrink()),
|
||||
const SizedBox(height: 8),
|
||||
const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2),
|
||||
const SizedBox(height: 8),
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.folders),
|
||||
Row(children: [
|
||||
Expanded(child: _buildSearchBarWidget(context)),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12),
|
||||
child: buildIconWeb(
|
||||
minSize: 40,
|
||||
iconPadding: EdgeInsets.zero,
|
||||
splashRadius: 15,
|
||||
icon: SvgPicture.asset(_imagePaths.icAddNewFolder, color: AppColor.colorTextButton, fit: BoxFit.fill),
|
||||
tooltip: AppLocalizations.of(context).new_mailbox,
|
||||
onTap: () => controller.goToCreateNewMailboxView(context))),
|
||||
]),
|
||||
Obx(() => controller.folderMailboxHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.folders, controller.folderRootNode)
|
||||
: const SizedBox.shrink()),
|
||||
])
|
||||
return Stack(
|
||||
children: [
|
||||
SingleChildScrollView(
|
||||
controller: controller.mailboxListScrollController,
|
||||
key: const PageStorageKey('mailbox_list'),
|
||||
physics: const ClampingScrollPhysics(),
|
||||
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0),
|
||||
child: Column(children: [
|
||||
Obx(() {
|
||||
if (controller.isSelectionEnabled() || _responsiveUtils.isDesktop(context)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
return _buildUserInformation(context);
|
||||
}),
|
||||
_buildLoadingView(),
|
||||
AppConfig.appGridDashboardAvailable && _responsiveUtils.isWebNotDesktop(context)
|
||||
? Column(children: [
|
||||
_buildAppGridDashboard(context),
|
||||
const SizedBox(height: 8),
|
||||
const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2),
|
||||
const SizedBox(height: 8),
|
||||
])
|
||||
: const SizedBox.shrink(),
|
||||
Obx(() => controller.defaultMailboxHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode)
|
||||
: const SizedBox.shrink()),
|
||||
const SizedBox(height: 8),
|
||||
const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2),
|
||||
const SizedBox(height: 8),
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.folders),
|
||||
Row(children: [
|
||||
Expanded(child: _buildSearchBarWidget(context)),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12),
|
||||
child: buildIconWeb(
|
||||
minSize: 40,
|
||||
iconPadding: EdgeInsets.zero,
|
||||
splashRadius: 15,
|
||||
icon: SvgPicture.asset(_imagePaths.icAddNewFolder, color: AppColor.colorTextButton, fit: BoxFit.fill),
|
||||
tooltip: AppLocalizations.of(context).new_mailbox,
|
||||
onTap: () => controller.goToCreateNewMailboxView(context))),
|
||||
]),
|
||||
Obx(() => controller.folderMailboxHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.folders, controller.folderRootNode)
|
||||
: const SizedBox.shrink()),
|
||||
])
|
||||
),
|
||||
Obx(() => controller.mailboxDashBoardController.isDraggingMailbox
|
||||
? Align(
|
||||
alignment: Alignment.topCenter,
|
||||
child: InkWell(
|
||||
onTap: () {},
|
||||
onHover: (value) => value ? controller.autoScrollTop() : controller.stopAutoScroll(),
|
||||
child: Container(
|
||||
height: 40)))
|
||||
: const SizedBox.shrink()),
|
||||
Obx(() => controller.mailboxDashBoardController.isDraggingMailbox
|
||||
? Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: InkWell(
|
||||
onTap: () {},
|
||||
onHover: (value) => value ? controller.autoScrollBottom() : controller.stopAutoScroll(),
|
||||
child: Container(
|
||||
height: 40)))
|
||||
: const SizedBox.shrink()),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+7
@@ -155,6 +155,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
final viewStateMarkAsReadMailbox = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||
final vacationResponse = Rxn<VacationResponse>();
|
||||
final routerParameters = Rxn<Map<String, String?>>();
|
||||
final _isDraggingMailbox = RxBool(false);
|
||||
Session? sessionCurrent;
|
||||
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
|
||||
Map<MailboxId, PresentationMailbox> mapMailboxById = {};
|
||||
@@ -1541,6 +1542,12 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
spamReportController.storeSpamReportStateAction(_storeSpamReportState);
|
||||
}
|
||||
|
||||
void onDragMailbox(bool isDragging) {
|
||||
_isDraggingMailbox.value = isDragging;
|
||||
}
|
||||
|
||||
bool get isDraggingMailbox => _isDraggingMailbox.value;
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
_emailReceiveManager.closeEmailReceiveManagerStream();
|
||||
|
||||
@@ -965,4 +965,8 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
}
|
||||
_navigationRouter = null;
|
||||
}
|
||||
|
||||
void onDragMailBox(bool isDrag) {
|
||||
mailboxDashBoardController.onDragMailbox(isDrag);
|
||||
}
|
||||
}
|
||||
@@ -373,7 +373,10 @@ class ThreadView extends GetWidget<ThreadController>
|
||||
dragAnchorStrategy: pointerDragAnchorStrategy,
|
||||
onDragStarted: () {
|
||||
controller.calculateDragValue(currentPresentationEmail);
|
||||
controller.onDragMailBox(true);
|
||||
},
|
||||
onDragEnd: (_) => controller.onDragMailBox(false),
|
||||
onDraggableCanceled: (_,__) => controller.onDragMailBox(false),
|
||||
));
|
||||
}),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user