mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-05 16:15:43 +00:00
fix: treeview,style,file picker (#91)
* fix: tree view,style,file picker Co-authored-by: wuke2022 <[email protected]>
This commit is contained in:
1 parent
5b69472ac8
commit
56375c0edb
7 files changed
+73
-101
No files matched your search
@@ -163,7 +163,6 @@ class CreateView extends GetView<CreateController> {
|
||||
),
|
||||
child: RoundedLoadingButton(
|
||||
color: Get.theme.colorScheme.secondary,
|
||||
duration: const Duration(milliseconds: 100),
|
||||
onPressed: () async {
|
||||
try {
|
||||
downloadController.start();
|
||||
@@ -179,7 +178,6 @@ class CreateView extends GetView<CreateController> {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
await createTask(CreateTask(
|
||||
rid: rr.id,
|
||||
opts: Options(
|
||||
@@ -187,6 +185,7 @@ class CreateView extends GetView<CreateController> {
|
||||
path: pathController.text,
|
||||
selectFiles: controller.selectedIndexes
|
||||
.cast<int>())));
|
||||
Get.back();
|
||||
Get.rootDelegate.offNamed(Routes.DOWNLOADING);
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
@@ -204,14 +204,16 @@ class BuildTaskListView extends GetView {
|
||||
: Icon(FaIcons.allIcons[findIcon(task.meta.res.name)]),
|
||||
|
||||
trailing: SizedBox(
|
||||
width: 180,
|
||||
width: task.status == Status.done ? 80 : 180,
|
||||
child: Row(
|
||||
// crossAxisAlignment: CrossAxisAlignment.baseline,
|
||||
// textBaseline: DefaultTextStyle.of(context).style.textBaseline,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text("${Util.fmtByte(task.progress.speed)} / s",
|
||||
style: context.textTheme.titleSmall),
|
||||
task.status == Status.done
|
||||
? const SizedBox.shrink()
|
||||
: Text("${Util.fmtByte(task.progress.speed)} / s",
|
||||
style: context.textTheme.titleSmall),
|
||||
...buildActions()
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:file_selector/file_selector.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
@@ -41,7 +41,7 @@ class _DirectorySelectorState extends State<DirectorySelector> {
|
||||
icon: const Icon(Icons.folder_open),
|
||||
onPressed: () async {
|
||||
if (GetPlatform.isDesktop) {
|
||||
var dir = await getDirectoryPath();
|
||||
var dir = await FilePicker.platform.getDirectoryPath();
|
||||
if (dir != null) {
|
||||
widget.controller.text = dir;
|
||||
MacSecureUtil.saveBookmark(dir);
|
||||
|
||||
@@ -20,24 +20,27 @@ class FileListView extends GetView {
|
||||
|
||||
List findChildFileIdsRecursive(children) {
|
||||
List res = [];
|
||||
for (var i in children) {
|
||||
if (fileInfos[i]['type'] == 'folder') {
|
||||
findChildFileIdsRecursive(fileInfos[i]['children']);
|
||||
for (var k in children) {
|
||||
if (fileInfos[k]['type'] == 'folder') {
|
||||
res.addAll(findChildFileIdsRecursive(fileInfos[k]['children']));
|
||||
} else {
|
||||
res.add(i);
|
||||
res.add(fileInfos[k]['fileId']);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
List<fluent.TreeViewItem> buildTreeViewItemsRecursive(
|
||||
int level, List<fluent.TreeViewItem> treeViewItems) {
|
||||
List children = fileInfos.where((e) => e['level'] == level).toList();
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
Map fileInfo = children[i];
|
||||
int level, int parentId) {
|
||||
List<fluent.TreeViewItem> res = [];
|
||||
List children = fileInfos
|
||||
.where((e) => e['level'] == level && e['parentId'] == parentId)
|
||||
.toList();
|
||||
for (int j = 0; j < children.length; j++) {
|
||||
Map fileInfo = children[j];
|
||||
if (fileInfo['type'] == 'folder') {
|
||||
// folder
|
||||
treeViewItems.add(fluent.TreeViewItem(
|
||||
res.add(fluent.TreeViewItem(
|
||||
// expanded: false, bug on init
|
||||
// value: fileInfo['id'],
|
||||
onInvoked: (item, reason) async {
|
||||
@@ -47,12 +50,12 @@ class FileListView extends GetView {
|
||||
List childrenIds =
|
||||
findChildFileIdsRecursive(fileInfo['children']);
|
||||
if (item.selected == true) {
|
||||
parentController.selectedIndexes
|
||||
.addAll(findChildFileIdsRecursive(childrenIds));
|
||||
parentController.selectedIndexes.addAll(childrenIds);
|
||||
} else {
|
||||
parentController.selectedIndexes
|
||||
.removeWhere((index) => childrenIds.contains(index));
|
||||
}
|
||||
debugPrint('${parentController.selectedIndexes.cast<int>()}');
|
||||
}
|
||||
},
|
||||
leading:
|
||||
@@ -76,13 +79,13 @@ class FileListView extends GetView {
|
||||
children: buildTreeViewItemsRecursive(
|
||||
// fileInfos.where((e) => e['level'] > level).toList(),
|
||||
level + 1,
|
||||
[])));
|
||||
fileInfo['id'])));
|
||||
} else {
|
||||
// file
|
||||
// if (fileInfo['selected']) {
|
||||
// parentController.selectedIndexs.add(fileInfo['fileId']);
|
||||
// }
|
||||
treeViewItems.add(fluent.TreeViewItem(
|
||||
res.add(fluent.TreeViewItem(
|
||||
value: fileInfo['fileId'],
|
||||
selected: fileInfo['selected'],
|
||||
onInvoked: (item, reason) async => {
|
||||
@@ -91,7 +94,8 @@ class FileListView extends GetView {
|
||||
? item.selected == false
|
||||
? parentController.selectedIndexes.remove(item.value)
|
||||
: parentController.selectedIndexes.add(item.value)
|
||||
: null
|
||||
: null,
|
||||
debugPrint('${parentController.selectedIndexes.cast<int>()}')
|
||||
},
|
||||
collapsable: false,
|
||||
leading: fileInfo['name'].lastIndexOf('.') == -1
|
||||
@@ -115,13 +119,13 @@ class FileListView extends GetView {
|
||||
));
|
||||
}
|
||||
}
|
||||
return treeViewItems;
|
||||
return res;
|
||||
}
|
||||
|
||||
List<fluent.TreeViewItem> items(files) {
|
||||
List infos = [];
|
||||
int idNext = 0;
|
||||
List selectedIndexs = [];
|
||||
List selectedFileIds = [];
|
||||
// List openedFolders = [];
|
||||
//make fileInfos list
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
@@ -166,16 +170,16 @@ class FileListView extends GetView {
|
||||
//TODO add unselected logic
|
||||
'selected': true
|
||||
});
|
||||
selectedIndexs.add(idNext);
|
||||
selectedFileIds.add(i);
|
||||
if (parentId != -1) {
|
||||
infos[parentId]['children'].add(idNext);
|
||||
}
|
||||
idNext++;
|
||||
}
|
||||
fileInfos = infos;
|
||||
parentController.selectedIndexes.value = selectedIndexs;
|
||||
parentController.selectedIndexes.value = selectedFileIds;
|
||||
// parentController.openedFolders.value = openedFolders;
|
||||
List<fluent.TreeViewItem> treeItems = buildTreeViewItemsRecursive(0, []);
|
||||
List<fluent.TreeViewItem> treeItems = buildTreeViewItemsRecursive(0, -1);
|
||||
return treeItems;
|
||||
}
|
||||
|
||||
@@ -203,19 +207,22 @@ class FileListView extends GetView {
|
||||
border: Border.all(color: Colors.grey, width: 1),
|
||||
borderRadius: BorderRadius.circular(5)),
|
||||
child: fluent.TreeView(
|
||||
// shrinkWrap: false,
|
||||
// addRepaintBoundaries: false,
|
||||
// usePrototypeItem: true,
|
||||
// onItemInvoked: (item, reason) async => {},
|
||||
onSecondaryTap: (item, details) async {
|
||||
debugPrint(
|
||||
'onSecondaryTap $item at ${details.globalPosition}');
|
||||
},
|
||||
// onSelectionChanged: (selectedItems) async => {},
|
||||
narrowSpacing: true,
|
||||
// scrollPrimary: true,
|
||||
selectionMode: fluent.TreeViewSelectionMode.multiple,
|
||||
items: items(files)))),
|
||||
shrinkWrap: false,
|
||||
// addRepaintBoundaries: false,
|
||||
// usePrototypeItem: true,
|
||||
// onItemInvoked: (item, reason) async => {},
|
||||
onSecondaryTap: (item, details) async {
|
||||
debugPrint(
|
||||
'onSecondaryTap $item at ${details.globalPosition}');
|
||||
},
|
||||
// onSelectionChanged: (selectedItems) async => {},
|
||||
narrowSpacing: true,
|
||||
// cacheExtent: 2000,
|
||||
items: items(files),
|
||||
// itemExtent: fileInfos.length.toDouble(),
|
||||
// scrollPrimary: true,
|
||||
selectionMode: fluent.TreeViewSelectionMode.multiple,
|
||||
))),
|
||||
],
|
||||
));
|
||||
}
|
||||
|
||||
@@ -138,6 +138,18 @@ const List iconMaps = [
|
||||
'type': 'Powerpoint Document',
|
||||
'thumbnail': 'file_powerpoint'
|
||||
},
|
||||
//windows
|
||||
{
|
||||
'extensions': ['exe'],
|
||||
'type': 'Microsoft',
|
||||
'thumbnail': 'windows'
|
||||
},
|
||||
//android
|
||||
{
|
||||
'extensions': ['apk'],
|
||||
'type': 'Android',
|
||||
'thumbnail': 'windows'
|
||||
},
|
||||
//other
|
||||
{
|
||||
'extensions': ['lnk'],
|
||||
|
||||
+13
-61
@@ -257,62 +257,14 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.1.4"
|
||||
file_selector:
|
||||
file_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_selector
|
||||
sha256: c348bc79073db2d22599ab86ac3e3baec9079ec90c04ed3b9a92f674a7a4db9f
|
||||
name: file_picker
|
||||
sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.9.2"
|
||||
file_selector_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_ios
|
||||
sha256: fdfc0578fa31b853780e2fadacf51bd85553071d8c49f5edd0d1ec159406e0ab
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.5.0+1"
|
||||
file_selector_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_linux
|
||||
sha256: "0c2043aba4b644e44bc17197589e80f59b1445ecd22d52878055e163d314a8d3"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.9.0"
|
||||
file_selector_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_macos
|
||||
sha256: "5fd8239766e90f16693517608c15b89fe1970a83efc395a834734fab3f9bfe27"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.9.0+1"
|
||||
file_selector_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_platform_interface
|
||||
sha256: "92b924983d18c53d9d354b95be261af869f2a8efa125b293d2db6569c32dd9c3"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
file_selector_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_web
|
||||
sha256: "8e9ca06d07a7fe60e487e3647792552c5b9722139aeb51b8f462be0336b47456"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.9.0"
|
||||
file_selector_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_windows
|
||||
sha256: b592a4815363438a00db50c3b03072e2899c0ffe2adf1fb9a868bf22eebedac2
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.9.1+2"
|
||||
version: "5.2.5"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -356,6 +308,14 @@ packages:
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: "60fc7b78455b94e6de2333d2f95196d32cf5c22f4b0b0520a628804cb463503b"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.7"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@@ -891,14 +851,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.4.0+3"
|
||||
stylish_bottom_bar:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: stylish_bottom_bar
|
||||
sha256: "24aab3e66a3e16b4fe786d4efb87b4111c94d75964b03c7a6dd17174c56d710c"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1052,5 +1004,5 @@ packages:
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
sdks:
|
||||
dart: ">=2.18.2 <4.0.0"
|
||||
dart: ">=2.18.0 <4.0.0"
|
||||
flutter: ">=3.3.0"
|
||||
@@ -42,7 +42,7 @@ dependencies:
|
||||
json_annotation: ^4.6.0
|
||||
dio: ^4.0.6
|
||||
path_provider: ^2.0.11
|
||||
file_selector: ^0.9.2
|
||||
file_picker: ^5.2.5
|
||||
macos_secure_bookmarks: ^0.2.1
|
||||
rounded_loading_button: ^2.1.0
|
||||
url_launcher: ^6.1.6
|
||||
|
||||
Reference in new issue
Block a user