TF-2684 Use scrollbar theme replace customize scrollbar

This commit is contained in:
dab246
2024-03-13 01:08:24 +07:00
committed by Dat H. Pham
parent dbf1f2d530
commit 8ddb4b9275
14 changed files with 117 additions and 160 deletions
@@ -160,7 +160,6 @@ extension AppColor on Color {
static const colorBackgroundQuotasWarning = Color(0xFFFFC107); static const colorBackgroundQuotasWarning = Color(0xFFFFC107);
static const colorQuotaWarning = Color(0xFFF05C44); static const colorQuotaWarning = Color(0xFFF05C44);
static const colorQuotaError = Color(0xffE64646); static const colorQuotaError = Color(0xffE64646);
static const colorThumbScrollBar = Color(0xFFAEB7C2);
static const colorCreateNewIdentityButton = Color(0xFFEBEDF0); static const colorCreateNewIdentityButton = Color(0xFFEBEDF0);
static const colorSpamReportBannerBackground = Color(0xFFBFDEFF); static const colorSpamReportBannerBackground = Color(0xFFBFDEFF);
static const colorSpamReportBannerStrokeBorder = Color(0x1F000000); static const colorSpamReportBannerStrokeBorder = Color(0x1F000000);
+3 -3
View File
@@ -14,9 +14,9 @@ class ThemeUtils {
dividerTheme: _dividerTheme, dividerTheme: _dividerTheme,
visualDensity: VisualDensity.adaptivePlatformDensity, visualDensity: VisualDensity.adaptivePlatformDensity,
scrollbarTheme: ScrollbarThemeData( scrollbarTheme: ScrollbarThemeData(
thickness: MaterialStateProperty.all(2.0), thickness: MaterialStateProperty.all(8.0),
radius: const Radius.circular(5.0), radius: const Radius.circular(8.0),
thumbColor: MaterialStateProperty.all(AppColor.colorThumbScrollBar)), thumbColor: MaterialStateProperty.all(AppColor.thumbScrollbarColor)),
); );
} }
@@ -31,7 +31,6 @@ class ContactController extends BaseController {
final searchQuery = SearchQuery.initial().obs; final searchQuery = SearchQuery.initial().obs;
final session = Rxn<Session>(); final session = Rxn<Session>();
final listContactSearched = RxList<EmailAddress>(); final listContactSearched = RxList<EmailAddress>();
final scrollListViewController = ScrollController();
GetAllAutoCompleteInteractor? _getAllAutoCompleteInteractor; GetAllAutoCompleteInteractor? _getAllAutoCompleteInteractor;
GetAutoCompleteInteractor? _getAutoCompleteInteractor; GetAutoCompleteInteractor? _getAutoCompleteInteractor;
@@ -85,7 +84,6 @@ class ContactController extends BaseController {
textInputSearchFocus.dispose(); textInputSearchFocus.dispose();
textInputSearchController.dispose(); textInputSearchController.dispose();
_deBouncerTime.cancel(); _deBouncerTime.cancel();
scrollListViewController.dispose();
super.onClose(); super.onClose();
} }
@@ -137,30 +137,26 @@ class ContactView extends GetWidget<ContactController> {
return Container( return Container(
color: Colors.white, color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(horizontal: 4),
child: ScrollbarListView( child: ListView.separated(
scrollController: controller.scrollListViewController, itemCount: controller.listContactSearched.length,
child: ListView.separated( separatorBuilder: (context, index) {
itemCount: controller.listContactSearched.length, return Padding(
controller: controller.scrollListViewController, padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
separatorBuilder: (context, index) { child: const Divider(height: 1, color: AppColor.colorDivider),
return Padding( );
padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils), },
child: const Divider(height: 1, color: AppColor.colorDivider), itemBuilder: (context, index) {
); final emailAddress = controller.listContactSearched[index];
}, final suggestionEmailAddress = _toSuggestionEmailAddress(
itemBuilder: (context, index) { emailAddress,
final emailAddress = controller.listContactSearched[index]; controller.contactSelected != null ? [controller.contactSelected!] : []
final suggestionEmailAddress = _toSuggestionEmailAddress( );
emailAddress, return ContactSuggestionBoxItem(
controller.contactSelected != null ? [controller.contactSelected!] : [] suggestionEmailAddress,
); padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
return ContactSuggestionBoxItem( selectedContactCallbackAction: (contact) => controller.selectContact(context, contact),
suggestionEmailAddress, );
padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils), }
selectedContactCallbackAction: (contact) => controller.selectContact(context, contact),
);
}
),
) )
); );
} }
@@ -154,6 +154,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
PointerDeviceKind.mouse, PointerDeviceKind.mouse,
PointerDeviceKind.trackpad PointerDeviceKind.trackpad
}, },
scrollbars: false
), ),
scrollController: controller.destinationListScrollController, scrollController: controller.destinationListScrollController,
child: RefreshIndicator( child: RefreshIndicator(
@@ -179,6 +180,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
PointerDeviceKind.mouse, PointerDeviceKind.mouse,
PointerDeviceKind.trackpad PointerDeviceKind.trackpad
}, },
scrollbars: false
), ),
scrollController: controller.destinationListScrollController, scrollController: controller.destinationListScrollController,
child: RefreshIndicator( child: RefreshIndicator(
@@ -115,7 +115,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
final _downloadManager = Get.find<DownloadManager>(); final _downloadManager = Get.find<DownloadManager>();
final _printUtils = Get.find<PrintUtils>(); final _printUtils = Get.find<PrintUtils>();
final _attachmentListScrollController = ScrollController(); final _attachmentListScrollController = ScrollController();
final emailContentScrollController = ScrollController();
final GetEmailContentInteractor _getEmailContentInteractor; final GetEmailContentInteractor _getEmailContentInteractor;
final MarkAsEmailReadInteractor _markAsEmailReadInteractor; final MarkAsEmailReadInteractor _markAsEmailReadInteractor;
@@ -190,7 +189,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void onClose() { void onClose() {
_downloadProgressStateController.close(); _downloadProgressStateController.close();
_attachmentListScrollController.dispose(); _attachmentListScrollController.dispose();
emailContentScrollController.dispose();
super.onClose(); super.onClose();
} }
@@ -88,6 +88,7 @@ class MailboxView extends BaseMailboxView {
PointerDeviceKind.mouse, PointerDeviceKind.mouse,
PointerDeviceKind.trackpad PointerDeviceKind.trackpad
}, },
scrollbars: false
), ),
child: RefreshIndicator( child: RefreshIndicator(
color: AppColor.primaryColor, color: AppColor.primaryColor,
@@ -131,7 +132,11 @@ class MailboxView extends BaseMailboxView {
const SizedBox(height: 8), const SizedBox(height: 8),
const Divider(color: AppColor.colorDividerMailbox, height: 1), const Divider(color: AppColor.colorDividerMailbox, height: 1),
Padding( Padding(
padding: const EdgeInsetsDirectional.symmetric(vertical: 4), padding: EdgeInsetsDirectional.only(
top: 4,
bottom: 4,
start: controller.responsiveUtils.isDesktop(context) ? 0 : 16
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@@ -249,7 +254,10 @@ class MailboxView extends BaseMailboxView {
controller.imagePaths, controller.imagePaths,
categories, categories,
controller, controller,
toggleMailboxCategories: controller.toggleMailboxCategories toggleMailboxCategories: controller.toggleMailboxCategories,
padding: controller.responsiveUtils.isDesktop(context)
? null
: const EdgeInsetsDirectional.only(start: 16)
), ),
AnimatedContainer( AnimatedContainer(
duration: const Duration(milliseconds: 400), duration: const Duration(milliseconds: 400),
@@ -43,12 +43,7 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
_buildLoadingView(), _buildLoadingView(),
Expanded(child: Padding( Expanded(child: Padding(
padding: MailboxVisibilityUtils.getPaddingListView(context, controller.responsiveUtils), padding: MailboxVisibilityUtils.getPaddingListView(context, controller.responsiveUtils),
child: PlatformInfo.isMobile child: _buildListMailbox(context)
? _buildListMailbox(context)
: ScrollbarListView(
scrollController: controller.mailboxListScrollController,
child: _buildListMailbox(context)
)
)) ))
] ]
), ),
@@ -1,6 +1,5 @@
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
@@ -9,15 +8,8 @@ class SettingsController extends GetxController {
final manageAccountDashboardController = Get.find<ManageAccountDashBoardController>(); final manageAccountDashboardController = Get.find<ManageAccountDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>(); final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>(); final imagePaths = Get.find<ImagePaths>();
final settingScrollController = ScrollController();
void selectSettings(AccountMenuItem accountMenuItem) => manageAccountDashboardController.selectSettings(accountMenuItem); void selectSettings(AccountMenuItem accountMenuItem) => manageAccountDashboardController.selectSettings(accountMenuItem);
void backToUniversalSettings() => manageAccountDashboardController.backToUniversalSettings(); void backToUniversalSettings() => manageAccountDashboardController.backToUniversalSettings();
@override
void onClose() {
settingScrollController.dispose();
super.onClose();
}
} }
@@ -1,8 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
@@ -15,8 +13,7 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final child = SingleChildScrollView( return SingleChildScrollView(
controller: PlatformInfo.isMobile ? null : controller.settingScrollController,
child: Column(children: [ child: Column(children: [
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userName: controller.manageAccountDashboardController.accountId.value != null userName: controller.manageAccountDashboardController.accountId.value != null
@@ -156,17 +153,5 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
), ),
]), ]),
); );
if (PlatformInfo.isMobile) {
return child;
} else {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 4),
child: ScrollbarListView(
scrollController: controller.settingScrollController,
child: child
),
);
}
} }
} }
@@ -10,7 +10,6 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
@@ -497,7 +496,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
searchQuery: controller.searchQuery, searchQuery: controller.searchQuery,
isShowingEmailContent: controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id, isShowingEmailContent: controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
isSearchEmailRunning: true, isSearchEmailRunning: true,
padding: SearchEmailUtils.getPaddingItemListMobile(context, controller.responsiveUtils), padding: SearchEmailUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
mailboxContain: currentPresentationEmail.mailboxContain, mailboxContain: currentPresentationEmail.mailboxContain,
emailActionClick: (action, email) { emailActionClick: (action, email) {
controller.pressEmailAction( controller.pressEmailAction(
@@ -533,61 +532,58 @@ class SearchEmailView extends GetWidget<SearchEmailController>
} }
}, },
) )
: ScrollbarListView( : ListView.separated(
scrollController: controller.resultSearchScrollController, controller: controller.resultSearchScrollController,
child: ListView.separated( physics: const AlwaysScrollableScrollPhysics(),
controller: controller.resultSearchScrollController, key: const PageStorageKey('list_presentation_email_in_search_view'),
physics: const AlwaysScrollableScrollPhysics(), itemCount: listPresentationEmail.length,
key: const PageStorageKey('list_presentation_email_in_search_view'), itemBuilder: (context, index) {
itemCount: listPresentationEmail.length, final currentPresentationEmail = listPresentationEmail[index];
itemBuilder: (context, index) { return Obx(() => EmailTileBuilder(
final currentPresentationEmail = listPresentationEmail[index]; presentationEmail: currentPresentationEmail,
return Obx(() => EmailTileBuilder( selectAllMode: controller.selectionMode.value,
presentationEmail: currentPresentationEmail, searchQuery: controller.searchQuery,
selectAllMode: controller.selectionMode.value, isShowingEmailContent: controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
searchQuery: controller.searchQuery, isSearchEmailRunning: true,
isShowingEmailContent: controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id, padding: SearchEmailUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
isSearchEmailRunning: true, mailboxContain: currentPresentationEmail.mailboxContain,
padding: SearchEmailUtils.getPaddingSearchResultList(context, controller.responsiveUtils), emailActionClick: (action, email) {
mailboxContain: currentPresentationEmail.mailboxContain, controller.pressEmailAction(
emailActionClick: (action, email) { context,
controller.pressEmailAction( action,
context, email,
action, mailboxContain: currentPresentationEmail.mailboxContain
email,
mailboxContain: currentPresentationEmail.mailboxContain
);
},
onMoreActionClick: (email, position) {
if (controller.responsiveUtils.isScreenWithShortestSide(context)) {
controller.openContextMenuAction(
context,
_contextMenuActionTile(context, email)
);
} else {
controller.openPopupMenuAction(
context,
position,
_popupMenuActionTile(context, email)
);
}
},
));
},
separatorBuilder: (context, index) {
return Padding(
padding: ItemEmailTileStyles.getPaddingDividerWeb(context, controller.responsiveUtils),
child: Divider(
color: index < listPresentationEmail.length - 1 &&
controller.selectionMode.value == SelectMode.INACTIVE
? null
: Colors.white
)
); );
}, },
) onMoreActionClick: (email, position) {
) if (controller.responsiveUtils.isScreenWithShortestSide(context)) {
controller.openContextMenuAction(
context,
_contextMenuActionTile(context, email)
);
} else {
controller.openPopupMenuAction(
context,
position,
_popupMenuActionTile(context, email)
);
}
},
));
},
separatorBuilder: (context, index) {
return Padding(
padding: ItemEmailTileStyles.getPaddingDividerWeb(context, controller.responsiveUtils),
child: Divider(
color: index < listPresentationEmail.length - 1 &&
controller.selectionMode.value == SelectMode.INACTIVE
? null
: Colors.white
)
);
},
)
); );
} }
@@ -81,7 +81,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
final currentSearchQuery = RxString(''); final currentSearchQuery = RxString('');
final listMailboxSearched = RxList<PresentationMailbox>(); final listMailboxSearched = RxList<PresentationMailbox>();
final textInputSearchController = TextEditingController(); final textInputSearchController = TextEditingController();
final scrollbarController = ScrollController();
late Debouncer<String> _deBouncerTime; late Debouncer<String> _deBouncerTime;
PresentationMailbox? get selectedMailbox => dashboardController.selectedMailbox.value; PresentationMailbox? get selectedMailbox => dashboardController.selectedMailbox.value;
@@ -730,7 +729,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void onClose() { void onClose() {
textInputSearchController.dispose(); textInputSearchController.dispose();
_deBouncerTime.cancel(); _deBouncerTime.cancel();
scrollbarController.dispose();
super.onClose(); super.onClose();
} }
} }
@@ -11,7 +11,6 @@ import 'package:get/get.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/context_item_mailbox_action.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/context_item_mailbox_action.dart';
@@ -58,12 +57,7 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
_buildLoadingView(), _buildLoadingView(),
Expanded( Expanded(
child: PlatformInfo.isMobile child: _buildMailboxListView(context)
? _buildMailboxListView(context)
: ScrollbarListView(
scrollController: controller.scrollbarController,
child: _buildMailboxListView(context)
)
) )
]), ]),
); );
@@ -179,7 +173,6 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
padding: SearchMailboxUtils.getPaddingListViewMailboxSearched(context, controller.responsiveUtils), padding: SearchMailboxUtils.getPaddingListViewMailboxSearched(context, controller.responsiveUtils),
key: const Key('list_mailbox_searched'), key: const Key('list_mailbox_searched'),
itemCount: controller.listMailboxSearched.length, itemCount: controller.listMailboxSearched.length,
controller: controller.scrollbarController,
shrinkWrap: true, shrinkWrap: true,
primary: false, primary: false,
itemBuilder: (context, index) { itemBuilder: (context, index) {
@@ -381,38 +381,35 @@ class ThreadView extends GetWidget<ThreadController>
focusNode: controller.focusNodeKeyBoard, focusNode: controller.focusNodeKeyBoard,
autofocus: true, autofocus: true,
onKey: controller.handleKeyEvent, onKey: controller.handleKeyEvent,
child: ScrollbarListView( child: ListView.separated(
scrollController: controller.listEmailController, key: const PageStorageKey('list_presentation_email_in_threads'),
child: ListView.separated( controller: controller.listEmailController,
key: const PageStorageKey('list_presentation_email_in_threads'), physics: const AlwaysScrollableScrollPhysics(),
controller: controller.listEmailController, itemCount: listPresentationEmail.length + 2,
physics: const AlwaysScrollableScrollPhysics(), itemBuilder: (context, index) => Obx(() {
itemCount: listPresentationEmail.length + 2, if (index == listPresentationEmail.length) {
itemBuilder: (context, index) => Obx(() { return _buildLoadMoreButton(
if (index == listPresentationEmail.length) {
return _buildLoadMoreButton(
context,
controller.loadingMoreStatus.value);
}
if (index == listPresentationEmail.length + 1) {
return _buildLoadMoreProgressBar(controller.loadingMoreStatus.value);
}
return _buildEmailItem(
context, context,
listPresentationEmail[index]); controller.loadingMoreStatus.value);
}), }
separatorBuilder: (context, index) { if (index == listPresentationEmail.length + 1) {
return Padding( return _buildLoadMoreProgressBar(controller.loadingMoreStatus.value);
padding: ItemEmailTileStyles.getPaddingDividerWeb(context, controller.responsiveUtils), }
child: Divider( return _buildEmailItem(
color: index < listPresentationEmail.length - 1 && context,
controller.mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE listPresentationEmail[index]);
? null }),
: Colors.white, separatorBuilder: (context, index) {
) return Padding(
); padding: ItemEmailTileStyles.getPaddingDividerWeb(context, controller.responsiveUtils),
}, child: Divider(
), color: index < listPresentationEmail.length - 1 &&
controller.mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE
? null
: Colors.white,
)
);
},
), ),
) )
); );