diff --git a/lib/ui/screens/notifications_screen.dart b/lib/ui/screens/notifications_screen.dart index 9e28c6c..7c0a4bc 100644 --- a/lib/ui/screens/notifications_screen.dart +++ b/lib/ui/screens/notifications_screen.dart @@ -8,12 +8,14 @@ import 'package:comunic/lists/users_list.dart'; import 'package:comunic/models/notification.dart' as n; import 'package:comunic/ui/routes/main_route/main_route.dart'; import 'package:comunic/ui/widgets/account_image_widget.dart'; +import 'package:comunic/ui/widgets/custom_list_tile.dart'; import 'package:comunic/ui/widgets/safe_state.dart'; import 'package:comunic/utils/date_utils.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/navigation_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; /// Notifications screen /// @@ -283,22 +285,29 @@ class _NotificationTile extends StatelessWidget { if (notification.onElemType == n.NotificationElementType.GROUP_MEMBERSHIP) message += groupsList[notification.onElemId].displayName; - return ListTile( + return CustomListTile( leading: AccountImageWidget( user: srcUser, ), onTap: () => _onTap(context), title: Text(message), subtitle: Text(diffTimeFromNowToStr(notification.timeCreate)), - trailing: PopupMenuButton<_PopupMenuActions>( - onSelected: _popupMenuAction, - itemBuilder: (c) => [ + onLongPressWithInfo: (size, offset) { + final position = RelativeRect.fromLTRB( + offset.dx - size.width, + offset.dy, + offset.dx, + offset.dy + size.height, + ); //fromSize(Rect.fromPoints(offset, Offset.zero), size);*/ + + print(position); + showMenu(context: context, position: position, items: [ PopupMenuItem( child: Text(tr("Delete")), value: _PopupMenuActions.DELETE, ), - ], - ), + ]).then(_popupMenuAction); + }, ); } diff --git a/lib/ui/widgets/custom_list_tile.dart b/lib/ui/widgets/custom_list_tile.dart new file mode 100644 index 0000000..84ee0b3 --- /dev/null +++ b/lib/ui/widgets/custom_list_tile.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +/// My custom list tile to add extra features to the default +/// implementation +/// +/// @author Pierre HUBERT + +class CustomListTile extends StatelessWidget { + final Widget leading; + final Widget title; + final Widget subtitle; + final Widget trailing; + final bool isThreeLine; + final bool dense; + final EdgeInsetsGeometry contentPadding; + final bool enabled; + final GestureTapCallback onTap; + final GestureLongPressCallback onLongPress; + final bool selected; + + /// Custom onLongPress function + final Function(Size, Offset) onLongPressWithInfo; + + const CustomListTile({ + Key key, + this.leading, + this.title, + this.subtitle, + this.trailing, + this.isThreeLine = false, + this.dense, + this.contentPadding, + this.enabled = true, + this.onTap, + this.onLongPress, + this.selected = false, + this.onLongPressWithInfo, + }) : assert(isThreeLine != null), + assert(enabled != null), + assert(selected != null), + assert(!isThreeLine || subtitle != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: leading, + title: title, + subtitle: subtitle, + trailing: trailing, + isThreeLine: isThreeLine, + dense: dense, + contentPadding: contentPadding, + enabled: enabled, + onTap: onTap, + onLongPress: () => _longPress(context), + selected: selected, + ); + } + + void _longPress(BuildContext context) { + RenderBox renderBox = context.findRenderObject(); + final size = renderBox.size; + final offset = renderBox.localToGlobal(Offset(size.width, size.height)); + + if (onLongPress != null) onLongPress(); + + if (onLongPressWithInfo != null) onLongPressWithInfo(size, offset); + } +}