Sfoglia il codice sorgente

[new]完善思维导图全屏观看功能

zk 1 anno fa
parent
commit
295043d428

+ 1 - 1
android/app/build.gradle

@@ -45,7 +45,7 @@ android {
 
         ndk {
             //noinspection ChromeOsAbiSupport
-            abiFilters "arm64-v8a"
+//            abiFilters "arm64-v8a"
         }
     }
 

BIN
assets/images/icon_mind_full_screen.webp


BIN
assets/images/icon_mind_full_screen_back.webp


+ 1 - 0
assets/string/base/string.xml

@@ -148,4 +148,5 @@
     <string name="talk_update_txt">编辑</string>
     <string name="talk_uploading_file_tip">录音上传中,请勿关闭小听</string>
     <string name="talk_add_template">新建模板</string>
+    <string name="talk_mind_full_screen">全屏观看</string>
 </resources>

+ 4 - 2
lib/module/talk/common_view.dart

@@ -402,13 +402,15 @@ Widget buildTemplateView(List<TemplateBean>? templateList, int? id,
                           : ColorName.secondaryTextColor)),
             ),
           ),
-        _buildAddTemplateView(isShowAdd, addCallback)
+        isShowAdd == true
+            ? _buildAddTemplateView(addCallback)
+            : const SizedBox.shrink()
       ],
     ),
   );
 }
 
