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