import 'package:fis_common/index.dart'; import 'package:fis_ui/values/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vitalapp/components/dynamic_drawer.dart'; import 'package:vitalapp/pages/admin/blank_door.dart'; import 'package:vitalapp/pages/home/controller.dart'; import 'package:vitalapp/pages/home/widgets/avatar.dart'; import 'package:fis_common/helpers/color.dart'; import 'package:vitalapp/pages/settings/center/controller.dart'; import 'package:vitalapp/pages/settings/center/view.dart'; import 'package:vitalapp/pages/settings/devices/controller.dart'; import 'package:vitalapp/pages/settings/server/controller.dart'; import 'package:vitalapp/pages/widgets/qr_view_example.dart'; import 'widgets/menus.dart'; import 'widgets/navigator.dart'; import 'widgets/patient.dart'; import 'widgets/status_bar.dart'; import 'widgets/title_bar_buttons.dart'; class HomePage extends GetView { const HomePage({super.key}); @override Widget build(BuildContext context) { return SafeArea( top: false, bottom: false, right: false, left: false, // maintainBottomViewPadding: true, child: LayoutBuilder( builder: (context, c) { return WillPopScope( onWillPop: () async { return false; }, child: Scaffold( key: controller.homeScaffoldKey, // resizeToAvoidBottomInset: false, backgroundColor: const Color.fromRGBO(238, 238, 238, 1), endDrawer: VDynamicDrawerWrapper( scaffoldKey: controller.homeScaffoldKey, ), body: Row( mainAxisSize: MainAxisSize.max, children: [ // Expanded(child: _buildBody(context)), SizedBox( width: c.maxWidth, child: _buildBody(context), ), ], )), ); }, ), ); } Widget _buildBody(BuildContext context) { Widget leftMenus = SizedBox(); if (controller.state.menuItems.length != 1) leftMenus = _buildMenu(context); return Row( mainAxisSize: MainAxisSize.max, children: [ leftMenus, Container( color: Theme.of(context).primaryColor, child: VerticalDivider( width: 1, color: Colors.white.withOpacity(.4), ), ), Expanded( child: Column( children: [ SizedBox( height: 60, child: _buildHeader(context), ), Expanded( child: Row( children: [ Expanded( child: _buildContent(), ), ], ), ), ], ), ), ], ); } Widget _buildMenu(BuildContext context) { final menuScrollController = ScrollController(); return Container( width: kIsWeb ? 100 : 120, decoration: BoxDecoration( gradient: LinearGradient( colors: [ Theme.of(context).primaryColor, FColorHelper.mixColor( Colors.black, Theme.of(context).primaryColor, 50, ), ], begin: Alignment.bottomRight, end: Alignment.topLeft, ), ), child: Stack( children: [ Positioned( bottom: 0, left: 0, right: 0, child: Opacity( opacity: 0.5, child: Image.asset( "assets/images/e_hospital.png", fit: BoxFit.fitWidth, ), ), ), Column( mainAxisSize: MainAxisSize.max, children: [ SizedBox( height: 90, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx( () => HomeAvatarWidget( size: 40, headImageToken: controller.state.headImageToken, ), ), const SizedBox( height: 8, ), Obx( () => Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: Text( controller.state.doctorName, style: const TextStyle( color: Colors.white, fontSize: 16, ), overflow: TextOverflow.ellipsis, ), ), ), ], ), ), Divider( color: Colors.white.withOpacity(.4), height: 1, indent: 30, endIndent: 30, ), const SizedBox( height: 8, ), Expanded( child: Obx( () { return HomeMenuListViewWidget( source: controller.state.menuItems, scrollerController: menuScrollController, currentSelectMenu: controller.state.currentSelectMenu, ); }, ), ), ], ), ], ), ); } Widget _buildContent() { return Padding( padding: EdgeInsets.all(8), child: HomeNavigator(), // child: Container( // color: Colors.white, // child: HomeNavigator(), // ), ); } Widget _buildHeader(BuildContext context) { final themeData = Theme.of(context); return Container( alignment: Alignment.center, decoration: BoxDecoration( gradient: LinearGradient( colors: [ // Color.fromRGBO(59, 188, 255, 1), // Color.fromRGBO(44, 120, 229, 1), themeData.primaryColor.withOpacity(.6), themeData.primaryColor, ], begin: Alignment.topRight, end: Alignment.bottomLeft, ), ), child: Center( child: kIsWeb ? GestureDetector( onPanStart: (event) { controller.onStartDrag(); }, onPanEnd: (e) { controller.onEndDrag(); }, onDoubleTap: () { controller.onMaximize(); }, onPanCancel: () { controller.onEndDrag(); }, child: _buildWindowTitle(context), ) : _buildWindowTitle(context), ), ); } Widget _buildHeaderLeft() { Widget headerLeft = SizedBox(); if (controller.state.menuItems.length != 1) { headerLeft = Text( controller.state.doctorTeamName, style: const TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ), ); } else { headerLeft = Row( children: [ Obx( () => HomeAvatarWidget( size: 40, headImageToken: controller.state.headImageToken, ), ), const SizedBox(width: 16), Text( controller.state.doctorTeamName, style: const TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(width: 5), Obx( () => Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: Text( "(${controller.state.doctorName})", style: const TextStyle( color: Colors.white, fontSize: 16, ), overflow: TextOverflow.ellipsis, ), ), ), ], ); } return Row( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ const SizedBox(width: 16), headerLeft, if (kIsWeb) Expanded( child: Container( color: Colors.transparent, height: 60, ), ), ], ); } Widget _buildHeaderCenter() { return Row( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ const SizedBox(width: 10), if (kIsWeb) Expanded( child: Container( color: Colors.transparent, height: 60, ), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( onTap: () async { BlankDoor.tryOpen(); }, child: const Text( "杏聆荟健康平台", style: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, ), ), ), ], ), if (kIsWeb) Expanded( child: Container( color: Colors.transparent, height: 60, ), ), ], ); } Widget _buildHeaderRight(BuildContext context) { return Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ if (kIsWeb) Expanded( child: Container( color: Colors.transparent, height: 60, ), ), Obx(() { print("currentRouter" + controller.state.currentSelectMenu); String currentRouter = controller.state.currentSelectMenu; if ([ "/basicCheck", "/electrocardiogram", "/ncg", "/bloodTest", "/biochemistryTest", "/remedicalRecordView", "/TraditionalChineseMedicineConstitution" ].contains(currentRouter) && !kIsWeb) { return IconButton( onPressed: () { // Get.to( // CameraExampleHome(), // ); // Get.to( // BarcodeScannerPage( // mode: BarcodeScannerMode.barcode, // ), // ); Get.to( () => QRViewExample( onScanSuccess: controller.onScanData, isBarcode: true, ), ); }, icon: Icon( FIcons.fis_scan, size: 40, color: Colors.white, ), ); } return SizedBox(); }), HeaderPatientPlace(), Padding( padding: EdgeInsets.symmetric(horizontal: 8), child: VerticalDivider( indent: 12, endIndent: 12, color: Colors.white, ), ), if (!kIsWeb) ...[ HeaderStatusBar(), ], Center( child: IconButton( padding: EdgeInsets.all(0), onPressed: () async { if (!kIsWeb) { Get.lazyPut(() => DevicesSettingController()); } Get.lazyPut(() => ServerSettingController()); Get.lazyPut(() => SettingCenterController()); await Get.to( Container( child: SettingCenterPage(), color: Colors.white, ), ); String currentRouter = controller.state.currentSelectMenu; controller.switchNavByName(currentRouter); }, icon: Icon( Icons.settings, color: Colors.white, size: 36, ), ), ), if (FPlatform.isWindows) ...[ Padding( padding: EdgeInsets.symmetric(horizontal: 8), child: VerticalDivider( indent: 12, endIndent: 12, color: Colors.white, ), ), TitleBarButtons( controller.onMinimize, controller.onWindowClose, controller.onMaximize, Colors.white, Colors.transparent, ), ] ], ); } Widget _buildWindowTitle(BuildContext context) { return Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( flex: 4, child: Align( alignment: Alignment.centerLeft, child: _buildHeaderLeft(), ), ), Flexible( flex: 4, child: Align( alignment: Alignment.center, child: _buildHeaderCenter(), ), ), Expanded( flex: 6, child: Align( alignment: Alignment.centerRight, child: _buildHeaderRight(context), ), ), ], ); } }