2022-05-29 17:19:50 +08:00
import ' dart:convert ' ;
2022-08-09 16:37:11 +08:00
import ' package:desktop_multi_window/desktop_multi_window.dart ' ;
2022-05-29 17:19:50 +08:00
import ' package:flutter/material.dart ' ;
2022-06-28 22:04:10 +08:00
import ' package:flutter_hbb/common.dart ' ;
2022-08-03 15:31:19 +08:00
import ' package:flutter_hbb/consts.dart ' ;
2022-05-29 17:19:50 +08:00
import ' package:flutter_hbb/desktop/pages/remote_page.dart ' ;
2022-08-06 17:08:48 +08:00
import ' package:flutter_hbb/desktop/widgets/tabbar_widget.dart ' ;
2022-05-29 17:19:50 +08:00
import ' package:flutter_hbb/utils/multi_window_manager.dart ' ;
2022-06-28 22:04:10 +08:00
import ' package:get/get.dart ' ;
import ' ../../models/model.dart ' ;
2022-05-29 17:19:50 +08:00
class ConnectionTabPage extends StatefulWidget {
final Map < String , dynamic > params ;
const ConnectionTabPage ( { Key ? key , required this . params } ) : super ( key: key ) ;
@ override
State < ConnectionTabPage > createState ( ) = > _ConnectionTabPageState ( params ) ;
}
2022-08-18 10:54:09 +08:00
class _ConnectionTabPageState extends State < ConnectionTabPage > {
2022-05-29 17:19:50 +08:00
// refactor List<int> when using multi-tab
// this singleton is only for test
2022-08-11 18:08:35 +08:00
RxList < TabInfo > tabs = RxList < TabInfo > . empty ( growable: true ) ;
2022-08-16 20:48:36 +08:00
static final Rx < String > _fullscreenID = " " . obs ;
2022-08-18 10:54:09 +08:00
final IconData selectedIcon = Icons . desktop_windows_sharp ;
final IconData unselectedIcon = Icons . desktop_windows_outlined ;
2022-08-05 10:27:06 +08:00
var connectionMap = RxList < Widget > . empty ( growable: true ) ;
2022-05-29 17:19:50 +08:00
_ConnectionTabPageState ( Map < String , dynamic > params ) {
2022-05-31 16:27:54 +08:00
if ( params [ ' id ' ] ! = null ) {
2022-08-18 10:54:09 +08:00
tabs . add ( TabInfo (
2022-08-22 20:18:31 +08:00
key: params [ ' id ' ] ,
2022-08-18 10:54:09 +08:00
label: params [ ' id ' ] ,
selectedIcon: selectedIcon ,
unselectedIcon: unselectedIcon ) ) ;
2022-05-31 16:27:54 +08:00
}
2022-05-29 17:19:50 +08:00
}
@ override
void initState ( ) {
super . initState ( ) ;
rustDeskWinManager . setMethodHandler ( ( call , fromWindowId ) async {
print (
" call ${ call . method } with args ${ call . arguments } from window ${ fromWindowId } " ) ;
// for simplify, just replace connectionId
if ( call . method = = " new_remote_desktop " ) {
2022-08-05 10:27:06 +08:00
final args = jsonDecode ( call . arguments ) ;
final id = args [ ' id ' ] ;
2022-08-09 19:32:19 +08:00
window_on_top ( windowId ( ) ) ;
2022-08-18 10:54:09 +08:00
DesktopTabBar . onAdd (
tabs ,
TabInfo (
2022-08-22 20:18:31 +08:00
key: id ,
2022-08-18 10:54:09 +08:00
label: id ,
selectedIcon: selectedIcon ,
unselectedIcon: unselectedIcon ) ) ;
2022-06-28 22:04:10 +08:00
} else if ( call . method = = " onDestroy " ) {
2022-08-11 18:08:35 +08:00
print (
" executing onDestroy hook, closing ${ tabs . map ( ( tab ) = > tab . label ) . toList ( ) } " ) ;
tabs . forEach ( ( tab ) {
final tag = ' ${ tab . label } ' ;
2022-06-28 22:04:10 +08:00
ffi ( tag ) . close ( ) . then ( ( _ ) {
Get . delete < FFI > ( tag: tag ) ;
} ) ;
} ) ;
Get . back ( ) ;
2022-05-29 17:19:50 +08:00
}
} ) ;
}
@ override
Widget build ( BuildContext context ) {
2022-08-22 13:51:05 +08:00
return SubWindowDragToResizeArea (
windowId: windowId ( ) ,
2022-08-22 17:58:48 +08:00
child: Container (
decoration: BoxDecoration (
border: Border . all ( color: MyTheme . color ( context ) . border ! ) ) ,
child: Scaffold (
backgroundColor: MyTheme . color ( context ) . bg ,
body: Column (
children: [
Obx ( ( ) = > Visibility (
visible: _fullscreenID . value . isEmpty ,
child: DesktopTabBar (
tabs: tabs ,
onTabClose: onRemoveId ,
dark: isDarkTheme ( ) ,
mainTab: false ,
) ) ) ,
Expanded ( child: Obx ( ( ) {
WindowController . fromWindowId ( windowId ( ) )
. setFullscreen ( _fullscreenID . value . isNotEmpty ) ;
return PageView (
controller: DesktopTabBar . controller . value ,
children: tabs
. map ( ( tab ) = > RemotePage (
key: ValueKey ( tab . label ) ,
id: tab . label ,
tabBarHeight: _fullscreenID . value . isNotEmpty
? 0
: kDesktopRemoteTabBarHeight ,
fullscreenID: _fullscreenID ,
) ) //RemotePage(key: ValueKey(e), id: e))
. toList ( ) ) ;
} ) ) ,
] ,
) ,
2022-08-22 13:51:05 +08:00
) ,
2022-05-31 16:27:54 +08:00
) ,
2022-05-29 17:19:50 +08:00
) ;
}
2022-05-31 16:27:54 +08:00
void onRemoveId ( String id ) {
2022-08-16 22:15:45 +08:00
ffi ( id ) . close ( ) ;
2022-08-11 18:08:35 +08:00
if ( tabs . length = = 0 ) {
2022-08-09 16:37:11 +08:00
WindowController . fromWindowId ( windowId ( ) ) . close ( ) ;
2022-08-09 09:01:06 +08:00
}
2022-05-31 16:27:54 +08:00
}
2022-08-09 16:37:11 +08:00
int windowId ( ) {
return widget . params [ " windowId " ] ;
}
2022-05-29 17:19:50 +08:00
}