.github
android
api
assets
buildtools
debian
drift_schemas
ios
lib
controllers
database
providers
screens
types
widgets
account
attachment
chat
feed
navigation
post
realm
about.dart
app_bar_leading.dart
connection_indicator.dart
context_menu.dart
dialog.dart
html.dart
link_preview.dart
loading_indicator.dart
markdown_content.dart
menu_bar.dart
notify_indicator.dart
unauthorized_hint.dart
universal_image.dart
updater.dart
version_label.dart
firebase_options.dart
logger.dart
main.dart
router.dart
theme.dart
linux
macos
snap
test
web
windows
.gitignore
.metadata
.roadsignrc
README.md
analysis_options.yaml
build.yaml
devtools_options.yaml
firebase.json
pubspec.lock
pubspec.yaml
roadsign.toml
47 lines
1.4 KiB
Dart
47 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_animate/flutter_animate.dart';
|
|
import 'package:flutter_context_menu/flutter_context_menu.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:surface/providers/config.dart';
|
|
|
|
class ContextMenuArea extends StatelessWidget {
|
|
final ContextMenu contextMenu;
|
|
final Widget child;
|
|
final ValueChanged<dynamic>? onItemSelected;
|
|
|
|
const ContextMenuArea({
|
|
super.key,
|
|
required this.contextMenu,
|
|
required this.child,
|
|
this.onItemSelected,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Offset mousePosition = Offset.zero;
|
|
|
|
return Listener(
|
|
onPointerDown: (event) {
|
|
mousePosition = event.position;
|
|
final cfg = context.read<ConfigProvider>();
|
|
if (!cfg.drawerIsCollapsed) {
|
|
// Leave padding for side navigation
|
|
mousePosition = mousePosition.copyWith(dx: mousePosition.dx - 80 * 2);
|
|
}
|
|
},
|
|
child: GestureDetector(
|
|
onLongPress: () => _showMenu(context, mousePosition),
|
|
onSecondaryTap: () => _showMenu(context, mousePosition),
|
|
child: child,
|
|
),
|
|
);
|
|
}
|
|
|
|
void _showMenu(BuildContext context, Offset mousePosition) async {
|
|
final menu =
|
|
contextMenu.copyWith(position: contextMenu.position ?? mousePosition);
|
|
final value = await showContextMenu(context, contextMenu: menu);
|
|
onItemSelected?.call(value);
|
|
}
|
|
}
|