Merge pull request #593 from ente-io/menuitem-on-pressed-state

Menuitem on pressed state
This commit is contained in:
Ashil 2022-10-22 15:59:36 +05:30 committed by GitHub
commit 9d422621e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 70 additions and 7 deletions

View file

@ -60,7 +60,7 @@ class _ExpandableMenuItemWidgetState extends State<ExpandableMenuItemWidget> {
title: widget.title, title: widget.title,
makeTextBold: true, makeTextBold: true,
), ),
isHeaderOfExpansion: true, isExpandable: true,
leadingIcon: widget.leadingIcon, leadingIcon: widget.leadingIcon,
trailingIcon: Icons.expand_more, trailingIcon: Icons.expand_more,
menuItemColor: enteColorScheme.fillFaint, menuItemColor: enteColorScheme.fillFaint,

View file

@ -4,7 +4,7 @@ import 'package:photos/ente_theme_data.dart';
class MenuItemWidget extends StatefulWidget { class MenuItemWidget extends StatefulWidget {
final Widget captionedTextWidget; final Widget captionedTextWidget;
final bool isHeaderOfExpansion; final bool isExpandable;
// leading icon can be passed without specifing size of icon, this component sets size to 20x20 irrespective of passed icon's size // leading icon can be passed without specifing size of icon, this component sets size to 20x20 irrespective of passed icon's size
final IconData? leadingIcon; final IconData? leadingIcon;
final Color? leadingIconColor; final Color? leadingIconColor;
@ -17,10 +17,11 @@ class MenuItemWidget extends StatefulWidget {
final Color? menuItemColor; final Color? menuItemColor;
final bool alignCaptionedTextToLeft; final bool alignCaptionedTextToLeft;
final double borderRadius; final double borderRadius;
final Color? pressedColor;
final ExpandableController? expandableController; final ExpandableController? expandableController;
const MenuItemWidget({ const MenuItemWidget({
required this.captionedTextWidget, required this.captionedTextWidget,
this.isHeaderOfExpansion = false, this.isExpandable = false,
this.leadingIcon, this.leadingIcon,
this.leadingIconColor, this.leadingIconColor,
this.trailingIcon, this.trailingIcon,
@ -31,6 +32,7 @@ class MenuItemWidget extends StatefulWidget {
this.menuItemColor, this.menuItemColor,
this.alignCaptionedTextToLeft = false, this.alignCaptionedTextToLeft = false,
this.borderRadius = 4.0, this.borderRadius = 4.0,
this.pressedColor,
this.expandableController, this.expandableController,
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@ -40,8 +42,10 @@ class MenuItemWidget extends StatefulWidget {
} }
class _MenuItemWidgetState extends State<MenuItemWidget> { class _MenuItemWidgetState extends State<MenuItemWidget> {
Color? menuItemColor;
@override @override
void initState() { void initState() {
menuItemColor = widget.menuItemColor;
if (widget.expandableController != null) { if (widget.expandableController != null) {
widget.expandableController!.addListener(() { widget.expandableController!.addListener(() {
setState(() {}); setState(() {});
@ -50,6 +54,12 @@ class _MenuItemWidgetState extends State<MenuItemWidget> {
super.initState(); super.initState();
} }
@override
void didChangeDependencies() {
menuItemColor = widget.menuItemColor;
super.didChangeDependencies();
}
@override @override
void dispose() { void dispose() {
if (widget.expandableController != null) { if (widget.expandableController != null) {
@ -60,11 +70,14 @@ class _MenuItemWidgetState extends State<MenuItemWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return widget.isHeaderOfExpansion return widget.isExpandable
? menuItemWidget(context) ? menuItemWidget(context)
: GestureDetector( : GestureDetector(
onTap: widget.onTap, onTap: widget.onTap,
onDoubleTap: widget.onDoubleTap, onDoubleTap: widget.onDoubleTap,
onTapDown: _onTapDown,
onTapUp: _onTapUp,
onTapCancel: _onCancel,
child: menuItemWidget(context), child: menuItemWidget(context),
); );
} }
@ -77,7 +90,7 @@ class _MenuItemWidgetState extends State<MenuItemWidget> {
? const Radius.circular(0) ? const Radius.circular(0)
: borderRadius; : borderRadius;
return AnimatedContainer( return AnimatedContainer(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 20),
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 12), padding: const EdgeInsets.symmetric(horizontal: 12),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -87,7 +100,7 @@ class _MenuItemWidgetState extends State<MenuItemWidget> {
bottomLeft: bottomBorderRadius, bottomLeft: bottomBorderRadius,
bottomRight: bottomBorderRadius, bottomRight: bottomBorderRadius,
), ),
color: widget.menuItemColor, color: menuItemColor,
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -139,4 +152,25 @@ class _MenuItemWidgetState extends State<MenuItemWidget> {
), ),
); );
} }
void _onTapDown(details) {
setState(() {
menuItemColor = widget.pressedColor;
});
}
void _onTapUp(details) {
Future.delayed(
const Duration(milliseconds: 100),
() => setState(() {
menuItemColor = widget.menuItemColor;
}),
);
}
void _onCancel() {
setState(() {
menuItemColor = widget.menuItemColor;
});
}
} }

View file

@ -2,6 +2,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photos/services/update_service.dart'; import 'package:photos/services/update_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/common/web_page.dart'; import 'package:photos/ui/common/web_page.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
@ -47,6 +48,7 @@ class AboutSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Source code", title: "Source code",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -61,6 +63,7 @@ class AboutSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Check for updates", title: "Check for updates",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -111,6 +114,7 @@ class AboutMenuItemWidget extends StatelessWidget {
captionedTextWidget: CaptionedTextWidget( captionedTextWidget: CaptionedTextWidget(
title: title, title: title,
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:flutter_sodium/flutter_sodium.dart';
import 'package:photos/services/local_authentication_service.dart'; import 'package:photos/services/local_authentication_service.dart';
import 'package:photos/services/user_service.dart'; import 'package:photos/services/user_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/account/change_email_dialog.dart'; import 'package:photos/ui/account/change_email_dialog.dart';
import 'package:photos/ui/account/password_entry_page.dart'; import 'package:photos/ui/account/password_entry_page.dart';
import 'package:photos/ui/account/recovery_key_page.dart'; import 'package:photos/ui/account/recovery_key_page.dart';
@ -34,6 +35,7 @@ class AccountSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Recovery key", title: "Recovery key",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -67,6 +69,7 @@ class AccountSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Change email", title: "Change email",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -92,6 +95,7 @@ class AccountSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Change password", title: "Change password",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -9,6 +9,7 @@ import 'package:photos/models/backup_status.dart';
import 'package:photos/models/duplicate_files.dart'; import 'package:photos/models/duplicate_files.dart';
import 'package:photos/services/deduplication_service.dart'; import 'package:photos/services/deduplication_service.dart';
import 'package:photos/services/sync_service.dart'; import 'package:photos/services/sync_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/backup_folder_selection_page.dart'; import 'package:photos/ui/backup_folder_selection_page.dart';
import 'package:photos/ui/common/dialogs.dart'; import 'package:photos/ui/common/dialogs.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
@ -48,6 +49,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Backed up folders", title: "Backed up folders",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () { onTap: () {
@ -122,6 +124,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Free up space", title: "Free up space",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -157,6 +160,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Deduplicate files", title: "Deduplicate files",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -3,6 +3,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photos/ente_theme_data.dart'; import 'package:photos/ente_theme_data.dart';
import 'package:photos/services/user_service.dart'; import 'package:photos/services/user_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/account/delete_account_page.dart'; import 'package:photos/ui/account/delete_account_page.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
@ -30,6 +31,7 @@ class DangerSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Logout", title: "Logout",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () { onTap: () {
@ -41,6 +43,7 @@ class DangerSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Delete account", title: "Delete account",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () { onTap: () {

View file

@ -6,6 +6,7 @@ import 'package:photos/core/configuration.dart';
import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/services/ignored_files_service.dart';
import 'package:photos/services/local_sync_service.dart'; import 'package:photos/services/local_sync_service.dart';
import 'package:photos/services/sync_service.dart'; import 'package:photos/services/sync_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
import 'package:photos/ui/components/menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget.dart';
@ -32,6 +33,7 @@ class DebugSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Key attributes", title: "Key attributes",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -43,6 +45,7 @@ class DebugSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Delete Local Import DB", title: "Delete Local Import DB",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -55,6 +58,7 @@ class DebugSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Allow auto-upload for ignored files", title: "Allow auto-upload for ignored files",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -11,6 +11,7 @@ import 'package:photos/ente_theme_data.dart';
import 'package:photos/events/two_factor_status_change_event.dart'; import 'package:photos/events/two_factor_status_change_event.dart';
import 'package:photos/services/local_authentication_service.dart'; import 'package:photos/services/local_authentication_service.dart';
import 'package:photos/services/user_service.dart'; import 'package:photos/services/user_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/account/sessions_page.dart'; import 'package:photos/ui/account/sessions_page.dart';
import 'package:photos/ui/common/loading_widget.dart'; import 'package:photos/ui/common/loading_widget.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
@ -216,6 +217,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Active sessions", title: "Active sessions",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photos/services/update_service.dart'; import 'package:photos/services/update_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
import 'package:photos/ui/components/menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget.dart';
@ -61,6 +62,7 @@ class SocialsMenuItemWidget extends StatelessWidget {
captionedTextWidget: CaptionedTextWidget( captionedTextWidget: CaptionedTextWidget(
title: text, title: text,
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () { onTap: () {

View file

@ -5,6 +5,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photos/core/configuration.dart'; import 'package:photos/core/configuration.dart';
import 'package:photos/core/constants.dart'; import 'package:photos/core/constants.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/common/web_page.dart'; import 'package:photos/ui/common/web_page.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
@ -34,6 +35,7 @@ class SupportSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Email", title: "Email",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {
@ -45,6 +47,7 @@ class SupportSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Roadmap", title: "Roadmap",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () { onTap: () {
@ -67,6 +70,7 @@ class SupportSectionWidget extends StatelessWidget {
captionedTextWidget: const CaptionedTextWidget( captionedTextWidget: const CaptionedTextWidget(
title: "Report a bug", title: "Report a bug",
), ),
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: Icons.chevron_right_outlined, trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true, trailingIconIsMuted: true,
onTap: () async { onTap: () async {

View file

@ -4,6 +4,7 @@ import 'package:adaptive_theme/adaptive_theme.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:photos/ente_theme_data.dart'; import 'package:photos/ente_theme_data.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart';
import 'package:photos/ui/components/menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget.dart';
@ -69,7 +70,8 @@ class _ThemeSwitchWidgetState extends State<ThemeSwitchWidget> {
title: toBeginningOfSentenceCase(themeMode.name), title: toBeginningOfSentenceCase(themeMode.name),
textStyle: Theme.of(context).colorScheme.enteTheme.textTheme.body, textStyle: Theme.of(context).colorScheme.enteTheme.textTheme.body,
), ),
isHeaderOfExpansion: false, pressedColor: getEnteColorScheme(context).fillFaint,
isExpandable: false,
trailingIcon: currentThemeMode == themeMode ? Icons.check : null, trailingIcon: currentThemeMode == themeMode ? Icons.check : null,
onTap: () async { onTap: () async {
AdaptiveTheme.of(context).setThemeMode(themeMode); AdaptiveTheme.of(context).setThemeMode(themeMode);