Skip to content

Commit 0c1f934

Browse files
committed
Add drag-n-drop
1 parent 85e1b1b commit 0c1f934

File tree

1 file changed

+43
-19
lines changed

1 file changed

+43
-19
lines changed

lib/pages/main/package_list.dart

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:desktop_adb_file_browser/riverpod/package_list.dart';
33
import 'package:desktop_adb_file_browser/riverpod/selected_device.dart';
44
import 'package:desktop_adb_file_browser/utils/adb.dart';
55
import 'package:desktop_adb_file_browser/widgets/adb_queue_indicator.dart';
6+
import 'package:desktop_drop/desktop_drop.dart';
67
import 'package:file_selector/file_selector.dart';
78
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
89
import 'package:flutter/material.dart';
@@ -20,6 +21,8 @@ class PackageList extends ConsumerStatefulWidget {
2021
}
2122

2223
class _PackageListState extends ConsumerState<PackageList> {
24+
bool _dragging = false;
25+
2326
@override
2427
Widget build(BuildContext context) {
2528
final packageListFuture = ref.watch(packageListProvider);
@@ -31,31 +34,52 @@ class _PackageListState extends ConsumerState<PackageList> {
3134
actions: [
3235
IconButton(
3336
onPressed: () async {
34-
final path = await openFile();
35-
if (path == null) return;
37+
final file = await openFile();
38+
if (file == null) return;
3639

37-
await uploadAndInstallAPK(path.path);
40+
await uploadAndInstallAPK(file.path);
3841
},
3942
icon: const Icon(FluentIcons.arrow_upload_32_regular))
4043
],
4144
),
4245
body: ADBQueueIndicator(
43-
child: packageListFuture.when(
44-
data: (packageList) => ListView.separated(
45-
itemBuilder: (c, i) => itemBuilder(c, i, packageList),
46-
itemCount: packageList.length,
47-
shrinkWrap: true,
48-
separatorBuilder: (context, index) => const Divider(),
49-
),
50-
error: (error, stackTrace) {
51-
debugPrint(error.toString());
52-
debugPrint(stackTrace.toString());
53-
return Center(
54-
child: Text("Error: $error"),
55-
);
56-
},
57-
loading: () => const Center(
58-
child: CircularProgressIndicator(),
46+
child: Container(
47+
color:
48+
_dragging ? Theme.of(context).focusColor.withOpacity(0.4) : null,
49+
child: DropTarget(
50+
onDragDone: (details) async {
51+
for (final file in details.files) {
52+
await uploadAndInstallAPK(file.path);
53+
}
54+
},
55+
onDragEntered: (detail) {
56+
setState(() {
57+
_dragging = true;
58+
});
59+
},
60+
onDragExited: (detail) {
61+
setState(() {
62+
_dragging = false;
63+
});
64+
},
65+
child: packageListFuture.when(
66+
data: (packageList) => ListView.separated(
67+
itemBuilder: (c, i) => itemBuilder(c, i, packageList),
68+
itemCount: packageList.length,
69+
shrinkWrap: true,
70+
separatorBuilder: (context, index) => const Divider(),
71+
),
72+
error: (error, stackTrace) {
73+
debugPrint(error.toString());
74+
debugPrint(stackTrace.toString());
75+
return Center(
76+
child: Text("Error: $error"),
77+
);
78+
},
79+
loading: () => const Center(
80+
child: CircularProgressIndicator(),
81+
),
82+
),
5983
),
6084
),
6185
),

0 commit comments

Comments
 (0)