diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index af0be2519..4f407b59b 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -2303,7 +2303,7 @@ String getWindowName({WindowType? overrideType}) { } String getWindowNameWithId(String id, {WindowType? overrideType}) { - return "${DesktopTab.labelGetterAlias(id).value} - ${getWindowName(overrideType: overrideType)}"; + return "${DesktopTab.tablabelGetter(id).value} - ${getWindowName(overrideType: overrideType)}"; } Future updateSystemWindowTheme() async { @@ -2536,3 +2536,21 @@ Widget buildErrorBanner(BuildContext context, )).marginOnly(bottom: 14), )); } + +String getDesktopTabLabel(String peerId, String alias) { + String label = alias.isEmpty ? peerId : alias; + try { + String peer = bind.mainGetPeerSync(id: peerId); + Map config = jsonDecode(peer); + if (config['info']['hostname'] is String) { + String hostname = config['info']['hostname']; + if (hostname.isNotEmpty && + !label.toLowerCase().contains(hostname.toLowerCase())) { + label += "@$hostname"; + } + } + } catch (e) { + debugPrint("Failed to get hostname:$e"); + } + return label; +} diff --git a/flutter/lib/desktop/pages/file_manager_tab_page.dart b/flutter/lib/desktop/pages/file_manager_tab_page.dart index 1e349c6f0..5af937269 100644 --- a/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ b/flutter/lib/desktop/pages/file_manager_tab_page.dart @@ -99,7 +99,7 @@ class _FileManagerTabPageState extends State { controller: tabController, onWindowCloseButton: handleWindowCloseButton, tail: const AddButton().paddingOnly(left: 10), - labelGetter: DesktopTab.labelGetterAlias, + labelGetter: DesktopTab.tablabelGetter, )), ); return Platform.isMacOS || kUseCompatibleUiMode diff --git a/flutter/lib/desktop/pages/port_forward_page.dart b/flutter/lib/desktop/pages/port_forward_page.dart index 2a173c53b..0e74d4a8f 100644 --- a/flutter/lib/desktop/pages/port_forward_page.dart +++ b/flutter/lib/desktop/pages/port_forward_page.dart @@ -266,7 +266,7 @@ class _PortForwardPageState extends State } void refreshTunnelConfig() async { - String peer = await bind.mainGetPeer(id: widget.id); + String peer = bind.mainGetPeerSync(id: widget.id); Map config = jsonDecode(peer); List infos = config['port_forwards'] as List; List<_PortForward> result = List.empty(growable: true); diff --git a/flutter/lib/desktop/pages/port_forward_tab_page.dart b/flutter/lib/desktop/pages/port_forward_tab_page.dart index 621f393e0..886b2693d 100644 --- a/flutter/lib/desktop/pages/port_forward_tab_page.dart +++ b/flutter/lib/desktop/pages/port_forward_tab_page.dart @@ -108,7 +108,7 @@ class _PortForwardTabPageState extends State { return true; }, tail: AddButton().paddingOnly(left: 10), - labelGetter: DesktopTab.labelGetterAlias, + labelGetter: DesktopTab.tablabelGetter, )), ); return Platform.isMacOS || kUseCompatibleUiMode diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 063fe49d8..509ef0120 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -210,7 +210,7 @@ class _ConnectionTabPageState extends State { onWindowCloseButton: handleWindowCloseButton, tail: const AddButton().paddingOnly(left: 10), pageViewBuilder: (pageView) => pageView, - labelGetter: DesktopTab.labelGetterAlias, + labelGetter: DesktopTab.tablabelGetter, tabBuilder: (key, icon, label, themeConf) => Obx(() { final connectionType = ConnectionTypeState.find(key); if (!connectionType.isValid()) { diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index be089559b..ce0dbe027 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:io'; import 'dart:math'; import 'dart:ui' as ui; @@ -267,13 +268,12 @@ class DesktopTab extends StatelessWidget { tabType == DesktopTabType.install; } - static RxString labelGetterAlias(String peerId) { - final opt = 'alias'; - PeerStringOption.init(peerId, opt, () { - final alias = bind.mainGetPeerOptionSync(id: peerId, key: opt); - return alias.isEmpty ? peerId : alias; + static RxString tablabelGetter(String peerId) { + PeerStringOption.init(peerId, 'tabLabel', () { + final alias = bind.mainGetPeerOptionSync(id: peerId, key: 'alias'); + return getDesktopTabLabel(peerId, alias); }); - return PeerStringOption.find(peerId, opt); + return PeerStringOption.find(peerId, 'tabLabel'); } @override @@ -921,14 +921,17 @@ class _TabState extends State<_Tab> with RestorationMixin { final labelWidget = Obx(() { return ConstrainedBox( constraints: BoxConstraints(maxWidth: widget.maxLabelWidth ?? 200), - child: Text( - translate(widget.label.value), - textAlign: TextAlign.center, - style: TextStyle( - color: isSelected - ? MyTheme.tabbar(context).selectedTextColor - : MyTheme.tabbar(context).unSelectedTextColor), - overflow: TextOverflow.ellipsis, + child: Tooltip( + message: translate(widget.label.value), + child: Text( + translate(widget.label.value), + textAlign: TextAlign.center, + style: TextStyle( + color: isSelected + ? MyTheme.tabbar(context).selectedTextColor + : MyTheme.tabbar(context).unSelectedTextColor), + overflow: TextOverflow.ellipsis, + ), )); }); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 67f195dd6..dab3a3e9b 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -8,6 +8,7 @@ import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hbb/consts.dart'; +import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/generated_bridge.dart'; import 'package:flutter_hbb/models/ab_model.dart'; import 'package:flutter_hbb/models/chat_model.dart'; @@ -353,9 +354,13 @@ class FfiModel with ChangeNotifier { } handleAliasChanged(Map evt) { - final rxAlias = PeerStringOption.find(evt['id'], 'alias'); - if (rxAlias.value != evt['alias']) { - rxAlias.value = evt['alias']; + if (!isDesktop) return; + final String peerId = evt['id']; + final String alias = evt['alias']; + String label = getDesktopTabLabel(peerId, alias); + final rxTabLabel = PeerStringOption.find(evt['id'], 'tabLabel'); + if (rxTabLabel.value != label) { + rxTabLabel.value = label; } } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 4186e93d2..9ebbc4b8a 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -729,9 +729,9 @@ pub fn main_store_fav(favs: Vec) { store_fav(favs) } -pub fn main_get_peer(id: String) -> String { +pub fn main_get_peer_sync(id: String) -> SyncReturn { let conf = get_peer(id); - serde_json::to_string(&conf).unwrap_or("".to_string()) + SyncReturn(serde_json::to_string(&conf).unwrap_or("".to_string())) } pub fn main_get_lan_peers() -> String {