From 56375c0edbe360298782017c752dd4f458dbf48c Mon Sep 17 00:00:00 2001 From: Neginegi Date: Wed, 22 Feb 2023 20:06:28 +0800 Subject: [PATCH] fix: treeview,style,file picker (#91) * fix: tree view,style,file picker Co-authored-by: wuke2022 --- .../app/modules/create/views/create_view.dart | 3 +- .../app/views/views/buid_task_list_view.dart | 8 +- .../app/views/views/directory_selector.dart | 4 +- .../lib/app/views/views/file_list_view.dart | 71 ++++++++++-------- ui/flutter/lib/util/file_icon.dart | 12 +++ ui/flutter/pubspec.lock | 74 ++++--------------- ui/flutter/pubspec.yaml | 2 +- 7 files changed, 73 insertions(+), 101 deletions(-) diff --git a/ui/flutter/lib/app/modules/create/views/create_view.dart b/ui/flutter/lib/app/modules/create/views/create_view.dart index 760cd56f..1464d2e6 100644 --- a/ui/flutter/lib/app/modules/create/views/create_view.dart +++ b/ui/flutter/lib/app/modules/create/views/create_view.dart @@ -163,7 +163,6 @@ class CreateView extends GetView { ), 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 { // return; // } // } - await createTask(CreateTask( rid: rr.id, opts: Options( @@ -187,6 +185,7 @@ class CreateView extends GetView { path: pathController.text, selectFiles: controller.selectedIndexes .cast()))); + Get.back(); Get.rootDelegate.offNamed(Routes.DOWNLOADING); } } catch (e) { diff --git a/ui/flutter/lib/app/views/views/buid_task_list_view.dart b/ui/flutter/lib/app/views/views/buid_task_list_view.dart index 3c715931..58d8760d 100644 --- a/ui/flutter/lib/app/views/views/buid_task_list_view.dart +++ b/ui/flutter/lib/app/views/views/buid_task_list_view.dart @@ -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() ], ), diff --git a/ui/flutter/lib/app/views/views/directory_selector.dart b/ui/flutter/lib/app/views/views/directory_selector.dart index e2976746..da57d26d 100644 --- a/ui/flutter/lib/app/views/views/directory_selector.dart +++ b/ui/flutter/lib/app/views/views/directory_selector.dart @@ -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 { 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); diff --git a/ui/flutter/lib/app/views/views/file_list_view.dart b/ui/flutter/lib/app/views/views/file_list_view.dart index a4cd938b..9b8f58fa 100644 --- a/ui/flutter/lib/app/views/views/file_list_view.dart +++ b/ui/flutter/lib/app/views/views/file_list_view.dart @@ -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 buildTreeViewItemsRecursive( - int level, List 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 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()}'); } }, 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()}') }, collapsable: false, leading: fileInfo['name'].lastIndexOf('.') == -1 @@ -115,13 +119,13 @@ class FileListView extends GetView { )); } } - return treeViewItems; + return res; } List 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 treeItems = buildTreeViewItemsRecursive(0, []); + List 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, + ))), ], )); } diff --git a/ui/flutter/lib/util/file_icon.dart b/ui/flutter/lib/util/file_icon.dart index 1bae0ec4..bc321eff 100644 --- a/ui/flutter/lib/util/file_icon.dart +++ b/ui/flutter/lib/util/file_icon.dart @@ -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'], diff --git a/ui/flutter/pubspec.lock b/ui/flutter/pubspec.lock index 072068bb..fe0fa714 100644 --- a/ui/flutter/pubspec.lock +++ b/ui/flutter/pubspec.lock @@ -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" diff --git a/ui/flutter/pubspec.yaml b/ui/flutter/pubspec.yaml index 61759cdb..e69d6183 100644 --- a/ui/flutter/pubspec.yaml +++ b/ui/flutter/pubspec.yaml @@ -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