-Widget _buildAddTemplateView(bool? isShowAdd, VoidCallback? addCallback) {
+Widget _buildAddTemplateView(VoidCallback? addCallback) {
   return Container(
     height: double.infinity,
     decoration: BoxDecoration(

+ 28 - 1
lib/module/talk/controller.dart

@@ -22,6 +22,7 @@ import 'package:electronic_assistant/utils/file_upload_check_helper.dart';
 import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
@@ -49,7 +50,6 @@ class TalkController extends BaseController {
   static const String argumentItem = 'argument_item';
   static const String argumentTalkId = 'argument_talk_id';
   static const String argumentEventTag = 'argument_event_tag';
-
   final String uploadNoPrompts = "UPLOAD_NO_PROMPTS";
 
   final Rxn<TalkBean> talkBean = Rxn();
@@ -128,6 +128,18 @@ class TalkController extends BaseController {
 
   Rxn<int> templateSelectId = Rxn();
 
+  final RxBool isShowMindFullScreen = false.obs;
+
+  final mindFullDuration = const Duration(milliseconds: 250);
+
+  GlobalKey headGlobalKey = GlobalKey();
+  GlobalKey bottomGlobalKey = GlobalKey();
+
+  double? _bottomViewHeight;
+  final RxnDouble _headViewHeight = RxnDouble();
+
+  double? get headViewHeight => _headViewHeight.value;
+
   @override
   void onInit() {
     super.onInit();
@@ -140,6 +152,17 @@ class TalkController extends BaseController {
     _initAudioPlayer();
     _getArguments();
     eventReport(EventId.event_101001, params: {EventId.id: eventTag});
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      _bottomViewHeight = bottomGlobalKey.currentContext?.size?.height;
+      _headViewHeight.value = headGlobalKey.currentContext?.size?.height;
+    });
+  }
+
+  double getBottomViewHeight() {
+    if (_bottomViewHeight == null) {
+      return -250.h;
+    }
+    return -_bottomViewHeight!;
   }
 
   void eventReport(String eventId, {Map<String, dynamic>? params}) {
@@ -672,6 +695,10 @@ class TalkController extends BaseController {
     });
   }
 
+  void onExitMindFullScreen() {
+    isShowMindFullScreen.value = false;
+  }
+
   @override
   void onClose() {
     super.onClose();

+ 18 - 1
lib/module/talk/mindmap/controller.dart

@@ -2,17 +2,34 @@ import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 
+import '../../../data/bean/template_bean.dart';
 import '../controller.dart';
 
 class MindMapController extends BaseController {
   final String? talkId;
 
+  MindMapController(this.talkId);
+
   TalkController get talkController => Get.find<TalkController>(tag: talkId);
 
-  MindMapController(this.talkId);
+  List<TemplateBean>? get templateList => talkController.templateList.value;
+
+  int? get templateSelectId => talkController.templateSelectId.value;
+
+  RxBool get isShowMindFullScreen => talkController.isShowMindFullScreen;
 
   @override
   void onReady() {
     super.onReady();
   }
+
+  void addTemplateClick() {}
+
+  void fullScreenClick() {
+    talkController.isShowMindFullScreen.value = true;
+  }
+
+  void exitFullScreenClick() {
+    talkController.onExitMindFullScreen();
+  }
 }

+ 5 - 0
lib/module/talk/mindmap/mindview/view.dart

@@ -10,6 +10,11 @@ class MindView extends BasePage<MindViewController> {
   final String markdown;
 
   @override
+  bool immersive() {
+    return true;
+  }
+
+  @override
   Widget buildBody(BuildContext context) {
     return DWebViewWidget(controller: controller.webViewController);
   }

+ 82 - 2
lib/module/talk/mindmap/view.dart

@@ -1,8 +1,11 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/module/talk/mindmap/controller.dart';
+import 'package:electronic_assistant/resource/assets.gen.dart';
+import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 
@@ -21,12 +24,16 @@ class MindMapView extends BasePage<MindMapController> {
   get controller => Get.find<MindMapController>(tag: talkId);
 
   @override
+  bool immersive() {
+    return true;
+  }
+
+  @override
   Widget buildBody(BuildContext context) {
     return Obx(() {
       if (controller.talkController.talkBean.value?.status.value ==
           TalkStatus.analysisSuccess) {
-        return MindView(
-            controller.talkController.talkBean.value!.summary.value!);
+        return _buildMindView();
       } else if (controller.talkController.talkBean.value?.status.value ==
           TalkStatus.analysisFail) {
         return getTalkFailView();
@@ -49,4 +56,77 @@ class MindMapView extends BasePage<MindMapController> {
       }
     });
   }
+
+  Widget _buildMindView() {
+    return Stack(
+      children: [
+        MindView(controller.talkController.talkBean.value!.summary.value!),
+        Obx(() {
+          return Visibility(
+            visible: !controller.isShowMindFullScreen.value,
+            child: Container(
+              margin: EdgeInsets.only(top: 14.h),
+              child: buildTemplateView(
+                  controller.templateList, controller.templateSelectId),
+            ),
+          );
+        }),
+        GestureDetector(
+          onTap: () {
+            controller.fullScreenClick();
+          },
+          child: Obx(() {
+            return Visibility(
+              visible: !controller.isShowMindFullScreen.value,
+              child: Align(
+                alignment: const Alignment(0.0, 0.7),
+                child: Container(
+                  decoration: BoxDecoration(
+                      color: ColorName.black60,
+                      border: Border.all(color: ColorName.white20, width: 1.w),
+                      borderRadius: BorderRadius.circular(24.w)),
+                  padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 6.w),
+                  child: IntrinsicWidth(
+                    child: Row(
+                      children: [
+                        Assets.images.iconMindFullScreen
+                            .image(width: 16.w, height: 16.w),
+                        SizedBox(width: 2.w),
+                        Text(StringName.talkMindFullScreen.tr,
+                            style: TextStyle(
+                                fontSize: 14.sp,
+                                color: ColorName.white70,
+                                height: 1))
+                      ],
+                    ),
+                  ),
+                ),
+              ),
+            );
+          }),
+        ),
+        _buildFullScreenBackView()
+      ],
+    );
+  }
+
+  Widget _buildFullScreenBackView() {
+    return Obx(() {
+      return Visibility(
+        visible: controller.isShowMindFullScreen.value,
+        child: GestureDetector(
+          onTap: () {
+            controller.exitFullScreenClick();
+          },
+          child: SafeArea(
+            child: Container(
+              margin: EdgeInsets.only(left: 4.w, top: 8.w),
+              child: Assets.images.iconMindFullScreenBack
+                  .image(width: 60.w, height: 60.w),
+            ),
+          ),
+        ),
+      );
+    });
+  }
 }

+ 5 - 0
lib/module/talk/original/view.dart

@@ -27,6 +27,11 @@ class OriginalView extends BasePage<OriginalController> {
     return buildOriginalContentView();
   }
 
+  @override
+  bool immersive() {
+    return true;
+  }
+
   Widget buildOriginalContentView() {
     return Obx(() {
       if (controller.originalList.isEmpty &&

+ 5 - 2
lib/module/talk/summary/view.dart

@@ -7,9 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
 import 'package:get/get.dart';
 import 'package:markdown/markdown.dart' as md;
-
 import '../../../data/bean/talks.dart';
-import '../../../data/bean/template_bean.dart';
 import '../../browser/view.dart';
 import '../../home/view.dart';
 import '../common_view.dart';
@@ -30,6 +28,11 @@ class SummaryView extends BasePage<SummaryController> {
     return buildSummaryStatusView();
   }
 
+  @override
+  bool immersive() {
+    return true;
+  }
+
   Widget buildSummaryView() {
     return Padding(
         padding:

+ 5 - 0
lib/module/talk/todo/view.dart

@@ -31,6 +31,11 @@ class TodoView extends BasePage<TodoController> {
     });
   }
 
+  @override
+  bool immersive() {
+    return true;
+  }
+
   _buildAllTaskView() {
     return Padding(
       padding: EdgeInsets.only(top: 6.h, bottom: 16.h),

+ 67 - 48
lib/module/talk/view.dart

@@ -74,6 +74,10 @@ class TalkPage extends BasePage<TalkController> {
           controller.onEditCancel();
           return false;
         }
+        if (controller.isShowMindFullScreen.value) {
+          controller.onExitMindFullScreen();
+          return false;
+        }
         return true;
       },
       child: DefaultTabController(
@@ -81,7 +85,6 @@ class TalkPage extends BasePage<TalkController> {
         length: controller.tabBeans.length,
         child: Stack(
           children: [
-            buildTopGradient(),
             _buildTalkContentView(),
             buildBottomView(),
           ],
@@ -90,25 +93,46 @@ class TalkPage extends BasePage<TalkController> {
     );
   }
 
-  Scaffold _buildTalkContentView() {
-    return Scaffold(
-      backgroundColor: Colors.transparent,
-      appBar: AppBar(
-        actions: [
-          _buildEditBtnView(),
-        ],
-        leadingWidth: 0.9.sw,
-        systemOverlayStyle: SystemUiOverlayStyle.dark,
-        backgroundColor: Colors.transparent,
-        leading: _buildAppbarLeftView(),
-      ),
-      body: Builder(builder: (context) {
+  Widget _buildTalkContentView() {
+    return Builder(builder: (context) {
+      final statusBarHeight = MediaQuery.of(context).padding.top;
+      return Obx(() {
         return Column(
-          crossAxisAlignment: CrossAxisAlignment.start,
-          children: [buildTabBar(context), buildTalkContentView()],
+          children: [
+            AnimatedContainer(
+              key: controller.headGlobalKey,
+              decoration: BoxDecoration(
+                gradient: LinearGradient(
+                  colors: ['#E1E9FF'.toColor(), '#F9FAFE'.toColor()],
+                  begin: Alignment.topCenter,
+                  end: Alignment.bottomCenter,
+                  stops: const [0, 1.0],
+                ),
+              ),
+              height: controller.isShowMindFullScreen.value
+                  ? 0
+                  : controller.headViewHeight,
+              duration: controller.mindFullDuration,
+              child: SingleChildScrollView(
+                physics: const NeverScrollableScrollPhysics(),
+                child: Column(children: [
+                  SizedBox(height: statusBarHeight),
+                  Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      _buildToolbarLeftView(),
+                      _buildToolbarRightView(),
+                    ],
+                  ),
+                  buildTabBar(context),
+                ]),
+              ),
+            ),
+            buildTalkContentView()
+          ],
         );
-      }),
-    );
+      });
+    });
   }
 
   Widget buildTabBar(BuildContext context) {
@@ -152,20 +176,6 @@ class TalkPage extends BasePage<TalkController> {
     return true;
   }
 
-  Container buildTopGradient() {
-    return Container(
-        width: 1.sw,
-        height: 180.h,
-        decoration: BoxDecoration(
-          gradient: LinearGradient(
-            colors: ['#E1E9FF'.toColor(), '#F9FAFE'.toColor()],
-            begin: Alignment.topCenter,
-            end: Alignment.bottomCenter,
-            stops: const [0, 1.0],
-          ),
-        ));
-  }
-
   Widget buildTalkContentView() {
     return Obx(() {
       if (controller.talkBean.value?.status.value == TalkStatus.notAnalysis &&
@@ -284,21 +294,30 @@ class TalkPage extends BasePage<TalkController> {
   Widget buildBottomView() {
     return Obx(() {
       return Visibility(
+        key: controller.bottomGlobalKey,
         visible: controller.isEditModel == false,
-        child: Align(
-          alignment: Alignment.bottomCenter,
-          child: Container(
-            margin: EdgeInsets.only(bottom: 20.h),
-            child: IntrinsicHeight(
-              child: Column(
-                crossAxisAlignment: CrossAxisAlignment.end,
-                children: [
-                  _buildAIAnalysisView(),
-                  SizedBox(height: 8.h),
-                  _buildTalkEditView(),
-                  SizedBox(height: 10.h),
-                  buildAudioView()
-                ],
+        child: AnimatedPositioned(
+          duration: controller.mindFullDuration,
+          bottom: controller.isShowMindFullScreen.value
+              ? controller.getBottomViewHeight()
+              : 0.h,
+          left: 0,
+          right: 0,
+          child: Align(
+            alignment: Alignment.bottomCenter,
+            child: Container(
+              margin: EdgeInsets.only(bottom: 20.h),
+              child: IntrinsicHeight(
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.end,
+                  children: [
+                    _buildAIAnalysisView(),
+                    SizedBox(height: 8.h),
+                    _buildTalkEditView(),
+                    SizedBox(height: 10.h),
+                    buildAudioView()
+                  ],
+                ),
               ),
             ),
           ),
@@ -440,7 +459,7 @@ class TalkPage extends BasePage<TalkController> {
     );
   }
 
-  Widget _buildAppbarLeftView() {
+  Widget _buildToolbarLeftView() {
     return Obx(() {
       if (controller.isEditModel) {
         return Align(
@@ -508,7 +527,7 @@ class TalkPage extends BasePage<TalkController> {
     });
   }
 
-  Widget _buildEditBtnView() {
+  Widget _buildToolbarRightView() {
     return Obx(() {
       return Visibility(
         visible: controller.talkBean.value?.status.value ==