diff --git a/.gitignore b/.gitignore index d6499532..1915e25c 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,5 @@ linux.AppDir ServerBox-x86_64.AppImage untranlated.json + +.vscode/settings.json diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 848476d5..5b4a4aad 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -274,6 +274,9 @@ class SettingStore extends PersistentStore { /// ssh page late final sshWakeLock = property('sshWakeLock', true); + /// fmt: https://example.com/{DIST}-{BRIGHT}.png + late final serverLogoUrl = property('serverLogoUrl', ''); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 857db550..890b9f7d 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Domain eingeben", "install": "install", "installDockerWithUrl": "Bitte installiere docker zuerst. https://docs.docker.com/engine/install", + "invalid": "Ungültig", "invalidJson": "Ungültige JSON", "invalidVersion": "Ungültige Version", "invalidVersionHelp": "Bitte stelle sicher, dass Docker korrekt installiert ist oder dass du eine nicht selbstkompilierte Version verwendest. Wenn du die oben genannten Probleme nicht hast, melde bitte einen Fehler auf {url}.", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 364934b0..356a2349 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Input Domain here", "install": "install", "installDockerWithUrl": "Please https://docs.docker.com/engine/install docker first.", + "invalid": "Invalid", "invalidJson": "Invalid JSON", "invalidVersion": "Invalid version", "invalidVersionHelp": "Please make sure that docker is installed correctly, or that you are using a non-self-compiled version. If you don't have the above issues, please submit an issue on {url}.", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 1ce283d8..535f082f 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Introduce el dominio aquí", "install": "Instalar", "installDockerWithUrl": "Por favor instala Docker primero desde https://docs.docker.com/engine/install", + "invalid": "Inválido", "invalidJson": "JSON inválido", "invalidVersion": "Versión no soportada", "invalidVersionHelp": "Por favor asegúrate de haber instalado Docker correctamente o que no estés usando una versión compilada por ti mismo. Si no tienes estos problemas, informa en {url}.", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 433859b6..9b2efc97 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Saisissez le domaine ici", "install": "installer", "installDockerWithUrl": "Veuillez d'abord installer https://docs.docker.com/engine/install docker.", + "invalid": "Invalide", "invalidJson": "JSON invalide", "invalidVersion": "Version invalide", "invalidVersionHelp": "Veuillez vous assurer que docker est installé correctement, ou que vous n'utilisez pas une version auto-compilée. Si vous n'avez pas les problèmes ci-dessus, veuillez soumettre un problème sur {url}.", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 618d8af7..6f5ae764 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Input domain di sini", "install": "Install", "installDockerWithUrl": "Silakan https://docs.docker.com/engine/install Docker pertama.", + "invalid": "Tidak valid", "invalidJson": "JSON tidak valid", "invalidVersion": "Versi tidak valid", "invalidVersionHelp": "Pastikan Docker diinstal dengan benar, atau Anda menggunakan versi yang tidak dikompilasi. Jika Anda tidak memiliki masalah di atas, silakan kirimkan masalah pada {url}.", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index cb73db96..49568faf 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -136,6 +136,7 @@ "inputDomainHere": "ここにドメインを入力", "install": "インストール", "installDockerWithUrl": "最初に https://docs.docker.com/engine/install dockerをインストールしてください", + "invalid": "無効", "invalidJson": "無効なJSON", "invalidVersion": "サポートされていないバージョン", "invalidVersionHelp": "dockerが正しくインストールされていること、または自己コンパイルされたバージョンを使用していないことを確認してください。問題がない場合は、{url}で問題を報告してください。", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 63eaaede..75213c9b 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Voer hier domein in", "install": "Installeren", "installDockerWithUrl": "Installeer eerst docker via https://docs.docker.com/engine/install.", + "invalid": "Ongeldig", "invalidJson": "Ongeldige JSON", "invalidVersion": "Ongeldige versie", "invalidVersionHelp": "Zorg ervoor dat docker correct is geïnstalleerd, of dat u een niet-zelf-gecompileerde versie gebruikt. Als dat niet het geval is, meld dan een probleem op {url}.", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index c44314bb..8c32c65d 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -136,6 +136,7 @@ "inputDomainHere": "Insira o domínio aqui", "install": "Instalar", "installDockerWithUrl": "Por favor, instale o Docker primeiro em https://docs.docker.com/engine/install", + "invalid": "Inválido", "invalidJson": "JSON inválido", "invalidVersion": "Versão não suportada", "invalidVersionHelp": "Por favor, assegure que o Docker está corretamente instalado, ou que não está usando uma versão compilada por si mesmo. Se não houver problemas, por favor, reporte em {url}.", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index add106eb..8593f015 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -136,6 +136,7 @@ "inputDomainHere": "введите домен здесь", "install": "установить", "installDockerWithUrl": "Пожалуйста, сначала установите Docker по адресу https://docs.docker.com/engine/install", + "invalid": "Недействительный", "invalidJson": "неверный JSON", "invalidVersion": "неподдерживаемая версия", "invalidVersionHelp": "Пожалуйста, убедитесь, что docker установлен корректно, или что используется не собственно собранная версия. Если проблема не в этом, пожалуйста, отправьте отчет о проблеме на {url}.", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 7efed18e..ded46658 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -136,6 +136,7 @@ "inputDomainHere": "在这里输入域名", "install": "安装", "installDockerWithUrl": "请先 https://docs.docker.com/engine/install docker", + "invalid": "无效", "invalidJson": "无效的 JSON", "invalidVersion": "不支持的版本", "invalidVersionHelp": "请确保正确安装了docker,或者使用的非自编译版本。如果没有以上问题,请在 {url} 提交问题。", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 802b63e3..c87eedcd 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -136,6 +136,7 @@ "inputDomainHere": "在這裡輸入域名", "install": "安裝", "installDockerWithUrl": "請先 https://docs.docker.com/engine/install docker", + "invalid": "無效", "invalidJson": "無效的 JSON", "invalidVersion": "不支持的版本", "invalidVersionHelp": "請確保正確安裝了docker,或者使用的非自編譯版本。如果沒有以上問題,請在 {url} 提交問題。", diff --git a/lib/view/page/server/detail/view.dart b/lib/view/page/server/detail/view.dart index b29167db..6e3999cd 100644 --- a/lib/view/page/server/detail/view.dart +++ b/lib/view/page/server/detail/view.dart @@ -8,6 +8,7 @@ import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/locale.dart'; import 'package:toolbox/core/extension/listx.dart'; +import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/data/model/app/server_detail_card.dart'; import 'package:toolbox/data/model/app/shell_func.dart'; import 'package:toolbox/data/model/server/battery.dart'; @@ -104,7 +105,8 @@ class _ServerDetailPageState extends State Widget _buildMainPage(Server si) { final buildFuncs = !Stores.setting.moveOutServerTabFuncBtns.fetch(); - final logoUrl = si.spi.custom?.logoUrl; + final logoUrl = si.spi.custom?.logoUrl ?? + Stores.setting.serverLogoUrl.fetch().selfIfNotNullEmpty; final buildLogo = logoUrl != null; final children = [ if (buildLogo) @@ -149,7 +151,9 @@ class _ServerDetailPageState extends State Widget _buildLogo(String logoUrl, Dist? dist) { if (dist != null) { - logoUrl = logoUrl.replaceFirst('{DIST}', dist.name); + logoUrl = logoUrl + .replaceFirst('{DIST}', dist.name) + .replaceFirst('{BRIGHT}', context.isDark ? 'dark' : 'light'); } return Padding( padding: const EdgeInsets.symmetric(vertical: 13), diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 4b117516..b2895f91 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -151,6 +151,7 @@ class _SettingPageState extends State { Widget _buildServer() { return Column( children: [ + _buildServerLogoUrl(), _buildServerFuncBtns(), _buildNetViewType(), _buildServerSeq(), @@ -1147,4 +1148,50 @@ class _SettingPageState extends State { trailing: StoreSwitch(prop: _setting.sshWakeLock), ); } + + Widget _buildServerLogoUrl() { + void onSave(String url) { + if (url.isEmpty || !url.startsWith('http')) { + context.showRoundDialog( + title: Text(l10n.failed), + child: Text('${l10n.invalid} URL'), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(l10n.ok), + ), + ], + ); + return; + } + _setting.serverLogoUrl.put(url); + context.pop(); + } + + return ListTile( + title: Text('Logo ${l10n.addr}'), + subtitle: SimpleMarkdown(data: '${l10n.view} ${l10n.doc}'), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () { + final ctrl = + TextEditingController(text: _setting.serverLogoUrl.fetch()); + context.showRoundDialog( + title: Text('Logo ${l10n.addr}'), + child: Input( + controller: ctrl, + autoFocus: true, + hint: 'https://example.com/logo.png', + icon: Icons.link, + onSubmitted: onSave, + ), + actions: [ + TextButton( + onPressed: () => onSave(ctrl.text), + child: Text(l10n.ok), + ), + ], + ); + }, + ); + } }