From 47aedb2f2e45d136fb948c1e70fb3d54c7571bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Sun, 22 Sep 2024 16:06:09 +0800 Subject: [PATCH] fix: rename file --- ios/Runner.xcodeproj/project.pbxproj | 36 ++++++++-------- lib/core/route.dart | 21 ---------- lib/data/model/sftp/absolute_path.dart | 35 ---------------- lib/data/model/sftp/browser_status.dart | 41 +++++++++++++++++- lib/data/res/build_data.dart | 2 +- lib/view/page/editor.dart | 55 ++++++++++++++++++------- lib/view/page/setting/entry.dart | 30 ++++++++++---- lib/view/page/storage/local.dart | 48 ++++++++++----------- lib/view/page/storage/sftp.dart | 24 ++++++----- macos/Runner.xcodeproj/project.pbxproj | 12 +++--- pubspec.yaml | 2 +- 11 files changed, 164 insertions(+), 142 deletions(-) delete mode 100644 lib/data/model/sftp/absolute_path.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 886905d1..8696a03b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -690,7 +690,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -700,7 +700,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -826,7 +826,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -836,7 +836,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -854,7 +854,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -864,7 +864,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -885,7 +885,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -898,7 +898,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -924,7 +924,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -937,7 +937,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -960,7 +960,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -973,7 +973,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -996,7 +996,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1008,7 +1008,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -1037,7 +1037,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1049,7 +1049,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -1075,7 +1075,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1087,7 +1087,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/core/route.dart b/lib/core/route.dart index 589a080e..0a744e78 100644 --- a/lib/core/route.dart +++ b/lib/core/route.dart @@ -17,7 +17,6 @@ import 'package:server_box/view/page/snippet/result.dart'; import 'package:server_box/view/page/ssh/page.dart'; import 'package:server_box/view/page/setting/seq/virt_key.dart'; import 'package:server_box/data/model/server/snippet.dart'; -import 'package:server_box/view/page/editor.dart'; import 'package:server_box/view/page/process.dart'; import 'package:server_box/view/page/server/tab.dart'; import 'package:server_box/view/page/setting/seq/srv_detail_seq.dart'; @@ -114,26 +113,6 @@ class AppRoutes { return AppRoutes(ContainerPage(key: key, spi: spi), 'docker'); } - /// - Pop true if the text is changed & [path] is not null - /// - Pop text if [path] is null - static AppRoutes editor({ - Key? key, - String? path, - String? text, - String? langCode, - String? title, - }) { - return AppRoutes( - EditorPage( - key: key, - path: path, - text: text, - langCode: langCode, - title: title, - ), - 'editor'); - } - // static AppRoutes fullscreen({Key? key}) { // return AppRoutes(FullScreenPage(key: key), 'fullscreen'); // } diff --git a/lib/data/model/sftp/absolute_path.dart b/lib/data/model/sftp/absolute_path.dart deleted file mode 100644 index 9e824588..00000000 --- a/lib/data/model/sftp/absolute_path.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:fl_lib/fl_lib.dart'; - -class AbsolutePath { - String _path; - final _prePath = []; - - AbsolutePath(this._path); - - String get path => _path; - - /// Update path, not set path - set path(String newPath) { - _prePath.add(_path); - if (newPath == '..') { - _path = _path.substring(0, _path.lastIndexOf('/')); - if (_path == '') { - _path = '/'; - } - return; - } - if (newPath.startsWith('/')) { - _path = newPath; - return; - } - _path = _path.joinPath(newPath, seperator: '/'); - } - - bool undo() { - if (_prePath.isEmpty) { - return false; - } - _path = _prePath.removeLast(); - return true; - } -} diff --git a/lib/data/model/sftp/browser_status.dart b/lib/data/model/sftp/browser_status.dart index c09b9e6d..7c50803d 100644 --- a/lib/data/model/sftp/browser_status.dart +++ b/lib/data/model/sftp/browser_status.dart @@ -1,12 +1,49 @@ import 'package:dartssh2/dartssh2.dart'; -import 'package:server_box/data/model/sftp/absolute_path.dart'; +import 'package:fl_lib/fl_lib.dart'; + +/// Remote server only can be linux-like system, so use '/' as seperator +const _sep = '/'; class SftpBrowserStatus { final List files = []; - final AbsolutePath path = AbsolutePath('/'); + final path = _AbsolutePath(_sep); SftpClient? client; SftpBrowserStatus(SSHClient client) { client.sftp().then((value) => this.client = value); } } + +class _AbsolutePath { + String _path; + final _prePath = []; + + _AbsolutePath(this._path); + + String get path => _path; + + /// Update path, not set path + set path(String newPath) { + _prePath.add(_path); + if (newPath == '..') { + _path = _path.substring(0, _path.lastIndexOf(_sep)); + if (_path == '') { + _path = _sep; + } + return; + } + if (newPath.startsWith(_sep)) { + _path = newPath; + return; + } + _path = _path.joinPath(newPath, seperator: _sep); + } + + bool undo() { + if (_prePath.isEmpty) { + return false; + } + _path = _prePath.removeLast(); + return true; + } +} diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 74fbb0f5..d431bc9d 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -3,6 +3,6 @@ abstract class BuildData { static const String name = "ServerBox"; - static const int build = 1091; + static const int build = 1095; static const int script = 58; } diff --git a/lib/view/page/editor.dart b/lib/view/page/editor.dart index 692defea..924de024 100644 --- a/lib/view/page/editor.dart +++ b/lib/view/page/editor.dart @@ -14,7 +14,17 @@ import 'package:server_box/data/res/store.dart'; import 'package:server_box/view/widget/two_line_text.dart'; -class EditorPage extends StatefulWidget { +final class EditorPageRet { + /// If edit text, this includes the edited result + final String? result; + + /// Indicates whether it's ok to edit existing file + final bool? editExistedOk; + + const EditorPageRet({this.result, this.editExistedOk}); +} + +final class EditorPageArgs { /// If path is not null, then it's a file editor /// If path is null, then it's a text editor final String? path; @@ -28,13 +38,23 @@ class EditorPage extends StatefulWidget { final String? title; - const EditorPage({ - super.key, + const EditorPageArgs({ this.path, this.text, this.langCode, this.title, }); +} + +class EditorPage extends StatefulWidget { + final EditorPageArgs? args; + + const EditorPage({super.key, this.args}); + + static const route = AppRoute( + page: EditorPage.new, + path: '/editor', + ); @override State createState() => _EditorPageState(); @@ -63,7 +83,8 @@ class _EditorPageState extends State { /// Higher priority than [path] if (Stores.setting.editorHighlight.fetch()) { - _langCode = widget.langCode ?? Highlights.getCode(widget.path); + _langCode = + widget.args?.langCode ?? Highlights.getCode(widget.args?.path); } _controller = CodeController( language: Highlights.all[_langCode], @@ -79,14 +100,15 @@ class _EditorPageState extends State { } Future _setupCtrl() async { - if (widget.path != null) { - final code = await Computer.shared.start( - (path) async => await File(path).readAsString(), - widget.path!, + final path = widget.args?.path; + final text = widget.args?.text; + if (path != null) { + final code = await Computer.shared.startNoParam( + () => File(path).readAsString(), ); _controller.text = code; - } else if (widget.text != null) { - _controller.text = widget.text!; + } else if (text != null) { + _controller.text = text; } } @@ -117,7 +139,9 @@ class _EditorPageState extends State { return CustomAppBar( centerTitle: true, title: TwoLineText( - up: widget.title ?? widget.path?.getFileName() ?? l10n.unknown, + up: widget.args?.title ?? + widget.args?.path?.getFileName() ?? + l10n.unknown, down: l10n.editor, ), actions: [ @@ -144,20 +168,21 @@ class _EditorPageState extends State { onPressed: () async { // If path is not null, then it's a file editor // save the text and return true to pop the page - if (widget.path != null) { + final path = widget.args?.path; + if (path != null) { final (res, _) = await context.showLoadingDialog( - fn: () => File(widget.path!).writeAsString(_controller.text), + fn: () => File(path).writeAsString(_controller.text), ); if (res == null) { context.showSnackBar(libL10n.fail); return; } - context.pop(true); + context.pop(const EditorPageRet(editExistedOk: true)); return; } // else it's a text editor // return the text to the previous page - context.pop(_controller.text); + context.pop(EditorPageRet(result: _controller.text)); }, ) ], diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 2399eab2..29c8fc16 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -16,6 +16,7 @@ import 'package:server_box/core/route.dart'; import 'package:server_box/data/model/app/net_view.dart'; import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/view/page/backup.dart'; +import 'package:server_box/view/page/editor.dart'; import 'package:server_box/view/page/private_key/list.dart'; const _kIconSize = 23.0; @@ -1150,6 +1151,7 @@ final class _AppSettingsPageState extends State { _buildCollapseUI(), _buildCupertinoRoute(), if (isDesktop) _buildHideTitleBar(), + _buildEditRawSettings(), ], ); } @@ -1315,20 +1317,30 @@ final class _AppSettingsPageState extends State { ); } - Future _onLongPressSetting() async { + Widget _buildEditRawSettings() { + return ListTile( + title: const Text('(Dev) Edit raw json'), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: _editRawSettings, + ); + } + + Future _editRawSettings() async { final map = Stores.setting.box.toJson(includeInternal: false); final keys = map.keys; /// Encode [map] to String with indent `\t` final text = jsonIndentEncoder.convert(map); - final result = await AppRoutes.editor( - text: text, - langCode: 'json', - title: libL10n.setting, - ).go(context); - if (result == null) { - return; - } + final ret = await EditorPage.route.go( + context, + args: EditorPageArgs( + text: text, + langCode: 'json', + title: libL10n.setting, + ), + ); + final result = ret?.result; + if (result == null) return; try { final newSettings = json.decode(result) as Map; Stores.setting.box.putAll(newSettings); diff --git a/lib/view/page/storage/local.dart b/lib/view/page/storage/local.dart index 10de74a7..729d4639 100644 --- a/lib/view/page/storage/local.dart +++ b/lib/view/page/storage/local.dart @@ -11,6 +11,7 @@ import 'package:server_box/data/res/misc.dart'; import 'package:server_box/core/route.dart'; import 'package:server_box/data/model/app/path_with_prefix.dart'; +import 'package:server_box/view/page/editor.dart'; final class LocalFilePageArgs { final bool? isPickFile; @@ -183,7 +184,7 @@ class _LocalFilePageState extends State Future _showFileActionDialog(FileSystemEntity file) async { final fileName = file.path.split('/').last; if (isPickFile) { - await context.showRoundDialog( + context.showRoundDialog( title: libL10n.file, child: Text(fileName), actions: [ @@ -199,9 +200,9 @@ class _LocalFilePageState extends State child: Column( mainAxisSize: MainAxisSize.min, children: [ - ListTile( - leading: const Icon(Icons.edit), - title: Text(libL10n.edit), + Btn.tile( + icon: const Icon(Icons.edit), + text: libL10n.edit, onTap: () async { context.pop(); final stat = await file.stat(); @@ -212,34 +213,35 @@ class _LocalFilePageState extends State ); return; } - final result = await AppRoutes.editor( - path: file.absolute.path, - ).go(context); - if (result == true) { + final ret = await EditorPage.route.go( + context, + args: EditorPageArgs(path: file.absolute.path), + ); + if (ret?.editExistedOk == true) { context.showSnackBar(l10n.saved); setState(() {}); } }, ), - ListTile( - leading: const Icon(Icons.abc), - title: Text(libL10n.rename), + Btn.tile( + icon: const Icon(Icons.abc), + text: libL10n.rename, onTap: () { context.pop(); _showRenameDialog(file); }, ), - ListTile( - leading: const Icon(Icons.delete), - title: Text(libL10n.delete), + Btn.tile( + icon: const Icon(Icons.delete), + text: libL10n.delete, onTap: () { context.pop(); _showDeleteDialog(file); }, ), - ListTile( - leading: const Icon(Icons.upload), - title: Text(l10n.upload), + Btn.tile( + icon: const Icon(Icons.upload), + text: l10n.upload, onTap: () async { context.pop(); @@ -270,9 +272,9 @@ class _LocalFilePageState extends State context.showSnackBar(l10n.added2List); }, ), - ListTile( - leading: const Icon(Icons.open_in_new), - title: Text(libL10n.open), + Btn.tile( + icon: const Icon(Icons.open_in_new), + text: libL10n.open, onTap: () { Pfs.share(path: file.absolute.path); }, @@ -283,7 +285,7 @@ class _LocalFilePageState extends State } void _showRenameDialog(FileSystemEntity file) { - final fileName = file.path.split('/').last; + final fileName = file.path.split(Pfs.seperator).last; final ctrl = TextEditingController(text: fileName); void onSubmit() async { final newName = ctrl.text; @@ -293,7 +295,7 @@ class _LocalFilePageState extends State } context.pop(); - final newPath = '${file.parent.path}/$newName'; + final newPath = '${file.parent.path}${Pfs.seperator}$newName'; await context.showLoadingDialog(fn: () => file.rename(newPath)); setState(() {}); @@ -305,7 +307,7 @@ class _LocalFilePageState extends State autoFocus: true, icon: Icons.abc, label: libL10n.name, - controller: TextEditingController(text: fileName), + controller: ctrl, suggestion: true, maxLines: 3, onSubmitted: (p0) => onSubmit(), diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index 1cc2b6f4..dcaeee70 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -14,6 +14,7 @@ import 'package:server_box/data/model/sftp/worker.dart'; import 'package:server_box/data/provider/sftp.dart'; import 'package:server_box/data/res/misc.dart'; import 'package:server_box/data/res/store.dart'; +import 'package:server_box/view/page/editor.dart'; import 'package:server_box/view/page/storage/local.dart'; import 'package:server_box/view/widget/omit_start_text.dart'; import 'package:server_box/view/widget/two_line_text.dart'; @@ -302,7 +303,7 @@ class _SftpPageState extends State with AfterLayoutMixin { } final remotePath = _getRemotePath(name); - final localPath = await _getLocalPath(remotePath); + final localPath = _getLocalPath(remotePath); final completer = Completer(); final req = SftpReq( widget.spi, @@ -316,8 +317,11 @@ class _SftpPageState extends State with AfterLayoutMixin { ); if (suc == null || err != null) return; - final result = await AppRoutes.editor(path: localPath).go(context); - if (result != null && result) { + final ret = await EditorPage.route.go( + context, + args: EditorPageArgs(path: localPath), + ); + if (ret?.editExistedOk == true) { SftpProvider.add(SftpReq( req.spi, remotePath, @@ -346,7 +350,7 @@ class _SftpPageState extends State with AfterLayoutMixin { SftpReq( widget.spi, remotePath, - await _getLocalPath(remotePath), + _getLocalPath(remotePath), SftpReqType.download, ), ); @@ -554,11 +558,8 @@ class _SftpPageState extends State with AfterLayoutMixin { onSubmitted: (_) => onSubmitted(), ), actions: [ - TextButton(onPressed: () => context.pop(), child: Text(libL10n.cancel)), - TextButton( - onPressed: onSubmitted, - child: Text(libL10n.rename, style: UIs.textRed), - ), + Btn.cancel(), + Btn.ok(onTap: onSubmitted, red: true), ], ); } @@ -593,8 +594,9 @@ class _SftpPageState extends State with AfterLayoutMixin { return prePath.joinPath(name.filename, seperator: '/'); } - Future _getLocalPath(String remotePath) async { - return Paths.file.joinPath(remotePath); + /// Local file dir + server id + remote path + String _getLocalPath(String remotePath) { + return Paths.file.joinPath(widget.spi.id).joinPath(remotePath); } /// Only return true if the path is changed diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 2459152f..544cca04 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -481,7 +481,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -608,7 +608,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -618,7 +618,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -638,7 +638,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1091; + CURRENT_PROJECT_VERSION = 1095; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -649,7 +649,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1091; + MARKETING_VERSION = 1.0.1095; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/pubspec.yaml b/pubspec.yaml index e1b56d9a..87098d8d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: server_box description: server status & toolbox app. publish_to: 'none' -version: 1.0.1091+1091 +version: 1.0.1095+1095 environment: sdk: ">=3.0.0"