confirm connection tab close
This commit is contained in:
parent
1c170366e7
commit
b93e59df21
@ -10,6 +10,8 @@ import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
|||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import '../../mobile/widgets/dialog.dart';
|
||||||
|
|
||||||
class ConnectionTabPage extends StatefulWidget {
|
class ConnectionTabPage extends StatefulWidget {
|
||||||
final Map<String, dynamic> params;
|
final Map<String, dynamic> params;
|
||||||
|
|
||||||
@ -37,6 +39,11 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
label: peerId,
|
label: peerId,
|
||||||
selectedIcon: selectedIcon,
|
selectedIcon: selectedIcon,
|
||||||
unselectedIcon: unselectedIcon,
|
unselectedIcon: unselectedIcon,
|
||||||
|
onTabCloseButton: () {
|
||||||
|
debugPrint("onTabCloseButton");
|
||||||
|
tabController.jumpBy(peerId);
|
||||||
|
clientClose(ffi(peerId).dialogManager);
|
||||||
|
},
|
||||||
page: Obx(() => RemotePage(
|
page: Obx(() => RemotePage(
|
||||||
key: ValueKey(peerId),
|
key: ValueKey(peerId),
|
||||||
id: peerId,
|
id: peerId,
|
||||||
@ -69,6 +76,11 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
label: id,
|
label: id,
|
||||||
selectedIcon: selectedIcon,
|
selectedIcon: selectedIcon,
|
||||||
unselectedIcon: unselectedIcon,
|
unselectedIcon: unselectedIcon,
|
||||||
|
onTabCloseButton: () {
|
||||||
|
debugPrint("onTabCloseButton");
|
||||||
|
tabController.jumpBy(id);
|
||||||
|
clientClose(ffi(id).dialogManager);
|
||||||
|
},
|
||||||
page: Obx(() => RemotePage(
|
page: Obx(() => RemotePage(
|
||||||
key: ValueKey(id),
|
key: ValueKey(id),
|
||||||
id: id,
|
id: id,
|
||||||
@ -95,7 +107,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
body: Obx(() => DesktopTab(
|
body: Obx(() => DesktopTab(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
showTabBar: fullscreen.isFalse,
|
showTabBar: fullscreen.isFalse,
|
||||||
onClose: () {
|
onWindowCloseButton: () {
|
||||||
tabController.clear();
|
tabController.clear();
|
||||||
},
|
},
|
||||||
tail: AddButton().paddingOnly(left: 10),
|
tail: AddButton().paddingOnly(left: 10),
|
||||||
|
@ -71,10 +71,10 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
backgroundColor: MyTheme.color(context).bg,
|
backgroundColor: MyTheme.color(context).bg,
|
||||||
body: DesktopTab(
|
body: DesktopTab(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
onClose: () {
|
onWindowCloseButton: () {
|
||||||
tabController.clear();
|
tabController.clear();
|
||||||
},
|
},
|
||||||
tail: AddButton().paddingOnly(left: 10),
|
tail: const AddButton().paddingOnly(left: 10),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -78,7 +78,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
backgroundColor: MyTheme.color(context).bg,
|
backgroundColor: MyTheme.color(context).bg,
|
||||||
body: DesktopTab(
|
body: DesktopTab(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
onClose: () {
|
onWindowCloseButton: () {
|
||||||
tabController.clear();
|
tabController.clear();
|
||||||
},
|
},
|
||||||
tail: AddButton().paddingOnly(left: 10),
|
tail: AddButton().paddingOnly(left: 10),
|
||||||
@ -88,7 +88,6 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onRemoveId(String id) {
|
void onRemoveId(String id) {
|
||||||
ffi("pf_$id").close();
|
|
||||||
if (tabController.state.value.tabs.isEmpty) {
|
if (tabController.state.value.tabs.isEmpty) {
|
||||||
WindowController.fromWindowId(windowId()).hide();
|
WindowController.fromWindowId(windowId()).hide();
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,8 @@ class TabInfo {
|
|||||||
final String label;
|
final String label;
|
||||||
final IconData? selectedIcon;
|
final IconData? selectedIcon;
|
||||||
final IconData? unselectedIcon;
|
final IconData? unselectedIcon;
|
||||||
final bool closable;
|
final bool closable; //
|
||||||
|
final VoidCallback? onTabCloseButton;
|
||||||
final Widget page;
|
final Widget page;
|
||||||
|
|
||||||
TabInfo(
|
TabInfo(
|
||||||
@ -33,6 +34,7 @@ class TabInfo {
|
|||||||
this.selectedIcon,
|
this.selectedIcon,
|
||||||
this.unselectedIcon,
|
this.unselectedIcon,
|
||||||
this.closable = true,
|
this.closable = true,
|
||||||
|
this.onTabCloseButton,
|
||||||
required this.page});
|
required this.page});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,16 +139,23 @@ class DesktopTabController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void jumpBy(String key) {
|
||||||
|
if (!isDesktop) return;
|
||||||
|
final index = state.value.tabs.indexWhere((tab) => tab.key == key);
|
||||||
|
jumpTo(index);
|
||||||
|
}
|
||||||
|
|
||||||
void closeBy(String? key) {
|
void closeBy(String? key) {
|
||||||
if (!isDesktop) return;
|
if (!isDesktop) return;
|
||||||
|
debugPrint("closeBy: $key");
|
||||||
assert(onRemove != null);
|
assert(onRemove != null);
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
if (state.value.selected < state.value.tabs.length) {
|
if (state.value.selected < state.value.tabs.length) {
|
||||||
remove(state.value.selected);
|
remove(state.value.selected);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
state.value.tabs.indexWhere((tab) => tab.key == key);
|
final index = state.value.tabs.indexWhere((tab) => tab.key == key);
|
||||||
remove(state.value.selected);
|
remove(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +184,7 @@ class DesktopTab extends StatelessWidget {
|
|||||||
final bool showClose;
|
final bool showClose;
|
||||||
final Widget Function(Widget pageView)? pageViewBuilder;
|
final Widget Function(Widget pageView)? pageViewBuilder;
|
||||||
final Widget? tail;
|
final Widget? tail;
|
||||||
final VoidCallback? onClose;
|
final VoidCallback? onWindowCloseButton;
|
||||||
final TabBuilder? tabBuilder;
|
final TabBuilder? tabBuilder;
|
||||||
final LabelGetter? labelGetter;
|
final LabelGetter? labelGetter;
|
||||||
|
|
||||||
@ -196,7 +205,7 @@ class DesktopTab extends StatelessWidget {
|
|||||||
this.showClose = true,
|
this.showClose = true,
|
||||||
this.pageViewBuilder,
|
this.pageViewBuilder,
|
||||||
this.tail,
|
this.tail,
|
||||||
this.onClose,
|
this.onWindowCloseButton,
|
||||||
this.tabBuilder,
|
this.tabBuilder,
|
||||||
this.labelGetter,
|
this.labelGetter,
|
||||||
}) : super(key: key) {
|
}) : super(key: key) {
|
||||||
@ -333,7 +342,7 @@ class DesktopTab extends StatelessWidget {
|
|||||||
showMinimize: showMinimize,
|
showMinimize: showMinimize,
|
||||||
showMaximize: showMaximize,
|
showMaximize: showMaximize,
|
||||||
showClose: showClose,
|
showClose: showClose,
|
||||||
onClose: onClose,
|
onClose: onWindowCloseButton,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -511,7 +520,13 @@ class _ListView extends StatelessWidget {
|
|||||||
unselectedIcon: tab.unselectedIcon,
|
unselectedIcon: tab.unselectedIcon,
|
||||||
closable: tab.closable,
|
closable: tab.closable,
|
||||||
selected: state.value.selected,
|
selected: state.value.selected,
|
||||||
onClose: () => controller.remove(index),
|
onClose: () {
|
||||||
|
if (tab.onTabCloseButton != null) {
|
||||||
|
tab.onTabCloseButton!();
|
||||||
|
} else {
|
||||||
|
controller.remove(index);
|
||||||
|
}
|
||||||
|
},
|
||||||
onSelected: () => controller.jumpTo(index),
|
onSelected: () => controller.jumpTo(index),
|
||||||
tabBuilder: tabBuilder == null
|
tabBuilder: tabBuilder == null
|
||||||
? null
|
? null
|
||||||
|
Loading…
x
Reference in New Issue
Block a user