From be74f9033497ab9ef52a7d7b0e68a843b64e0218 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 4 Dec 2022 15:15:48 +0800 Subject: [PATCH] right menu to show/hide peer card Signed-off-by: 21pages --- flutter/lib/common/widgets/peer_tab_page.dart | 232 +++++++++++++----- .../lib/desktop/pages/connection_page.dart | 23 +- flutter/lib/mobile/pages/connection_page.dart | 15 +- src/lang/ca.rs | 1 + src/lang/cn.rs | 1 + src/lang/cs.rs | 1 + src/lang/da.rs | 1 + src/lang/de.rs | 1 + src/lang/eo.rs | 1 + src/lang/es.rs | 1 + src/lang/fa.rs | 1 + src/lang/fr.rs | 1 + src/lang/gr.rs | 2 +- src/lang/hu.rs | 1 + src/lang/id.rs | 1 + src/lang/it.rs | 1 + src/lang/ja.rs | 1 + src/lang/ko.rs | 1 + src/lang/kz.rs | 1 + src/lang/pl.rs | 1 + src/lang/pt_PT.rs | 1 + src/lang/ptbr.rs | 1 + src/lang/ru.rs | 1 + src/lang/sk.rs | 1 + src/lang/sq.rs | 1 + src/lang/sv.rs | 1 + src/lang/template.rs | 1 + src/lang/tr.rs | 1 + src/lang/tw.rs | 1 + src/lang/ua.rs | 1 + src/lang/vn.rs | 1 + 31 files changed, 198 insertions(+), 101 deletions(-) diff --git a/flutter/lib/common/widgets/peer_tab_page.dart b/flutter/lib/common/widgets/peer_tab_page.dart index 523230810..3e8f04b93 100644 --- a/flutter/lib/common/widgets/peer_tab_page.dart +++ b/flutter/lib/common/widgets/peer_tab_page.dart @@ -1,36 +1,73 @@ +import 'dart:ui' as ui; + +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common/widgets/address_book.dart'; import 'package:flutter_hbb/common/widgets/peers_view.dart'; import 'package:flutter_hbb/common/widgets/peer_card.dart'; import 'package:flutter_hbb/consts.dart'; +import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; +import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; +import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart' + as mod_menu; import 'package:get/get.dart'; import '../../common.dart'; import '../../models/platform_model.dart'; class PeerTabPage extends StatefulWidget { - final List tabs; - final List children; - const PeerTabPage({required this.tabs, required this.children, Key? key}) - : super(key: key); + const PeerTabPage({Key? key}) : super(key: key); @override State createState() => _PeerTabPageState(); } +class _TabEntry { + final String name; + final Widget widget; + final Function() load; + _TabEntry(this.name, this.widget, this.load); +} + class _PeerTabPageState extends State with SingleTickerProviderStateMixin { - final RxInt _tabIndex = 0.obs; + late final RxInt _tabHiddenFlag; + late final RxString _currentTab; + final List<_TabEntry> entries = [ + _TabEntry( + 'Recent Sessions', + RecentPeersView( + menuPadding: kDesktopMenuPadding, + ), + bind.mainLoadRecentPeers), + _TabEntry( + 'Favorites', + FavoritePeersView( + menuPadding: kDesktopMenuPadding, + ), + bind.mainLoadFavPeers), + _TabEntry( + 'Discovered', + DiscoveredPeersView( + menuPadding: kDesktopMenuPadding, + ), + bind.mainDiscover), + _TabEntry( + 'Address Book', + const AddressBook( + menuPadding: kDesktopMenuPadding, + ), + () => {}), + ]; @override void initState() { - setPeer(); - super.initState(); - } - - setPeer() { - final index = bind.getLocalFlutterConfig(k: 'peer-tab-index'); - if (index != '') { - _tabIndex.value = int.parse(index); - } + _tabHiddenFlag = (int.tryParse( + bind.getLocalFlutterConfig(k: 'hidden-peer-card'), + radix: 2) ?? + 0) + .obs; + _currentTab = bind.getLocalFlutterConfig(k: 'current-peer-tab').obs; + adjustTab(); final uiType = bind.getLocalFlutterConfig(k: 'peer-card-ui-type'); if (uiType != '') { @@ -38,27 +75,14 @@ class _PeerTabPageState extends State ? PeerUiType.list : PeerUiType.grid; } + super.initState(); } // hard code for now - Future _handleTabSelection(int index) async { - _tabIndex.value = index; - await bind.setLocalFlutterConfig(k: 'peer-tab-index', v: index.toString()); - switch (index) { - case 0: - bind.mainLoadRecentPeers(); - break; - case 1: - bind.mainLoadFavPeers(); - break; - case 2: - bind.mainDiscover(); - break; - case 3: - - /// AddressBook initState will refresh ab state - break; - } + Future handleTabSelection(String tabName) async { + _currentTab.value = tabName; + await bind.setLocalFlutterConfig(k: 'current-peer-tab', v: tabName); + entries.firstWhereOrNull((e) => e.name == tabName)?.load(); } @override @@ -80,8 +104,9 @@ class _PeerTabPageState extends State child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Expanded(child: _createSwitchBar(context)), - const SizedBox(width: 10), + Expanded( + child: visibleContextMenuListener( + _createSwitchBar(context))), const PeerSearchBar(), Offstage( offstage: !isDesktop, @@ -97,44 +122,48 @@ class _PeerTabPageState extends State Widget _createSwitchBar(BuildContext context) { final textColor = Theme.of(context).textTheme.titleLarge?.color; - return ListView( + return Obx(() => ListView( scrollDirection: Axis.horizontal, shrinkWrap: true, controller: ScrollController(), - children: super.widget.tabs.asMap().entries.map((t) { - return Obx(() => InkWell( - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - color: _tabIndex.value == t.key - ? Theme.of(context).backgroundColor - : null, - borderRadius: BorderRadius.circular(isDesktop ? 2 : 6), - ), - child: Align( - alignment: Alignment.center, - child: Text( - t.value, - textAlign: TextAlign.center, - style: TextStyle( - height: 1, - fontSize: 14, - color: - _tabIndex.value == t.key ? textColor : textColor - ?..withOpacity(0.5)), - ), - )), - onTap: () async => await _handleTabSelection(t.key), - )); - }).toList()); + children: entries.where((e) => !isTabHidden(e.name)).map((t) { + return InkWell( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: _currentTab.value == t.name + ? Theme.of(context).backgroundColor + : null, + borderRadius: BorderRadius.circular(isDesktop ? 2 : 6), + ), + child: Align( + alignment: Alignment.center, + child: Text( + translate(t.name), + textAlign: TextAlign.center, + style: TextStyle( + height: 1, + fontSize: 14, + color: + _currentTab.value == t.name ? textColor : textColor + ?..withOpacity(0.5)), + ), + )), + onTap: () async => await handleTabSelection(t.name), + ); + }).toList())); } Widget _createPeersView() { final verticalMargin = isDesktop ? 12.0 : 6.0; return Expanded( - child: Obx(() => widget - .children[_tabIndex.value]) //: (to) => _tabIndex.value = to) - .marginSymmetric(vertical: verticalMargin), + child: Obx(() => + entries + .firstWhereOrNull((e) => e.name == _currentTab.value) + ?.widget ?? + visibleContextMenuListener(Center( + child: Text(translate('Right click to select tabs')), + ))).marginSymmetric(vertical: verticalMargin), ); } @@ -167,6 +196,81 @@ class _PeerTabPageState extends State .toList(), ); } + + bool isTabHidden(String name) { + int index = entries.indexWhere((e) => e.name == name); + if (index >= 0) { + return _tabHiddenFlag & (1 << index) != 0; + } + assert(false); + return false; + } + + adjustTab() { + List visibleTabs = + entries.where((e) => !isTabHidden(e.name)).map((e) => e.name).toList(); + if (visibleTabs.isNotEmpty) { + if (!visibleTabs.contains(_currentTab.value)) { + handleTabSelection(visibleTabs[0]); + } + } else { + _currentTab.value = ''; + } + } + + Widget visibleContextMenuListener(Widget child) { + return Listener( + onPointerDown: (e) { + if (e.kind != ui.PointerDeviceKind.mouse) { + return; + } + if (e.buttons == 2) { + showRightMenu( + (CancelFunc cancelFunc) { + return visibleContextMenu(cancelFunc); + }, + target: e.position, + ); + } + }, + child: child); + } + + Widget visibleContextMenu(CancelFunc cancelFunc) { + final List menu = entries.asMap().entries.map((e) { + int bitMask = 1 << e.key; + return MenuEntrySwitch( + switchType: SwitchType.scheckbox, + text: translate(e.value.name), + getter: () async { + return _tabHiddenFlag.value & bitMask == 0; + }, + setter: (show) async { + if (show) { + _tabHiddenFlag.value &= ~bitMask; + } else { + _tabHiddenFlag.value |= bitMask; + } + await bind.setLocalFlutterConfig( + k: 'hidden-peer-card', + v: _tabHiddenFlag.value.toRadixString(2)); + cancelFunc(); + adjustTab(); + }); + }).toList(); + return mod_menu.PopupMenu( + items: menu + .map((entry) => entry.build( + context, + const MenuConfig( + commonColor: MyTheme.accent, + height: 20.0, + dividerHeight: 12.0, + ))) + .expand((i) => i) + .toList(), + ); + } } class PeerSearchBar extends StatefulWidget { diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index a830d6399..81f526c12 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -121,28 +121,7 @@ class _ConnectionPageState extends State ])), SliverFillRemaining( hasScrollBody: false, - child: PeerTabPage( - tabs: [ - translate('Recent Sessions'), - translate('Favorites'), - translate('Discovered'), - translate('Address Book') - ], - children: [ - RecentPeersView( - menuPadding: kDesktopMenuPadding, - ), - FavoritePeersView( - menuPadding: kDesktopMenuPadding, - ), - DiscoveredPeersView( - menuPadding: kDesktopMenuPadding, - ), - const AddressBook( - menuPadding: kDesktopMenuPadding, - ), - ], - ).paddingOnly(right: 12.0), + child: PeerTabPage().paddingOnly(right: 12.0), ) ], ).paddingOnly(left: 12.0), diff --git a/flutter/lib/mobile/pages/connection_page.dart b/flutter/lib/mobile/pages/connection_page.dart index e99226c4d..957910324 100644 --- a/flutter/lib/mobile/pages/connection_page.dart +++ b/flutter/lib/mobile/pages/connection_page.dart @@ -75,20 +75,7 @@ class _ConnectionPageState extends State { ])), SliverFillRemaining( hasScrollBody: false, - child: PeerTabPage( - tabs: [ - translate('Recent Sessions'), - translate('Favorites'), - translate('Discovered'), - translate('Address Book') - ], - children: [ - RecentPeersView(), - FavoritePeersView(), - DiscoveredPeersView(), - const AddressBook(), - ], - ), + child: PeerTabPage(), ) ], ).marginOnly(top: 2, left: 10, right: 10); diff --git a/src/lang/ca.rs b/src/lang/ca.rs index e7794b989..6fc919b8d 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 8af5229f2..1b49f6c4a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "隐藏连接管理窗口"), ("hide_cm_tip", "在只允许密码连接并且只用固定密码的情况下才允许隐藏"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", "右键选择选项卡"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 547b233f4..6455023de 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 5d815a90b..afd6476ee 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index e4306301b..273a607ed 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Fenster zur Verwaltung der Verbindung verstecken"), ("hide_cm_tip", "Dies ist nur möglich, wenn der Zugriff nur über ein permanentes Passwort erfolgt."), // Sehr unklar. Muss noch angepasst werden. Original: Allow hiding only if accepting sessions via password and using pernament passw"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index f5a2f7e55..3a38b6601 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index d8362ff05..39d031c9d 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Ocultar ventana de gestión de conexión"), ("hide_cm_tip", "Permitir ocultar solo si se aceptan sesiones a través de contraseña y usando contraseña permanente"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index ee3706e34..7513f84e8 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "پنهان کردن پنجره مدیریت اتصال"), ("hide_cm_tip", "فقط در صورت پذیرفتن جلسات از طریق رمز عبور و استفاده از رمز عبور دائمی، مخفی شدن مجاز است"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 860f59518..a4eedfa2a 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Masquer la fenêtre de gestion des connexions"), ("hide_cm_tip", "Autoriser le masquage uniquement si vous acceptez des sessions via un mot de passe et utilisez un mot de passe permanent"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/gr.rs b/src/lang/gr.rs index 20bb98200..986919a8b 100644 --- a/src/lang/gr.rs +++ b/src/lang/gr.rs @@ -397,6 +397,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Request access to your device", "Αίτημα πρόσβασης στη συσκευή σας"), ("Hide connection management window", "Απόκρυψη παραθύρου διαχείρισης σύνδεσης"), ("hide_cm_tip", "Να επιτρέπεται η απόκρυψη, μόνο εάν αποδέχεστε συνδέσεις μέσω κωδικού πρόσβασης και χρησιμοποιείτε μόνιμο κωδικό πρόσβασης"), - ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 51f072e16..941caeac1 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index b2492553d..7f4a50523 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index ec993ad04..98ea9366e 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Nascondi la finestra di gestione delle connessioni"), ("hide_cm_tip", "Permetti di nascondere solo se si accettano sessioni con password permanente"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 5cd6d8d6d..4121dd55c 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 31d69841c..a1cd730e9 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index c32fa778d..1e623c0b6 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index edd9a4e45..ed14e3ca2 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 1c174af8d..65620e3e8 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 86bd1b77f..cf388a88c 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index bcb539498..76a8cca87 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Скрывать окно управления соединениями"), ("hide_cm_tip", "Разрешать скрытие случае, если принимаются сеансы по паролю или используется постоянный пароль"), ("wayland_experiment_tip", "Поддержка Wayland находится на экспериментальной стадии, используйте X11, если вам требуется автоматический доступ."), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 194b3dc83..e7a9b12b5 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index a7cb45443..1926c849b 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Fshih dritaren e menaxhimit të lidhjes"), ("hide_cm_tip", "Kjo është e mundur vetëm nëse aksesi bëhet nëpërmjet një fjalëkalimi të përhershëm"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 79c9bbcc1..cfef903a7 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Göm hanteringsfönster"), ("hide_cm_tip", "Tillåt att gömma endast om accepterande sessioner med lösenord och permanenta lösenord"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index acc92be20..ed7189ce6 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index bd2e9cd62..6c518da81 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "Bağlantı yönetimi penceresini gizle"), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 35b2cb2cf..e7c024420 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", "隱藏連接管理窗口"), ("hide_cm_tip", "在只允許密碼連接並且只用固定密碼的情況下才允許隱藏"), ("wayland_experiment_tip", ""), + ("Right click to select tabs", "右鍵選擇選項卡"), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index b1fdca17a..713d15c69 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index acac782d1..c59de33fc 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -398,5 +398,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Hide connection management window", ""), ("hide_cm_tip", ""), ("wayland_experiment_tip", ""), + ("Right click to select tabs", ""), ].iter().cloned().collect(); }