diff --git a/frontend/appflowy_flutter/integration_test/panes/panes_overlay_test.dart b/frontend/appflowy_flutter/integration_test/panes/panes_overlay_test.dart index 3586478df5c37..664eb56435039 100644 --- a/frontend/appflowy_flutter/integration_test/panes/panes_overlay_test.dart +++ b/frontend/appflowy_flutter/integration_test/panes/panes_overlay_test.dart @@ -1,6 +1,6 @@ import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/workspace/presentation/home/panes/flowy_pane.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -57,7 +57,7 @@ void main() { findsNWidgets(2), ); - await tester.createNewPageWithName(name: _documentName); + await tester.createNewPageWithNameUnderParent(name: _documentName); await tester.tap(find.byType(FlowyPane).first); await tester.openPage(_documentName); @@ -97,7 +97,7 @@ void main() { ); await tester.tap(find.byType(FlowyPane).first); - await tester.createNewPageWithName(name: _documentName); + await tester.createNewPageWithNameUnderParent(name: _documentName); expect( find.textContaining(LocaleKeys.readOnlyViewText.tr()), diff --git a/frontend/appflowy_flutter/integration_test/panes/panes_test.dart b/frontend/appflowy_flutter/integration_test/panes/panes_test.dart index ee4dbc1c85a16..14fc0f41b0b16 100644 --- a/frontend/appflowy_flutter/integration_test/panes/panes_test.dart +++ b/frontend/appflowy_flutter/integration_test/panes/panes_test.dart @@ -1,5 +1,5 @@ import 'package:appflowy/workspace/presentation/home/panes/flowy_pane.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; @@ -19,12 +19,12 @@ void main() { expect(find.byType(FlowyPane), findsOneWidget); - await tester.createNewPageWithName( + await tester.createNewPageWithNameUnderParent( name: _documentName, layout: ViewLayoutPB.Document, ); - await tester.createNewPageWithName( + await tester.createNewPageWithNameUnderParent( name: _documentTwoName, layout: ViewLayoutPB.Document, ); diff --git a/frontend/appflowy_flutter/lib/plugins/document/document.dart b/frontend/appflowy_flutter/lib/plugins/document/document.dart index 4dc56f39d5c2f..3855979c21f3a 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/document.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/document.dart @@ -1,7 +1,5 @@ library document_plugin; -import 'package:flutter/material.dart'; - import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/plugins/document/application/document_appearance_cubit.dart'; @@ -19,6 +17,7 @@ import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class DocumentPluginBuilder extends PluginBuilder { @@ -54,7 +53,7 @@ class DocumentPlugin extends Plugin { } late PluginType _pluginType; - late final ViewInfoBloc _viewInfoBloc; + ViewInfoBloc? _viewInfoBloc; @override final ViewPluginNotifier notifier; @@ -63,7 +62,7 @@ class DocumentPlugin extends Plugin { @override PluginWidgetBuilder get widgetBuilder => DocumentPluginWidgetBuilder( - bloc: _viewInfoBloc, + bloc: _viewInfoBloc!, notifier: notifier, initialSelection: initialSelection, ); @@ -76,19 +75,17 @@ class DocumentPlugin extends Plugin { @override void init() { - _viewInfoBloc = ViewInfoBloc(view: notifier.view) - ..add(const ViewInfoEvent.started()); + _viewInfoBloc = ViewInfoBloc(view: notifier.view)..add(const ViewInfoEvent.started()); } @override void dispose() { - _viewInfoBloc.close(); + _viewInfoBloc?.close(); notifier.dispose(); } } -class DocumentPluginWidgetBuilder extends PluginWidgetBuilder - with NavigationItem { +class DocumentPluginWidgetBuilder extends PluginWidgetBuilder with NavigationItem { DocumentPluginWidgetBuilder({ required this.bloc, required this.notifier, diff --git a/frontend/appflowy_flutter/lib/plugins/document/document_page.dart b/frontend/appflowy_flutter/lib/plugins/document/document_page.dart index 7ab8d037c0db0..56849a3d1d3d7 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/document_page.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/document_page.dart @@ -102,7 +102,6 @@ class _DocumentPageState extends State { Widget _buildEditorPage(BuildContext context, DocumentState state) { final appflowyEditorPage = AppFlowyEditorPage( autoFocus: !widget.readOnlyStatus, - editorState: editorState!, editorState: state.editorState!, styleCustomizer: EditorStyleCustomizer( context: context, diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart index c7f60220120d6..3db29dcaa4379 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart @@ -4,7 +4,6 @@ import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.da import 'package:appflowy/startup/plugin/plugin.dart'; import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/workspace/application/panes/panes_bloc/panes_bloc.dart'; -import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart'; import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/application/view/view_service.dart'; import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart'; diff --git a/frontend/appflowy_flutter/lib/workspace/application/panes/panes_bloc/panes_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/panes/panes_bloc/panes_bloc.dart index 995dae440c834..0bf593d10cd85 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/panes/panes_bloc/panes_bloc.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/panes/panes_bloc/panes_bloc.dart @@ -1,15 +1,14 @@ import 'package:appflowy/startup/plugin/plugin.dart'; +import 'package:appflowy/workspace/application/panes/panes.dart'; import 'package:appflowy/workspace/application/panes/panes_service.dart'; import 'package:appflowy/workspace/presentation/home/panes/draggable_pane_target.dart'; import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:appflowy/workspace/application/panes/panes.dart'; - part 'panes_bloc.freezed.dart'; -part 'panes_state.dart'; part 'panes_event.dart'; +part 'panes_state.dart'; enum SplitDirection { left, right, up, down, none } @@ -29,13 +28,17 @@ class PanesBloc extends Bloc { return; } - final direction = [SplitDirection.right, SplitDirection.down] - .contains(e.splitDirection) + final direction = [ + SplitDirection.right, + SplitDirection.down, + ].contains(e.splitDirection) ? Direction.front : Direction.back; - final axis = [SplitDirection.down, SplitDirection.up] - .contains(e.splitDirection) + final axis = [ + SplitDirection.down, + SplitDirection.up, + ].contains(e.splitDirection) ? Axis.horizontal : Axis.vertical; @@ -82,10 +85,8 @@ class PanesBloc extends Bloc { ), ); }, - openTabInActivePane: (e) => - state.activePane.tabsController.openView(e.plugin), - opnePluginInActivePane: (e) => - state.activePane.tabsController.openPlugin(plugin: e.plugin), + openTabInActivePane: (e) => state.activePane.tabsController.openView(e.plugin), + opnePluginInActivePane: (e) => state.activePane.tabsController.openPlugin(plugin: e.plugin), selectTab: (e) { if (e.pane != null) { emit(state.copyWith(activePane: e.pane!)); diff --git a/frontend/appflowy_flutter/lib/workspace/application/panes/panes_service.dart b/frontend/appflowy_flutter/lib/workspace/application/panes/panes_service.dart index 6ae1b69724d78..7fb680ce00c07 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/panes/panes_service.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/panes/panes_service.dart @@ -49,8 +49,14 @@ class PanesService { final ret = newHolderNode.copyWith( children: direction == Direction.front - ? [oldChildNode, newChildNode] - : [newChildNode, oldChildNode], + ? [ + oldChildNode, + newChildNode, + ] + : [ + newChildNode, + oldChildNode, + ], ); return ret.copyWith( diff --git a/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_controller.dart b/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_controller.dart index fb95df53a2de3..977874ddc3c10 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_controller.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_controller.dart @@ -3,8 +3,7 @@ import 'package:appflowy/startup/plugin/plugin.dart'; import 'package:appflowy/workspace/application/tabs/tabs_service.dart'; import 'package:appflowy/workspace/presentation/home/home_stack.dart'; import 'package:appflowy/workspace/presentation/home/tabs/draggable_tab_item.dart'; - -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:flutter/material.dart'; import 'package:nanoid/nanoid.dart'; @@ -42,10 +41,17 @@ class TabsController extends ChangeNotifier { pageManagers = pageManagersCopy; } - void openView(Plugin plugin, {int? index}) { + void openView( + Plugin plugin, { + int? index, + }) { final selectExistingPlugin = _selectPluginIfOpen(plugin.id); if (!selectExistingPlugin) { - tabService.openViewHandler(this, plugin, index: index); + tabService.openViewHandler( + this, + plugin, + index: index, + ); currentIndex = index ?? pageManagers.length - 1; } @@ -69,9 +75,7 @@ class TabsController extends ChangeNotifier { /// And the current selected tab isn't the first (index 0) /// as currentIndex cannot be -1 /// Then decrease currentIndex by 1 - currentIndex = currentIndex > pageManagers.length - 1 && currentIndex > 0 - ? currentIndex - 1 - : currentIndex; + currentIndex = currentIndex > pageManagers.length - 1 && currentIndex > 0 ? currentIndex - 1 : currentIndex; if (!closePaneSubRoutine) { setLatestOpenView(); @@ -130,12 +134,18 @@ class TabsController extends ChangeNotifier { break; case TabDraggableHoverPosition.left: final index = pageManagers.indexOf(to); - openView(from.plugin, index: index); + openView( + from.plugin, + index: index, + ); currentIndex = index; break; case TabDraggableHoverPosition.right: final index = pageManagers.indexOf(to); - openView(from.plugin, index: index + 1); + openView( + from.plugin, + index: index + 1, + ); currentIndex = index + 1; break; } diff --git a/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_service.dart b/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_service.dart index 94bea80e29fad..7832351cdab29 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_service.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/tabs/tabs_service.dart @@ -27,7 +27,11 @@ class TabService { return null; } - void openViewHandler(TabsController controller, Plugin plugin, {int? index}) { + void openViewHandler( + TabsController controller, + Plugin plugin, { + int? index, + }) { final openPlugins = menuSharedState.openPlugins; /// Determine placement of new pagemanager in list of pagemanagers diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/desktop_home_screen.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/desktop_home_screen.dart index a8652b8e292fa..8e369a853ff1b 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/desktop_home_screen.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/desktop_home_screen.dart @@ -6,15 +6,10 @@ import 'package:appflowy/user/application/auth/auth_service.dart'; import 'package:appflowy/user/application/reminder/reminder_bloc.dart'; import 'package:appflowy/workspace/application/favorite/favorite_bloc.dart'; import 'package:appflowy/workspace/application/home/home_bloc.dart'; -import 'package:appflowy/workspace/application/home/home_bloc.dart'; -import 'package:appflowy/workspace/application/home/home_service.dart'; import 'package:appflowy/workspace/application/home/home_service.dart'; import 'package:appflowy/workspace/application/home/home_setting_bloc.dart'; -import 'package:appflowy/workspace/application/home/home_setting_bloc.dart'; import 'package:appflowy/workspace/application/panes/panes_bloc/panes_bloc.dart'; import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; -import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; -import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart'; import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/presentation/home/errors/workspace_failed_screen.dart'; import 'package:appflowy/workspace/presentation/home/hotkeys.dart'; diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_draggables.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_draggables.dart index 9f7a18e3c3940..cbcacfd33747c 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_draggables.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_draggables.dart @@ -1,7 +1,7 @@ import 'package:appflowy/workspace/application/panes/panes.dart'; import 'package:appflowy/workspace/application/tabs/tabs_controller.dart'; import 'package:appflowy/workspace/presentation/home/home_stack.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; enum CrossDraggableType { view, tab, pane, none } diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart index 828b3138835d3..a870af5222c82 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart @@ -16,14 +16,11 @@ import 'package:appflowy/workspace/presentation/home/panes/panes_layout.dart'; import 'package:appflowy/workspace/presentation/home/toast.dart'; import 'package:appflowy_backend/dispatch/dispatch.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:equatable/equatable.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; -import 'package:flowy_infra_ui/flowy_infra_ui.dart'; -import 'package:flowy_infra_ui/style_widget/extension.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:provider/provider.dart'; import 'package:time/time.dart'; @@ -181,6 +178,10 @@ abstract mixin class NavigationItem { } class PageNotifier extends ChangeNotifier { + PageNotifier({Plugin? plugin, bool? readOnly}) + : _plugin = plugin ?? makePlugin(pluginType: PluginType.blank), + _readOnly = readOnly ?? false; + Plugin _plugin; bool _readOnly; @@ -188,10 +189,6 @@ class PageNotifier extends ChangeNotifier { Widget tabBarWidget(String pluginId) => _plugin.widgetBuilder.tabBarItem(pluginId); - PageNotifier({Plugin? plugin, bool? readOnly}) - : _plugin = plugin ?? makePlugin(pluginType: PluginType.blank), - _readOnly = readOnly ?? false; - /// This is the only place where the plugin is set. /// No need compare the old plugin with the new plugin. Just set it. set plugin(Plugin newPlugin) { @@ -216,7 +213,7 @@ class PageNotifier extends ChangeNotifier { } // PageManager manages the view for one Tab -class PageManager { +class PageManager extends Equatable { PageManager(); final PageNotifier _notifier = PageNotifier(); @@ -284,6 +281,9 @@ class PageManager { void dispose() { _notifier.dispose(); } + + @override + List get props => [notifier.plugin.id]; } class HomeTopBar extends StatelessWidget { @@ -340,7 +340,7 @@ class HomeTopBar extends StatelessWidget { ), ], ), - ).bottomBorder(color: Theme.of(context).dividerColor), + ), ), if (notifier.readOnly) _buildReadOnlyBanner(context), ], diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart index 36ccfffe342b1..661566f99fbeb 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart @@ -2,12 +2,9 @@ import 'dart:io'; import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/workspace/application/home/home_setting_bloc.dart'; -import 'package:appflowy/workspace/application/home/home_setting_bloc.dart'; import 'package:appflowy/workspace/application/panes/panes_bloc/panes_bloc.dart'; import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; -import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; import 'package:appflowy/workspace/application/sidebar/rename_view/rename_view_bloc.dart'; -import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/sidebar_user.dart'; import 'package:flutter/material.dart'; import 'package:hotkey_manager/hotkey_manager.dart'; diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_shared_state.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_shared_state.dart index 97a5751c2a22b..415038526ad5c 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_shared_state.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_shared_state.dart @@ -9,8 +9,6 @@ class MenuSharedState { _latestOpenView.value = view; } - final ValueNotifier _latestOpenView = ValueNotifier(null); - ViewPB? get latestOpenView => _latestOpenView.value; ValueNotifier get notifier => _latestOpenView; diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/favorite_folder.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/favorite_folder.dart index 6fca55efa15a3..2f11e0eae82dd 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/favorite_folder.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/favorite_folder.dart @@ -50,7 +50,7 @@ class FavoriteFolder extends StatelessWidget { view: view, level: 0, onSelected: (view) { - if (RawKeyboard.instance.isControlPressed) { + if (HardwareKeyboard.instance.isControlPressed) { context.read().add(OpenTabInActivePane(plugin: view.plugin())); } diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/personal_folder.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/personal_folder.dart index 334e070bd3058..8380e48ed244e 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/personal_folder.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/sidebar/folder/personal_folder.dart @@ -49,7 +49,7 @@ class PersonalFolder extends StatelessWidget { leftPadding: 16, isFeedback: false, onSelected: (view) { - if (RawKeyboard.instance.isControlPressed) { + if (HardwareKeyboard.instance.isControlPressed) { context.read().add(OpenTabInActivePane(plugin: view.plugin())); } diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/view/draggable_view_item.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/view/draggable_view_item.dart index b76cf5e70dbaa..1df38907604a3 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/view/draggable_view_item.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/view/draggable_view_item.dart @@ -2,7 +2,6 @@ import 'package:appflowy/workspace/application/view/view_bloc.dart'; import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/presentation/home/home_draggables.dart'; import 'package:appflowy/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart'; -import 'package:appflowy/workspace/presentation/widgets/draggable_item/draggable_item.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:appflowy_editor/appflowy_editor.dart' hide Log; import 'package:flutter/material.dart'; @@ -62,15 +61,15 @@ class _DraggableViewItemState extends State { if (!_shouldAccept(view, position)) { return; } - setState(() => this.position = position); + _updatePosition(position); } }, onLeave: (_) => _updatePosition( DraggableHoverPosition.none, ), onAcceptWithDetails: (data) { - if (data.crossDraggableType == CrossDraggableType.view) { - final from = data.draggable as ViewPB; + if (data.data.crossDraggableType == CrossDraggableType.view) { + final from = data.data.draggable as ViewPB; _move( from, widget.view.draggable as ViewPB, diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/panes/draggable_pane_target.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/panes/draggable_pane_target.dart index 5dab027ad543b..8d5329c7abf2a 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/panes/draggable_pane_target.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/panes/draggable_pane_target.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/workspace/application/panes/panes.dart'; import 'package:appflowy/workspace/application/panes/panes_bloc/panes_bloc.dart'; @@ -5,10 +7,9 @@ import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/presentation/home/home_draggables.dart'; import 'package:appflowy/workspace/presentation/home/home_sizes.dart'; import 'package:appflowy/workspace/presentation/widgets/draggable_item/draggable_target.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; -import 'package:vector_math/vector_math.dart' as math; -import 'dart:math'; +import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:flutter/material.dart'; +import 'package:vector_math/vector_math.dart' as math; enum FlowyDraggableHoverPosition { none, top, left, right, bottom, tab } @@ -37,7 +38,7 @@ class _DraggablePaneTargetState extends State { @override Widget build(BuildContext context) { return DraggableItemTarget( - onWillAccept: (data) => _shouldAccept(data!, position), + onWillAcceptWithDetails: (data) => _shouldAccept(data.data, position), onMove: (data) { final renderBox = widget.paneContext.findRenderObject() as RenderBox; final offset = renderBox.globalToLocal(data.offset); @@ -56,8 +57,8 @@ class _DraggablePaneTargetState extends State { onLeave: (_) => setState( () => position = FlowyDraggableHoverPosition.none, ), - onAccept: (data) { - _move(data, widget.pane); + onAcceptWithDetails: (data) { + _move(data.data, widget.pane); setState(() => position = FlowyDraggableHoverPosition.none); }, child: Stack( @@ -98,10 +99,9 @@ class _DraggablePaneTargetState extends State { ) _getHoverWidgetPosition(FlowyDraggableHoverPosition position) { double? left, top, height, width; - final topOffset = - (widget.pane.draggable as PaneNode).tabsController.pages > 1 - ? HomeSizes.tabBarHeight + HomeSizes.topBarHeight - : HomeSizes.topBarHeight; + final topOffset = (widget.pane.draggable as PaneNode).tabsController.pages > 1 + ? HomeSizes.tabBarHeight + HomeSizes.topBarHeight + : HomeSizes.topBarHeight; switch (position) { case FlowyDraggableHoverPosition.top: @@ -185,8 +185,7 @@ class _DraggablePaneTargetState extends State { FlowyDraggableHoverPosition position, ) { if (data.crossDraggableType == CrossDraggableType.pane && - (data.draggable as PaneNode).paneId == - (widget.pane.draggable as PaneNode).paneId) { + (data.draggable as PaneNode).paneId == (widget.pane.draggable as PaneNode).paneId) { return false; } @@ -197,16 +196,13 @@ class _DraggablePaneTargetState extends State { if (position == FlowyDraggableHoverPosition.tab) { switch (from.crossDraggableType) { case CrossDraggableType.view: - (to.draggable as PaneNode) - .tabsController - .openView((from.draggable as ViewPB).plugin()); + (to.draggable as PaneNode).tabsController.openView((from.draggable as ViewPB).plugin()); return; case CrossDraggableType.tab: final fromTab = from.draggable as TabNode; final destinationPaneNode = to.draggable as PaneNode; bool contains = false; - for (final element - in destinationPaneNode.tabsController.pageManagers) { + for (final element in destinationPaneNode.tabsController.pageManagers) { if (element.plugin.id == fromTab.pageManager.plugin.id) { contains = true; break; @@ -214,9 +210,10 @@ class _DraggablePaneTargetState extends State { } if (!contains) { - destinationPaneNode.tabsController - .openView(fromTab.pageManager.plugin); fromTab.tabs.closeView(fromTab.pageManager.plugin.id); + destinationPaneNode.tabsController.openView( + fromTab.pageManager.plugin, + ); } return; diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/draggable_tab_item.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/draggable_tab_item.dart index c91e543c58662..230295674727a 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/draggable_tab_item.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/draggable_tab_item.dart @@ -1,12 +1,11 @@ +import 'package:appflowy/workspace/application/tabs/tabs_controller.dart'; import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/presentation/home/home_draggables.dart'; import 'package:appflowy/workspace/presentation/home/home_stack.dart'; import 'package:appflowy/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:flutter/material.dart'; -import 'package:appflowy/workspace/application/tabs/tabs_controller.dart'; - enum TabDraggableHoverPosition { none, left, right } class DraggableTabItem extends StatefulWidget { @@ -32,7 +31,7 @@ class _DraggabletabItemState extends State { @override Widget build(BuildContext context) { - final child = Container( + final child = DecoratedBox( decoration: BoxDecoration( border: Border( right: position == TabDraggableHoverPosition.right @@ -56,7 +55,7 @@ class _DraggabletabItemState extends State { dragAnchorStrategy: pointerDragAnchorStrategy, enableAutoScroll: false, data: widget.tabs, - onWillAccept: (data) => true, + onWillAcceptWithDetails: (data) => true, onMove: (data) { final renderBox = context.findRenderObject() as RenderBox; final offset = renderBox.globalToLocal(data.offset); @@ -69,8 +68,8 @@ class _DraggabletabItemState extends State { setState(() => this.position = position); }, onLeave: (_) => setState(() => position = TabDraggableHoverPosition.none), - onAccept: (data) { - _move(data, widget.tabs, data.crossDraggableType); + onAcceptWithDetails: (data) { + _move(data.data, widget.tabs, data.data.crossDraggableType); setState(() => position = TabDraggableHoverPosition.none); }, feedback: IntrinsicWidth( diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart index 37657e1b45d4f..8b708f69761b0 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/combined_draggable_item.dart @@ -9,8 +9,8 @@ class CombinedDraggableItem extends StatefulWidget { required this.data, this.feedback, this.childWhenDragging, - this.onAccept, - this.onWillAccept, + this.onAcceptWithDetails, + this.onWillAcceptWithDetails, this.onMove, this.onLeave, this.onDragging, @@ -23,13 +23,12 @@ class CombinedDraggableItem extends StatefulWidget { final T data; final Widget? feedback; final Widget? childWhenDragging; - final DragTargetAccept? onAccept; - final DragTargetWillAccept? onWillAccept; + final DragTargetAcceptWithDetails? onAcceptWithDetails; + final DragTargetWillAcceptWithDetails? onWillAcceptWithDetails; final DragTargetMove? onMove; final DragTargetLeave? onLeave; final void Function(bool)? onDragging; - final Offset Function(Draggable, BuildContext, Offset)? - dragAnchorStrategy; + final Offset Function(Draggable, BuildContext, Offset)? dragAnchorStrategy; /// Whether to enable auto scroll when dragging. /// @@ -39,17 +38,15 @@ class CombinedDraggableItem extends StatefulWidget { final Size hitTestSize; @override - State> createState() => - _CombinedDraggableItemState(); + State> createState() => _CombinedDraggableItemState(); } -class _CombinedDraggableItemState - extends State> { +class _CombinedDraggableItemState extends State> { @override Widget build(BuildContext context) { return DraggableItemTarget( - onAccept: widget.onAccept, - onWillAccept: widget.onWillAccept, + onAcceptWithDetails: widget.onAcceptWithDetails, + onWillAcceptWithDetails: widget.onWillAcceptWithDetails, onMove: widget.onMove, onLeave: widget.onLeave, child: DraggableItem( diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/draggable_target.dart b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/draggable_target.dart index c7dbf3286e7c8..4cd55dcf50e35 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/draggable_target.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/draggable_item/draggable_target.dart @@ -4,32 +4,31 @@ class DraggableItemTarget extends StatefulWidget { const DraggableItemTarget({ super.key, required this.child, - this.onAccept, - this.onWillAccept, this.onMove, this.onLeave, + this.onAcceptWithDetails, + this.onWillAcceptWithDetails, }); final Widget child; - final DragTargetAccept? onAccept; - final DragTargetWillAccept? onWillAccept; final DragTargetMove? onMove; final DragTargetLeave? onLeave; + final DragTargetAcceptWithDetails? onAcceptWithDetails; + final DragTargetWillAcceptWithDetails? onWillAcceptWithDetails; @override State> createState() => _DraggableItemTargetState(); } -class _DraggableItemTargetState - extends State> { +class _DraggableItemTargetState extends State> { @override Widget build(BuildContext context) { return DragTarget( - onAccept: widget.onAccept, - onWillAccept: widget.onWillAccept, onMove: widget.onMove, onLeave: widget.onLeave, builder: (_, __, ___) => widget.child, + onAcceptWithDetails: widget.onAcceptWithDetails, + onWillAcceptWithDetails: widget.onWillAcceptWithDetails, ); } } diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/view_title_bar.dart b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/view_title_bar.dart index e2529ead16972..0f7b12a9b8f3f 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/view_title_bar.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/view_title_bar.dart @@ -216,7 +216,11 @@ class _ViewTitleState extends State<_ViewTitle> { if (widget.behavior == _ViewTitleBehavior.uneditable) { return Listener( - onPointerDown: (_) => context.read().openPlugin(widget.view), + onPointerDown: (_) => context.read().add( + OpenPluginInActivePane( + plugin: widget.view.plugin(), + ), + ), child: FlowyButton( useIntrinsicWidth: true, onTap: () {},