diff --git a/lib/models/file_model.dart b/lib/models/file_model.dart index 03c94160d..bb6d4521d 100644 --- a/lib/models/file_model.dart +++ b/lib/models/file_model.dart @@ -1,14 +1,9 @@ import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:file_manager/enums/sort_by.dart'; +import 'package:path/path.dart' as p; import 'package:flutter/material.dart'; - import 'model.dart'; -// BIG TODO remove file manager ! - +enum SortBy { name, type, date, size } // enum FileType { // Dir = 0, @@ -19,37 +14,30 @@ import 'model.dart'; // } class FileDirectory { - // List entries = []; - List entries = []; + List entries = []; int id = 0; String path = ""; + String get parent => p.dirname(path); + FileDirectory(); - FileDirectory.fromJson(Map json,SortBy sort) { + FileDirectory.fromJson(Map json, SortBy sort) { id = json['id']; path = json['path']; if (json['entries'] != null) { - entries = []; + entries = []; json['entries'].forEach((v) { - entries.add(new Entry.fromJson(v).toRemoteFileSystemEntity(path)); + entries.add(new Entry.fromJson(v)); }); - entries = _sortRemoteEntitiesList(entries, sort); + entries = _sortList(entries, sort); } } - changeSortStyle(SortBy sort){ - entries = _sortRemoteEntitiesList(entries, sort); + changeSortStyle(SortBy sort) { + entries = _sortList(entries, sort); } - // Map toJson() { - // final Map data = new Map(); - // data['entries'] = this.entries.map((v) => v.toJson()).toList(); - // data['id'] = this.id; - // data['path'] = this.path; - // return data; - // } - clear() { entries = []; id = 0; @@ -72,476 +60,157 @@ class Entry { size = json['size']; } - RemoteFileSystemEntity toRemoteFileSystemEntity(String parentPath) { - return RemoteFileSystemEntity.from("$parentPath/$name", entryType, modifiedTime, size); - } + bool get isFile => entryType > 3; - Map toJson() { - final Map data = new Map(); - data['entry_type'] = this.entryType; - data['modified_time'] = this.modifiedTime; - data['name'] = this.name; - data['size'] = this.size; - return data; + bool get isDirectory => entryType <= 3; + + DateTime lastModified() { + return DateTime.fromMillisecondsSinceEpoch(modifiedTime * 1000); } } // TODO 使用工厂单例模式 -class RemoteFileModel extends ChangeNotifier { +class FileModel extends ChangeNotifier { + var _jobCount = 0; SortBy _sortStyle = SortBy.name; + SortBy get sortStyle => _sortStyle; + FileDirectory _currentLocalDir = FileDirectory(); + + FileDirectory get currentLocalDir => _currentLocalDir; + FileDirectory _currentRemoteDir = FileDirectory(); + FileDirectory get currentRemoteDir => _currentRemoteDir; - tryUpdateRemoteDir(String fd) { - debugPrint("tryUpdateRemoteDir:$fd"); + tryUpdateDir(String fd, bool isLocal) { try { - final fileDir = FileDirectory.fromJson(jsonDecode(fd),_sortStyle); - _currentRemoteDir = fileDir; - debugPrint("_currentRemoteDir:${_currentRemoteDir.path}"); + final fileDir = FileDirectory.fromJson(jsonDecode(fd), _sortStyle); + if (isLocal) { + _currentLocalDir = fileDir; + } else { + _currentRemoteDir = fileDir; + } notifyListeners(); } catch (e) { - debugPrint("tryUpdateRemoteDir fail:$fd"); + debugPrint("tryUpdateDir fail:$fd"); } } - goToParentDirectory() { - var parentPath = ""; - if (_currentRemoteDir.path == "") { - parentPath = ""; + refresh(bool isLocal){ + openDirectory(isLocal?_currentLocalDir.path:_currentRemoteDir.path,isLocal); + } + + openDirectory(String path, bool isLocal) { + if (isLocal) { + final res = FFI.getByName("read_dir", path); + tryUpdateDir(res, true); } else { - parentPath = Directory(_currentRemoteDir.path).parent.path; + FFI.setByName("read_remote_dir", path); } - FFI.setByName("read_remote_dir", parentPath); } - changeSortStyle(SortBy sort){ + goToParentDirectory(bool isLocal) { + final fd = isLocal ? _currentLocalDir : _currentRemoteDir; + openDirectory(fd.parent, isLocal); + } + + sendFiles(String path, String to, bool showHidden, bool isRemote) { + _jobCount++; + final msg = { + "id": _jobCount.toString(), + "path": path, + "to": to, + "show_hidden": showHidden.toString(), + "is_remote": isRemote.toString() // isRemote 指path的位置而不是to的位置 + }; + FFI.setByName("send_files",jsonEncode(msg)); + } + + changeSortStyle(SortBy sort) { + _sortStyle = sort; + _currentLocalDir.changeSortStyle(sort); _currentRemoteDir.changeSortStyle(sort); notifyListeners(); } - @override - void dispose() { + void clear() { + _currentLocalDir.clear(); _currentRemoteDir.clear(); - super.dispose(); } } -// int entryType = 4; -// int modifiedTime = 0; -// String name = ""; -// int size = 0; - -class RemoteFileSystemEntity extends FileSystemEntity { - int entryType; - int modifiedTime; - String path; - int size; - - RemoteFileSystemEntity(this.path, - this.entryType, - this.modifiedTime, - this.size); - - - // 工厂模式 自动输出两个类型 - factory RemoteFileSystemEntity.from( - String path, - int entryType, - int modifiedTime, - int size - ) { - if (entryType > 3) { - return RemoteFile(path, - entryType, - modifiedTime, - size); - } else { - return RemoteFile(path, - entryType, - modifiedTime, - size); - } - } - - DateTime lastModifiedSync() { - return DateTime.fromMillisecondsSinceEpoch(modifiedTime * 1000); - } - - int lengthSync() { - return size; - } - - bool isFile(){ - return entryType > 3; - } - - @override - // TODO: implement absolute - FileSystemEntity get absolute => throw UnimplementedError(); - - @override - Future exists() { - // TODO: implement exists - throw UnimplementedError(); - } - - @override - bool existsSync() { - // TODO: implement existsSync - throw UnimplementedError(); - } - - @override - Future rename(String newPath) { - // TODO: implement rename - throw UnimplementedError(); - } - - @override - FileSystemEntity renameSync(String newPath) { - // TODO: implement renameSync - throw UnimplementedError(); - } -} - -class RemoteDir extends RemoteFileSystemEntity implements Directory { - RemoteDir(path, entryType, modifiedTime, size) - : super(path, entryType, modifiedTime, size); - - @override - // TODO: implement absolute - Directory get absolute => throw UnimplementedError(); - - @override - Future create({bool recursive = false}) { - // TODO: implement create - throw UnimplementedError(); - } - - @override - void createSync({bool recursive = false}) { - // TODO: implement createSync - } - - @override - Future createTemp([String? prefix]) { - // TODO: implement createTemp - throw UnimplementedError(); - } - - @override - Directory createTempSync([String? prefix]) { - // TODO: implement createTempSync - throw UnimplementedError(); - } - - @override - Future exists() { - // TODO: implement exists - throw UnimplementedError(); - } - - @override - bool existsSync() { - // TODO: implement existsSync - throw UnimplementedError(); - } - - @override - Stream list( - {bool recursive = false, bool followLinks = true}) { - // TODO: implement list - throw UnimplementedError(); - } - - @override - List listSync( - {bool recursive = false, bool followLinks = true}) { - // TODO: implement listSync - throw UnimplementedError(); - } - - @override - Future rename(String newPath) { - // TODO: implement rename - throw UnimplementedError(); - } - - @override - Directory renameSync(String newPath) { - // TODO: implement renameSync - throw UnimplementedError(); - } -} - -class RemoteFile extends RemoteFileSystemEntity implements File { - - RemoteFile(path, entryType, modifiedTime, size) - : super(path, entryType, modifiedTime, size); - - // *************************** - - @override - Future length() { - // TODO: implement length - throw UnimplementedError(); - } - - @override - Future lastModified() { - // TODO: implement lastModified - throw UnimplementedError(); - } - - @override - Future copy(String newPath) { - // TODO: implement copy - throw UnimplementedError(); - } - - @override - File copySync(String newPath) { - // TODO: implement copySync - throw UnimplementedError(); - } - - @override - Future create({bool recursive = false}) { - // TODO: implement create - throw UnimplementedError(); - } - - @override - void createSync({bool recursive = false}) { - // TODO: implement createSync - } - - @override - Future exists() { - // TODO: implement exists - throw UnimplementedError(); - } - - @override - bool existsSync() { - // TODO: implement existsSync - throw UnimplementedError(); - } - - @override - Future lastAccessed() { - // TODO: implement lastAccessed - throw UnimplementedError(); - } - - @override - DateTime lastAccessedSync() { - // TODO: implement lastAccessedSync - throw UnimplementedError(); - } - - @override - Future open({FileMode mode = FileMode.read}) { - // TODO: implement open - throw UnimplementedError(); - } - - @override - Stream> openRead([int? start, int? end]) { - // TODO: implement openRead - throw UnimplementedError(); - } - - @override - RandomAccessFile openSync({FileMode mode = FileMode.read}) { - // TODO: implement openSync - throw UnimplementedError(); - } - - @override - IOSink openWrite({FileMode mode = FileMode.write, Encoding encoding = utf8}) { - // TODO: implement openWrite - throw UnimplementedError(); - } - - @override - Future readAsBytes() { - // TODO: implement readAsBytes - throw UnimplementedError(); - } - - @override - Uint8List readAsBytesSync() { - // TODO: implement readAsBytesSync - throw UnimplementedError(); - } - - @override - Future> readAsLines({Encoding encoding = utf8}) { - // TODO: implement readAsLines - throw UnimplementedError(); - } - - @override - List readAsLinesSync({Encoding encoding = utf8}) { - // TODO: implement readAsLinesSync - throw UnimplementedError(); - } - - @override - Future readAsString({Encoding encoding = utf8}) { - // TODO: implement readAsString - throw UnimplementedError(); - } - - @override - String readAsStringSync({Encoding encoding = utf8}) { - // TODO: implement readAsStringSync - throw UnimplementedError(); - } - - @override - Future rename(String newPath) { - // TODO: implement rename - throw UnimplementedError(); - } - - @override - File renameSync(String newPath) { - // TODO: implement renameSync - throw UnimplementedError(); - } - - @override - Future setLastAccessed(DateTime time) { - // TODO: implement setLastAccessed - throw UnimplementedError(); - } - - @override - void setLastAccessedSync(DateTime time) { - // TODO: implement setLastAccessedSync - } - - @override - Future setLastModified(DateTime time) { - // TODO: implement setLastModified - throw UnimplementedError(); - } - - @override - void setLastModifiedSync(DateTime time) { - // TODO: implement setLastModifiedSync - } - - @override - Future writeAsBytes(List bytes, - {FileMode mode = FileMode.write, bool flush = false}) { - // TODO: implement writeAsBytes - throw UnimplementedError(); - } - - @override - void writeAsBytesSync(List bytes, - {FileMode mode = FileMode.write, bool flush = false}) { - // TODO: implement writeAsBytesSync - } - - @override - Future writeAsString(String contents, - {FileMode mode = FileMode.write, - Encoding encoding = utf8, - bool flush = false}) { - // TODO: implement writeAsString - throw UnimplementedError(); - } - - @override - void writeAsStringSync(String contents, - {FileMode mode = FileMode.write, - Encoding encoding = utf8, - bool flush = false}) { - // TODO: implement writeAsStringSync - } - - @override - // TODO: implement absolute - File get absolute => throw UnimplementedError(); -} - - class _PathStat { final String path; final DateTime dateTime; + _PathStat(this.path, this.dateTime); } // code from file_manager pkg after edit -List _sortRemoteEntitiesList( - List list, SortBy sortType) { +List _sortList(List list, SortBy sortType) { if (sortType == SortBy.name) { // making list of only folders. - final dirs = list.where((element) => element is Directory).toList(); + final dirs = list.where((element) => element.isDirectory).toList(); // sorting folder list by name. - dirs.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase())); + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); // making list of only flies. - final files = list.where((element) => element is File).toList(); + final files = list.where((element) => element.isFile).toList(); // sorting files list by name. - files.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase())); + files.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); // first folders will go to list (if available) then files will go to list. return [...dirs, ...files]; } else if (sortType == SortBy.date) { // making the list of Path & DateTime List<_PathStat> _pathStat = []; - for (RemoteFileSystemEntity e in list) { - _pathStat.add(_PathStat(e.path, e.lastModifiedSync())); + for (Entry e in list) { + _pathStat.add(_PathStat(e.name, e.lastModified())); } // sort _pathStat according to date _pathStat.sort((b, a) => a.dateTime.compareTo(b.dateTime)); - // sorting [list] accroding to [_pathStat] + // sorting [list] according to [_pathStat] list.sort((a, b) => _pathStat - .indexWhere((element) => element.path == a.path) - .compareTo(_pathStat.indexWhere((element) => element.path == b.path))); + .indexWhere((element) => element.path == a.name) + .compareTo(_pathStat.indexWhere((element) => element.path == b.name))); return list; } else if (sortType == SortBy.type) { // making list of only folders. - final dirs = list.where((element) => element is Directory).toList(); + final dirs = list.where((element) => element.isDirectory).toList(); // sorting folders by name. - dirs.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase())); + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); // making the list of files - final files = list.where((element) => element is File).toList(); + final files = list.where((element) => element.isFile).toList(); // sorting files list by extension. - files.sort((a, b) => a.path + files.sort((a, b) => a.name .toLowerCase() .split('.') .last - .compareTo(b.path.toLowerCase().split('.').last)); + .compareTo(b.name.toLowerCase().split('.').last)); return [...dirs, ...files]; } else if (sortType == SortBy.size) { // create list of path and size Map _sizeMap = {}; - for (RemoteFileSystemEntity e in list) { - _sizeMap[e.path] = e.lengthSync(); + for (Entry e in list) { + _sizeMap[e.name] = e.size; } // making list of only folders. - final dirs = list.where((element) => element is Directory).toList(); + final dirs = list.where((element) => element.isDirectory).toList(); // sorting folder list by name. - dirs.sort((a, b) => a.path.toLowerCase().compareTo(b.path.toLowerCase())); + dirs.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase())); // making list of only flies. - final files = list.where((element) => element is File).toList(); + final files = list.where((element) => element.isFile).toList(); // creating sorted list of [_sizeMapList] by size. final List> _sizeMapList = _sizeMap.entries.toList(); @@ -549,9 +218,9 @@ List _sortRemoteEntitiesList( // sort [list] according to [_sizeMapList] files.sort((a, b) => _sizeMapList - .indexWhere((element) => element.key == a.path) + .indexWhere((element) => element.key == a.name) .compareTo( - _sizeMapList.indexWhere((element) => element.key == b.path))); + _sizeMapList.indexWhere((element) => element.key == b.name))); return [...dirs, ...files]; } return []; diff --git a/lib/models/model.dart b/lib/models/model.dart index 88094c3bb..af8c54e25 100644 --- a/lib/models/model.dart +++ b/lib/models/model.dart @@ -135,7 +135,7 @@ class FfiModel with ChangeNotifier { } else if (name == 'chat') { FFI.chatModel.receive(evt['text'] ?? ""); } else if (name == 'file_dir') { - FFI.remoteFileModel.tryUpdateRemoteDir(evt['value'] ?? ""); + FFI.fileModel.tryUpdateDir(evt['value'] ?? "",false); } } if (pos != null) FFI.cursorModel.updateCursorPosition(pos); @@ -695,7 +695,7 @@ class FFI { static final canvasModel = CanvasModel(); static final serverModel = ServerModel(); static final chatModel = ChatModel(); - static final remoteFileModel = RemoteFileModel(); + static final fileModel = FileModel(); static String getId() { return getByName('remote_id'); diff --git a/lib/pages/connection_page.dart b/lib/pages/connection_page.dart index cc37932f5..abea7db7d 100644 --- a/lib/pages/connection_page.dart +++ b/lib/pages/connection_page.dart @@ -54,11 +54,12 @@ class _ConnectionPageState extends State { getSearchBarUI(), Container(height: 12), getPeers(), - // ElevatedButton( - // onPressed: () { - // toggleChatOverlay(); - // }, - // child: Text("Chat Debug")) + ElevatedButton( + onPressed: () { + final res = FFI.getByName("read_dir"); + debugPrint("read_dir : $res"); + }, + child: Text("Local File Debug")) ]), ); } diff --git a/lib/pages/file_manager_page.dart b/lib/pages/file_manager_page.dart index d0a138a80..dfd57936f 100644 --- a/lib/pages/file_manager_page.dart +++ b/lib/pages/file_manager_page.dart @@ -1,11 +1,10 @@ import 'dart:async'; -import 'dart:io'; -import 'package:file_manager/file_manager.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_hbb/models/file_model.dart'; import 'package:provider/provider.dart'; import 'package:flutter_breadcrumb/flutter_breadcrumb.dart'; +import 'package:path/path.dart' as p; import '../common.dart'; import '../models/model.dart'; @@ -20,30 +19,33 @@ class FileManagerPage extends StatefulWidget { } class _FileManagerPageState extends State { - final _localFileModel = FileManagerController(); - final _remoteFileModel = FFI.remoteFileModel; + final _fileModel = FFI.fileModel; Timer? _interval; Timer? _timer; var _reconnects = 1; + var _isLocal = false; var _selectMode = false; - final List _selectedItems = []; + final List _selectedItems = []; // 换成entry对象数组 - // final _breadCrumbScrollController = ScrollController(); @override void initState() { super.initState(); showLoading(translate('Connecting...')); FFI.connect(widget.id, isFileTransfer: true); + Future.delayed(Duration(seconds: 1), () { + final res = FFI.getByName("read_dir", FFI.getByName("get_home_dir")); + debugPrint("read_dir local :$res"); + _fileModel.tryUpdateDir(res, true); + }); _interval = Timer.periodic(Duration(milliseconds: 30), (timer) => FFI.ffiModel.update(widget.id, context, handleMsgBox)); } @override void dispose() { - _remoteFileModel.dispose(); - _localFileModel.dispose(); + _fileModel.clear(); _interval?.cancel(); FFI.close(); EasyLoading.dismiss(); @@ -53,7 +55,7 @@ class _FileManagerPageState extends State { @override Widget build(BuildContext context) { return ChangeNotifierProvider.value( - value: _remoteFileModel, + value: _fileModel, child: Scaffold( backgroundColor: MyTheme.grayBg, appBar: AppBar( @@ -66,10 +68,11 @@ class _FileManagerPageState extends State { title: Text(translate(_isLocal ? "Local" : "Remote")), actions: [ IconButton( - icon: Icon(Icons.change_circle), - onPressed: () => setState(() { - _isLocal = !_isLocal; - })), + icon: Icon(Icons.change_circle), + onPressed: () => setState(() { + _isLocal = !_isLocal; + }), + ) ], ), body: body(), @@ -77,94 +80,71 @@ class _FileManagerPageState extends State { )); } - Widget body() => Consumer( - builder: (context, remoteModel, _child) => FileManager( - controller: _localFileModel, - emptyFolder: emptyPage(), - builder: (context, localSnapshot) { - final snapshot = - _isLocal ? localSnapshot : remoteModel.currentRemoteDir.entries; - return Column(children: [ - headTools(), - Expanded( - child: ListView.builder( - itemCount: snapshot.length + 1, - itemBuilder: (context, index) { - if (index >= snapshot.length) { - // 添加尾部信息 文件统计信息等 - // 添加快速返回上部 - // 使用 bottomSheet 提示以选择的文件数量 点击后展开查看更多 - return listTail(); - } - - var isFile = false; - if (_isLocal){ - isFile = FileManager.isFile(snapshot[index]); - }else { - isFile = (snapshot[index] as RemoteFileSystemEntity).isFile(); - } - - final path = snapshot[index].path; - var selected = false; - if (_selectMode) { - selected = _selectedItems.any((e) => e == path); - } - return Card( - child: ListTile( - leading: isFile - ? Icon(Icons.feed_outlined) - : Icon(Icons.folder), - title: Text(FileManager.basename(snapshot[index])), - trailing: _selectMode - ? Checkbox( - value: selected, - onChanged: (v) { - if (v == null) return; - if (v && !selected) { - setState(() { - _selectedItems.add(path); - }); - } else if (!v && selected) { - setState(() { - _selectedItems.remove(path); - }); - } - }) - : null, - onTap: () { - if (!isFile) { - if (_isLocal) { - _localFileModel.openDirectory(snapshot[index]); - } else { - readRemoteDir(path); - } - } else { - // Perform file-related tasks. - } - }, - onLongPress: () { - setState(() { - _selectedItems.clear(); - _selectMode = !_selectMode; - }); - }, - ), - ); - }, - )) - ]); - })); + Widget body() => Consumer(builder: (context, fileModel, _child) { + final fd = + _isLocal ? fileModel.currentLocalDir : fileModel.currentRemoteDir; + final entries = fd.entries; + return Column(children: [ + headTools(), + Expanded( + child: ListView.builder( + itemCount: entries.length + 1, + itemBuilder: (context, index) { + if (index >= entries.length) { + // 添加尾部信息 文件统计信息等 + // 添加快速返回上部 + // 使用 bottomSheet 提示以选择的文件数量 点击后展开查看更多 + return listTail(); + } + final path = p.join(fd.path,entries[index].name); + var selected = false; + if (_selectMode) { + selected = _selectedItems.any((e) => e == path); + } + return Card( + child: ListTile( + leading: entries[index].isFile + ? Icon(Icons.feed_outlined) + : Icon(Icons.folder), + title: Text(entries[index].name), + trailing: _selectMode + ? Checkbox( + value: selected, + onChanged: (v) { + if (v == null) return; + if (v && !selected) { + setState(() { + _selectedItems.add(path); + }); + } else if (!v && selected) { + setState(() { + _selectedItems.remove(path); + }); + } + }) + : null, + onTap: () { + if (entries[index].isDirectory) { + _fileModel.openDirectory(path,_isLocal); + } else { + // Perform file-related tasks. + } + }, + onLongPress: () { + setState(() { + _selectedItems.clear(); + _selectMode = !_selectMode; + }); + }, + ), + ); + }, + )) + ]); + }); goBack() { - if (_isLocal) { - _localFileModel.goToParentDirectory(); - } else { - _remoteFileModel.goToParentDirectory(); - } - } - - void readRemoteDir(String path) { - FFI.setByName("read_remote_dir", path); + _fileModel.goToParentDirectory(_isLocal); } void handleMsgBox(Map evt, String id) { @@ -210,28 +190,42 @@ class _FileManagerPageState extends State { children: [ // IconButton(onPressed: () {}, icon: Icon(Icons.sort)), PopupMenuButton( - icon: Icon(Icons.sort), + icon: Icon(Icons.sort), itemBuilder: (context) { - return SortBy.values.map((e) => PopupMenuItem( - child: Text(translate(e.toString().split(".").last)), - value: e, - )).toList(); + return SortBy.values + .map((e) => PopupMenuItem( + child: + Text(translate(e.toString().split(".").last)), + value: e, + )) + .toList(); }, - onSelected: changeSortStyle), - IconButton(onPressed: () {}, icon: Icon(Icons.more_vert)), + onSelected: _fileModel.changeSortStyle), + PopupMenuButton( + icon: Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + child: Row( + children: [ + Icon(Icons.refresh), + Text("刷新") + ], + ), + value: "refresh", + ) + ]; + }, + onSelected: (v){ + if(v == "refresh"){ + _fileModel.refresh(_isLocal); + } + }), ], ) ], )); - changeSortStyle(SortBy sort){ - if(_isLocal){ - _localFileModel.sortedBy = sort; - }else{ - _remoteFileModel.changeSortStyle(sort); - } - } - Widget emptyPage() { return Column( children: [ @@ -279,7 +273,10 @@ class _FileManagerPageState extends State { children: [ IconButton( icon: Icon(Icons.paste), - onPressed: () {}, + onPressed: () { + debugPrint("paste"); + _fileModel.sendFiles(_selectedItems.first, _fileModel.currentRemoteDir.path+'/'+_selectedItems.first.split('/').last, false, false); + }, ), IconButton( icon: Icon(Icons.delete_forever), @@ -305,8 +302,8 @@ class _FileManagerPageState extends State { List getPathBreadCrumbItems( void Function() onHome, void Function(String) onPressed) { final path = _isLocal - ? _localFileModel.getCurrentPath - : _remoteFileModel.currentRemoteDir.path; + ? _fileModel.currentLocalDir.path + : _fileModel.currentRemoteDir.path; final list = path.trim().split('/'); list.remove(""); final breadCrumbList = [ @@ -325,14 +322,4 @@ class _FileManagerPageState extends State { return breadCrumbList; } -// // NOT GOOD -// void breadCrumbToLast() { -// try { -// _breadCrumbScrollController.animateTo( -// _breadCrumbScrollController.position.maxScrollExtent, -// curve: Curves.easeOut, -// duration: const Duration(milliseconds: 300), -// ); -// } catch (e) {} -// } } diff --git a/pubspec.yaml b/pubspec.yaml index 22a12bd7c..d5f869d76 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,7 +48,6 @@ dependencies: dash_chat: ^1.1.16 draggable_float_widget: ^0.0.2 settings_ui: ^2.0.2 - file_manager: ^1.0.0 flutter_breadcrumb: ^1.0.1 dev_dependencies: