mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-30 00:36:28 +00:00
91 lines
2.3 KiB
Dart
91 lines
2.3 KiB
Dart
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;
|
|
final Color tileColor;
|
|
|
|
/// Custom onLongPress function
|
|
final Function(Size, Offset) onLongPressWithInfo;
|
|
|
|
/// Show menu onLongPress
|
|
final Function(RelativeRect) onLongPressOpenMenu;
|
|
|
|
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,
|
|
this.onLongPressOpenMenu,
|
|
this.tileColor,
|
|
}) : assert(isThreeLine != null),
|
|
assert(enabled != null),
|
|
assert(selected != null),
|
|
assert(!isThreeLine || subtitle != null),
|
|
super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ListTile(
|
|
tileColor: tileColor,
|
|
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) {
|
|
if (onLongPress != null) onLongPress();
|
|
|
|
if (onLongPressWithInfo != null || onLongPressOpenMenu != null) {
|
|
RenderBox renderBox = context.findRenderObject();
|
|
final size = renderBox.size;
|
|
final offset = renderBox.localToGlobal(Offset(size.width, size.height));
|
|
|
|
if (onLongPressWithInfo != null) onLongPressWithInfo(size, offset);
|
|
|
|
if (onLongPressOpenMenu != null) {
|
|
final position = RelativeRect.fromLTRB(
|
|
offset.dx - size.width,
|
|
offset.dy,
|
|
offset.dx,
|
|
offset.dy + size.height,
|
|
);
|
|
|
|
onLongPressOpenMenu(position);
|
|
}
|
|
}
|
|
}
|
|
}
|