[flutter]: highlight selected view in expanded app pannel

This commit is contained in:
appflowy 2021-11-11 10:55:13 +08:00
parent 2245ddef1c
commit 89bb50eb44
4 changed files with 49 additions and 19 deletions

View File

@ -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));
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);