From db9b2dd818db0b18822bfaa8c007c52b59b27339 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, 1 Sep 2024 21:07:32 +0800 Subject: [PATCH] fix: snippet fmt (#570) --- lib/data/model/app/backup.dart | 41 +++++++++++++++------------- lib/data/model/app/backup.g.dart | 2 ++ lib/data/model/app/tag_pickable.dart | 5 ---- lib/data/model/server/server.dart | 11 +------- lib/data/model/server/snippet.dart | 38 ++++++++++++++------------ lib/data/store/no_backup.dart | 33 ++++++++++++++++++++++ lib/main.dart | 7 ++++- 7 files changed, 84 insertions(+), 53 deletions(-) delete mode 100644 lib/data/model/app/tag_pickable.dart diff --git a/lib/data/model/app/backup.dart b/lib/data/model/app/backup.dart index a70d0ef8..0707b5b9 100644 --- a/lib/data/model/app/backup.dart +++ b/lib/data/model/app/backup.dart @@ -18,7 +18,7 @@ const backupFormatVersion = 1; final _logger = Logger('Backup'); @JsonSerializable() -class Backup extends Mergeable { +class Backup implements Mergeable { // backup format version final int version; final String date; @@ -28,9 +28,9 @@ class Backup extends Mergeable { final Map container; final Map history; final int? lastModTime; - final Map settings; + final Map? settings; - Backup({ + const Backup({ required this.version, required this.date, required this.spis, @@ -181,22 +181,25 @@ class Backup extends Mergeable { } // Settings - if (force) { - Stores.setting.box.putAll(settings); - } else { - final nowSettings = Stores.setting.box.keys.toSet(); - final bakSettings = settings.keys.toSet(); - final newSettings = bakSettings.difference(nowSettings); - final delSettings = nowSettings.difference(bakSettings); - final updateSettings = nowSettings.intersection(bakSettings); - for (final s in newSettings) { - Stores.setting.box.put(s, settings[s]); - } - for (final s in delSettings) { - Stores.setting.box.delete(s); - } - for (final s in updateSettings) { - Stores.setting.box.put(s, settings[s]); + final settings_ = settings; + if (settings_ != null) { + if (force) { + Stores.setting.box.putAll(settings_); + } else { + final nowSettings = Stores.setting.box.keys.toSet(); + final bakSettings = settings_.keys.toSet(); + final newSettings = bakSettings.difference(nowSettings); + final delSettings = nowSettings.difference(bakSettings); + final updateSettings = nowSettings.intersection(bakSettings); + for (final s in newSettings) { + Stores.setting.box.put(s, settings_[s]); + } + for (final s in delSettings) { + Stores.setting.box.delete(s); + } + for (final s in updateSettings) { + Stores.setting.box.put(s, settings_[s]); + } } } diff --git a/lib/data/model/app/backup.g.dart b/lib/data/model/app/backup.g.dart index 06e2a09c..9c5d53cc 100644 --- a/lib/data/model/app/backup.g.dart +++ b/lib/data/model/app/backup.g.dart @@ -20,6 +20,7 @@ Backup _$BackupFromJson(Map json) => Backup( .toList(), container: json['container'] as Map, history: json['history'] as Map, + settings: json['settings'] as Map?, lastModTime: (json['lastModTime'] as num?)?.toInt(), ); @@ -32,4 +33,5 @@ Map _$BackupToJson(Backup instance) => { 'container': instance.container, 'history': instance.history, 'lastModTime': instance.lastModTime, + 'settings': instance.settings, }; diff --git a/lib/data/model/app/tag_pickable.dart b/lib/data/model/app/tag_pickable.dart deleted file mode 100644 index 46b0b87b..00000000 --- a/lib/data/model/app/tag_pickable.dart +++ /dev/null @@ -1,5 +0,0 @@ -abstract class TagPickable { - bool containsTag(String tag); - - String get tagName; -} diff --git a/lib/data/model/server/server.dart b/lib/data/model/server/server.dart index b96b25c2..233e88fa 100644 --- a/lib/data/model/server/server.dart +++ b/lib/data/model/server/server.dart @@ -1,7 +1,6 @@ import 'package:dartssh2/dartssh2.dart'; import 'package:server_box/data/model/app/error.dart'; import 'package:server_box/data/model/app/shell_func.dart'; -import 'package:server_box/data/model/app/tag_pickable.dart'; import 'package:server_box/data/model/server/battery.dart'; import 'package:server_box/data/model/server/conn.dart'; import 'package:server_box/data/model/server/cpu.dart'; @@ -14,7 +13,7 @@ import 'package:server_box/data/model/server/server_private_info.dart'; import 'package:server_box/data/model/server/system.dart'; import 'package:server_box/data/model/server/temp.dart'; -class Server implements TagPickable { +class Server { Spi spi; ServerStatus status; SSHClient? client; @@ -27,14 +26,6 @@ class Server implements TagPickable { this.client, }); - @override - bool containsTag(String tag) { - return spi.tags?.contains(tag) ?? false; - } - - @override - String get tagName => spi.id; - bool get needGenClient => conn < ServerConn.connecting; bool get canViewDetails => conn == ServerConn.finished; diff --git a/lib/data/model/server/snippet.dart b/lib/data/model/server/snippet.dart index ac072075..cd81e23f 100644 --- a/lib/data/model/server/snippet.dart +++ b/lib/data/model/server/snippet.dart @@ -6,13 +6,11 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:server_box/data/model/server/server_private_info.dart'; import 'package:xterm/core.dart'; -import 'package:server_box/data/model/app/tag_pickable.dart'; - part 'snippet.g.dart'; @JsonSerializable() @HiveType(typeId: 2) -class Snippet implements TagPickable { +class Snippet { @HiveField(0) final String name; @HiveField(1) @@ -39,14 +37,6 @@ class Snippet implements TagPickable { Map toJson() => _$SnippetToJson(this); - @override - bool containsTag(String tag) { - return tags?.contains(tag) ?? false; - } - - @override - String get tagName => name; - static final fmtFinder = RegExp(r'\$\{[^{}]+\}'); String fmtWithSpi(Spi spi) { @@ -109,11 +99,21 @@ class Snippet implements TagPickable { if (special != null) { final raw = key.substring(special.key.length + 1, key.length - 1); await special.value((term: terminal, raw: raw)); + } else { + // Term keys + final termKey = _find(fmtTermKeys, key); + if (termKey != null) { + await _doTermKeys(terminal, termKey, key); + } else { + // Normal input + terminal.textInput(key); + } } - // Term keys - final termKey = _find(fmtTermKeys, key); - if (termKey != null) await _doTermKeys(terminal, termKey, key); + // Text between this and next match + if (idx < starts.length - 1) { + terminal.textInput(argsFmted.substring(end, starts[idx + 1])); + } } // End term input @@ -129,10 +129,10 @@ class Snippet implements TagPickable { MapEntry termKey, String key, ) async { - if (termKey.value == TerminalKey.enter) { - terminal.keyInput(TerminalKey.enter); - return; - } + // if (termKey.value == TerminalKey.enter) { + // terminal.keyInput(TerminalKey.enter); + // return; + // } final ctrlAlt = switch (termKey.value) { TerminalKey.control => (ctrl: true, alt: false), @@ -140,6 +140,8 @@ class Snippet implements TagPickable { _ => (ctrl: false, alt: false), }; + if (!key.contains('+')) return; + // `${ctrl+ad}` -> `ctrla + d` final chars = key.substring(termKey.key.length + 1, key.length - 1); if (chars.isEmpty) return; diff --git a/lib/data/store/no_backup.dart b/lib/data/store/no_backup.dart index 89b9fef4..c041d265 100644 --- a/lib/data/store/no_backup.dart +++ b/lib/data/store/no_backup.dart @@ -1,4 +1,6 @@ import 'package:fl_lib/fl_lib.dart'; +import 'package:server_box/data/res/build_data.dart'; +import 'package:server_box/data/res/store.dart'; final class NoBackupStore extends PersistentStore { NoBackupStore._() : super('no_backup'); @@ -13,4 +15,35 @@ final class NoBackupStore extends PersistentStore { late final webdavUrl = property('webdavUrl', ''); late final webdavUser = property('webdavUser', ''); late final webdavPwd = property('webdavPwd', ''); + + void migrate() { + if (BuildData.build > 1076) return; + + final settings = Stores.setting; + final icloudSync_ = settings.box.get('icloudSync'); + if (icloudSync_ is bool) { + icloudSync.put(icloudSync_); + settings.box.delete('icloudSync'); + } + final webdavSync_ = settings.box.get('webdavSync'); + if (webdavSync_ is bool) { + webdavSync.put(webdavSync_); + settings.box.delete('webdavSync'); + } + final webdavUrl_ = settings.box.get('webdavUrl'); + if (webdavUrl_ is String) { + webdavUrl.put(webdavUrl_); + settings.box.delete('webdavUrl'); + } + final webdavUser_ = settings.box.get('webdavUser'); + if (webdavUser_ is String) { + webdavUser.put(webdavUser_); + settings.box.delete('webdavUser'); + } + final webdavPwd_ = settings.box.get('webdavPwd'); + if (webdavPwd_ is String) { + webdavPwd.put(webdavPwd_); + settings.box.delete('webdavPwd'); + } + } } diff --git a/lib/main.dart b/lib/main.dart index b9364249..077a8119 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -27,6 +27,8 @@ import 'package:server_box/data/provider/snippet.dart'; import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/data/res/misc.dart'; import 'package:server_box/data/res/store.dart'; +import 'package:server_box/data/store/no_backup.dart'; + Future main() async { _runInZone(() async { await _initApp(); @@ -66,7 +68,6 @@ Future _initApp() async { FontUtils.loadFrom(Stores.setting.fontPath.fetch()); _doPlatformRelated(); - _doVersionRelated(); } Future _initData() async { @@ -92,6 +93,9 @@ Future _initData() async { SftpProvider.instance.load(); if (Stores.setting.betaTest.fetch()) AppUpdate.chan = AppUpdateChan.beta; + + // It may effect the following logic, so await it. + await _doVersionRelated(); } void _setupDebug() { @@ -130,6 +134,7 @@ Future _doVersionRelated() async { if (curVer < newVer) { ServerDetailCards.autoAddNewCards(newVer); ServerFuncBtn.autoAddNewFuncs(newVer); + NoBackupStore.instance.migrate(); Stores.setting.lastVer.put(newVer); } }