Browse Source

[flutter]: highlight selected view in expanded app pannel

appflowy 3 years ago
parent
commit
89bb50eb44

+ 14 - 5
app_flowy/lib/workspace/presentation/home/home_screen.dart

@@ -6,6 +6,7 @@ import 'package:app_flowy/workspace/presentation/stack_page/home_stack.dart';
 import 'package:app_flowy/workspace/presentation/widgets/float_bubble/question_bubble.dart';
 import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
 import 'package:app_flowy/startup/startup.dart';
+import 'package:flowy_infra/notifier.dart';
 import 'package:flowy_log/flowy_log.dart';
 import 'package:flowy_infra_ui/style_widget/container.dart';
 import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
@@ -87,22 +88,30 @@ class HomeScreen extends StatelessWidget {
 
   Widget _buildHomeMenu({required HomeLayout layout, required BuildContext context}) {
     final homeBloc = context.read<HomeBloc>();
-    final collapasedNotifier = getIt<HomeStackManager>().collapsedNotifier;
 
-    HomeMenu homeMenu =
-        HomeMenu(user: user, workspaceId: workspaceSetting.workspace.id, collapsedNotifier: collapasedNotifier);
+    final collapasedNotifier = getIt<HomeStackManager>().collapsedNotifier;
     collapasedNotifier.addPublishListener((isCollapsed) {
       homeBloc.add(HomeEvent.forceCollapse(isCollapsed));
     });
 
-    homeMenu.pageContext.addPublishListener((pageContext) {
+    final pageContext = PublishNotifier<HomeStackContext>();
+    pageContext.addPublishListener((pageContext) {
       getIt<HomeStackManager>().switchStack(pageContext);
     });
 
+    HomeStackContext? initialStackContext;
     if (workspaceSetting.hasLatestView()) {
-      getIt<HomeStackManager>().switchStack(workspaceSetting.latestView.stackContext());
+      initialStackContext = workspaceSetting.latestView.stackContext();
     }
 
+    HomeMenu homeMenu = HomeMenu(
+      user: user,
+      workspaceSetting: workspaceSetting,
+      collapsedNotifier: collapasedNotifier,
+      pageContext: pageContext,
+      initialStackContext: initialStackContext,
+    );
+
     return FocusTraversalGroup(child: RepaintBoundary(child: homeMenu));
   }
 

+ 22 - 11
app_flowy/lib/workspace/presentation/widgets/menu/menu.dart

@@ -5,6 +5,7 @@ import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
 import 'package:flowy_infra_ui/widget/spacing.dart';
 import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_setting.pb.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:provider/provider.dart';
@@ -41,17 +42,25 @@ import 'widget/menu_trash.dart';
 //                                                  └────────┘
 
 class HomeMenu extends StatelessWidget {
-  final PublishNotifier<HomeStackContext> pageContext = PublishNotifier();
-  final PublishNotifier<bool> collapsedNotifier;
+  final PublishNotifier<HomeStackContext> _pageContext;
+  final PublishNotifier<bool> _collapsedNotifier;
   final UserProfile user;
-  final String workspaceId;
+  final CurrentWorkspaceSetting workspaceSetting;
 
   HomeMenu({
     Key? key,
     required this.user,
-    required this.workspaceId,
-    required this.collapsedNotifier,
-  }) : super(key: key);
+    required this.workspaceSetting,
+    required PublishNotifier<bool> collapsedNotifier,
+    required PublishNotifier<HomeStackContext> pageContext,
+    HomeStackContext? initialStackContext,
+  })  : _pageContext = pageContext,
+        _collapsedNotifier = collapsedNotifier,
+        super(key: key) {
+    if (initialStackContext != null) {
+      pageContext.value = initialStackContext;
+    }
+  }
 
   @override
   Widget build(BuildContext context) {
@@ -59,7 +68,7 @@ class HomeMenu extends StatelessWidget {
       providers: [
         BlocProvider<MenuBloc>(
           create: (context) {
-            final menuBloc = getIt<MenuBloc>(param1: user, param2: workspaceId);
+            final menuBloc = getIt<MenuBloc>(param1: user, param2: workspaceSetting.workspace.id);
             menuBloc.add(const MenuEvent.initial());
             return menuBloc;
           },
@@ -69,11 +78,11 @@ class HomeMenu extends StatelessWidget {
         listeners: [
           BlocListener<MenuBloc, MenuState>(
             listenWhen: (p, c) => p.context != c.context,
-            listener: (context, state) => pageContext.value = state.context,
+            listener: (context, state) => _pageContext.value = state.context,
           ),
           BlocListener<MenuBloc, MenuState>(
             listenWhen: (p, c) => p.isCollapse != c.isCollapse,
-            listener: (context, state) => collapsedNotifier.value = state.isCollapse,
+            listener: (context, state) => _collapsedNotifier.value = state.isCollapse,
           )
         ],
         child: BlocBuilder<MenuBloc, MenuState>(
@@ -88,7 +97,7 @@ class HomeMenu extends StatelessWidget {
     return Container(
       color: Theme.of(context).colorScheme.background,
       child: ChangeNotifierProvider(
-        create: (_) => MenuSharedState(),
+        create: (_) => MenuSharedState(view: workspaceSetting.hasLatestView() ? workspaceSetting.latestView : null),
         child: Column(
           mainAxisAlignment: MainAxisAlignment.start,
           children: [
@@ -162,6 +171,8 @@ class MenuSharedState extends ChangeNotifier {
   View? _view;
   View? _forcedOpenView;
 
+  MenuSharedState({View? view}) : _view = view;
+
   void addForcedOpenViewListener(void Function(View) callback) {
     super.addListener(() {
       if (_forcedOpenView != null) {
@@ -192,5 +203,5 @@ class MenuSharedState extends ChangeNotifier {
     }
   }
 
-  View? get selecedtView => _view;
+  View? get selectedView => _view;
 }

+ 12 - 2
app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/section.dart

@@ -21,7 +21,11 @@ class ViewSection extends StatelessWidget {
     return ChangeNotifierProxyProvider<AppDataNotifier, ViewSectionNotifier>(
       create: (_) {
         final views = Provider.of<AppDataNotifier>(context, listen: false).views;
-        return ViewSectionNotifier(views, context);
+        return ViewSectionNotifier(
+          context: context,
+          views: views,
+          selectedView: Provider.of<MenuSharedState>(context, listen: false).selectedView,
+        );
       },
       update: (_, notifier, controller) => controller!..update(notifier),
       child: Consumer(builder: (context, ViewSectionNotifier notifier, child) {
@@ -59,7 +63,13 @@ class ViewSectionNotifier with ChangeNotifier {
   List<View> _views;
   View? _selectedView;
   CancelableOperation? _notifyListenerOperation;
-  ViewSectionNotifier(List<View> views, BuildContext context) : _views = views {
+
+  ViewSectionNotifier({
+    required BuildContext context,
+    required List<View> views,
+    View? selectedView,
+  })  : _views = views,
+        _selectedView = selectedView {
     final menuSharedState = Provider.of<MenuSharedState>(context, listen: false);
     menuSharedState.addForcedOpenViewListener((forcedOpenView) {
       selectedView = forcedOpenView;

+ 1 - 1
rust-lib/flowy-document/src/services/doc/edit/doc_actor.rs

@@ -118,7 +118,7 @@ impl DocumentActor {
         let mut document = self.document.write().await;
         let result = document.compose_delta(&delta);
         tracing::Span::current().record(
-            "compose_result",
+            "composed_delta",
             &format!("doc_id:{} - {}", &self.doc_id, delta.to_json()).as_str(),
         );
         drop(document);