feat: disable letter cache (#446)

Fixes #445
This commit is contained in:
lollipopkit🏳️‍⚧️
2024-07-03 19:55:33 +08:00
committed by GitHub
parent 4430045550
commit 6e428c91d1
18 changed files with 103 additions and 69 deletions

View File

@@ -80,37 +80,22 @@ class MyApp extends StatelessWidget {
themeMode: themeMode, themeMode: themeMode,
theme: light, theme: light,
darkTheme: tMode < 3 ? dark : dark.toAmoled, darkTheme: tMode < 3 ? dark : dark.toAmoled,
home: _buildAppContent(ctx), home: Builder(
builder: (context) {
context.setLibL10n();
final appL10n = AppLocalizations.of(context);
if (appL10n != null) l10n = appL10n;
final intros = _IntroPage.builders;
if (intros.isNotEmpty) {
return _IntroPage(intros);
}
return const HomePage();
},
),
); );
} }
Widget _buildAppContent(BuildContext ctx) {
//if (Pros.app.isWearOS) return const WearHome();
return const _AppContent(
intro: _IntroPage(),
child: HomePage(),
);
}
}
/// It's used for init settings related to [BuildContext]
final class _AppContent extends StatelessWidget {
final Widget child;
final Widget intro;
const _AppContent({required this.child, required this.intro});
@override
Widget build(BuildContext context) {
context.setLibL10n();
final appL10n = AppLocalizations.of(context);
if (appL10n != null) l10n = appL10n;
final showIntro = Stores.setting.showIntro.fetch();
if (showIntro) return intro;
return child;
}
} }
void _setup(BuildContext context) async { void _setup(BuildContext context) async {

View File

@@ -280,7 +280,9 @@ class SettingStore extends PersistentStore {
/// Format: {width}x{height} /// Format: {width}x{height}
late final windowSize = property('windowSize', ''); late final windowSize = property('windowSize', '');
late final showIntro = property('showIntro', true); late final introVer = property('introVer', 0);
late final letterCache = property('letterCache', false);
// Never show these settings for users // Never show these settings for users
// //

View File

@@ -1,24 +1,26 @@
part of 'app.dart'; part of 'app.dart';
final class _IntroPage extends StatelessWidget { final class _IntroPage extends StatelessWidget {
const _IntroPage(); final List<IntroPageBuilder> pages;
static final _setting = Stores.setting; const _IntroPage(this.pages);
static const _kIconSize = 23.0;
static const _introListPad = EdgeInsets.symmetric(horizontal: 17); static const _builders = {
1: _buildAppSettings,
2: _buildRecommended,
1006: _buildTermLetterCache,
};
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return LayoutBuilder( return LayoutBuilder(
builder: (context, cons) { builder: (context, cons) {
final padTop = cons.maxHeight * .2; final padTop = cons.maxHeight * .16;
final pages_ = pages.map((e) => e(context, padTop)).toList();
return IntroPage( return IntroPage(
pages: [ pages: pages_,
_buildAppSettings(context, padTop),
_buildRecommended(context, padTop),
],
onDone: (ctx) { onDone: (ctx) {
Stores.setting.showIntro.put(false); Stores.setting.introVer.put(BuildData.build);
Navigator.of(ctx).pushReplacement( Navigator.of(ctx).pushReplacement(
MaterialPageRoute(builder: (_) => const HomePage()), MaterialPageRoute(builder: (_) => const HomePage()),
); );
@@ -28,12 +30,29 @@ final class _IntroPage extends StatelessWidget {
); );
} }
Widget _buildRecommended(BuildContext context, double padTop) { static Widget _buildTermLetterCache(BuildContext context, double padTop) {
return ListView( return ListView(
padding: _introListPad, padding: _introListPad,
children: [ children: [
SizedBox(height: padTop), SizedBox(height: padTop),
const Icon(Bootstrap.stars, size: 35), IntroPage.title(icon: BoxIcons.bxs_terminal, big: true),
SizedBox(height: padTop),
ListTile(
leading: const Icon(Bootstrap.input_cursor),
title: Text(l10n.letterCache),
subtitle: Text(l10n.letterCacheTip, style: UIs.textGrey),
trailing: StoreSwitch(prop: _setting.letterCache),
).cardx,
],
);
}
static Widget _buildRecommended(BuildContext context, double padTop) {
return ListView(
padding: _introListPad,
children: [
SizedBox(height: padTop),
IntroPage.title(icon: Bootstrap.stars, big: true),
SizedBox(height: padTop), SizedBox(height: padTop),
ListTile( ListTile(
leading: const Icon(MingCute.delete_2_fill), leading: const Icon(MingCute.delete_2_fill),
@@ -57,12 +76,12 @@ final class _IntroPage extends StatelessWidget {
); );
} }
Widget _buildAppSettings(BuildContext ctx, double padTop) { static Widget _buildAppSettings(BuildContext ctx, double padTop) {
return ListView( return ListView(
padding: _introListPad, padding: _introListPad,
children: [ children: [
SizedBox(height: padTop), SizedBox(height: padTop),
_buildTitle(l10n.init, big: true), IntroPage.title(text: l10n.init, big: true),
SizedBox(height: padTop), SizedBox(height: padTop),
ListTile( ListTile(
leading: const Icon(IonIcons.language), leading: const Icon(IonIcons.language),
@@ -94,14 +113,15 @@ final class _IntroPage extends StatelessWidget {
); );
} }
Widget _buildTitle(String text, {bool big = false}) { static List<IntroPageBuilder> get builders {
return Center( final storedVer = _setting.introVer.fetch();
child: Text( return _builders.entries
text, .where((e) => e.key > storedVer)
style: big .map((e) => e.value)
? const TextStyle(fontSize: 41, fontWeight: FontWeight.w500) .toList();
: UIs.textGrey,
),
);
} }
static final _setting = Stores.setting;
static const _kIconSize = 23.0;
static const _introListPad = EdgeInsets.symmetric(horizontal: 17);
} }

View File

@@ -67,7 +67,6 @@
"decode": "Decode", "decode": "Decode",
"decompress": "Dekomprimieren", "decompress": "Dekomprimieren",
"delete": "Löschen", "delete": "Löschen",
"deleteScripts": "Gleichzeitiges Löschen von Server-Skripten",
"deleteServers": "Batch-Löschung von Servern", "deleteServers": "Batch-Löschung von Servern",
"deviceName": "Gerätename", "deviceName": "Gerätename",
"dirEmpty": "Stelle sicher, dass der Ordner leer ist.", "dirEmpty": "Stelle sicher, dass der Ordner leer ist.",
@@ -154,6 +153,8 @@
"languageName": "Deutsch", "languageName": "Deutsch",
"lastTry": "Letzter Versuch", "lastTry": "Letzter Versuch",
"launchPage": "Startseite", "launchPage": "Startseite",
"letterCache": "Buchstaben-Caching",
"letterCacheTip": "Empfohlen zu aktivieren, aber die Aktivierung verhindert die Eingabe von CJK (Chinesisch, Japanisch, Koreanisch) Zeichen",
"license": "Lizenzen", "license": "Lizenzen",
"light": "Hell", "light": "Hell",
"loadingFiles": "Lädt Dateien...", "loadingFiles": "Lädt Dateien...",

View File

@@ -67,7 +67,6 @@
"decode": "Decode", "decode": "Decode",
"decompress": "Decompress", "decompress": "Decompress",
"delete": "Delete", "delete": "Delete",
"deleteScripts": "Delete server scripts at the same time",
"deleteServers": "Batch delete servers", "deleteServers": "Batch delete servers",
"deviceName": "Device name", "deviceName": "Device name",
"dirEmpty": "Make sure the folder is empty.", "dirEmpty": "Make sure the folder is empty.",
@@ -154,6 +153,8 @@
"languageName": "English", "languageName": "English",
"lastTry": "Last try", "lastTry": "Last try",
"launchPage": "Launch page", "launchPage": "Launch page",
"letterCache": "Letter caching",
"letterCacheTip": "Recommended to enable, but enabling it prevents the input of CJK (Chinese, Japanese, Korean) characters",
"license": "License", "license": "License",
"light": "Light", "light": "Light",
"loadingFiles": "Loading files...", "loadingFiles": "Loading files...",

View File

@@ -67,7 +67,6 @@
"decode": "Decodificar", "decode": "Decodificar",
"decompress": "Descomprimir", "decompress": "Descomprimir",
"delete": "Eliminar", "delete": "Eliminar",
"deleteScripts": "Eliminar scripts del servidor simultáneamente",
"deleteServers": "Eliminar servidores en lote", "deleteServers": "Eliminar servidores en lote",
"deviceName": "Nombre del dispositivo", "deviceName": "Nombre del dispositivo",
"dirEmpty": "Asegúrate de que el directorio esté vacío", "dirEmpty": "Asegúrate de que el directorio esté vacío",
@@ -154,6 +153,8 @@
"languageName": "Español", "languageName": "Español",
"lastTry": "Último intento", "lastTry": "Último intento",
"launchPage": "Página de lanzamiento", "launchPage": "Página de lanzamiento",
"letterCache": "Caché de letras",
"letterCacheTip": "Se recomienda activar, pero al activarlo se impide la introducción de caracteres CJK (chino, japonés, coreano)",
"license": "Licencia de código abierto", "license": "Licencia de código abierto",
"light": "Claro", "light": "Claro",
"loadingFiles": "Cargando directorio...", "loadingFiles": "Cargando directorio...",

View File

@@ -67,7 +67,6 @@
"decode": "Décoder", "decode": "Décoder",
"decompress": "Décompresser", "decompress": "Décompresser",
"delete": "Supprimer", "delete": "Supprimer",
"deleteScripts": "Supprimer les scripts du serveur en même temps",
"deleteServers": "Supprimer des serveurs en lot", "deleteServers": "Supprimer des serveurs en lot",
"deviceName": "Nom de l'appareil", "deviceName": "Nom de l'appareil",
"dirEmpty": "Assurez-vous que le répertoire est vide.", "dirEmpty": "Assurez-vous que le répertoire est vide.",
@@ -154,6 +153,8 @@
"languageName": "Français", "languageName": "Français",
"lastTry": "Dernière tentative", "lastTry": "Dernière tentative",
"launchPage": "Page de lancement", "launchPage": "Page de lancement",
"letterCache": "Mise en cache des lettres",
"letterCacheTip": "Recommandé à activer, mais son activation empêche la saisie de caractères CJK (chinois, japonais, coréen)",
"license": "Licence", "license": "Licence",
"light": "Clair", "light": "Clair",
"loadingFiles": "Chargement des fichiers...", "loadingFiles": "Chargement des fichiers...",

View File

@@ -67,7 +67,6 @@
"decode": "Membaca sandi", "decode": "Membaca sandi",
"decompress": "Dekompresi", "decompress": "Dekompresi",
"delete": "Menghapus", "delete": "Menghapus",
"deleteScripts": "Menghapus skrip server secara bersamaan",
"deleteServers": "Penghapusan server secara batch", "deleteServers": "Penghapusan server secara batch",
"deviceName": "Nama perangkat", "deviceName": "Nama perangkat",
"dirEmpty": "Pastikan dir kosong.", "dirEmpty": "Pastikan dir kosong.",
@@ -154,6 +153,8 @@
"languageName": "Indonesia", "languageName": "Indonesia",
"lastTry": "Percobaan terakhir", "lastTry": "Percobaan terakhir",
"launchPage": "Halaman peluncuran", "launchPage": "Halaman peluncuran",
"letterCache": "Caching huruf",
"letterCacheTip": "Disarankan untuk diaktifkan, tetapi mengaktifkannya mencegah input karakter CJK (Cina, Jepang, Korea)",
"license": "Lisensi", "license": "Lisensi",
"light": "Terang", "light": "Terang",
"loadingFiles": "Memuat file ...", "loadingFiles": "Memuat file ...",

View File

@@ -67,7 +67,6 @@
"decode": "デコード", "decode": "デコード",
"decompress": "解凍", "decompress": "解凍",
"delete": "削除", "delete": "削除",
"deleteScripts": "サーバースクリプトも削除",
"deleteServers": "サーバーを一括削除", "deleteServers": "サーバーを一括削除",
"deviceName": "デバイス名", "deviceName": "デバイス名",
"dirEmpty": "フォルダーが空であることを確認してください", "dirEmpty": "フォルダーが空であることを確認してください",
@@ -154,6 +153,8 @@
"languageName": "日本語", "languageName": "日本語",
"lastTry": "最後の試み", "lastTry": "最後の試み",
"launchPage": "起動ページ", "launchPage": "起動ページ",
"letterCache": "文字キャッシング",
"letterCacheTip": "有効化を推奨しますが、有効にするとCJK中国語、日本語、韓国語の文字の入力ができなくなります",
"license": "オープンソースライセンス", "license": "オープンソースライセンス",
"light": "ライト", "light": "ライト",
"loadingFiles": "ディレクトリを読み込んでいます...", "loadingFiles": "ディレクトリを読み込んでいます...",

View File

@@ -67,7 +67,6 @@
"decode": "Decoderen", "decode": "Decoderen",
"decompress": "Decomprimeren", "decompress": "Decomprimeren",
"delete": "Verwijderen", "delete": "Verwijderen",
"deleteScripts": "Verwijder tegelijkertijd serverscripts",
"deleteServers": "Servers batchgewijs verwijderen", "deleteServers": "Servers batchgewijs verwijderen",
"deviceName": "Apparaatnaam", "deviceName": "Apparaatnaam",
"dirEmpty": "Zorg ervoor dat de map leeg is.", "dirEmpty": "Zorg ervoor dat de map leeg is.",
@@ -154,6 +153,8 @@
"languageName": "Nederlands", "languageName": "Nederlands",
"lastTry": "Laatste poging", "lastTry": "Laatste poging",
"launchPage": "Startpagina", "launchPage": "Startpagina",
"letterCache": "Lettercaching",
"letterCacheTip": "Aanbevolen om in te schakelen, maar bij inschakeling wordt de invoer van CJK (Chinees, Japans, Koreaans) tekens voorkomen",
"license": "Licentie", "license": "Licentie",
"light": "Licht", "light": "Licht",
"loadingFiles": "Bestanden laden...", "loadingFiles": "Bestanden laden...",

View File

@@ -67,7 +67,6 @@
"decode": "Decodificar", "decode": "Decodificar",
"decompress": "Descomprimir", "decompress": "Descomprimir",
"delete": "Excluir", "delete": "Excluir",
"deleteScripts": "Excluir scripts do servidor simultaneamente",
"deleteServers": "Excluir servidores em lote", "deleteServers": "Excluir servidores em lote",
"deviceName": "Nome do dispositivo", "deviceName": "Nome do dispositivo",
"dirEmpty": "Certifique-se de que a pasta está vazia", "dirEmpty": "Certifique-se de que a pasta está vazia",
@@ -154,6 +153,8 @@
"languageName": "Português", "languageName": "Português",
"lastTry": "Última tentativa", "lastTry": "Última tentativa",
"launchPage": "Página de lançamento", "launchPage": "Página de lançamento",
"letterCache": "Cache de letras",
"letterCacheTip": "Recomendado para ativar, mas a ativação impede a entrada de caracteres CJK (chinês, japonês, coreano)",
"license": "Licença de código aberto", "license": "Licença de código aberto",
"light": "Claro", "light": "Claro",
"loadingFiles": "Carregando diretórios...", "loadingFiles": "Carregando diretórios...",

View File

@@ -67,7 +67,6 @@
"decode": "декодировать", "decode": "декодировать",
"decompress": "разархивировать", "decompress": "разархивировать",
"delete": "удалить", "delete": "удалить",
"deleteScripts": "удалить скрипты с сервера",
"deleteServers": "удалить серверы пакетно", "deleteServers": "удалить серверы пакетно",
"deviceName": "Название устройства", "deviceName": "Название устройства",
"dirEmpty": "Пожалуйста, убедитесь, что папка пуста", "dirEmpty": "Пожалуйста, убедитесь, что папка пуста",
@@ -154,6 +153,8 @@
"languageName": "Русский", "languageName": "Русский",
"lastTry": "последняя попытка", "lastTry": "последняя попытка",
"launchPage": "стартовая страница", "launchPage": "стартовая страница",
"letterCache": "Кэширование букв",
"letterCacheTip": "Рекомендуется включить, но его активация препятствует вводу символов CJK (китайский, японский, корейский)",
"license": "лицензия", "license": "лицензия",
"light": "светлая", "light": "светлая",
"loadingFiles": "Загрузка файлов...", "loadingFiles": "Загрузка файлов...",

View File

@@ -67,7 +67,6 @@
"decode": "解码", "decode": "解码",
"decompress": "解压缩", "decompress": "解压缩",
"delete": "删除", "delete": "删除",
"deleteScripts": "同时删除服务器脚本",
"deleteServers": "批量删除服务器", "deleteServers": "批量删除服务器",
"deviceName": "设备名", "deviceName": "设备名",
"dirEmpty": "请确保文件夹为空", "dirEmpty": "请确保文件夹为空",
@@ -154,6 +153,8 @@
"languageName": "简体中文", "languageName": "简体中文",
"lastTry": "最后尝试", "lastTry": "最后尝试",
"launchPage": "启动页", "launchPage": "启动页",
"letterCache": "输入法字符缓存",
"letterCacheTip": "推荐开启,但是开启后无法输入 CJK 等文字",
"license": "开源许可证", "license": "开源许可证",
"light": "亮", "light": "亮",
"loadingFiles": "正在加载目录。。。", "loadingFiles": "正在加载目录。。。",

View File

@@ -67,7 +67,6 @@
"decode": "解碼", "decode": "解碼",
"decompress": "解壓縮", "decompress": "解壓縮",
"delete": "刪除", "delete": "刪除",
"deleteScripts": "同時刪除伺服器腳本",
"deleteServers": "批量刪除伺服器", "deleteServers": "批量刪除伺服器",
"deviceName": "設備名", "deviceName": "設備名",
"dirEmpty": "請確保資料夾為空", "dirEmpty": "請確保資料夾為空",
@@ -154,6 +153,8 @@
"languageName": "繁體中文", "languageName": "繁體中文",
"lastTry": "最後嘗試", "lastTry": "最後嘗試",
"launchPage": "啓動頁", "launchPage": "啓動頁",
"letterCache": "输入法字符緩存",
"letterCacheTip": "推薦開啟但是開啟後無法輸入CJK中文、日文、韓文等文字",
"license": "開源許可證", "license": "開源許可證",
"light": "亮", "light": "亮",
"loadingFiles": "正在加載目錄...", "loadingFiles": "正在加載目錄...",

View File

@@ -156,6 +156,7 @@ class _SettingPageState extends State<SettingPage> {
Widget _buildSSH() { Widget _buildSSH() {
return Column( return Column(
children: [ children: [
_buildLetterCache(),
_buildSSHWakeLock(), _buildSSHWakeLock(),
_buildTermTheme(), _buildTermTheme(),
_buildFont(), _buildFont(),
@@ -1178,4 +1179,16 @@ class _SettingPageState extends State<SettingPage> {
trailing: StoreSwitch(prop: _setting.betaTest), trailing: StoreSwitch(prop: _setting.betaTest),
); );
} }
Widget _buildLetterCache() {
return ListTile(
leading: const Icon(Bootstrap.input_cursor),
title: Text(l10n.letterCache),
subtitle: Text(
'${l10n.letterCacheTip}\n${l10n.needRestart}',
style: UIs.textGrey,
),
trailing: StoreSwitch(prop: _setting.letterCache),
);
}
} }

View File

@@ -129,6 +129,7 @@ class SSHPageState extends State<SSHPage>
} }
Widget _buildBody() { Widget _buildBody() {
final letterCache = Stores.setting.letterCache.fetch();
return SizedBox( return SizedBox(
height: _media.size.height - height: _media.size.height -
_virtKeysHeight - _virtKeysHeight -
@@ -144,8 +145,10 @@ class SSHPageState extends State<SSHPage>
_terminal, _terminal,
key: _termKey, key: _termKey,
controller: _terminalController, controller: _terminalController,
keyboardType: TextInputType.text, keyboardType: letterCache
enableSuggestions: true, ? TextInputType.text
: TextInputType.visiblePassword,
enableSuggestions: !letterCache,
textStyle: _terminalStyle, textStyle: _terminalStyle,
theme: _terminalTheme, theme: _terminalTheme,
deleteDetection: isMobile, deleteDetection: isMobile,

View File

@@ -385,8 +385,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "v1.0.59" ref: "v1.0.60"
resolved-ref: aaca37cb7052e301bbd723615f6827371ad7f2b8 resolved-ref: "5a88f7c6901e8f2c556a1d79ceaf7be9fb518233"
url: "https://github.com/lppcg/fl_lib" url: "https://github.com/lppcg/fl_lib"
source: git source: git
version: "0.0.1" version: "0.0.1"

View File

@@ -58,7 +58,7 @@ dependencies:
fl_lib: fl_lib:
git: git:
url: https://github.com/lppcg/fl_lib url: https://github.com/lppcg/fl_lib
ref: v1.0.59 ref: v1.0.60
dependency_overrides: dependency_overrides:
# dartssh2: # dartssh2: