diff --git a/client/lib/ui/explorer/resource_item_gesture_handler.dart b/client/lib/ui/explorer/resource_item_gesture_handler.dart index ce668724..829078dd 100644 --- a/client/lib/ui/explorer/resource_item_gesture_handler.dart +++ b/client/lib/ui/explorer/resource_item_gesture_handler.dart @@ -7,6 +7,7 @@ import 'package:phylum/ui/explorer/resource_details_row.dart'; import 'package:phylum/ui/explorer/resource_icon_extension.dart'; import 'package:phylum/ui/explorer/resource_options_dialog.dart'; import 'package:provider/provider.dart'; +import 'package:super_drag_and_drop/super_drag_and_drop.dart'; class ResourceItemGestureHandler extends StatefulWidget { final int index; @@ -89,40 +90,54 @@ class _ResourceItemGestureHandlerState extends State context.read().updateSelection((_) => widget.index, SelectionMode.single, false); Actions.maybeInvoke(context, const ActivateIntent()); }, - child: Draggable( - data: '__selected', - dragAnchorStrategy: pointerDragAnchorStrategy, - onDragStarted: () { + child: DragItemWidget( + allowedOperations: () => [DropOperation.copy, DropOperation.move], + dragItemProvider: (request) { final controller = context.read(); if (!context.read().isSelected(widget.resource.id)) { controller.updateSelection((_) => widget.index, SelectionMode.single, false); } controller.setDragging(true); + request.session.dragCompleted.addListener(() { + if (request.session.dragCompleted.value != null) { + controller.setDragging(false); + } + }); + + final state = context.read(); + final item = DragItem( + localData: state.selectedIds, + ); + return item; }, - onDragEnd: (details) { - context.read().setDragging(false); - }, - feedback: Builder(builder: (ctx) { + canAddItemToExistingSession: false, + dragBuilder: (ctx, child) { final theme = Theme.of(context); - final count = context.read().selectedIds.length; - return Card( - shape: RoundedRectangleBorder(side: BorderSide(color: theme.colorScheme.primary), borderRadius: BorderRadius.circular(4.0)), - elevation: 16.0, - margin: const EdgeInsets.only(left: 16.0), - child: SizedBox( - width: 240, - height: 48, - child: ListTile( - leading: widget.resource.getIcon(), - title: Text(widget.resource.name), - trailing: count == 1 ? null : Badge(label: Text(count.toString(), style: const TextStyle(fontSize: 14))), + final state = context.read(); + final count = state.selectedIds.length; + return SnapshotSettings( + constraintsTransform: (constraints) => BoxConstraints(maxWidth: 240, maxHeight: 48), + child: Card( + shape: RoundedRectangleBorder(side: BorderSide(color: theme.colorScheme.primary), borderRadius: BorderRadius.circular(4.0)), + elevation: 16.0, + margin: const EdgeInsets.only(left: 16.0), + child: SizedBox( + width: 240, + height: 48, + child: ListTile( + leading: widget.resource.getIcon(), + title: Text(widget.resource.name), + trailing: count == 1 ? null : Badge(label: Text(count.toString(), style: const TextStyle(fontSize: 14))), + ), ), ), ); - }), - child: ResourceDetailsRow( - r: widget.resource, - dropTargetActive: dropTargetActive, + }, + child: DraggableWidget( + child: ResourceDetailsRow( + r: widget.resource, + dropTargetActive: dropTargetActive, + ), ), ), ); diff --git a/client/pubspec.lock b/client/pubspec.lock index 6fed667f..7616389b 100644 --- a/client/pubspec.lock +++ b/client/pubspec.lock @@ -907,6 +907,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.24" + super_drag_and_drop: + dependency: "direct main" + description: + name: super_drag_and_drop + sha256: e1ea1528916a728b3d0c3007c0af1303947026011f78564279af68d8856a0205 + url: "https://pub.dev" + source: hosted + version: "0.8.24" super_native_extensions: dependency: transitive description: diff --git a/client/pubspec.yaml b/client/pubspec.yaml index 4c286d05..4ed3fe2e 100644 --- a/client/pubspec.yaml +++ b/client/pubspec.yaml @@ -30,6 +30,7 @@ dependencies: state_notifier: stream_transform: super_clipboard: + super_drag_and_drop: uri: uuid: sqlite3: