fix: snippet fmt (#570)

This commit is contained in:
lollipopkit🏳️‍⚧️
2024-09-01 21:07:32 +08:00
committed by GitHub
parent edb49ead67
commit db9b2dd818
7 changed files with 84 additions and 53 deletions

View File

@@ -18,7 +18,7 @@ const backupFormatVersion = 1;
final _logger = Logger('Backup'); final _logger = Logger('Backup');
@JsonSerializable() @JsonSerializable()
class Backup extends Mergeable { class Backup implements Mergeable {
// backup format version // backup format version
final int version; final int version;
final String date; final String date;
@@ -28,9 +28,9 @@ class Backup extends Mergeable {
final Map<String, dynamic> container; final Map<String, dynamic> container;
final Map<String, dynamic> history; final Map<String, dynamic> history;
final int? lastModTime; final int? lastModTime;
final Map<String, dynamic> settings; final Map<String, dynamic>? settings;
Backup({ const Backup({
required this.version, required this.version,
required this.date, required this.date,
required this.spis, required this.spis,
@@ -181,22 +181,25 @@ class Backup extends Mergeable {
} }
// Settings // Settings
final settings_ = settings;
if (settings_ != null) {
if (force) { if (force) {
Stores.setting.box.putAll(settings); Stores.setting.box.putAll(settings_);
} else { } else {
final nowSettings = Stores.setting.box.keys.toSet(); final nowSettings = Stores.setting.box.keys.toSet();
final bakSettings = settings.keys.toSet(); final bakSettings = settings_.keys.toSet();
final newSettings = bakSettings.difference(nowSettings); final newSettings = bakSettings.difference(nowSettings);
final delSettings = nowSettings.difference(bakSettings); final delSettings = nowSettings.difference(bakSettings);
final updateSettings = nowSettings.intersection(bakSettings); final updateSettings = nowSettings.intersection(bakSettings);
for (final s in newSettings) { for (final s in newSettings) {
Stores.setting.box.put(s, settings[s]); Stores.setting.box.put(s, settings_[s]);
} }
for (final s in delSettings) { for (final s in delSettings) {
Stores.setting.box.delete(s); Stores.setting.box.delete(s);
} }
for (final s in updateSettings) { for (final s in updateSettings) {
Stores.setting.box.put(s, settings[s]); Stores.setting.box.put(s, settings_[s]);
}
} }
} }

View File

@@ -20,6 +20,7 @@ Backup _$BackupFromJson(Map<String, dynamic> json) => Backup(
.toList(), .toList(),
container: json['container'] as Map<String, dynamic>, container: json['container'] as Map<String, dynamic>,
history: json['history'] as Map<String, dynamic>, history: json['history'] as Map<String, dynamic>,
settings: json['settings'] as Map<String, dynamic>?,
lastModTime: (json['lastModTime'] as num?)?.toInt(), lastModTime: (json['lastModTime'] as num?)?.toInt(),
); );
@@ -32,4 +33,5 @@ Map<String, dynamic> _$BackupToJson(Backup instance) => <String, dynamic>{
'container': instance.container, 'container': instance.container,
'history': instance.history, 'history': instance.history,
'lastModTime': instance.lastModTime, 'lastModTime': instance.lastModTime,
'settings': instance.settings,
}; };

View File

@@ -1,5 +0,0 @@
abstract class TagPickable {
bool containsTag(String tag);
String get tagName;
}

View File

@@ -1,7 +1,6 @@
import 'package:dartssh2/dartssh2.dart'; import 'package:dartssh2/dartssh2.dart';
import 'package:server_box/data/model/app/error.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/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/battery.dart';
import 'package:server_box/data/model/server/conn.dart'; import 'package:server_box/data/model/server/conn.dart';
import 'package:server_box/data/model/server/cpu.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/system.dart';
import 'package:server_box/data/model/server/temp.dart'; import 'package:server_box/data/model/server/temp.dart';
class Server implements TagPickable { class Server {
Spi spi; Spi spi;
ServerStatus status; ServerStatus status;
SSHClient? client; SSHClient? client;
@@ -27,14 +26,6 @@ class Server implements TagPickable {
this.client, 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 needGenClient => conn < ServerConn.connecting;
bool get canViewDetails => conn == ServerConn.finished; bool get canViewDetails => conn == ServerConn.finished;

View File

@@ -6,13 +6,11 @@ import 'package:json_annotation/json_annotation.dart';
import 'package:server_box/data/model/server/server_private_info.dart'; import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:xterm/core.dart'; import 'package:xterm/core.dart';
import 'package:server_box/data/model/app/tag_pickable.dart';
part 'snippet.g.dart'; part 'snippet.g.dart';
@JsonSerializable() @JsonSerializable()
@HiveType(typeId: 2) @HiveType(typeId: 2)
class Snippet implements TagPickable { class Snippet {
@HiveField(0) @HiveField(0)
final String name; final String name;
@HiveField(1) @HiveField(1)
@@ -39,14 +37,6 @@ class Snippet implements TagPickable {
Map<String, dynamic> toJson() => _$SnippetToJson(this); Map<String, dynamic> toJson() => _$SnippetToJson(this);
@override
bool containsTag(String tag) {
return tags?.contains(tag) ?? false;
}
@override
String get tagName => name;
static final fmtFinder = RegExp(r'\$\{[^{}]+\}'); static final fmtFinder = RegExp(r'\$\{[^{}]+\}');
String fmtWithSpi(Spi spi) { String fmtWithSpi(Spi spi) {
@@ -109,11 +99,21 @@ class Snippet implements TagPickable {
if (special != null) { if (special != null) {
final raw = key.substring(special.key.length + 1, key.length - 1); final raw = key.substring(special.key.length + 1, key.length - 1);
await special.value((term: terminal, raw: raw)); await special.value((term: terminal, raw: raw));
} } else {
// Term keys // Term keys
final termKey = _find(fmtTermKeys, key); final termKey = _find(fmtTermKeys, key);
if (termKey != null) await _doTermKeys(terminal, termKey, key); if (termKey != null) {
await _doTermKeys(terminal, termKey, key);
} else {
// Normal input
terminal.textInput(key);
}
}
// Text between this and next match
if (idx < starts.length - 1) {
terminal.textInput(argsFmted.substring(end, starts[idx + 1]));
}
} }
// End term input // End term input
@@ -129,10 +129,10 @@ class Snippet implements TagPickable {
MapEntry<String, TerminalKey> termKey, MapEntry<String, TerminalKey> termKey,
String key, String key,
) async { ) async {
if (termKey.value == TerminalKey.enter) { // if (termKey.value == TerminalKey.enter) {
terminal.keyInput(TerminalKey.enter); // terminal.keyInput(TerminalKey.enter);
return; // return;
} // }
final ctrlAlt = switch (termKey.value) { final ctrlAlt = switch (termKey.value) {
TerminalKey.control => (ctrl: true, alt: false), TerminalKey.control => (ctrl: true, alt: false),
@@ -140,6 +140,8 @@ class Snippet implements TagPickable {
_ => (ctrl: false, alt: false), _ => (ctrl: false, alt: false),
}; };
if (!key.contains('+')) return;
// `${ctrl+ad}` -> `ctrla + d` // `${ctrl+ad}` -> `ctrla + d`
final chars = key.substring(termKey.key.length + 1, key.length - 1); final chars = key.substring(termKey.key.length + 1, key.length - 1);
if (chars.isEmpty) return; if (chars.isEmpty) return;

View File

@@ -1,4 +1,6 @@
import 'package:fl_lib/fl_lib.dart'; 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 { final class NoBackupStore extends PersistentStore {
NoBackupStore._() : super('no_backup'); NoBackupStore._() : super('no_backup');
@@ -13,4 +15,35 @@ final class NoBackupStore extends PersistentStore {
late final webdavUrl = property('webdavUrl', ''); late final webdavUrl = property('webdavUrl', '');
late final webdavUser = property('webdavUser', ''); late final webdavUser = property('webdavUser', '');
late final webdavPwd = property('webdavPwd', ''); 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');
}
}
} }

View File

@@ -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/build_data.dart';
import 'package:server_box/data/res/misc.dart'; import 'package:server_box/data/res/misc.dart';
import 'package:server_box/data/res/store.dart'; import 'package:server_box/data/res/store.dart';
import 'package:server_box/data/store/no_backup.dart';
Future<void> main() async { Future<void> main() async {
_runInZone(() async { _runInZone(() async {
await _initApp(); await _initApp();
@@ -66,7 +68,6 @@ Future<void> _initApp() async {
FontUtils.loadFrom(Stores.setting.fontPath.fetch()); FontUtils.loadFrom(Stores.setting.fontPath.fetch());
_doPlatformRelated(); _doPlatformRelated();
_doVersionRelated();
} }
Future<void> _initData() async { Future<void> _initData() async {
@@ -92,6 +93,9 @@ Future<void> _initData() async {
SftpProvider.instance.load(); SftpProvider.instance.load();
if (Stores.setting.betaTest.fetch()) AppUpdate.chan = AppUpdateChan.beta; if (Stores.setting.betaTest.fetch()) AppUpdate.chan = AppUpdateChan.beta;
// It may effect the following logic, so await it.
await _doVersionRelated();
} }
void _setupDebug() { void _setupDebug() {
@@ -130,6 +134,7 @@ Future<void> _doVersionRelated() async {
if (curVer < newVer) { if (curVer < newVer) {
ServerDetailCards.autoAddNewCards(newVer); ServerDetailCards.autoAddNewCards(newVer);
ServerFuncBtn.autoAddNewFuncs(newVer); ServerFuncBtn.autoAddNewFuncs(newVer);
NoBackupStore.instance.migrate();
Stores.setting.lastVer.put(newVer); Stores.setting.lastVer.put(newVer);
} }
} }