diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index bc0eb7b67..55fd93bcc 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -232,11 +232,11 @@ class _GeneralState extends State<_General> { controller: scrollController, children: [ theme(), - abr(), hwcodec(), audio(context), record(context), _Card(title: 'Language', children: [language()]), + other() ], ).marginOnly(bottom: _kListViewBottomMargin)); } @@ -267,8 +267,10 @@ class _GeneralState extends State<_General> { ]); } - Widget abr() { - return _Card(title: 'Adaptive Bitrate', children: [ + Widget other() { + return _Card(title: 'Other', children: [ + _OptionCheckBox(context, 'Confirm before closing multiple tabs', + 'enable-confirm-closing-tabs'), _OptionCheckBox(context, 'Adaptive Bitrate', 'enable-abr'), ]); } diff --git a/flutter/lib/desktop/pages/file_manager_tab_page.dart b/flutter/lib/desktop/pages/file_manager_tab_page.dart index 24a36eddb..f844edc36 100644 --- a/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ b/flutter/lib/desktop/pages/file_manager_tab_page.dart @@ -10,7 +10,7 @@ import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:get/get.dart'; -import '../../mobile/widgets/dialog.dart'; +import '../../models/platform_model.dart'; /// File Transfer for multi tabs class FileManagerTabPage extends StatefulWidget { @@ -35,7 +35,7 @@ class _FileManagerTabPageState extends State { label: params['id'], selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - onTabCloseButton: () => handleTabCloseButton(params['id']), + onTabCloseButton: () => () => tabController.closeBy(params['id']), page: FileManagerPage(key: ValueKey(params['id']), id: params['id']))); } @@ -58,7 +58,7 @@ class _FileManagerTabPageState extends State { label: id, selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - onTabCloseButton: () => handleTabCloseButton(id), + onTabCloseButton: () => tabController.closeBy(id), page: FileManagerPage(key: ValueKey(id), id: id))); } else if (call.method == "onDestroy") { tabController.clear(); @@ -98,26 +98,19 @@ class _FileManagerTabPageState extends State { return widget.params["windowId"]; } - void handleTabCloseButton(String peerId) { - final session = ffi('ft_$peerId'); - if (session.ffiModel.pi.hostname.isNotEmpty) { - tabController.jumpBy(peerId); - clientClose(session.dialogManager); - } else { - tabController.closeBy(peerId); - } - } - Future handleWindowCloseButton() async { final connLength = tabController.state.value.tabs.length; - if (connLength < 1) { + if (connLength <= 1) { + tabController.clear(); return true; - } else if (connLength == 1) { - final currentConn = tabController.state.value.tabs[0]; - handleTabCloseButton(currentConn.key); - return false; } else { - final res = await closeConfirmDialog(); + final opt = "enable-confirm-closing-tabs"; + final bool res; + if (!option2bool(opt, await bind.mainGetOption(key: opt))) { + res = true; + } else { + res = await closeConfirmDialog(); + } if (res) { tabController.clear(); } diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 352e4682a..1d3daf7b3 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -12,7 +12,7 @@ import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import '../../mobile/widgets/dialog.dart'; +import '../../models/platform_model.dart'; class ConnectionTabPage extends StatefulWidget { final Map params; @@ -42,7 +42,7 @@ class _ConnectionTabPageState extends State { label: peerId, selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - onTabCloseButton: () => handleTabCloseButton(peerId), + onTabCloseButton: () => tabController.closeBy(peerId), page: Obx(() => RemotePage( key: ValueKey(peerId), id: peerId, @@ -78,7 +78,7 @@ class _ConnectionTabPageState extends State { label: id, selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - onTabCloseButton: () => handleTabCloseButton(id), + onTabCloseButton: () => tabController.closeBy(id), page: Obx(() => RemotePage( key: ValueKey(id), id: id, @@ -173,29 +173,21 @@ class _ConnectionTabPageState extends State { return widget.params["windowId"]; } - void handleTabCloseButton(String peerId) { - final session = ffi(peerId); - if (session.ffiModel.pi.hostname.isNotEmpty) { - tabController.jumpBy(peerId); - clientClose(session.dialogManager); - } else { - tabController.closeBy(peerId); - } - } - Future handleWindowCloseButton() async { final connLength = tabController.length; - if (connLength < 1) { + if (connLength <= 1) { + tabController.clear(); return true; - } else if (connLength == 1) { - final currentConn = tabController.state.value.tabs[0]; - handleTabCloseButton(currentConn.key); - return false; } else { - final res = await closeConfirmDialog(); + final opt = "enable-confirm-closing-tabs"; + final bool res; + if (!option2bool(opt, await bind.mainGetOption(key: opt))) { + res = true; + } else { + res = await closeConfirmDialog(); + } if (res) { tabController.clear(); - _update_remote_count(); } return res; } diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index a98b3af20..e3fcf0f53 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -456,8 +456,15 @@ class WindowActionPanel extends StatelessWidget { } Future closeConfirmDialog() async { + var confirm = true; final res = await gFFI.dialogManager.show((setState, close) { - submit() => close(true); + submit() { + final opt = "enable-confirm-closing-tabs"; + String value = bool2option(opt, confirm); + bind.mainSetOption(key: opt, value: value); + close(true); + } + return CustomAlertDialog( title: Row(children: [ const Icon(Icons.warning_amber_sharp, @@ -465,7 +472,25 @@ Future closeConfirmDialog() async { const SizedBox(width: 10), Text(translate("Warning")), ]), - content: Text(translate("Disconnect all devices?")), + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(translate("Disconnect all devices?")), + CheckboxListTile( + contentPadding: const EdgeInsets.all(0), + dense: true, + controlAffinity: ListTileControlAffinity.leading, + title: Text( + translate("Confirm before closing multiple tabs"), + ), + value: confirm, + onChanged: (v) { + if (v == null) return; + setState(() => confirm = v); + }, + ) + ]), // confirm checkbox actions: [ TextButton(onPressed: close, child: Text(translate("Cancel"))), ElevatedButton(onPressed: submit, child: Text(translate("OK"))), diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 35e77990c..0d0b9e208 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", "暂时无法访问远端设备,因为远端设备正在请求用户账户权限,请等待对方关闭UAC窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"), ("elevated_foreground_window_warning", "暂时无法使用鼠标键盘,因为远端桌面的当前窗口需要更高的权限才能操作, 可以请求对方最小化当前窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"), ("Disconnected", "会话已结束"), + ("Other", "其他"), + ("Confirm before closing multiple tabs", "关闭多个标签页时向您确认"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index e849dfa3f..9ca84a28b 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 3dd2e0a51..10cd64dd4 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", "Afbrudt"), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 38c0f657a..f45a583f9 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index cee1975b0..f243eb28a 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index d3da5b402..413cef26b 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 70a62e49d..79c93a4d9 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -193,7 +193,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reboot required", "Redémarrage pour prendre effet"), ("Unsupported display server ", "Le serveur d'affichage actuel n'est pas pris en charge"), ("x11 expected", "Veuillez passer à x11"), - ("Port", ""), + ("Port", "Port"), ("Settings", "Paramètres"), ("Username", " Nom d'utilisateur"), ("Invalid port", "Port invalide"), @@ -274,7 +274,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_stop_service_tip", "La fermeture du service fermera automatiquement toutes les connexions établies."), ("android_version_audio_tip", "La version actuelle d'Android ne prend pas en charge la capture audio, veuillez passer à Android 10 ou supérieur."), ("android_start_service_tip", "Appuyez sur [Démarrer le service] ou sur l'autorisation OUVRIR [Capture d'écran] pour démarrer le service de partage d'écran."), - ("Account", ""), + ("Account", "Compte"), ("Overwrite", "Écraser"), ("This file exists, skip or overwrite this file?", "Ce fichier existe, ignorer ou écraser ce fichier ?"), ("Quit", "Quitter"), @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 191165b65..b4ddebc94 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 96ac3892b..a751c11c0 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 1954eeaae..ae98a5690 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 0c11db665..46428d74c 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", "他の"), + ("Confirm before closing multiple tabs", "同時に複数のタブを閉じる前に確認する"), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index d59d71dc9..3c857424e 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index b4f29894d..f83b8b04b 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 03f030507..9130d6b9a 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", "Ostrzeżenie UAC"), ("elevated_foreground_window_warning", "Pierwszoplanowe okno ostrzeżenia o podwyższeniu uprawnień"), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 835fae801..0fd796cb3 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 280390d7f..a20fdd557 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 7784d74f0..c86d5cc31 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 0319ddc68..8d4105118 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index b292f917c..02bfc95c0 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 1a7912f23..e4ee58e23 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index b588f2a33..5b0dc48aa 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", "暂时无法访问远端设备,因为远端设备正在请求用户账户权限,请等待对方关闭UAC窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"), ("elevated_foreground_window_warning", "暫時無法使用鼠標鍵盤,因為遠端桌面的當前窗口需要更高的權限才能操作, 可以請求對方最小化當前窗口。為避免這個問題,建議在遠端設備上安裝或者以管理員權限運行本軟件。"), ("Disconnected", "會話已結束"), + ("Other", "其他"), + ("Confirm before closing multiple tabs", "關閉多個分頁前跟我確認"), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 3a5c4afd6..7d5037807 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -191,9 +191,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Warning", "Попередження"), ("Login screen using Wayland is not supported", "Вхід у систему з використанням Wayland не підтримується"), ("Reboot required", "Потрібне перезавантаження"), - ("Unsupported display server", "Непідтримуваний сервер дисплея"), + ("Unsupported display server ", ""), ("x11 expected", "Очікується X11"), - ("Port", ""), + ("Port", "Порт"), ("Settings", "Налаштування"), ("Username", "Ім'я користувача"), ("Invalid port", "Неправильний порт"), @@ -274,7 +274,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_stop_service_tip", "Закриття служби автоматично закриє всі встановлені з'єднання."), ("android_version_audio_tip", "Поточна версія Android не підтримує захоплення звуку, оновіть її до Android 10 або вище."), ("android_start_service_tip", "Натисніть [Запуск проміжного сервера] або ВІДКРИТИ роздільну здатність [Захоплення екрана], щоб запустити службу демонстрації екрана."), - ("Account", ""), + ("Account", "Акаунт"), ("Overwrite", "Перезаписати"), ("This file exists, skip or overwrite this file?", "Цей файл існує, пропустити або перезаписати файл?"), ("Quit", "Вийти"), @@ -298,7 +298,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Connection not allowed", "Підключення не дозволено"), ("Legacy mode", ""), ("Map mode", ""), - ("Режим перекладу", ""), + ("Translate mode", ""), ("Use temporary password", "Використовувати тимчасовий пароль"), ("Use permanent password", "Використовувати постійний пароль"), ("Use both passwords", "Використовувати обидва паролі"), @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index c245bdd75..4e441abff 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -371,5 +371,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("uac_warning", ""), ("elevated_foreground_window_warning", ""), ("Disconnected", ""), + ("Other", ""), + ("Confirm before closing multiple tabs", ""), ].iter().cloned().collect(); }