diff --git a/lib/modules/meeting/controllers/meeting_controller.dart b/lib/modules/meeting/controllers/meeting_controller.dart index 6f07ab900..01317e29a 100644 --- a/lib/modules/meeting/controllers/meeting_controller.dart +++ b/lib/modules/meeting/controllers/meeting_controller.dart @@ -367,8 +367,9 @@ class MeetingController extends GetxController { } // 修改标题 - void editMeetingTitle(int id, String title) async { - if (title.isNotEmpty) { + void editMeetingTitle(int id) async { + if (titleController.text.isNotEmpty) { + String title = titleController.text + titleCSuffix; SqfliteApi.editMeetingTitle(id, {'title': title}); int index = dataList.indexWhere((item) => item['id'] == id); if (index != -1) { diff --git a/lib/modules/meeting/views/ai_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart similarity index 98% rename from lib/modules/meeting/views/ai_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart index 94b578219..06977d83f 100644 --- a/lib/modules/meeting/views/ai_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart @@ -5,9 +5,9 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../../../data/services/db/sqflite_api.dart'; -import '../../../data/services/deapsound_ai_service.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../../../../data/services/db/sqflite_api.dart'; +import '../../../../data/services/deapsound_ai_service.dart'; +import '../../controllers/meeting_details_controller.dart'; class AIBottomSheet extends StatefulWidget { const AIBottomSheet({super.key}); diff --git a/lib/modules/meeting/views/bottomSheet/edit_title_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/edit_title_bottom_sheet.dart new file mode 100644 index 000000000..dc964d23e --- /dev/null +++ b/lib/modules/meeting/views/bottomSheet/edit_title_bottom_sheet.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../controllers/meeting_controller.dart'; + +class EditTitleBottomSheet extends GetView { + final int id; + + const EditTitleBottomSheet(this.id, {super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'editMeetingTitle'.tr, // 编辑会议标题 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + Container( + height: 48.w, + margin: EdgeInsets.symmetric(vertical: 20.w), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: TextField( + controller: controller.titleController, + style: TextStyle( + color: Colors.black87, + fontSize: 16.sp, + ), + decoration: InputDecoration( + hintText: 'maxCharacters'.tr, + hintStyle: TextStyle( + color: Colors.black54, + fontSize: 16.sp, + ), + fillColor: Colors.transparent, + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(horizontal: 10.w), + ), + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => Get.back(), + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + controller.editMeetingTitle(id); + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'confirm'.tr, // 确认 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart b/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart new file mode 100644 index 000000000..bb843c478 --- /dev/null +++ b/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class FiltrateDrawer extends StatelessWidget { + const FiltrateDrawer({super.key}); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(20.w), + child: TextField( + decoration: InputDecoration( + hintText: '在所有文件中搜索', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.w), + borderSide: BorderSide.none, + ), + filled: true, + fillColor: Colors.grey[100], + contentPadding: EdgeInsets.zero, + ), + ), + ), + ListTile( + leading: Icon(Icons.folder, color: Colors.red), + title: + Text('全部文件(4)', style: TextStyle(fontWeight: FontWeight.bold)), + onTap: () {}, + ), + ListTile( + leading: Icon(Icons.category, color: Colors.blue), + title: Text('未分类(4)'), + onTap: () {}, + ), + ListTile( + leading: Icon(Icons.delete, color: Colors.teal), + title: Text('回收站'), + onTap: () {}, + ), + Divider(), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), + child: Text('文件夹', style: TextStyle(color: Colors.grey)), + ), + ...['NOTE', 'CALL', 'NotePin', 'Import', 'Desktop'] + .map((name) => ListTile( + title: Text(name), + onTap: () {}, + )), + Divider(), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), + child: Text('排序方式', style: TextStyle(color: Colors.grey)), + ), + ListTile( + title: Text('创建时间'), + trailing: Icon(Icons.arrow_upward), + onTap: () {}, + ), + ListTile( + title: Text('修改时间'), + trailing: Icon(Icons.arrow_upward), + onTap: () {}, + ), + ], + ), + ); + } +} diff --git a/lib/modules/meeting/views/generate_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart similarity index 99% rename from lib/modules/meeting/views/generate_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart index 24fd91c60..436cfe930 100644 --- a/lib/modules/meeting/views/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart @@ -1,12 +1,12 @@ -import '../../../data/services/db/sqflite_api.dart'; +import '../../../../data/services/db/sqflite_api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../../controllers/meeting_details_controller.dart'; import 'record_language_bottom_sheet.dart'; -import 'template_view.dart'; +import '../template_view.dart'; class GenerateBottomSheet extends StatefulWidget { final bool isSummarizeAgain; diff --git a/lib/modules/meeting/views/bottomSheet/import_audio_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/import_audio_bottom_sheet.dart new file mode 100644 index 000000000..1b94778f2 --- /dev/null +++ b/lib/modules/meeting/views/bottomSheet/import_audio_bottom_sheet.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../routes/app_routes.dart'; +import '../../controllers/meeting_controller.dart'; + +class ImportAudioBottomSheet extends GetView { + const ImportAudioBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '添加音频', + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + SizedBox(height: 16.w), + _importAudioItem(Icons.mic, '现场录音', onTap: () async { + Get.back(); + await Get.toNamed(Routes.meetingRecord, arguments: { + 'audioTypes': 0, + }); + controller.addMeetingAudio(); + }), + _importAudioItem( + Icons.videocam, + '音、视频录音', + onTap: controller.bleManager.isConnected + ? () async { + Get.back(); + await Get.toNamed(Routes.meetingRecord, arguments: { + 'audioTypes': 1, + }); + controller.addMeetingAudio(); + } + : null, + ), + _importAudioItem( + Icons.phone, + '通话录音', + onTap: controller.bleManager.isConnected + ? () async { + Get.back(); + await Get.toNamed(Routes.meetingRecord, arguments: { + 'audioTypes': 2, + }); + controller.addMeetingAudio(); + } + : null, + ), + _importAudioItem(Icons.library_music, '导入本地音频', onTap: () { + Get.back(); + controller.addAudio(); + }), + Padding( + padding: EdgeInsets.symmetric(vertical: 16.w), + child: Text( + '支持导入单文件时长不超过5小时的音频', + style: TextStyle( + fontSize: 14.sp, + color: Colors.grey[600], + ), + ), + ), + SizedBox(height: 4.w), + ], + ), + ); + } + + Widget _importAudioItem( + IconData icon, + String title, { + VoidCallback? onTap, + }) { + return GestureDetector( + onTap: onTap, + child: Container( + height: 48.w, + padding: EdgeInsets.symmetric(horizontal: 12.w), + margin: EdgeInsets.symmetric(vertical: 4.w), + decoration: BoxDecoration( + color: Colors.grey[50]!.withOpacity(onTap != null ? 1 : 0.5), + borderRadius: BorderRadius.circular(12.w), + ), + child: Row( + children: [ + Opacity( + opacity: onTap != null ? 1.0 : 0.5, + child: Icon(icon, size: 20.w), + ), + 10.horizontalSpace, + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + color: Colors.black87.withOpacity(onTap != null ? 1 : 0.5), + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 16.w, + color: Colors.grey.withOpacity(onTap != null ? 1 : 0.5), + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/meeting/views/more_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart similarity index 96% rename from lib/modules/meeting/views/more_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart index db1a92dff..e2fd34257 100644 --- a/lib/modules/meeting/views/more_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../controllers/meeting_controller.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../../controllers/meeting_controller.dart'; +import '../../controllers/meeting_details_controller.dart'; import 'generate_bottom_sheet.dart'; class MoreBottomSheet extends StatefulWidget { diff --git a/lib/modules/meeting/views/record_language_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart similarity index 100% rename from lib/modules/meeting/views/record_language_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart diff --git a/lib/modules/meeting/views/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart similarity index 98% rename from lib/modules/meeting/views/share_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index bc59fd5bf..0936a5636 100644 --- a/lib/modules/meeting/views/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -11,9 +11,9 @@ import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../../../core/utils/synchrodata.dart'; -import '../controllers/meeting_details_controller.dart'; -import '../controllers/mind_map_controller.dart'; +import '../../../../core/utils/synchrodata.dart'; +import '../../controllers/meeting_details_controller.dart'; +import '../../controllers/mind_map_controller.dart'; class ShareBottomSheet extends StatefulWidget { const ShareBottomSheet({super.key}); diff --git a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart similarity index 99% rename from lib/modules/meeting/views/speaker_all_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart index 1d7a7c03b..0134569d5 100644 --- a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart @@ -8,9 +8,9 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:lottie/lottie.dart'; -import '../../../core/utils/synchrodata.dart'; -import '../../../data/services/db/sqflite_api.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../../../../core/utils/synchrodata.dart'; +import '../../../../data/services/db/sqflite_api.dart'; +import '../../controllers/meeting_details_controller.dart'; class SpeakerAllBottomSheet extends StatefulWidget { const SpeakerAllBottomSheet({super.key}); diff --git a/lib/modules/meeting/views/speaker_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart similarity index 98% rename from lib/modules/meeting/views/speaker_bottom_sheet.dart rename to lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart index 2e814e26f..9f9e02f68 100644 --- a/lib/modules/meeting/views/speaker_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart @@ -6,9 +6,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import '../../../core/utils/synchrodata.dart'; -import '../../../data/services/db/sqflite_api.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../../../../core/utils/synchrodata.dart'; +import '../../../../data/services/db/sqflite_api.dart'; +import '../../controllers/meeting_details_controller.dart'; class SpeakerBottomSheet extends StatefulWidget { final int id; diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index 79640b2a6..dd73a4bba 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -9,12 +9,12 @@ import 'package:lottie/lottie.dart'; import '../../../core/theme/app_colors.dart'; import '../controllers/meeting_details_controller.dart'; -import 'mind_map_tab.dart'; -import 'more_bottom_sheet.dart'; -import 'overview_tab.dart'; -import 'share_bottom_sheet.dart'; -import 'speech_tab.dart'; -import 'summary_tab.dart'; +import 'tabs/mind_map_tab.dart'; +import 'bottomSheet/more_bottom_sheet.dart'; +import 'tabs/overview_tab.dart'; +import 'bottomSheet/share_bottom_sheet.dart'; +import 'tabs/speech_tab.dart'; +import 'tabs/summary_tab.dart'; class MeetingDetailsView extends GetView { const MeetingDetailsView({super.key}); diff --git a/lib/modules/meeting/views/meeting_view.dart b/lib/modules/meeting/views/meeting_view.dart index 3864ba4ec..0f333450e 100644 --- a/lib/modules/meeting/views/meeting_view.dart +++ b/lib/modules/meeting/views/meeting_view.dart @@ -8,34 +8,68 @@ import '../../../core/theme/app_colors.dart'; import '../../../routes/app_routes.dart'; import '../controllers/meeting_controller.dart'; import '../model/meeting_model.dart'; +import 'bottomSheet/edit_title_bottom_sheet.dart'; +import 'bottomSheet/filtrate_drawer.dart'; +import 'bottomSheet/import_audio_bottom_sheet.dart'; class MeetingView extends GetView { const MeetingView({super.key}); @override Widget build(BuildContext context) { + final GlobalKey scaffoldKey = GlobalKey(); final isDarkMode = Theme.of(context).brightness == Brightness.dark; return PopScope( onPopInvokedWithResult: controller.onPopInvokedWithResult, child: Scaffold( + key: scaffoldKey, backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], - appBar: _buildAppBar(context, isDarkMode), - body: Stack( + appBar: _buildAppBar(isDarkMode), + drawer: Drawer( + width: 260.w, + child: const FiltrateDrawer(), + ), + drawerEnableOpenDragGesture: false, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - // _buildConnect(isDarkMode), - Expanded( - child: _buildBody(context, isDarkMode), + IconButton( + icon: Icon( + Icons.folder_open, + color: isDarkMode ? Colors.white : Colors.black, + ), + onPressed: () { + scaffoldKey.currentState?.openDrawer(); + }, ), + _buildConnect(isDarkMode), ], ), - _buildMicButton(context, isDarkMode), + Expanded( + child: _buildBody(context, isDarkMode), + ), ], ), - // floatingActionButton: _buildFloatingButtons(), + floatingActionButton: FloatingActionButton( + heroTag: "addAudio", + onPressed: () { + Get.bottomSheet( + const ImportAudioBottomSheet(), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ); + }, + child: const Icon(Icons.add), + ), ), ); } @@ -96,339 +130,8 @@ class MeetingView extends GetView { ); } - /// 构建底部中间的录音按钮 - Widget _buildMicButton(BuildContext context, bool isDarkMode) { - return Positioned( - bottom: 20, - left: 0, - right: 0, - child: Center( - child: FloatingActionButton( - heroTag: "recordAudio", - onPressed: () { - _showStartsRecordSheet(context, isDarkMode); - }, - child: const Icon(Icons.mic), - ), - ), - ); - } - - /// 构建右下角的悬浮按钮 - Widget _buildFloatingButtons() { - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - FloatingActionButton( - heroTag: "addAudio", - onPressed: () { - controller.addAudio(); - }, - child: const Icon(Icons.add), - ), - ], - ); - } - -// 开始录音弹窗 - void _showStartsRecordSheet(BuildContext context, bool isDarkMode) { - showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) { - return Container( - decoration: BoxDecoration( - color: isDarkMode ? Colors.grey[900] : Colors.white, - borderRadius: BorderRadius.vertical(top: Radius.circular(18.w)), - ), - padding: EdgeInsets.only( - left: 0, - right: 0, - top: 12.w, - bottom: MediaQuery.of(context).viewInsets.bottom + 12.w, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - alignment: Alignment.centerLeft, - padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 8.w), - child: Text( - '开始录音', - style: TextStyle( - fontSize: 18.sp, - fontWeight: FontWeight.bold, - color: isDarkMode ? Colors.white : Colors.black87, - ), - ), - ), - Divider( - height: 1, - color: isDarkMode ? Colors.white12 : Colors.grey[200]), - // 选项列表 - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), - child: Column( - children: [ - // 现场录音 - 始终可用 - _importAudioItem( - context, - isDarkMode, - icon: Icon(Icons.mic, size: 25.w), - title: '现场录音', - enabled: true, // 始终可用 - onTap: () async { - Navigator.of(context).pop(); - await Get.toNamed(Routes.meetingRecord, arguments: { - 'audioTypes': 0, - }); - controller.addMeetingAudio(); - }, - ), - SizedBox(height: 8.w), - // 音、视频录音 - 根据控制器状态禁用 - _importAudioItem( - context, isDarkMode, - icon: Icon(Icons.videocam, size: 25.w), - title: '音、视频录音', - enabled: controller.bleManager.isConnected, // 依赖控制器状态 - onTap: controller.bleManager.isConnected - ? () async { - // 条件启用 - Navigator.of(context).pop(); - await Get.toNamed(Routes.meetingRecord, - arguments: { - 'audioTypes': 1, - }); - controller.addMeetingAudio(); - } - : null, // 禁用时置空onTap - ), - SizedBox(height: 8.w), - // 通话录音 - 根据控制器状态禁用 - _importAudioItem( - context, isDarkMode, - icon: Icon(Icons.phone, size: 25.w), - title: '通话录音', - enabled: controller.bleManager.isConnected, // 依赖控制器状态 - onTap: controller.bleManager.isConnected - ? () async { - // 条件启用 - Navigator.of(context).pop(); - await Get.toNamed(Routes.meetingRecord, - arguments: { - 'audioTypes': 2, - }); - controller.addMeetingAudio(); - } - : null, // 禁用时置空onTap - ), - SizedBox(height: 8.w), - _importAudioItem( - context, - isDarkMode, - icon: Icon(Icons.library_music, size: 25.w), - title: '导入本地音频', - enabled: true, - onTap: () { - Get.back(); - controller.addAudio(); - }, - ), - ], - ), - ), - SizedBox(height: 8.w), - Padding( - padding: EdgeInsets.symmetric(horizontal: 20.w), - child: Text( - '支持导入单文件时长不超过5小时的音频', - style: TextStyle( - fontSize: 13.sp, - color: isDarkMode ? Colors.white54 : Colors.grey[600], - ), - ), - ), - SizedBox(height: 16.w), - GestureDetector( - onTap: () => Navigator.of(context).pop(), - child: Icon(Icons.close, size: 32.w, color: Colors.grey), - ), - SizedBox(height: 8.w), - ], - ), - ); - }, - ); - } - -// 选项框 (增加enabled参数) - Widget _importAudioItem( - BuildContext context, - bool isDarkMode, { - required Widget icon, - required String title, - required bool enabled, // 新增启用状态参数 - required VoidCallback? onTap, // 改为可空回调 - }) { - return Material( - color: Colors.transparent, - child: InkWell( - borderRadius: BorderRadius.circular(12.w), - onTap: onTap, // 禁用时onTap为null - child: Container( - height: 52.w, - padding: EdgeInsets.symmetric(horizontal: 12.w), - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withOpacity(enabled ? 0.03 : 0.01) // 调整禁用透明度 - : Colors.grey[50]!.withOpacity(enabled ? 1 : 0.5), - borderRadius: BorderRadius.circular(12.w), - ), - child: Row( - children: [ - // 图标添加透明度效果 - Opacity( - opacity: enabled ? 1.0 : 0.5, - child: icon, - ), - SizedBox(width: 14.w), - Expanded( - child: Text( - title, - style: TextStyle( - fontSize: 16.sp, - color: isDarkMode - ? Colors.white.withOpacity(enabled ? 1 : 0.5) - : Colors.black87.withOpacity(enabled ? 1 : 0.5), - ), - ), - ), - Icon(Icons.arrow_forward_ios, - size: 18.w, - color: Colors.grey.withOpacity(enabled ? 1 : 0.5)), - ], - ), - ), - ), - ); - } - -// 新增右侧弹窗 - - void _showRightDrawerDialog(BuildContext context, bool isDarkMode) { - showGeneralDialog( - context: context, - barrierDismissible: true, - barrierLabel: "rightDrawer", - transitionDuration: const Duration(milliseconds: 300), - pageBuilder: (context, anim1, anim2) { - return Align( - alignment: Alignment.centerRight, - child: FractionallySizedBox( - widthFactor: 0.7, - child: Material( - color: Colors.transparent, - child: Container( - height: MediaQuery.of(context).size.height, - decoration: BoxDecoration( - color: isDarkMode ? Colors.white : Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(18.w), - bottomLeft: Radius.circular(18.w), - ), - ), - child: _buildDrawerContent(context, isDarkMode), - ), - ), - ), - ); - }, - transitionBuilder: (context, anim1, anim2, child) { - final offsetAnimation = Tween( - begin: const Offset(1, 0), - end: Offset.zero, - ).animate(CurvedAnimation(parent: anim1, curve: Curves.easeOutCubic)); - return SlideTransition( - position: offsetAnimation, - child: child, - ); - }, - ); - } - -// 侧边栏内容 - Widget _buildDrawerContent(BuildContext context, bool isDarkMode) { - return SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(20.w), - child: TextField( - decoration: InputDecoration( - hintText: '在所有文件中搜索', - prefixIcon: Icon(Icons.search), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12.w), - borderSide: BorderSide.none, - ), - filled: true, - fillColor: Colors.grey[100], - contentPadding: EdgeInsets.zero, - ), - ), - ), - ListTile( - leading: Icon(Icons.folder, color: Colors.red), - title: - Text('全部文件(4)', style: TextStyle(fontWeight: FontWeight.bold)), - onTap: () {}, - ), - ListTile( - leading: Icon(Icons.category, color: Colors.blue), - title: Text('未分类(4)'), - onTap: () {}, - ), - ListTile( - leading: Icon(Icons.delete, color: Colors.teal), - title: Text('回收站'), - onTap: () {}, - ), - Divider(), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), - child: Text('文件夹', style: TextStyle(color: Colors.grey)), - ), - ...['NOTE', 'CALL', 'NotePin', 'Import', 'Desktop'] - .map((name) => ListTile( - title: Text(name), - onTap: () {}, - )), - Divider(), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), - child: Text('排序方式', style: TextStyle(color: Colors.grey)), - ), - ListTile( - title: Text('创建时间'), - trailing: Icon(Icons.arrow_upward), - onTap: () {}, - ), - ListTile( - title: Text('修改时间'), - trailing: Icon(Icons.arrow_upward), - onTap: () {}, - ), - ], - ), - ); - } - // 构建应用栏 - PreferredSizeWidget _buildAppBar(BuildContext context, bool isDarkMode) { + PreferredSizeWidget _buildAppBar(bool isDarkMode) { return AppBar( backgroundColor: isDarkMode ? Colors.black : Colors.white, surfaceTintColor: Colors.transparent, @@ -450,15 +153,6 @@ class MeetingView extends GetView { ), ), centerTitle: true, - // actions: [ - // IconButton( - // icon: Icon(Icons.folder_open, - // color: isDarkMode ? Colors.white : Colors.black), - // onPressed: () { - // _showRightDrawerDialog(context, isDarkMode); - // }, - // ), - // ], ); } @@ -678,7 +372,16 @@ class MeetingView extends GetView { dotIndex != -1 ? data.title.substring(0, dotIndex) : data.title; controller.titleCSuffix = data.title.substring(dotIndex, data.title.length); - _bottomSheet(context, isDarkMode, data.id); + Get.bottomSheet( + EditTitleBottomSheet(data.id), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ); }, ), _popupMenuEntry( @@ -724,129 +427,6 @@ class MeetingView extends GetView { ); } - void _bottomSheet( - BuildContext context, - bool isDarkMode, - int id, - ) { - Get.bottomSheet( - Padding( - padding: MediaQuery.of(context).viewInsets, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), - color: isDarkMode ? AppColors.darkBackground : Colors.grey[50], - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'editMeetingTitle'.tr, // 编辑会议标题 - style: TextStyle( - color: isDarkMode ? Colors.white : Colors.black87, - fontSize: 16.sp, - ), - ), - Container( - height: 48.w, - margin: EdgeInsets.only(top: 10.w, bottom: 20.w), - alignment: Alignment.center, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withOpacity(0.05) - : Colors.white, - borderRadius: BorderRadius.circular(12.w), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withOpacity(0.2) - : Colors.black.withOpacity(0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: TextField( - controller: controller.titleController, - style: TextStyle( - color: isDarkMode ? Colors.white : Colors.black87, - fontSize: 16.sp, - ), - decoration: InputDecoration( - hintText: 'maxCharacters'.tr, - hintStyle: TextStyle( - color: isDarkMode ? Colors.white70 : Colors.black54, - fontSize: 16.sp, - ), - fillColor: Colors.transparent, - border: InputBorder.none, - contentPadding: EdgeInsets.symmetric(horizontal: 10.w), - ), - ), - ), - Padding( - padding: EdgeInsets.only(top: 30.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - GestureDetector( - onTap: () { - Get.back(); - }, - child: Container( - width: 120.w, - height: 40.w, - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border.all( - width: 2.w, - color: isDarkMode ? AppColors.primary : Colors.blue, - ), - borderRadius: BorderRadius.circular(12.w), - ), - child: Text( - 'cancel'.tr, // 取消 - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? AppColors.primary : Colors.blue, - ), - ), - ), - ), - GestureDetector( - onTap: () { - String title = controller.titleController.text + - controller.titleCSuffix; - controller.editMeetingTitle(id, title); - }, - child: Container( - width: 120.w, - height: 40.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: isDarkMode ? AppColors.primary : Colors.blue, - borderRadius: BorderRadius.circular(12.w), - ), - child: Text( - 'confirm'.tr, // 确认 - style: TextStyle( - color: Colors.white, - fontSize: 14.sp, - ), - ), - ), - ), - ], - ), - ), - ], - ), - ), - ), - isScrollControlled: true, - clipBehavior: Clip.hardEdge, - ); - } - String _formatDateSeconds(int seconds) { if (seconds < 60) { return '${seconds}s'; @@ -861,540 +441,4 @@ class MeetingView extends GetView { return '${hours}h ${remainingMinutes}m ${remainingSeconds}s'; } } - -// ...existing code... -// // 选项框 -// Widget _importAudioItem1( -// BuildContext context, -// bool isDarkMode, { -// required Widget icon, -// required String title, -// required VoidCallback onTap, -// }) { -// return Material( -// color: Colors.transparent, -// child: InkWell( -// borderRadius: BorderRadius.circular(12.w), -// onTap: onTap, -// child: Container( -// height: 52.w, -// padding: EdgeInsets.symmetric(horizontal: 12.w), -// decoration: BoxDecoration( -// color: -// isDarkMode ? Colors.white.withOpacity(0.03) : Colors.grey[50], -// borderRadius: BorderRadius.circular(12.w), -// ), -// child: Row( -// children: [ -// icon, -// SizedBox(width: 14.w), -// Expanded( -// child: Text( -// title, -// style: TextStyle( -// fontSize: 16.sp, -// color: isDarkMode ? Colors.white : Colors.black87, -// ), -// ), -// ), -// Icon(Icons.arrow_forward_ios, size: 18.w, color: Colors.grey), -// ], -// ), -// ), -// ), -// ); -// } - -// // 底部+号菜单 -// void _showAddAudioMenu(BuildContext context, bool isDarkMode) { -// showModalBottomSheet( -// context: context, -// isScrollControlled: true, -// backgroundColor: Colors.transparent, -// builder: (context) { -// return Padding( -// padding: EdgeInsets.only( -// bottom: MediaQuery.of(context).viewInsets.bottom + 30.w, -// left: 16.w, -// right: 16.w, -// ), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// children: [ -// // 录音按钮 -// Container( -// margin: EdgeInsets.only(bottom: 12.w), -// child: GestureDetector( -// onTap: () { -// Navigator.of(context).pop(); -// // TODO: 实现开始录音逻辑 -// _showStartsRecordSheet(context, isDarkMode); -// }, -// child: Container( -// height: 56.w, -// decoration: BoxDecoration( -// color: isDarkMode -// ? Colors.white.withOpacity(0.05) -// : Colors.grey[100], -// borderRadius: BorderRadius.circular(28.w), -// ), -// child: Row( -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Container( -// width: 36.w, -// height: 36.w, -// decoration: BoxDecoration( -// color: Colors.red.withOpacity(0.15), -// shape: BoxShape.circle, -// ), -// child: Icon(Icons.mic, color: Colors.red, size: 24.w), -// ), -// SizedBox(width: 12.w), -// Text( -// '开始录音', -// style: TextStyle( -// color: isDarkMode ? Colors.white70 : Colors.black87, -// fontSize: 16.sp, -// fontWeight: FontWeight.w500, -// ), -// ), -// Spacer(), -// Icon(Icons.arrow_forward_ios, -// color: Colors.grey, size: 18.w), -// SizedBox(width: 16.w), -// ], -// ), -// ), -// ), -// ), -// // 导入音频按钮 -// Container( -// margin: EdgeInsets.only(bottom: 24.w), -// child: GestureDetector( -// onTap: () { -// Navigator.of(context).pop(); -// _showImportAudioSheet(context, isDarkMode); -// }, -// child: Container( -// height: 56.w, -// decoration: BoxDecoration( -// color: isDarkMode -// ? Colors.white.withOpacity(0.10) -// : Colors.white, -// borderRadius: BorderRadius.circular(28.w), -// border: Border.all( -// color: Colors.blue.withOpacity(0.15), -// width: 2, -// ), -// boxShadow: [ -// BoxShadow( -// color: Colors.blue.withOpacity(0.08), -// blurRadius: 8, -// offset: Offset(0, 2), -// ), -// ], -// ), -// child: Row( -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Container( -// width: 36.w, -// height: 36.w, -// decoration: BoxDecoration( -// color: Colors.blue.withOpacity(0.15), -// shape: BoxShape.circle, -// ), -// child: Icon(Icons.file_upload_outlined, -// color: Colors.blue, size: 24.w), -// ), -// SizedBox(width: 12.w), -// Text( -// '导入音频', -// style: TextStyle( -// color: Colors.blue, -// fontSize: 16.sp, -// fontWeight: FontWeight.w500, -// ), -// ), -// Spacer(), -// Icon(Icons.arrow_forward_ios, -// color: Colors.grey, size: 18.w), -// SizedBox(width: 16.w), -// ], -// ), -// ), -// ), -// ), -// // 关闭按钮 -// GestureDetector( -// onTap: () => Navigator.of(context).pop(), -// child: Container( -// width: 56.w, -// height: 56.w, -// decoration: BoxDecoration( -// color: isDarkMode -// ? Colors.white.withOpacity(0.08) -// : Colors.black.withOpacity(0.08), -// shape: BoxShape.circle, -// ), -// child: Icon(Icons.close, -// color: isDarkMode ? Colors.white : Colors.black54, -// size: 32.w), -// ), -// ), -// SizedBox(height: 10.w), -// ], -// ), -// ); -// }, -// ); -// } - -// // 新增:从opus导出选择弹窗 -// void _showLocalOpusPicker(BuildContext context, bool isDarkMode) async { -// // 这里以用户目录下的 Downloads 为例,可根据实际需求修改路径 -// controller.loadTranslatopus(); -// showModalBottomSheet( -// context: context, -// isScrollControlled: true, -// backgroundColor: Colors.transparent, -// builder: (context) { -// return StatefulBuilder( -// builder: (context, setState) { -// return Container( -// decoration: BoxDecoration( -// color: isDarkMode ? Colors.grey[900] : Colors.white, -// borderRadius: BorderRadius.vertical(top: Radius.circular(18.w)), -// ), -// padding: EdgeInsets.only( -// left: 0, -// right: 0, -// top: 12.w, -// bottom: MediaQuery.of(context).viewInsets.bottom + 12.w, -// ), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// children: [ -// Text( -// '选择音视频文件', -// style: TextStyle( -// fontSize: 18.sp, -// fontWeight: FontWeight.bold, -// color: isDarkMode ? Colors.white : Colors.black87, -// ), -// ), -// Divider( -// height: 1, -// color: isDarkMode ? Colors.white12 : Colors.grey[200]), -// SizedBox(height: 8.w), -// SizedBox( -// height: 300.w, -// child: ListView.builder( -// itemCount: controller.files.length, -// itemBuilder: (context, idx) { -// final file = controller.files[idx]; -// final fileName = file.path.split('/').last; -// final isChecked = -// controller.selected.contains(file.path); -// return CheckboxListTile( -// value: isChecked, -// onChanged: (checked) { -// setState(() { -// if (checked == true) { -// controller.selected.add(file.path); -// } else { -// controller.selected.remove(file.path); -// } -// }); -// }, -// title: Text( -// fileName, -// style: TextStyle( -// color: isDarkMode ? Colors.white : Colors.black87, -// fontSize: 15.sp, -// ), -// ), -// controlAffinity: ListTileControlAffinity.leading, -// activeColor: Colors.blue, -// ); -// }, -// ), -// ), -// SizedBox(height: 12.w), -// Row( -// mainAxisAlignment: MainAxisAlignment.spaceEvenly, -// children: [ -// ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Colors.grey, -// ), -// onPressed: () => Navigator.of(context).pop(), -// child: -// Text('取消', style: TextStyle(color: Colors.white)), -// ), -// ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Colors.blue, -// ), -// onPressed: controller.selected.isEmpty -// ? null -// : () { -// Navigator.of(context).pop(); -// // TODO: 调用导入逻辑 -// controller.shareAllTranslatAudio(); -// }, -// child: -// Text('导入选中', style: TextStyle(color: Colors.white)), -// ), -// ], -// ), -// SizedBox(height: 8.w), -// ], -// ), -// ); -// }, -// ); -// }, -// ); -// } - -// // 新增:本地音视频文件选择弹窗 -// void _showLocalAudioVideoPicker(BuildContext context, bool isDarkMode) async { -// // 这里以用户目录下的 Downloads 为例,可根据实际需求修改路径 -// controller.loadTranslatAudio(); -// showModalBottomSheet( -// context: context, -// isScrollControlled: true, -// backgroundColor: Colors.transparent, -// builder: (context) { -// return StatefulBuilder( -// builder: (context, setState) { -// return Container( -// decoration: BoxDecoration( -// color: isDarkMode ? Colors.grey[900] : Colors.white, -// borderRadius: BorderRadius.vertical(top: Radius.circular(18.w)), -// ), -// padding: EdgeInsets.only( -// left: 0, -// right: 0, -// top: 12.w, -// bottom: MediaQuery.of(context).viewInsets.bottom + 12.w, -// ), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// children: [ -// Text( -// '选择音视频文件', -// style: TextStyle( -// fontSize: 18.sp, -// fontWeight: FontWeight.bold, -// color: isDarkMode ? Colors.white : Colors.black87, -// ), -// ), -// Divider( -// height: 1, -// color: isDarkMode ? Colors.white12 : Colors.grey[200]), -// SizedBox(height: 8.w), -// SizedBox( -// height: 300.w, -// child: ListView.builder( -// itemCount: controller.files.length, -// itemBuilder: (context, idx) { -// final file = controller.files[idx]; -// final fileName = file.path.split('/').last; -// final isChecked = -// controller.selected.contains(file.path); -// return CheckboxListTile( -// value: isChecked, -// onChanged: (checked) { -// setState(() { -// if (checked == true) { -// controller.selected.add(file.path); -// } else { -// controller.selected.remove(file.path); -// } -// }); -// }, -// title: Text( -// fileName, -// style: TextStyle( -// color: isDarkMode ? Colors.white : Colors.black87, -// fontSize: 15.sp, -// ), -// ), -// controlAffinity: ListTileControlAffinity.leading, -// activeColor: Colors.blue, -// ); -// }, -// ), -// ), -// SizedBox(height: 12.w), -// Row( -// mainAxisAlignment: MainAxisAlignment.spaceEvenly, -// children: [ -// ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Colors.grey, -// ), -// onPressed: () => Navigator.of(context).pop(), -// child: -// Text('取消', style: TextStyle(color: Colors.white)), -// ), -// ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Colors.blue, -// ), -// onPressed: controller.selected.isEmpty -// ? null -// : () { -// Navigator.of(context).pop(); -// // TODO: 调用导入逻辑 -// controller.addTranslatAudio(); -// }, -// child: -// Text('导入选中', style: TextStyle(color: Colors.white)), -// ), -// ], -// ), -// SizedBox(height: 8.w), -// ], -// ), -// ); -// }, -// ); -// }, -// ); -// } - -// // 导入音频弹窗 -// void _showImportAudioSheet(BuildContext context, bool isDarkMode) { -// showModalBottomSheet( -// context: context, -// isScrollControlled: true, -// backgroundColor: Colors.transparent, -// builder: (context) { -// return Container( -// decoration: BoxDecoration( -// color: isDarkMode ? Colors.grey[900] : Colors.white, -// borderRadius: BorderRadius.vertical(top: Radius.circular(18.w)), -// ), -// padding: EdgeInsets.only( -// left: 0, -// right: 0, -// top: 12.w, -// bottom: MediaQuery.of(context).viewInsets.bottom + 12.w, -// ), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// children: [ -// Container( -// alignment: Alignment.centerLeft, -// padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 8.w), -// child: Text( -// '导入音频', -// style: TextStyle( -// fontSize: 18.sp, -// fontWeight: FontWeight.bold, -// color: isDarkMode ? Colors.white : Colors.black87, -// ), -// ), -// ), -// Divider( -// height: 1, -// color: isDarkMode ? Colors.white12 : Colors.grey[200]), -// // 选项列表 -// Padding( -// padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.w), -// child: Column( -// children: [ -// _importAudioItem1( -// context, -// isDarkMode, -// icon: Image.asset('assets/images/explore.png', -// width: 32.w, height: 32.w), -// title: '从外部导入', -// onTap: () { -// Navigator.of(context).pop(); -// controller.addAudio(); -// // TODO: 实现从文件导入逻辑 -// }, -// ), -// // SizedBox(height: 8.w), -// // _importAudioItem1( -// // context, -// // isDarkMode, -// // icon: Image.asset('assets/images/explore.png', -// // width: 32.w, height: 32.w), -// // title: '从翻译里导入', -// // onTap: () { -// // Navigator.of(context).pop(); -// // _showLocalAudioVideoPicker(context, isDarkMode); -// // // TODO: 实现从相册导入逻辑 -// // }, -// // ), -// // SizedBox(height: 8.w), -// // _importAudioItem1( -// // context, -// // isDarkMode, -// // icon: Row( -// // mainAxisSize: MainAxisSize.min, -// // children: [ -// // Image.asset('assets/images/explore.png', -// // width: 20.w, height: 20.w), -// // SizedBox(width: 4.w), -// // Image.asset('assets/images/explore.png', -// // width: 20.w, height: 20.w), -// // SizedBox(width: 4.w), -// // Image.asset('assets/images/explore.png', -// // width: 20.w, height: 20.w), -// // ], -// // ), -// // title: '从opus导出', -// // onTap: () { -// // Navigator.of(context).pop(); -// // // TODO: 实现从其他APP导入逻辑 -// // _showLocalOpusPicker(context, isDarkMode); -// // }, -// // ), -// ], -// ), -// ), -// SizedBox(height: 8.w), -// Padding( -// padding: EdgeInsets.symmetric(horizontal: 20.w), -// child: Text( -// '支持导入单文件时长不超过5小时的音频', -// style: TextStyle( -// fontSize: 13.sp, -// color: isDarkMode ? Colors.white54 : Colors.grey[600], -// ), -// ), -// ), -// SizedBox(height: 16.w), -// GestureDetector( -// onTap: () => Navigator.of(context).pop(), -// child: Icon(Icons.close, size: 32.w, color: Colors.grey), -// ), -// SizedBox(height: 8.w), -// ], -// ), -// ); -// }, -// ); -// } - - // void _showRecordingSheet(BuildContext context, bool isDarkMode) { - // if (_recordingOverlayEntry != null) return; // 防止重复添加 - // _recordingOverlayEntry = OverlayEntry( - // builder: (ctx) => RecordingFloatingPanel( - // onStop: () { - // _recordingOverlayEntry?.remove(); - // _recordingOverlayEntry = null; - // // 录音完成后的逻辑 - // }, - // ), - // ); - // Overlay.of(context).insert(_recordingOverlayEntry!); - // } } diff --git a/lib/modules/meeting/views/mind_map_tab.dart b/lib/modules/meeting/views/tabs/mind_map_tab.dart similarity index 92% rename from lib/modules/meeting/views/mind_map_tab.dart rename to lib/modules/meeting/views/tabs/mind_map_tab.dart index 38e83691d..fde1a2e7b 100644 --- a/lib/modules/meeting/views/mind_map_tab.dart +++ b/lib/modules/meeting/views/tabs/mind_map_tab.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../controllers/mind_map_controller.dart'; +import '../../controllers/mind_map_controller.dart'; class MindMapTab extends StatefulWidget { const MindMapTab({super.key}); diff --git a/lib/modules/meeting/views/overview_tab.dart b/lib/modules/meeting/views/tabs/overview_tab.dart similarity index 97% rename from lib/modules/meeting/views/overview_tab.dart rename to lib/modules/meeting/views/tabs/overview_tab.dart index 0dde125c7..68c441135 100644 --- a/lib/modules/meeting/views/overview_tab.dart +++ b/lib/modules/meeting/views/tabs/overview_tab.dart @@ -3,9 +3,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../controllers/meeting_details_controller.dart'; -import 'ai_bottom_sheet.dart'; -import 'generate_bottom_sheet.dart'; +import '../../controllers/meeting_details_controller.dart'; +import '../bottomSheet/ai_bottom_sheet.dart'; +import '../bottomSheet/generate_bottom_sheet.dart'; class OverviewTab extends StatefulWidget { const OverviewTab({super.key}); diff --git a/lib/modules/meeting/views/speech_tab.dart b/lib/modules/meeting/views/tabs/speech_tab.dart similarity index 98% rename from lib/modules/meeting/views/speech_tab.dart rename to lib/modules/meeting/views/tabs/speech_tab.dart index c2530aa0d..37bd4373e 100644 --- a/lib/modules/meeting/views/speech_tab.dart +++ b/lib/modules/meeting/views/tabs/speech_tab.dart @@ -4,11 +4,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:lottie/lottie.dart'; -import '../controllers/meeting_details_controller.dart'; -import 'ai_bottom_sheet.dart'; -import 'generate_bottom_sheet.dart'; -import 'speaker_all_bottom_sheet.dart'; -import 'speaker_bottom_sheet.dart'; +import '../../controllers/meeting_details_controller.dart'; +import '../bottomSheet/ai_bottom_sheet.dart'; +import '../bottomSheet/generate_bottom_sheet.dart'; +import '../bottomSheet/speaker_all_bottom_sheet.dart'; +import '../bottomSheet/speaker_bottom_sheet.dart'; class SpeechTab extends GetView { const SpeechTab({super.key}); diff --git a/lib/modules/meeting/views/summary_tab.dart b/lib/modules/meeting/views/tabs/summary_tab.dart similarity index 98% rename from lib/modules/meeting/views/summary_tab.dart rename to lib/modules/meeting/views/tabs/summary_tab.dart index 4bd470157..2cba7aac5 100644 --- a/lib/modules/meeting/views/summary_tab.dart +++ b/lib/modules/meeting/views/tabs/summary_tab.dart @@ -4,11 +4,11 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../../../data/services/db/sqflite_api.dart'; -import '../controllers/meeting_details_controller.dart'; -import 'ai_bottom_sheet.dart'; -import 'generate_bottom_sheet.dart'; -import 'speaker_all_bottom_sheet.dart'; +import '../../../../data/services/db/sqflite_api.dart'; +import '../../controllers/meeting_details_controller.dart'; +import '../bottomSheet/ai_bottom_sheet.dart'; +import '../bottomSheet/generate_bottom_sheet.dart'; +import '../bottomSheet/speaker_all_bottom_sheet.dart'; class SummaryTab extends StatefulWidget { const SummaryTab({super.key});