From 58ad84b7df9c16d53aa71ec9f84a4e350c70ab42 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 25 Aug 2022 10:16:41 +0800 Subject: [PATCH 01/33] feat: flowy overlay --- .../board/presentation/board_page.dart | 13 ++-- .../plugins/grid/presentation/grid_page.dart | 13 ++-- .../presentation/widgets/row/row_detail.dart | 63 ++++++++----------- .../lib/src/flowy_overlay/flowy_dialog.dart | 39 ++++++++++++ .../lib/src/flowy_overlay/flowy_overlay.dart | 13 ++++ .../src/flowy_overlay/overlay_container.dart | 6 +- frontend/app_flowy/pubspec.lock | 2 +- 7 files changed, 100 insertions(+), 49 deletions(-) create mode 100644 frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart diff --git a/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart b/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart index e7202e0a6d..423a075867 100644 --- a/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart +++ b/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart @@ -9,6 +9,7 @@ import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart' import 'package:app_flowy/plugins/grid/presentation/widgets/cell/cell_builder.dart'; import 'package:app_flowy/plugins/grid/presentation/widgets/row/row_detail.dart'; import 'package:appflowy_board/appflowy_board.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/widget/error_page.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart'; @@ -157,10 +158,14 @@ class BoardContent extends StatelessWidget { rowCache: rowCache, ); - RowDetailPage( - cellBuilder: GridCellBuilder(delegate: dataController), - dataController: dataController, - ).show(context); + FlowyOverlay.show( + context: context, + builder: (BuildContext context) { + return RowDetailPage( + cellBuilder: GridCellBuilder(delegate: dataController), + dataController: dataController, + ); + }); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/grid_page.dart b/frontend/app_flowy/lib/plugins/grid/presentation/grid_page.dart index 2c6c1e2180..215ef7d222 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/grid_page.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/grid_page.dart @@ -3,6 +3,7 @@ import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart' import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/grid_bloc.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart'; @@ -287,10 +288,14 @@ class _GridRowsState extends State<_GridRows> { rowCache: rowCache, ); - RowDetailPage( - cellBuilder: cellBuilder, - dataController: dataController, - ).show(context); + FlowyOverlay.show( + context: context, + builder: (BuildContext context) { + return RowDetailPage( + cellBuilder: cellBuilder, + dataController: dataController, + ); + }); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index a98fcfa688..ea4d94fc17 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -4,6 +4,7 @@ import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart' import 'package:app_flowy/plugins/grid/application/row/row_detail_bloc.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/src/flowy_overlay/flowy_dialog.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; @@ -33,23 +34,6 @@ class RowDetailPage extends StatefulWidget with FlowyOverlayDelegate { @override State createState() => _RowDetailPageState(); - void show(BuildContext context) async { - final windowSize = MediaQuery.of(context).size; - final size = windowSize * 0.7; - FlowyOverlay.of(context).insertWithRect( - widget: OverlayContainer( - child: this, - constraints: BoxConstraints.tight(size), - ), - identifier: RowDetailPage.identifier(), - anchorPosition: Offset(-size.width / 2.0, -size.height / 2.0), - anchorSize: windowSize, - anchorDirection: AnchorDirection.center, - style: FlowyOverlayStyle(blur: false), - delegate: this, - ); - } - static String identifier() { return (RowDetailPage).toString(); } @@ -58,26 +42,28 @@ class RowDetailPage extends StatefulWidget with FlowyOverlayDelegate { class _RowDetailPageState extends State { @override Widget build(BuildContext context) { - return BlocProvider( - create: (context) { - final bloc = RowDetailBloc( - dataController: widget.dataController, - ); - bloc.add(const RowDetailEvent.initial()); - return bloc; - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 20), - child: Column( - children: [ - SizedBox( - height: 40, - child: Row( - children: const [Spacer(), _CloseButton()], + return FlowyDialog( + child: BlocProvider( + create: (context) { + final bloc = RowDetailBloc( + dataController: widget.dataController, + ); + bloc.add(const RowDetailEvent.initial()); + return bloc; + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 20), + child: Column( + children: [ + SizedBox( + height: 40, + child: Row( + children: const [Spacer(), _CloseButton()], + ), ), - ), - Expanded(child: _PropertyList(cellBuilder: widget.cellBuilder)), - ], + Expanded(child: _PropertyList(cellBuilder: widget.cellBuilder)), + ], + ), ), ), ); @@ -92,8 +78,9 @@ class _CloseButton extends StatelessWidget { final theme = context.watch(); return FlowyIconButton( width: 24, - onPressed: () => - FlowyOverlay.of(context).remove(RowDetailPage.identifier()), + onPressed: () { + FlowyOverlay.pop(context); + }, iconPadding: const EdgeInsets.fromLTRB(2, 2, 2, 2), icon: svgWidget("home/close", color: theme.iconColor), ); diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart new file mode 100644 index 0000000000..0c5caeb840 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'dart:math'; + +const overlayContainerPadding = EdgeInsets.all(12); +const overlayContainerMaxWidth = 760.0; +const overlayContainerMinWidth = 320.0; + +class FlowyDialog extends StatelessWidget { + final Widget? title; + final Widget child; + final BoxConstraints? constraints; + final EdgeInsets padding; + const FlowyDialog({ + required this.child, + this.title, + this.constraints, + this.padding = overlayContainerPadding, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final windowSize = MediaQuery.of(context).size; + final size = windowSize * 0.7; + return SimpleDialog(title: title, children: [ + Material( + type: MaterialType.transparency, + child: Container( + padding: padding, + height: size.height, + width: max(min(size.width, overlayContainerMaxWidth), + overlayContainerMinWidth), + constraints: constraints, + child: child, + ), + ) + ]); + } +} diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart index 25507b8f6d..5525a3569d 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart @@ -109,6 +109,19 @@ class FlowyOverlay extends StatefulWidget { return state; } + static void show( + {required BuildContext context, + required Widget Function(BuildContext context) builder}) { + showDialog( + context: context, + builder: builder, + ); + } + + static void pop(BuildContext context) { + Navigator.of(context).pop(); + } + @override FlowyOverlayState createState() => FlowyOverlayState(); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart index 96b566b308..91206253b1 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart @@ -18,12 +18,14 @@ class OverlayContainer extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = context.watch() ?? AppTheme.fromType(ThemeType.light); + final theme = + context.watch() ?? AppTheme.fromType(ThemeType.light); return Material( type: MaterialType.transparency, child: Container( padding: padding, - decoration: FlowyDecoration.decoration(theme.surface, theme.shadowColor.withOpacity(0.15)), + decoration: FlowyDecoration.decoration( + theme.surface, theme.shadowColor.withOpacity(0.15)), constraints: constraints, child: child, ), diff --git a/frontend/app_flowy/pubspec.lock b/frontend/app_flowy/pubspec.lock index 0f9421a563..b08897239c 100644 --- a/frontend/app_flowy/pubspec.lock +++ b/frontend/app_flowy/pubspec.lock @@ -28,7 +28,7 @@ packages: path: "packages/appflowy_board" relative: true source: path - version: "0.0.4" + version: "0.0.5" appflowy_editor: dependency: "direct main" description: From 84b5762017638f5b8808aee58350c3d9970d3c6c Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 25 Aug 2022 11:45:51 +0800 Subject: [PATCH 02/33] feat: unify styles --- .../presentation/widgets/row/row_detail.dart | 1 - .../settings/settings_dialog.dart | 67 ++++++++++--------- .../flowy_infra_ui/lib/flowy_infra_ui.dart | 1 + .../lib/src/flowy_overlay/flowy_dialog.dart | 36 +++++----- 4 files changed, 58 insertions(+), 47 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index ea4d94fc17..a2cba8b2fb 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -4,7 +4,6 @@ import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart' import 'package:app_flowy/plugins/grid/application/row/row_detail_bloc.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; -import 'package:flowy_infra_ui/src/flowy_overlay/flowy_dialog.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; diff --git a/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart b/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart index eaf09d770f..6de69029a5 100644 --- a/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart +++ b/frontend/app_flowy/lib/workspace/presentation/settings/settings_dialog.dart @@ -6,6 +6,7 @@ import 'package:app_flowy/workspace/presentation/settings/widgets/settings_langu import 'package:app_flowy/workspace/presentation/settings/widgets/settings_user_view.dart'; import 'package:app_flowy/workspace/presentation/settings/widgets/settings_menu.dart'; import 'package:app_flowy/workspace/application/settings/settings_dialog_bloc.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -28,46 +29,50 @@ class SettingsDialog extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => getIt(param1: user)..add(const SettingsDialogEvent.initial()), + create: (context) => getIt(param1: user) + ..add(const SettingsDialogEvent.initial()), child: BlocBuilder( builder: (context, state) => ChangeNotifierProvider.value( - value: Provider.of(context, listen: true), - child: AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), + value: Provider.of(context, + listen: true), + child: FlowyDialog( title: Text( LocaleKeys.settings_title.tr(), style: const TextStyle( fontWeight: FontWeight.bold, ), ), - content: ConstrainedBox( - constraints: const BoxConstraints( - maxHeight: 600, - minWidth: 600, - maxWidth: 1000, - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: 200, - child: SettingsMenu( - changeSelectedIndex: (index) { - context.read().add(SettingsDialogEvent.setViewIndex(index)); - }, - currentIndex: context.read().state.viewIndex, - ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 200, + child: SettingsMenu( + changeSelectedIndex: (index) { + context + .read() + .add(SettingsDialogEvent.setViewIndex(index)); + }, + currentIndex: context + .read() + .state + .viewIndex, ), - const VerticalDivider(), - const SizedBox(width: 10), - Expanded( - child: getSettingsView(context.read().state.viewIndex, - context.read().state.userProfile), - ) - ], - ), + ), + const VerticalDivider(), + const SizedBox(width: 10), + Expanded( + child: getSettingsView( + context + .read() + .state + .viewIndex, + context + .read() + .state + .userProfile), + ) + ], ), ), ))); diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart index 91768bd645..6ec4b64a51 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart @@ -8,3 +8,4 @@ export 'src/keyboard/keyboard_visibility_detector.dart'; export 'src/flowy_overlay/flowy_overlay.dart'; export 'src/flowy_overlay/list_overlay.dart'; export 'src/flowy_overlay/option_overlay.dart'; +export 'src/flowy_overlay/flowy_dialog.dart'; diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart index 0c5caeb840..e0158d5c0c 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_dialog.dart @@ -1,20 +1,22 @@ import 'package:flutter/material.dart'; import 'dart:math'; -const overlayContainerPadding = EdgeInsets.all(12); +const _overlayContainerPadding = EdgeInsets.all(12); const overlayContainerMaxWidth = 760.0; const overlayContainerMinWidth = 320.0; class FlowyDialog extends StatelessWidget { final Widget? title; + final ShapeBorder? shape; final Widget child; final BoxConstraints? constraints; final EdgeInsets padding; const FlowyDialog({ required this.child, this.title, + this.shape, this.constraints, - this.padding = overlayContainerPadding, + this.padding = _overlayContainerPadding, Key? key, }) : super(key: key); @@ -22,18 +24,22 @@ class FlowyDialog extends StatelessWidget { Widget build(BuildContext context) { final windowSize = MediaQuery.of(context).size; final size = windowSize * 0.7; - return SimpleDialog(title: title, children: [ - Material( - type: MaterialType.transparency, - child: Container( - padding: padding, - height: size.height, - width: max(min(size.width, overlayContainerMaxWidth), - overlayContainerMinWidth), - constraints: constraints, - child: child, - ), - ) - ]); + return SimpleDialog( + title: title, + shape: shape ?? + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + children: [ + Material( + type: MaterialType.transparency, + child: Container( + padding: padding, + height: size.height, + width: max(min(size.width, overlayContainerMaxWidth), + overlayContainerMinWidth), + constraints: constraints, + child: child, + ), + ) + ]); } } From ddc394fcd73d4fbcd6c0b72ceaccdf0dd5f238ac Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 25 Aug 2022 16:58:03 +0800 Subject: [PATCH 03/33] feat: introduce popover widget --- .../widgets/header/field_cell.dart | 5 +- .../widgets/header/field_editor.dart | 62 +++++++++++++------ .../widgets/header/grid_header.dart | 5 +- .../presentation/widgets/row/row_detail.dart | 5 +- .../widgets/toolbar/grid_property.dart | 5 +- .../flowy_infra_ui/lib/flowy_infra_ui.dart | 1 + .../lib/src/flowy_overlay/flowy_popover.dart | 27 ++++++++ 7 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index c1de0eca31..20bf490a41 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -65,14 +65,15 @@ class GridFieldCell extends StatelessWidget { final state = context.read().state; final field = state.field; - FieldEditor( + FieldEditorPopOver.show( + context, gridId: state.gridId, fieldName: field.name, typeOptionLoader: FieldTypeOptionLoader( gridId: state.gridId, field: field, ), - ).show(context); + ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index efa70bb81a..655975d2f7 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -49,24 +49,6 @@ class FieldEditor extends StatelessWidget with FlowyOverlayDelegate { ); } - void show( - BuildContext context, { - AnchorDirection anchorDirection = AnchorDirection.bottomWithLeftAligned, - }) { - FlowyOverlay.of(context).remove(identifier()); - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: this, - constraints: BoxConstraints.loose(const Size(280, 400)), - ), - identifier: identifier(), - anchorContext: context, - anchorDirection: anchorDirection, - style: FlowyOverlayStyle(blur: false), - delegate: this, - ); - } - static String identifier() { return (FieldEditor).toString(); } @@ -116,3 +98,47 @@ class _FieldNameCell extends StatelessWidget { ); } } + +class FieldEditorPopOver extends StatelessWidget { + final String gridId; + final String fieldName; + + final IFieldTypeOptionLoader typeOptionLoader; + const FieldEditorPopOver({ + required this.gridId, + required this.fieldName, + required this.typeOptionLoader, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return FlowyPopover( + child: Container( + constraints: BoxConstraints.loose(const Size(280, 400)), + width: 280, + height: 400, + child: FieldEditor( + gridId: gridId, + fieldName: fieldName, + typeOptionLoader: typeOptionLoader, + key: key), + )); + } + + static show( + BuildContext context, { + required String gridId, + required String fieldName, + required IFieldTypeOptionLoader typeOptionLoader, + Key? key, + }) { + FlowyPopover.show(context, builder: (BuildContext context) { + return FieldEditorPopOver( + gridId: gridId, + fieldName: fieldName, + typeOptionLoader: typeOptionLoader, + key: key); + }); + } +} diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart index 9d33768e65..8ae11330b4 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart @@ -157,11 +157,12 @@ class CreateFieldButton extends StatelessWidget { return FlowyButton( text: const FlowyText.medium('New column', fontSize: 12), hoverColor: theme.shader6, - onTap: () => FieldEditor( + onTap: () => FieldEditorPopOver.show( + context, gridId: gridId, fieldName: "", typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), - ).show(context), + ), leftIcon: svgWidget("home/add"), ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index a2cba8b2fb..cd9d93026a 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -169,14 +169,15 @@ class _RowDetailCell extends StatelessWidget { } void _showFieldEditor(BuildContext context) { - FieldEditor( + FieldEditorPopOver.show( + context, gridId: cellId.gridId, fieldName: cellId.field.name, typeOptionLoader: FieldTypeOptionLoader( gridId: cellId.gridId, field: cellId.field, ), - ).show(context); + ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 02230e5139..81cf019d9c 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -119,11 +119,12 @@ class _GridPropertyCell extends StatelessWidget { hoverColor: theme.hover, leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), onTap: () { - FieldEditor( + FieldEditorPopOver.show( + context, gridId: gridId, fieldName: field.name, typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field), - ).show(context, anchorDirection: AnchorDirection.bottomRight); + ); }, ); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart index 6ec4b64a51..a656077eb5 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/flowy_infra_ui.dart @@ -9,3 +9,4 @@ export 'src/flowy_overlay/flowy_overlay.dart'; export 'src/flowy_overlay/list_overlay.dart'; export 'src/flowy_overlay/option_overlay.dart'; export 'src/flowy_overlay/flowy_dialog.dart'; +export 'src/flowy_overlay/flowy_popover.dart'; diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart new file mode 100644 index 0000000000..f5bee6b492 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +const _overlayContainerPadding = EdgeInsets.all(12); + +class FlowyPopover extends StatelessWidget { + final Widget child; + final ShapeBorder? shape; + + FlowyPopover({Key? key, required this.child, this.shape}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SimpleDialog( + shape: shape ?? + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + children: [Container(padding: _overlayContainerPadding, child: child)], + ); + } + + static show( + BuildContext context, { + required Widget Function(BuildContext context) builder, + }) { + showDialog( + barrierColor: Colors.transparent, context: context, builder: builder); + } +} From 4fb760e44c12d739bd72c1ab5c575c0e7b6c5448 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Fri, 26 Aug 2022 13:47:49 +0800 Subject: [PATCH 04/33] feat: add popover overlay --- .../widgets/header/field_editor.dart | 18 +- .../lib/src/flowy_overlay/flowy_popover.dart | 56 +++- .../flowy_overlay/flowy_popover_layout.dart | 251 ++++++++++++++++++ 3 files changed, 303 insertions(+), 22 deletions(-) create mode 100644 frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover_layout.dart diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 655975d2f7..5289fe6d89 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -114,16 +114,14 @@ class FieldEditorPopOver extends StatelessWidget { @override Widget build(BuildContext context) { return FlowyPopover( - child: Container( - constraints: BoxConstraints.loose(const Size(280, 400)), - width: 280, - height: 400, - child: FieldEditor( - gridId: gridId, - fieldName: fieldName, - typeOptionLoader: typeOptionLoader, - key: key), - )); + builder: (BuildContext context) { + return FieldEditor( + gridId: gridId, + fieldName: fieldName, + typeOptionLoader: typeOptionLoader, + key: key); + }, + ); } static show( diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart index f5bee6b492..4d512fda40 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -1,21 +1,23 @@ +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; +import 'package:flowy_infra_ui/style_widget/decoration.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:provider/provider.dart'; import 'package:flutter/material.dart'; +import './flowy_popover_layout.dart'; const _overlayContainerPadding = EdgeInsets.all(12); -class FlowyPopover extends StatelessWidget { - final Widget child; +class FlowyPopover extends StatefulWidget { + final Widget Function(BuildContext context) builder; final ShapeBorder? shape; + final EdgeInsets padding; - FlowyPopover({Key? key, required this.child, this.shape}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SimpleDialog( - shape: shape ?? - RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - children: [Container(padding: _overlayContainerPadding, child: child)], - ); - } + FlowyPopover({ + Key? key, + required this.builder, + this.shape, + this.padding = _overlayContainerPadding, + }) : super(key: key); static show( BuildContext context, { @@ -24,4 +26,34 @@ class FlowyPopover extends StatelessWidget { showDialog( barrierColor: Colors.transparent, context: context, builder: builder); } + + @override + State createState() => _FlowyPopoverState(); +} + +class _FlowyPopoverState extends State { + final preRenderKey = GlobalKey(); + Size? size; + + @override + Widget build(BuildContext context) { + final theme = + context.watch() ?? AppTheme.fromType(ThemeType.light); + return Material( + type: MaterialType.transparency, + child: CustomSingleChildLayout( + delegate: PopoverLayoutDelegate( + anchorRect: const Rect.fromLTWH(0, 0, 280, 400), + anchorDirection: AnchorDirection.rightWithTopAligned, + overlapBehaviour: OverlapBehaviour.stretch, + ), + child: Container( + padding: widget.padding, + constraints: BoxConstraints.loose(const Size(280, 400)), + decoration: FlowyDecoration.decoration( + theme.surface, theme.shadowColor.withOpacity(0.15)), + key: preRenderKey, + child: widget.builder(context), + ))); + } } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover_layout.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover_layout.dart new file mode 100644 index 0000000000..0d4bacde52 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover_layout.dart @@ -0,0 +1,251 @@ +import 'dart:math' as math; +import 'package:flutter/material.dart'; +import 'flowy_overlay.dart'; + +class PopoverLayoutDelegate extends SingleChildLayoutDelegate { + PopoverLayoutDelegate({ + required this.anchorRect, + required this.anchorDirection, + required this.overlapBehaviour, + }); + + final Rect anchorRect; + final AnchorDirection anchorDirection; + final OverlapBehaviour overlapBehaviour; + + @override + bool shouldRelayout(PopoverLayoutDelegate oldDelegate) { + return anchorRect != oldDelegate.anchorRect || + anchorDirection != oldDelegate.anchorDirection || + overlapBehaviour != oldDelegate.overlapBehaviour; + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + switch (overlapBehaviour) { + case OverlapBehaviour.none: + return constraints.loosen(); + case OverlapBehaviour.stretch: + BoxConstraints childConstraints; + switch (anchorDirection) { + case AnchorDirection.topLeft: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + anchorRect.top, + )); + break; + case AnchorDirection.topRight: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.right, + anchorRect.top, + )); + break; + case AnchorDirection.bottomLeft: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + constraints.maxHeight - anchorRect.bottom, + )); + break; + case AnchorDirection.bottomRight: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.right, + constraints.maxHeight - anchorRect.bottom, + )); + break; + case AnchorDirection.center: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth, + constraints.maxHeight, + )); + break; + case AnchorDirection.topWithLeftAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.left, + anchorRect.top, + )); + break; + case AnchorDirection.topWithCenterAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth, + anchorRect.top, + )); + break; + case AnchorDirection.topWithRightAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.right, + anchorRect.top, + )); + break; + case AnchorDirection.rightWithTopAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.right, + constraints.maxHeight - anchorRect.top, + )); + break; + case AnchorDirection.rightWithCenterAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.right, + constraints.maxHeight, + )); + break; + case AnchorDirection.rightWithBottomAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth - anchorRect.right, + anchorRect.bottom, + )); + break; + case AnchorDirection.bottomWithLeftAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + constraints.maxHeight - anchorRect.bottom, + )); + break; + case AnchorDirection.bottomWithCenterAligned: + childConstraints = BoxConstraints.loose(Size( + constraints.maxWidth, + constraints.maxHeight - anchorRect.bottom, + )); + break; + case AnchorDirection.bottomWithRightAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.right, + constraints.maxHeight - anchorRect.bottom, + )); + break; + case AnchorDirection.leftWithTopAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + constraints.maxHeight - anchorRect.top, + )); + break; + case AnchorDirection.leftWithCenterAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + constraints.maxHeight, + )); + break; + case AnchorDirection.leftWithBottomAligned: + childConstraints = BoxConstraints.loose(Size( + anchorRect.left, + anchorRect.bottom, + )); + break; + case AnchorDirection.custom: + childConstraints = constraints.loosen(); + break; + default: + throw UnimplementedError(); + } + return childConstraints; + } + } + + @override + Offset getPositionForChild(Size size, Size childSize) { + Offset position; + switch (anchorDirection) { + case AnchorDirection.topLeft: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top - childSize.height, + ); + break; + case AnchorDirection.topRight: + position = Offset( + anchorRect.right, + anchorRect.top - childSize.height, + ); + break; + case AnchorDirection.bottomLeft: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.bottom, + ); + break; + case AnchorDirection.bottomRight: + position = Offset( + anchorRect.right, + anchorRect.bottom, + ); + break; + case AnchorDirection.center: + position = anchorRect.center; + break; + case AnchorDirection.topWithLeftAligned: + position = Offset( + anchorRect.left, + anchorRect.top - childSize.height, + ); + break; + case AnchorDirection.topWithCenterAligned: + position = Offset( + anchorRect.left + anchorRect.width / 2.0 - childSize.width / 2.0, + anchorRect.top - childSize.height, + ); + break; + case AnchorDirection.topWithRightAligned: + position = Offset( + anchorRect.right - childSize.width, + anchorRect.top - childSize.height, + ); + break; + case AnchorDirection.rightWithTopAligned: + position = Offset(anchorRect.right, anchorRect.top); + break; + case AnchorDirection.rightWithCenterAligned: + position = Offset( + anchorRect.right, + anchorRect.top + anchorRect.height / 2.0 - childSize.height / 2.0, + ); + break; + case AnchorDirection.rightWithBottomAligned: + position = Offset( + anchorRect.right, + anchorRect.bottom - childSize.height, + ); + break; + case AnchorDirection.bottomWithLeftAligned: + position = Offset( + anchorRect.left, + anchorRect.bottom, + ); + break; + case AnchorDirection.bottomWithCenterAligned: + position = Offset( + anchorRect.left + anchorRect.width / 2.0 - childSize.width / 2.0, + anchorRect.bottom, + ); + break; + case AnchorDirection.bottomWithRightAligned: + position = Offset( + anchorRect.right - childSize.width, + anchorRect.bottom, + ); + break; + case AnchorDirection.leftWithTopAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top, + ); + break; + case AnchorDirection.leftWithCenterAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top + anchorRect.height / 2.0 - childSize.height / 2.0, + ); + break; + case AnchorDirection.leftWithBottomAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.bottom - childSize.height, + ); + break; + default: + throw UnimplementedError(); + } + return Offset( + math.max(0.0, math.min(size.width - childSize.width, position.dx)), + math.max(0.0, math.min(size.height - childSize.height, position.dy)), + ); + } +} From e9b215ebbd9f972961d8dadabc22fc0b76abc577 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Fri, 26 Aug 2022 14:26:07 +0800 Subject: [PATCH 05/33] feat: poover anchor on the object --- .../widgets/header/field_cell.dart | 1 + .../widgets/header/field_editor.dart | 37 +++++++-------- .../widgets/header/grid_header.dart | 1 + .../presentation/widgets/row/row_detail.dart | 1 + .../widgets/toolbar/grid_property.dart | 1 + .../lib/src/flowy_overlay/flowy_popover.dart | 45 +++++++++++++++++-- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index 20bf490a41..86f67b73ef 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -67,6 +67,7 @@ class GridFieldCell extends StatelessWidget { FieldEditorPopOver.show( context, + anchorContext: context, gridId: state.gridId, fieldName: field.name, typeOptionLoader: FieldTypeOptionLoader( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 5289fe6d89..7da896547a 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -113,9 +113,26 @@ class FieldEditorPopOver extends StatelessWidget { @override Widget build(BuildContext context) { - return FlowyPopover( + return FieldEditor( + gridId: gridId, + fieldName: fieldName, + typeOptionLoader: typeOptionLoader, + key: key); + } + + static show( + BuildContext context, { + required BuildContext anchorContext, + required String gridId, + required String fieldName, + required IFieldTypeOptionLoader typeOptionLoader, + Key? key, + }) { + FlowyPopover.show( + context, + anchorContext: anchorContext, builder: (BuildContext context) { - return FieldEditor( + return FieldEditorPopOver( gridId: gridId, fieldName: fieldName, typeOptionLoader: typeOptionLoader, @@ -123,20 +140,4 @@ class FieldEditorPopOver extends StatelessWidget { }, ); } - - static show( - BuildContext context, { - required String gridId, - required String fieldName, - required IFieldTypeOptionLoader typeOptionLoader, - Key? key, - }) { - FlowyPopover.show(context, builder: (BuildContext context) { - return FieldEditorPopOver( - gridId: gridId, - fieldName: fieldName, - typeOptionLoader: typeOptionLoader, - key: key); - }); - } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart index 8ae11330b4..7e2466173f 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart @@ -159,6 +159,7 @@ class CreateFieldButton extends StatelessWidget { hoverColor: theme.shader6, onTap: () => FieldEditorPopOver.show( context, + anchorContext: context, gridId: gridId, fieldName: "", typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index cd9d93026a..ae5ec03031 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -171,6 +171,7 @@ class _RowDetailCell extends StatelessWidget { void _showFieldEditor(BuildContext context) { FieldEditorPopOver.show( context, + anchorContext: context, gridId: cellId.gridId, fieldName: cellId.field.name, typeOptionLoader: FieldTypeOptionLoader( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 81cf019d9c..3cef420a53 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -121,6 +121,7 @@ class _GridPropertyCell extends StatelessWidget { onTap: () { FieldEditorPopOver.show( context, + anchorContext: context, gridId: gridId, fieldName: field.name, typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field), diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart index 4d512fda40..9b8c9d74e6 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -10,21 +10,59 @@ const _overlayContainerPadding = EdgeInsets.all(12); class FlowyPopover extends StatefulWidget { final Widget Function(BuildContext context) builder; final ShapeBorder? shape; + final Rect anchorRect; + final AnchorDirection? anchorDirection; final EdgeInsets padding; FlowyPopover({ Key? key, required this.builder, + required this.anchorRect, this.shape, this.padding = _overlayContainerPadding, + this.anchorDirection, }) : super(key: key); static show( BuildContext context, { required Widget Function(BuildContext context) builder, + BuildContext? anchorContext, + Offset? anchorPosition, + AnchorDirection? anchorDirection, + Size? anchorSize, + Offset? anchorOffset, }) { + final offset = anchorOffset ?? Offset.zero; + Offset targetAnchorPosition = anchorPosition ?? Offset.zero; + Size targetAnchorSize = anchorSize ?? Size.zero; + if (anchorContext != null) { + RenderObject renderObject = anchorContext.findRenderObject()!; + assert( + renderObject is RenderBox, + 'Unexpected non-RenderBox render object caught.', + ); + final renderBox = renderObject as RenderBox; + targetAnchorPosition = renderBox.localToGlobal(Offset.zero); + targetAnchorSize = renderBox.size; + } + final anchorRect = Rect.fromLTWH( + targetAnchorPosition.dx + offset.dx, + targetAnchorPosition.dy + offset.dy, + targetAnchorSize.width, + targetAnchorSize.height, + ); + showDialog( - barrierColor: Colors.transparent, context: context, builder: builder); + barrierColor: Colors.transparent, + context: context, + builder: (BuildContext context) { + return FlowyPopover( + anchorRect: anchorRect, + anchorDirection: anchorDirection, + builder: (BuildContext context) { + return builder(context); + }); + }); } @override @@ -43,8 +81,9 @@ class _FlowyPopoverState extends State { type: MaterialType.transparency, child: CustomSingleChildLayout( delegate: PopoverLayoutDelegate( - anchorRect: const Rect.fromLTWH(0, 0, 280, 400), - anchorDirection: AnchorDirection.rightWithTopAligned, + anchorRect: widget.anchorRect, + anchorDirection: + widget.anchorDirection ?? AnchorDirection.rightWithTopAligned, overlapBehaviour: OverlapBehaviour.stretch, ), child: Container( From 5cdd1d38c485b7d728f2692bac88a191b31380a2 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Fri, 26 Aug 2022 15:25:35 +0800 Subject: [PATCH 06/33] feat: aciton sheet --- .../widgets/header/field_cell.dart | 5 ++-- .../header/field_cell_action_sheet.dart | 30 +++++++++++-------- .../widgets/header/field_editor.dart | 24 ++------------- .../header/field_type_option_editor.dart | 23 +++++--------- .../lib/src/flowy_overlay/flowy_popover.dart | 7 ++++- 5 files changed, 36 insertions(+), 53 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index 86f67b73ef..bbd7e7b5f2 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -54,11 +54,12 @@ class GridFieldCell extends StatelessWidget { void _showActionSheet(BuildContext context) { final state = context.read().state; - GridFieldCellActionSheet( + GridFieldCellActionSheetPopover.show( + context, cellContext: GridFieldCellContext(gridId: state.gridId, field: state.field), onEdited: () => _showFieldEditor(context), - ).show(context); + ); } void _showFieldEditor(BuildContext context) { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart index cd884cd557..a7bb1ea625 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart @@ -21,19 +21,6 @@ class GridFieldCellActionSheet extends StatelessWidget {required this.cellContext, required this.onEdited, Key? key}) : super(key: key); - void show(BuildContext overlayContext) { - FlowyOverlay.of(overlayContext).insertWithAnchor( - widget: OverlayContainer( - child: this, - constraints: BoxConstraints.loose(const Size(240, 200)), - ), - identifier: GridFieldCellActionSheet.identifier(), - anchorContext: overlayContext, - anchorDirection: AnchorDirection.bottomWithLeftAligned, - delegate: this, - ); - } - @override Widget build(BuildContext context) { return BlocProvider( @@ -213,3 +200,20 @@ extension _FieldActionExtension on FieldAction { } } } + +class GridFieldCellActionSheetPopover { + static show( + BuildContext context, { + required GridFieldCellContext cellContext, + required VoidCallback onEdited, + }) { + FlowyPopover.show(context, + anchorContext: context, + anchorDirection: AnchorDirection.bottomWithLeftAligned, + constraints: BoxConstraints.loose(const Size(240, 200)), + builder: (BuildContext context) { + return GridFieldCellActionSheet( + cellContext: cellContext, onEdited: onEdited); + }); + } +} diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 7da896547a..cd2efb2c4e 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -99,27 +99,7 @@ class _FieldNameCell extends StatelessWidget { } } -class FieldEditorPopOver extends StatelessWidget { - final String gridId; - final String fieldName; - - final IFieldTypeOptionLoader typeOptionLoader; - const FieldEditorPopOver({ - required this.gridId, - required this.fieldName, - required this.typeOptionLoader, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return FieldEditor( - gridId: gridId, - fieldName: fieldName, - typeOptionLoader: typeOptionLoader, - key: key); - } - +class FieldEditorPopOver { static show( BuildContext context, { required BuildContext anchorContext, @@ -132,7 +112,7 @@ class FieldEditorPopOver extends StatelessWidget { context, anchorContext: anchorContext, builder: (BuildContext context) { - return FieldEditorPopOver( + return FieldEditor( gridId: gridId, fieldName: fieldName, typeOptionLoader: typeOptionLoader, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index 20440235cb..11e0434054 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -102,22 +102,15 @@ class _FieldTypeOptionEditorState extends State { void _showOverlay(BuildContext context, Widget child, {VoidCallback? onRemoved}) { - final identifier = child.toString(); - if (currentOverlayIdentifier != null) { - FlowyOverlay.of(context).remove(currentOverlayIdentifier!); - } - - currentOverlayIdentifier = identifier; - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: child, - constraints: BoxConstraints.loose(const Size(460, 440)), - ), - identifier: identifier, + FlowyPopover.show( + context, + constraints: BoxConstraints.loose(const Size(460, 440)), anchorContext: context, - anchorDirection: AnchorDirection.leftWithCenterAligned, - style: FlowyOverlayStyle(blur: false), - anchorOffset: const Offset(-20, 0), + anchorDirection: AnchorDirection.rightWithCenterAligned, + anchorOffset: const Offset(20, 0), + builder: (BuildContext context) { + return child; + }, ); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart index 9b8c9d74e6..6a773799cf 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -13,6 +13,7 @@ class FlowyPopover extends StatefulWidget { final Rect anchorRect; final AnchorDirection? anchorDirection; final EdgeInsets padding; + final BoxConstraints? constraints; FlowyPopover({ Key? key, @@ -21,6 +22,7 @@ class FlowyPopover extends StatefulWidget { this.shape, this.padding = _overlayContainerPadding, this.anchorDirection, + this.constraints, }) : super(key: key); static show( @@ -31,6 +33,7 @@ class FlowyPopover extends StatefulWidget { AnchorDirection? anchorDirection, Size? anchorSize, Offset? anchorOffset, + BoxConstraints? constraints, }) { final offset = anchorOffset ?? Offset.zero; Offset targetAnchorPosition = anchorPosition ?? Offset.zero; @@ -59,6 +62,7 @@ class FlowyPopover extends StatefulWidget { return FlowyPopover( anchorRect: anchorRect, anchorDirection: anchorDirection, + constraints: constraints, builder: (BuildContext context) { return builder(context); }); @@ -88,7 +92,8 @@ class _FlowyPopoverState extends State { ), child: Container( padding: widget.padding, - constraints: BoxConstraints.loose(const Size(280, 400)), + constraints: widget.constraints ?? + BoxConstraints.loose(const Size(280, 400)), decoration: FlowyDecoration.decoration( theme.surface, theme.shadowColor.withOpacity(0.15)), key: preRenderKey, From 2fb11519d2411d5f97adfd20038d61a6ab6d53ca Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 13:56:16 +0800 Subject: [PATCH 07/33] feat: add popover package --- .../packages/appflowy_popover/.gitignore | 30 +++++++++++ .../packages/appflowy_popover/.metadata | 10 ++++ .../packages/appflowy_popover/CHANGELOG.md | 3 ++ .../packages/appflowy_popover/LICENSE | 1 + .../packages/appflowy_popover/README.md | 39 ++++++++++++++ .../appflowy_popover/analysis_options.yaml | 4 ++ .../lib/appflowy_popover.dart | 7 +++ .../packages/appflowy_popover/pubspec.yaml | 54 +++++++++++++++++++ .../test/appflowy_popover_test.dart | 12 +++++ 9 files changed, 160 insertions(+) create mode 100644 frontend/app_flowy/packages/appflowy_popover/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/.metadata create mode 100644 frontend/app_flowy/packages/appflowy_popover/CHANGELOG.md create mode 100644 frontend/app_flowy/packages/appflowy_popover/LICENSE create mode 100644 frontend/app_flowy/packages/appflowy_popover/README.md create mode 100644 frontend/app_flowy/packages/appflowy_popover/analysis_options.yaml create mode 100644 frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart create mode 100644 frontend/app_flowy/packages/appflowy_popover/pubspec.yaml create mode 100644 frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart diff --git a/frontend/app_flowy/packages/appflowy_popover/.gitignore b/frontend/app_flowy/packages/appflowy_popover/.gitignore new file mode 100644 index 0000000000..96486fd930 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/.gitignore @@ -0,0 +1,30 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/frontend/app_flowy/packages/appflowy_popover/.metadata b/frontend/app_flowy/packages/appflowy_popover/.metadata new file mode 100644 index 0000000000..e7011f64f3 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + channel: stable + +project_type: package diff --git a/frontend/app_flowy/packages/appflowy_popover/CHANGELOG.md b/frontend/app_flowy/packages/appflowy_popover/CHANGELOG.md new file mode 100644 index 0000000000..41cc7d8192 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/frontend/app_flowy/packages/appflowy_popover/LICENSE b/frontend/app_flowy/packages/appflowy_popover/LICENSE new file mode 100644 index 0000000000..ba75c69f7f --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/frontend/app_flowy/packages/appflowy_popover/README.md b/frontend/app_flowy/packages/appflowy_popover/README.md new file mode 100644 index 0000000000..8b55e735b5 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/frontend/app_flowy/packages/appflowy_popover/analysis_options.yaml b/frontend/app_flowy/packages/appflowy_popover/analysis_options.yaml new file mode 100644 index 0000000000..a5744c1cfb --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart new file mode 100644 index 0000000000..f8e77ebb4a --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart @@ -0,0 +1,7 @@ +library appflowy_popover; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/pubspec.yaml b/frontend/app_flowy/packages/appflowy_popover/pubspec.yaml new file mode 100644 index 0000000000..be1e57f009 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/pubspec.yaml @@ -0,0 +1,54 @@ +name: appflowy_popover +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=2.17.6 <3.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart b/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart new file mode 100644 index 0000000000..f2c80aea5c --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:appflowy_popover/appflowy_popover.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +} From fe549e8d6794182dc614d1bf88e69518342009ea Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 14:00:27 +0800 Subject: [PATCH 08/33] feat: add example --- .../appflowy_popover/example/.gitignore | 47 ++ .../appflowy_popover/example/.metadata | 45 ++ .../appflowy_popover/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 71 +++ .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 ++ .../com/example/example/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 8 + .../example/android/build.gradle | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../appflowy_popover/example/ios/.gitignore | 34 ++ .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 481 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 49 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/example_button.dart | 68 +++ .../appflowy_popover/example/lib/main.dart | 133 ++++ .../appflowy_popover/example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../appflowy_popover/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../appflowy_popover/example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 +++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 +++++++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../appflowy_popover/example/pubspec.yaml | 89 +++ .../example/test/widget_test.dart | 30 + .../appflowy_popover/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../appflowy_popover/example/web/index.html | 58 ++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 32 + .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/appflowy_popover.dart | 177 +++++- .../test/appflowy_popover_test.dart | 10 +- 128 files changed, 4575 insertions(+), 11 deletions(-) create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/.metadata create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/README.md create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/analysis_options.yaml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/build.gradle create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/debug/AndroidManifest.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/AndroidManifest.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values-night/styles.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values/styles.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/app/src/profile/AndroidManifest.xml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/build.gradle create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/gradle.properties create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/android/settings.gradle create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Debug.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Release.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/AppDelegate.swift create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Info.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/CMakeLists.txt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/CMakeLists.txt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugins.cmake create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/main.cc create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.cc create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/AppDelegate.swift create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Release.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/DebugProfile.entitlements create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Info.plist create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/MainFlutterWindow.swift create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Release.entitlements create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/pubspec.yaml create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/favicon.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-192.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-512.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-192.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-512.png create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/index.html create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/web/manifest.json create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/.gitignore create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/CMakeLists.txt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/CMakeLists.txt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugins.cmake create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/CMakeLists.txt create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/Runner.rc create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.cpp create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/main.cpp create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resource.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resources/app_icon.ico create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/runner.exe.manifest create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.cpp create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.h create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.cpp create mode 100644 frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.h diff --git a/frontend/app_flowy/packages/appflowy_popover/example/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/.gitignore new file mode 100644 index 0000000000..a8e938c083 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/.gitignore @@ -0,0 +1,47 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/frontend/app_flowy/packages/appflowy_popover/example/.metadata b/frontend/app_flowy/packages/appflowy_popover/example/.metadata new file mode 100644 index 0000000000..39f2501e1f --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: android + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: ios + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: linux + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: macos + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: web + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + - platform: windows + create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/frontend/app_flowy/packages/appflowy_popover/example/README.md b/frontend/app_flowy/packages/appflowy_popover/example/README.md new file mode 100644 index 0000000000..2b3fce4c86 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/frontend/app_flowy/packages/appflowy_popover/example/analysis_options.yaml b/frontend/app_flowy/packages/appflowy_popover/example/analysis_options.yaml new file mode 100644 index 0000000000..61b6c4de17 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/android/.gitignore new file mode 100644 index 0000000000..6f568019d3 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/build.gradle b/frontend/app_flowy/packages/appflowy_popover/example/android/app/build.gradle new file mode 100644 index 0000000000..0833ecfca8 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/build.gradle @@ -0,0 +1,71 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/debug/AndroidManifest.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..45d523a2a2 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/AndroidManifest.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..3f41384dbc --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 0000000000..e793a000d6 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000000..f74085f3f6 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable/launch_background.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..304732f884 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values-night/styles.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000000..06952be745 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values/styles.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..cb1ef88056 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/profile/AndroidManifest.xml b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..45d523a2a2 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/build.gradle b/frontend/app_flowy/packages/appflowy_popover/example/android/build.gradle new file mode 100644 index 0000000000..83ae220041 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/gradle.properties b/frontend/app_flowy/packages/appflowy_popover/example/android/gradle.properties new file mode 100644 index 0000000000..94adc3a3f9 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/gradle/wrapper/gradle-wrapper.properties b/frontend/app_flowy/packages/appflowy_popover/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..cc5527d781 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/frontend/app_flowy/packages/appflowy_popover/example/android/settings.gradle b/frontend/app_flowy/packages/appflowy_popover/example/android/settings.gradle new file mode 100644 index 0000000000..44e62bcf06 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/ios/.gitignore new file mode 100644 index 0000000000..7a7f9873ad --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/AppFrameworkInfo.plist b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000000..8d4492f977 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Debug.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000000..592ceee85b --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Release.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000000..592ceee85b --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.pbxproj b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..6edd238e7c --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,481 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..c87d15a335 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..1d526a16ed --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/AppDelegate.swift b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000000..70693e4a8c --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d36b1fab2d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000000..89c2725b70 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..f2e259c7c9 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/Main.storyboard b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..f3c28516fb --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Info.plist b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Info.plist new file mode 100644 index 0000000000..907f329fe0 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Runner-Bridging-Header.h b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000000..308a2a560b --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart new file mode 100644 index 0000000000..d98c37d99d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:appflowy_popover/appflowy_popover.dart'; + +class PopoverMenu extends StatelessWidget { + final AppFlowyPopoverController popover = AppFlowyPopoverController(); + @override + Widget build(BuildContext context) { + return Container( + width: 200, + height: 200, + decoration: const BoxDecoration(color: Colors.yellow), + child: ListView(children: [ + const Text("App"), + AppFlowyPopover( + controller: popover, + offset: const Offset(10, 0), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + popupBuilder: (BuildContext context) { + return PopoverMenu(); + }, + child: TextButton( + onPressed: () { + popover.show(); + }, + child: const Text("Second"), + ), + ), + ]), + ); + } +} + +class ExampleButton extends StatelessWidget { + final AppFlowyPopoverController _popover = AppFlowyPopoverController(); + + final String label; + final Alignment targetAnchor; + final Alignment followerAnchor; + final Offset? offset; + + ExampleButton({ + Key? key, + required this.label, + this.targetAnchor = Alignment.topLeft, + this.followerAnchor = Alignment.topLeft, + this.offset = Offset.zero, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AppFlowyPopover( + controller: _popover, + targetAnchor: targetAnchor, + followerAnchor: followerAnchor, + offset: offset, + child: TextButton( + onPressed: (() { + _popover.show(); + }), + child: Text(label), + ), + popupBuilder: (BuildContext context) { + return PopoverMenu(); + }, + ); + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart new file mode 100644 index 0000000000..7ce7798acb --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import "./example_button.dart"; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or simply save your changes to "hot reload" in a Flutter IDE). + // Notice that the counter didn't reset back to zero; the application + // is not restarted. + primarySwatch: Colors.blue, + ), + home: const MyHomePage(title: 'AppFlowy Popover Example'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({Key? key, required this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Row(children: [ + Column(children: [ + ExampleButton( + label: "Left top", + targetAnchor: Alignment.bottomLeft, + offset: const Offset(0, 10), + ), + Expanded(child: Container()), + ExampleButton( + label: "Left bottom", + followerAnchor: Alignment.bottomLeft, + offset: const Offset(0, -10), + ), + ]), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ExampleButton( + label: "Top", + targetAnchor: Alignment.bottomCenter, + followerAnchor: Alignment.topCenter, + offset: const Offset(0, 10), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ExampleButton( + label: "Central", + targetAnchor: Alignment.bottomCenter, + followerAnchor: Alignment.topCenter, + offset: const Offset(0, 10), + ), + ], + ), + ), + ExampleButton( + label: "Bottom", + targetAnchor: Alignment.topCenter, + followerAnchor: Alignment.bottomCenter, + offset: const Offset(0, -10), + ), + ], + ), + ), + Column( + children: [ + ExampleButton( + label: "Right top", + targetAnchor: Alignment.bottomRight, + followerAnchor: Alignment.topRight, + offset: const Offset(0, 10), + ), + Expanded(child: Container()), + ExampleButton( + label: "Right bottom", + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.bottomRight, + offset: const Offset(0, -10), + ), + ], + ) + ]), + ); + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/linux/.gitignore new file mode 100644 index 0000000000..d3896c9844 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/CMakeLists.txt b/frontend/app_flowy/packages/appflowy_popover/example/linux/CMakeLists.txt new file mode 100644 index 0000000000..74c66dd446 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/CMakeLists.txt b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000000..d5bd01648a --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.cc b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000000..e71a16d23d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.h b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000000..e0f0a47bc0 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugins.cmake b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000000..2e1de87a7e --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/main.cc b/frontend/app_flowy/packages/appflowy_popover/example/linux/main.cc new file mode 100644 index 0000000000..e7c5c54370 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.cc b/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.cc new file mode 100644 index 0000000000..0ba8f43096 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "example"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.h b/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.h new file mode 100644 index 0000000000..72271d5e41 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/macos/.gitignore new file mode 100644 index 0000000000..746adbb6b9 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Debug.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000000..c2efd0b608 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Release.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000000..c2efd0b608 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000000..cccf817a52 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.pbxproj b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..c84862c675 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..fb7259e177 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..1d526a16ed --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/AppDelegate.swift b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000000..d53ef64377 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..a2ec33f19f --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/AppInfo.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000000..8b42559e87 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Debug.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000000..36b0fd9464 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Release.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000000..dff4f49561 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Warnings.xcconfig b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000000..42bcbf4780 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/DebugProfile.entitlements b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000000..dddb8a30c8 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Info.plist b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Info.plist new file mode 100644 index 0000000000..4789daa6a4 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/MainFlutterWindow.swift b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000000..2722837ec9 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Release.entitlements b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Release.entitlements new file mode 100644 index 0000000000..852fa1a472 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/pubspec.yaml b/frontend/app_flowy/packages/appflowy_popover/example/pubspec.yaml new file mode 100644 index 0000000000..c970983dbc --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/pubspec.yaml @@ -0,0 +1,89 @@ +name: example +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.17.6 <3.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + appflowy_popover: + path: ../ + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart b/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart new file mode 100644 index 0000000000..092d222f7e --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:example/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/favicon.png b/frontend/app_flowy/packages/appflowy_popover/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-192.png b/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-512.png b/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-192.png b/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-512.png b/frontend/app_flowy/packages/appflowy_popover/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/index.html b/frontend/app_flowy/packages/appflowy_popover/example/web/index.html new file mode 100644 index 0000000000..41b3bc336f --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/web/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/web/manifest.json b/frontend/app_flowy/packages/appflowy_popover/example/web/manifest.json new file mode 100644 index 0000000000..096edf8fe4 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/.gitignore b/frontend/app_flowy/packages/appflowy_popover/example/windows/.gitignore new file mode 100644 index 0000000000..d492d0d98c --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/CMakeLists.txt b/frontend/app_flowy/packages/appflowy_popover/example/windows/CMakeLists.txt new file mode 100644 index 0000000000..c0270746b1 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/CMakeLists.txt b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000000..930d2071a3 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.cc b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000000..8b6d4680af --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.h b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000000..dc139d85a9 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugins.cmake b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000000..b93c4c30c1 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/CMakeLists.txt b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/CMakeLists.txt new file mode 100644 index 0000000000..b9e550fba8 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/Runner.rc b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/Runner.rc new file mode 100644 index 0000000000..5fdea291cf --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.cpp b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.cpp new file mode 100644 index 0000000000..b43b9095ea --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.h b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.h new file mode 100644 index 0000000000..6da0652f05 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/main.cpp b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/main.cpp new file mode 100644 index 0000000000..bcb57b0e2a --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resource.h b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resource.h new file mode 100644 index 0000000000..66a65d1e4a --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resources/app_icon.ico b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/runner.exe.manifest b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/runner.exe.manifest new file mode 100644 index 0000000000..c977c4a425 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.cpp b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.cpp new file mode 100644 index 0000000000..f5bf9fa0f5 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.h b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.h new file mode 100644 index 0000000000..3879d54755 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.cpp b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.cpp new file mode 100644 index 0000000000..c10f08dc7d --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.h b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.h new file mode 100644 index 0000000000..17ba431125 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart index f8e77ebb4a..a28c03f5d2 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart @@ -1,7 +1,174 @@ -library appflowy_popover; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; -/// A Calculator. -class Calculator { - /// Returns [value] plus 1. - int addOne(int value) => value + 1; +class AppFlowyPopoverController { + AppFlowyPopoverState? state; + + close() { + state?.close(); + } + + show() { + state?.showOverlay(); + } +} + +class AppFlowyPopover extends StatefulWidget { + final Widget child; + final AppFlowyPopoverController? controller; + final Offset? offset; + final Decoration? maskDecoration; + final Alignment targetAnchor; + final Alignment followerAnchor; + final Widget Function(BuildContext context) popupBuilder; + + const AppFlowyPopover({ + Key? key, + required this.child, + required this.popupBuilder, + this.controller, + this.offset, + this.maskDecoration, + this.targetAnchor = Alignment.topLeft, + this.followerAnchor = Alignment.topLeft, + }) : super(key: key); + + @override + State createState() => AppFlowyPopoverState(); +} + +final _globalPopovers = List.empty(growable: true); + +class AppFlowyPopoverState extends State { + final LayerLink layerLink = LayerLink(); + OverlayEntry? _overlayEntry; + bool hasMask = true; + + @override + void initState() { + widget.controller?.state = this; + super.initState(); + } + + showOverlay() { + debugPrint("show overlay"); + _overlayEntry?.remove(); + + if (_globalPopovers.isNotEmpty) { + hasMask = false; + } + debugPrint("has mask: $hasMask"); + + final newEntry = OverlayEntry(builder: (context) { + final children = []; + + if (hasMask) { + children.add(_PopoverMask( + decoration: widget.maskDecoration, + onTap: () => _closeAll(), + onExit: () => _closeAll(), + )); + } + + children.add(CompositedTransformFollower( + link: layerLink, + offset: widget.offset ?? Offset.zero, + targetAnchor: widget.targetAnchor, + followerAnchor: widget.followerAnchor, + child: widget.popupBuilder(context), + )); + + return Stack(children: children); + // return widget.popupBuilder(context); + }); + + _globalPopovers.add(this); + _overlayEntry = newEntry; + + Overlay.of(context)?.insert(newEntry); + } + + _closeAll() { + final copiedArr = [..._globalPopovers]; + for (var i = copiedArr.length - 1; i >= 0; i--) { + copiedArr[i].close(); + } + _globalPopovers.clear(); + } + + close() { + if (_globalPopovers.last == this) { + _globalPopovers.removeLast(); + } + _overlayEntry?.remove(); + _overlayEntry = null; + } + + @override + void dispose() { + debugPrint("popover dispose"); + _overlayEntry?.remove(); + _overlayEntry = null; + if (hasMask) { + debugPrint("len: ${_globalPopovers.length}"); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return CompositedTransformTarget(link: layerLink, child: widget.child); + } +} + +class _PopoverMask extends StatefulWidget { + final void Function() onTap; + final void Function()? onExit; + final Decoration? decoration; + + const _PopoverMask( + {Key? key, required this.onTap, this.onExit, this.decoration}) + : super(key: key); + + @override + State createState() => _PopoverMaskState(); +} + +class _PopoverMaskState extends State<_PopoverMask> { + @override + void initState() { + HardwareKeyboard.instance.addHandler(_handleGlobalKeyEvent); + super.initState(); + } + + bool _handleGlobalKeyEvent(KeyEvent event) { + if (event.logicalKey == LogicalKeyboardKey.escape) { + if (widget.onExit != null) { + widget.onExit!(); + } + + return true; + } + return false; + } + + @override + void dispose() { + HardwareKeyboard.instance.removeHandler(_handleGlobalKeyEvent); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: widget.onTap, + child: Container( + // decoration: widget.decoration, + decoration: widget.decoration ?? + const BoxDecoration( + color: Color.fromARGB(0, 244, 67, 54), + ), + ), + ); + } } diff --git a/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart b/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart index f2c80aea5c..9a3bf783f3 100644 --- a/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart +++ b/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart @@ -1,12 +1,10 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:appflowy_popover/appflowy_popover.dart'; - void main() { test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); }); } From 072d94ebe6e91fa5e3989e3af264f62971fe5637 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 15:13:13 +0800 Subject: [PATCH 09/33] feat: add secondary button --- .../example/lib/example_button.dart | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index d98c37d99d..8f1a6997d5 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -1,8 +1,14 @@ import 'package:flutter/material.dart'; import 'package:appflowy_popover/appflowy_popover.dart'; -class PopoverMenu extends StatelessWidget { +class PopoverMenu extends StatefulWidget { + @override + State createState() => _PopoverMenuState(); +} + +class _PopoverMenuState extends State { final AppFlowyPopoverController popover = AppFlowyPopoverController(); + final AppFlowyPopoverController hoverPopover = AppFlowyPopoverController(); @override Widget build(BuildContext context) { return Container( @@ -23,6 +29,35 @@ class PopoverMenu extends StatelessWidget { onPressed: () { popover.show(); }, + onHover: (value) { + if (value) { + popover.show(); + } else { + popover.close(); + } + }, + child: const Text("First"), + ), + ), + AppFlowyPopover( + controller: hoverPopover, + offset: const Offset(10, 0), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + popupBuilder: (BuildContext context) { + return PopoverMenu(); + }, + child: TextButton( + onPressed: () { + hoverPopover.show(); + }, + onHover: (value) { + if (value) { + hoverPopover.show(); + } else { + hoverPopover.close(); + } + }, child: const Text("Second"), ), ), From defef552ed3a88278dfbfe8630b505d0e7b51f76 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 15:29:39 +0800 Subject: [PATCH 10/33] feat: add exclusive --- .../example/lib/example_button.dart | 29 +++++++++++-------- .../lib/appflowy_popover.dart | 17 ++++++++++- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 8f1a6997d5..df8b83f349 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -7,8 +7,17 @@ class PopoverMenu extends StatefulWidget { } class _PopoverMenuState extends State { - final AppFlowyPopoverController popover = AppFlowyPopoverController(); - final AppFlowyPopoverController hoverPopover = AppFlowyPopoverController(); + final AppFlowyPopoverExclusive exclusive = AppFlowyPopoverExclusive(); + late AppFlowyPopoverController firstPopover; + late AppFlowyPopoverController secondPopover; + + @override + void initState() { + firstPopover = AppFlowyPopoverController(exclusive: exclusive); + secondPopover = AppFlowyPopoverController(exclusive: exclusive); + super.initState(); + } + @override Widget build(BuildContext context) { return Container( @@ -18,7 +27,7 @@ class _PopoverMenuState extends State { child: ListView(children: [ const Text("App"), AppFlowyPopover( - controller: popover, + controller: firstPopover, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, @@ -27,20 +36,18 @@ class _PopoverMenuState extends State { }, child: TextButton( onPressed: () { - popover.show(); + firstPopover.show(); }, onHover: (value) { if (value) { - popover.show(); - } else { - popover.close(); + firstPopover.show(); } }, child: const Text("First"), ), ), AppFlowyPopover( - controller: hoverPopover, + controller: secondPopover, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, @@ -49,13 +56,11 @@ class _PopoverMenuState extends State { }, child: TextButton( onPressed: () { - hoverPopover.show(); + secondPopover.show(); }, onHover: (value) { if (value) { - hoverPopover.show(); - } else { - hoverPopover.close(); + secondPopover.show(); } }, child: const Text("Second"), diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart index a28c03f5d2..02672e2a04 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart @@ -1,14 +1,29 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +class AppFlowyPopoverExclusive { + AppFlowyPopoverController? controller; +} + class AppFlowyPopoverController { AppFlowyPopoverState? state; + AppFlowyPopoverExclusive? exclusive; + + AppFlowyPopoverController({this.exclusive}); close() { state?.close(); + if (exclusive != null && exclusive!.controller == this) { + exclusive!.controller = null; + } } show() { + if (exclusive != null) { + debugPrint("show popover"); + exclusive!.controller?.close(); + exclusive!.controller = this; + } state?.showOverlay(); } } @@ -110,7 +125,7 @@ class AppFlowyPopoverState extends State { _overlayEntry?.remove(); _overlayEntry = null; if (hasMask) { - debugPrint("len: ${_globalPopovers.length}"); + debugPrint("popover len: ${_globalPopovers.length}"); } super.dispose(); } From 99a3a386a3c791497a5a88e79d11f4f2f29cd44f Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 16:07:54 +0800 Subject: [PATCH 11/33] feat: add popover removal --- .../lib/appflowy_popover.dart | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart index 02672e2a04..ab2d1bf37b 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart @@ -52,13 +52,13 @@ class AppFlowyPopover extends StatefulWidget { State createState() => AppFlowyPopoverState(); } -final _globalPopovers = List.empty(growable: true); - class AppFlowyPopoverState extends State { final LayerLink layerLink = LayerLink(); OverlayEntry? _overlayEntry; bool hasMask = true; + static AppFlowyPopoverState? _popoverWithMask; + @override void initState() { widget.controller?.state = this; @@ -67,9 +67,11 @@ class AppFlowyPopoverState extends State { showOverlay() { debugPrint("show overlay"); - _overlayEntry?.remove(); + close(); - if (_globalPopovers.isNotEmpty) { + if (_popoverWithMask == null) { + _popoverWithMask = this; + } else { hasMask = false; } debugPrint("has mask: $hasMask"); @@ -80,13 +82,14 @@ class AppFlowyPopoverState extends State { if (hasMask) { children.add(_PopoverMask( decoration: widget.maskDecoration, - onTap: () => _closeAll(), - onExit: () => _closeAll(), + onTap: () => close(), + onExit: () => close(), )); } children.add(CompositedTransformFollower( link: layerLink, + showWhenUnlinked: false, offset: widget.offset ?? Offset.zero, targetAnchor: widget.targetAnchor, followerAnchor: widget.followerAnchor, @@ -94,40 +97,28 @@ class AppFlowyPopoverState extends State { )); return Stack(children: children); - // return widget.popupBuilder(context); }); - _globalPopovers.add(this); _overlayEntry = newEntry; Overlay.of(context)?.insert(newEntry); } - _closeAll() { - final copiedArr = [..._globalPopovers]; - for (var i = copiedArr.length - 1; i >= 0; i--) { - copiedArr[i].close(); - } - _globalPopovers.clear(); - } - close() { - if (_globalPopovers.last == this) { - _globalPopovers.removeLast(); + if (_overlayEntry != null) { + _overlayEntry!.remove(); + _overlayEntry = null; + if (_popoverWithMask == this) { + _popoverWithMask = null; + } } - _overlayEntry?.remove(); - _overlayEntry = null; } @override - void dispose() { - debugPrint("popover dispose"); - _overlayEntry?.remove(); - _overlayEntry = null; - if (hasMask) { - debugPrint("popover len: ${_globalPopovers.length}"); - } - super.dispose(); + void deactivate() { + debugPrint("deactivate"); + close(); + super.deactivate(); } @override @@ -168,9 +159,9 @@ class _PopoverMaskState extends State<_PopoverMask> { } @override - void dispose() { + void deactivate() { HardwareKeyboard.instance.removeHandler(_handleGlobalKeyEvent); - super.dispose(); + super.deactivate(); } @override From 406f185ab7972982a724cc7308576761a3aaa90d Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 29 Aug 2022 17:45:08 +0800 Subject: [PATCH 12/33] feat: field action sheet use popover --- .../widgets/header/field_cell.dart | 61 +++++++-------- .../header/field_cell_action_sheet.dart | 75 +++++++++++-------- frontend/app_flowy/pubspec.lock | 9 ++- frontend/app_flowy/pubspec.yaml | 2 + 4 files changed, 82 insertions(+), 65 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index bbd7e7b5f2..253d28cecd 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -1,8 +1,10 @@ import 'package:app_flowy/plugins/grid/application/field/field_cell_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/field_service.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/hover.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; @@ -15,21 +17,42 @@ import 'field_type_extension.dart'; import 'field_cell_action_sheet.dart'; import 'field_editor.dart'; -class GridFieldCell extends StatelessWidget { +class GridFieldCell extends StatefulWidget { final GridFieldCellContext cellContext; const GridFieldCell(this.cellContext, {Key? key}) : super(key: key); @override - Widget build(BuildContext context) { + State createState() => _GridFieldCellState(); +} + +class _GridFieldCellState extends State { + final popover = AppFlowyPopoverController(); + + @override + Widget build(BuildContext gridCellContext) { return BlocProvider( - create: (context) => FieldCellBloc(cellContext: cellContext) + create: (context) => FieldCellBloc(cellContext: widget.cellContext) ..add(const FieldCellEvent.initial()), child: BlocBuilder( // buildWhen: (p, c) => p.field != c.field, builder: (context, state) { - final button = FieldCellButton( - field: state.field, - onTap: () => _showActionSheet(context), + final button = AppFlowyPopover( + controller: popover, + child: FieldCellButton( + field: state.field, + onTap: () => popover.show(), + ), + targetAnchor: Alignment.bottomLeft, + followerAnchor: Alignment.topLeft, + offset: const Offset(0, 10), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: GridFieldCellActionSheet( + cellContext: widget.cellContext, + ), + ); + }, ); const line = Positioned( @@ -51,32 +74,6 @@ class GridFieldCell extends StatelessWidget { ), ); } - - void _showActionSheet(BuildContext context) { - final state = context.read().state; - GridFieldCellActionSheetPopover.show( - context, - cellContext: - GridFieldCellContext(gridId: state.gridId, field: state.field), - onEdited: () => _showFieldEditor(context), - ); - } - - void _showFieldEditor(BuildContext context) { - final state = context.read().state; - final field = state.field; - - FieldEditorPopOver.show( - context, - anchorContext: context, - gridId: state.gridId, - fieldName: field.name, - typeOptionLoader: FieldTypeOptionLoader( - gridId: state.gridId, - field: field, - ), - ); - } } class _GridHeaderCellContainer extends StatelessWidget { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart index a7bb1ea625..6eb02a5918 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart @@ -1,3 +1,5 @@ +import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:app_flowy/plugins/grid/presentation/widgets/header/field_editor.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/prelude.dart'; import 'package:flowy_infra/image.dart'; @@ -9,6 +11,7 @@ import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:app_flowy/generated/locale_keys.g.dart'; import '../../layout/sizes.dart'; @@ -16,9 +19,7 @@ import '../../layout/sizes.dart'; class GridFieldCellActionSheet extends StatelessWidget with FlowyOverlayDelegate { final GridFieldCellContext cellContext; - final VoidCallback onEdited; - const GridFieldCellActionSheet( - {required this.cellContext, required this.onEdited, Key? key}) + const GridFieldCellActionSheet({required this.cellContext, Key? key}) : super(key: key); @override @@ -29,10 +30,7 @@ class GridFieldCellActionSheet extends StatelessWidget child: Column( children: [ _EditFieldButton( - onEdited: () { - FlowyOverlay.of(context).remove(identifier()); - onEdited(); - }, + cellContext: cellContext, ), const VSpace(6), _FieldOperationList(cellContext, @@ -53,9 +51,17 @@ class GridFieldCellActionSheet extends StatelessWidget } } -class _EditFieldButton extends StatelessWidget { - final Function() onEdited; - const _EditFieldButton({required this.onEdited, Key? key}) : super(key: key); +class _EditFieldButton extends StatefulWidget { + final GridFieldCellContext cellContext; + const _EditFieldButton({required this.cellContext, Key? key}) + : super(key: key); + + @override + State createState() => _EditFieldButtonState(); +} + +class _EditFieldButtonState extends State<_EditFieldButton> { + final popover = AppFlowyPopoverController(); @override Widget build(BuildContext context) { @@ -64,11 +70,33 @@ class _EditFieldButton extends StatelessWidget { builder: (context, state) { return SizedBox( height: GridSize.typeOptionItemHeight, - child: FlowyButton( - text: FlowyText.medium(LocaleKeys.grid_field_editProperty.tr(), - fontSize: 12), - hoverColor: theme.hover, - onTap: onEdited, + child: AppFlowyPopover( + controller: popover, + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (context) { + final field = widget.cellContext.field; + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: FieldEditor( + gridId: widget.cellContext.gridId, + fieldName: field.name, + typeOptionLoader: FieldTypeOptionLoader( + gridId: widget.cellContext.gridId, + field: field, + ), + ), + ); + }, + child: FlowyButton( + text: FlowyText.medium( + LocaleKeys.grid_field_editProperty.tr(), + fontSize: 12, + ), + hoverColor: theme.hover, + onTap: () => popover.show(), + ), ), ); }, @@ -200,20 +228,3 @@ extension _FieldActionExtension on FieldAction { } } } - -class GridFieldCellActionSheetPopover { - static show( - BuildContext context, { - required GridFieldCellContext cellContext, - required VoidCallback onEdited, - }) { - FlowyPopover.show(context, - anchorContext: context, - anchorDirection: AnchorDirection.bottomWithLeftAligned, - constraints: BoxConstraints.loose(const Size(240, 200)), - builder: (BuildContext context) { - return GridFieldCellActionSheet( - cellContext: cellContext, onEdited: onEdited); - }); - } -} diff --git a/frontend/app_flowy/pubspec.lock b/frontend/app_flowy/pubspec.lock index b08897239c..4717151e92 100644 --- a/frontend/app_flowy/pubspec.lock +++ b/frontend/app_flowy/pubspec.lock @@ -36,6 +36,13 @@ packages: relative: true source: path version: "0.0.2" + appflowy_popover: + dependency: "direct main" + description: + path: "packages/appflowy_popover" + relative: true + source: path + version: "0.0.1" args: dependency: transitive description: @@ -1480,5 +1487,5 @@ packages: source: hosted version: "8.1.0" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.17.6 <3.0.0" flutter: ">=3.0.0" diff --git a/frontend/app_flowy/pubspec.yaml b/frontend/app_flowy/pubspec.yaml index f713825a4f..1b2129f306 100644 --- a/frontend/app_flowy/pubspec.yaml +++ b/frontend/app_flowy/pubspec.yaml @@ -41,6 +41,8 @@ dependencies: path: packages/appflowy_board appflowy_editor: path: packages/appflowy_editor + appflowy_popover: + path: packages/appflowy_popover flutter_quill: git: url: https://github.com/appflowy/flutter-quill.git From e9535201a4e0196969b01667d91340a09481b274 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 12:51:59 +0800 Subject: [PATCH 13/33] refactor: rename popover --- .../widgets/header/field_cell.dart | 8 ++-- .../header/field_cell_action_sheet.dart | 6 +-- .../widgets/header/field_editor.dart | 6 +-- .../header/field_type_option_editor.dart | 33 ++++++++++++---- .../example/lib/example_button.dart | 20 +++++----- .../{appflowy_popover.dart => popover.dart} | 39 +++++++++++++------ ...wy_popover_test.dart => popover_test.dart} | 0 .../lib/style_widget/button.dart | 15 +++++-- .../lib/style_widget/hover.dart | 16 +++++++- 9 files changed, 94 insertions(+), 49 deletions(-) rename frontend/app_flowy/packages/appflowy_popover/lib/{appflowy_popover.dart => popover.dart} (82%) rename frontend/app_flowy/packages/appflowy_popover/test/{appflowy_popover_test.dart => popover_test.dart} (100%) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index 253d28cecd..a28fa3060f 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -1,7 +1,6 @@ import 'package:app_flowy/plugins/grid/application/field/field_cell_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/field_service.dart'; -import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; -import 'package:appflowy_popover/appflowy_popover.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; @@ -15,7 +14,6 @@ import '../../layout/sizes.dart'; import 'field_type_extension.dart'; import 'field_cell_action_sheet.dart'; -import 'field_editor.dart'; class GridFieldCell extends StatefulWidget { final GridFieldCellContext cellContext; @@ -26,7 +24,7 @@ class GridFieldCell extends StatefulWidget { } class _GridFieldCellState extends State { - final popover = AppFlowyPopoverController(); + final popover = PopoverController(); @override Widget build(BuildContext gridCellContext) { @@ -36,7 +34,7 @@ class _GridFieldCellState extends State { child: BlocBuilder( // buildWhen: (p, c) => p.field != c.field, builder: (context, state) { - final button = AppFlowyPopover( + final button = Popover( controller: popover, child: FieldCellButton( field: state.field, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart index 6eb02a5918..c560a333a6 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart @@ -11,7 +11,7 @@ import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:appflowy_popover/appflowy_popover.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:app_flowy/generated/locale_keys.g.dart'; import '../../layout/sizes.dart'; @@ -61,7 +61,7 @@ class _EditFieldButton extends StatefulWidget { } class _EditFieldButtonState extends State<_EditFieldButton> { - final popover = AppFlowyPopoverController(); + final popover = PopoverController(); @override Widget build(BuildContext context) { @@ -70,7 +70,7 @@ class _EditFieldButtonState extends State<_EditFieldButton> { builder: (context, state) { return SizedBox( height: GridSize.typeOptionItemHeight, - child: AppFlowyPopover( + child: Popover( controller: popover, targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index cd2efb2c4e..5da201d8c3 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -10,7 +10,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'field_name_input.dart'; import 'field_type_option_editor.dart'; -class FieldEditor extends StatelessWidget with FlowyOverlayDelegate { +class FieldEditor extends StatelessWidget { final String gridId; final String fieldName; @@ -49,10 +49,6 @@ class FieldEditor extends StatelessWidget with FlowyOverlayDelegate { ); } - static String identifier() { - return (FieldEditor).toString(); - } - @override bool asBarrier() => true; } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index 11e0434054..a545a9b2b7 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -1,5 +1,6 @@ import 'dart:typed_data'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_data_controller.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:dartz/dartz.dart' show Either; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -36,6 +37,7 @@ class FieldTypeOptionEditor extends StatefulWidget { } class _FieldTypeOptionEditorState extends State { + final popover = PopoverController(); String? currentOverlayIdentifier; @override @@ -68,18 +70,33 @@ class _FieldTypeOptionEditorState extends State { final theme = context.watch(); return SizedBox( height: GridSize.typeOptionItemHeight, - child: FlowyButton( - text: FlowyText.medium(field.fieldType.title(), fontSize: 12), - margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), - hoverColor: theme.hover, - onTap: () { + child: Popover( + controller: popover, + offset: const Offset(20, 0), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + popupBuilder: (context) { final list = FieldTypeList(onSelectField: (newFieldType) { widget.dataController.switchToField(newFieldType); }); - _showOverlay(context, list); + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: list, + ); }, - leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), - rightIcon: svgWidget("grid/more", color: theme.iconColor), + child: FlowyButton( + text: FlowyText.medium(field.fieldType.title(), fontSize: 12), + margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + hoverColor: theme.hover, + onHover: (bool hover) { + if (hover) { + popover.show(); + } + }, + leftIcon: + svgWidget(field.fieldType.iconName(), color: theme.iconColor), + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ), ), ); } diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index df8b83f349..3e5699b334 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:appflowy_popover/appflowy_popover.dart'; +import 'package:appflowy_popover/popover.dart'; class PopoverMenu extends StatefulWidget { @override @@ -7,14 +7,14 @@ class PopoverMenu extends StatefulWidget { } class _PopoverMenuState extends State { - final AppFlowyPopoverExclusive exclusive = AppFlowyPopoverExclusive(); - late AppFlowyPopoverController firstPopover; - late AppFlowyPopoverController secondPopover; + final PopoverExclusive exclusive = PopoverExclusive(); + late PopoverController firstPopover; + late PopoverController secondPopover; @override void initState() { - firstPopover = AppFlowyPopoverController(exclusive: exclusive); - secondPopover = AppFlowyPopoverController(exclusive: exclusive); + firstPopover = PopoverController(exclusive: exclusive); + secondPopover = PopoverController(exclusive: exclusive); super.initState(); } @@ -26,7 +26,7 @@ class _PopoverMenuState extends State { decoration: const BoxDecoration(color: Colors.yellow), child: ListView(children: [ const Text("App"), - AppFlowyPopover( + Popover( controller: firstPopover, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, @@ -46,7 +46,7 @@ class _PopoverMenuState extends State { child: const Text("First"), ), ), - AppFlowyPopover( + Popover( controller: secondPopover, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, @@ -72,7 +72,7 @@ class _PopoverMenuState extends State { } class ExampleButton extends StatelessWidget { - final AppFlowyPopoverController _popover = AppFlowyPopoverController(); + final PopoverController _popover = PopoverController(); final String label; final Alignment targetAnchor; @@ -89,7 +89,7 @@ class ExampleButton extends StatelessWidget { @override Widget build(BuildContext context) { - return AppFlowyPopover( + return Popover( controller: _popover, targetAnchor: targetAnchor, followerAnchor: followerAnchor, diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart similarity index 82% rename from frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart rename to frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index ab2d1bf37b..e25ac26d56 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/appflowy_popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -1,15 +1,16 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -class AppFlowyPopoverExclusive { - AppFlowyPopoverController? controller; +class PopoverExclusive { + PopoverController? controller; } -class AppFlowyPopoverController { - AppFlowyPopoverState? state; - AppFlowyPopoverExclusive? exclusive; +class PopoverController { + PopoverState? state; + PopoverExclusive? exclusive; - AppFlowyPopoverController({this.exclusive}); + PopoverController({this.exclusive}); close() { state?.close(); @@ -28,16 +29,16 @@ class AppFlowyPopoverController { } } -class AppFlowyPopover extends StatefulWidget { +class Popover extends StatefulWidget { final Widget child; - final AppFlowyPopoverController? controller; + final PopoverController? controller; final Offset? offset; final Decoration? maskDecoration; final Alignment targetAnchor; final Alignment followerAnchor; final Widget Function(BuildContext context) popupBuilder; - const AppFlowyPopover({ + const Popover({ Key? key, required this.child, required this.popupBuilder, @@ -49,19 +50,27 @@ class AppFlowyPopover extends StatefulWidget { }) : super(key: key); @override - State createState() => AppFlowyPopoverState(); + State createState() => PopoverState(); } -class AppFlowyPopoverState extends State { +class PopoverState extends State { final LayerLink layerLink = LayerLink(); OverlayEntry? _overlayEntry; bool hasMask = true; + late TapGestureRecognizer _recognizer; - static AppFlowyPopoverState? _popoverWithMask; + static PopoverState? _popoverWithMask; @override void initState() { widget.controller?.state = this; + _recognizer = TapGestureRecognizer(); + _recognizer.onTapDown = (details) { + debugPrint("ggg tapdown"); + }; + _recognizer.onTap = (() { + debugPrint("ggg tap"); + }); super.initState(); } @@ -121,6 +130,12 @@ class AppFlowyPopoverState extends State { super.deactivate(); } + @override + void dispose() { + _recognizer.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return CompositedTransformTarget(link: layerLink, child: widget.child); diff --git a/frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart b/frontend/app_flowy/packages/appflowy_popover/test/popover_test.dart similarity index 100% rename from frontend/app_flowy/packages/appflowy_popover/test/appflowy_popover_test.dart rename to frontend/app_flowy/packages/appflowy_popover/test/popover_test.dart diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart index 046ee8a0c1..ba2b3049af 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; class FlowyButton extends StatelessWidget { final Widget text; final VoidCallback? onTap; + final void Function(bool)? onHover; final EdgeInsets margin; final Widget? leftIcon; final Widget? rightIcon; @@ -15,6 +16,7 @@ class FlowyButton extends StatelessWidget { Key? key, required this.text, this.onTap, + this.onHover, this.margin = const EdgeInsets.symmetric(horizontal: 6, vertical: 2), this.leftIcon, this.rightIcon, @@ -27,7 +29,9 @@ class FlowyButton extends StatelessWidget { return InkWell( onTap: onTap, child: FlowyHover( - style: HoverStyle(borderRadius: BorderRadius.zero, hoverColor: hoverColor), + style: + HoverStyle(borderRadius: BorderRadius.zero, hoverColor: hoverColor), + onHover: onHover, setSelected: () => isSelected, builder: (context, onHover) => _render(), ), @@ -38,14 +42,16 @@ class FlowyButton extends StatelessWidget { List children = List.empty(growable: true); if (leftIcon != null) { - children.add(SizedBox.fromSize(size: const Size.square(16), child: leftIcon!)); + children.add( + SizedBox.fromSize(size: const Size.square(16), child: leftIcon!)); children.add(const HSpace(6)); } children.add(Expanded(child: text)); if (rightIcon != null) { - children.add(SizedBox.fromSize(size: const Size.square(16), child: rightIcon!)); + children.add( + SizedBox.fromSize(size: const Size.square(16), child: rightIcon!)); } return Padding( @@ -121,7 +127,8 @@ class FlowyTextButton extends StatelessWidget { visualDensity: VisualDensity.compact, hoverElevation: 0, highlightElevation: 0, - shape: RoundedRectangleBorder(borderRadius: radius ?? BorderRadius.circular(2)), + shape: RoundedRectangleBorder( + borderRadius: radius ?? BorderRadius.circular(2)), fillColor: fillColor, hoverColor: hoverColor ?? Colors.transparent, focusColor: Colors.transparent, diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart index b9440bf1f1..6938a2f209 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart @@ -9,6 +9,7 @@ class FlowyHover extends StatefulWidget { final HoverBuilder? builder; final Widget? child; final bool Function()? setSelected; + final void Function(bool)? onHover; final MouseCursor? cursor; const FlowyHover( @@ -17,6 +18,7 @@ class FlowyHover extends StatefulWidget { this.child, required this.style, this.setSelected, + this.onHover, this.cursor}) : super(key: key); @@ -32,8 +34,18 @@ class _FlowyHoverState extends State { return MouseRegion( cursor: widget.cursor != null ? widget.cursor! : SystemMouseCursors.click, opaque: false, - onEnter: (p) => setState(() => _onHover = true), - onExit: (p) => setState(() => _onHover = false), + onEnter: (p) { + setState(() => _onHover = true); + if (widget.onHover != null) { + widget.onHover!(true); + } + }, + onExit: (p) { + setState(() => _onHover = false); + if (widget.onHover != null) { + widget.onHover!(false); + } + }, child: renderWidget(), ); } From bfb60dcaec779eaedbee48fae5e34345f0b16134 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 14:02:06 +0800 Subject: [PATCH 14/33] feat: refactor multi select --- .../widgets/header/field_editor.dart | 42 +++++-- .../header/field_type_option_editor.dart | 13 +- .../widgets/header/type_option/builder.dart | 29 ++--- .../widgets/header/type_option/date.dart | 116 +++++++++++++----- .../header/type_option/multi_select.dart | 14 ++- .../widgets/header/type_option/number.dart | 11 +- .../header/type_option/single_select.dart | 14 ++- .../example/lib/example_button.dart | 6 +- .../appflowy_popover/lib/popover.dart | 24 ++-- 9 files changed, 188 insertions(+), 81 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 5da201d8c3..835568fa88 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -1,5 +1,6 @@ import 'package:app_flowy/plugins/grid/application/field/field_editor_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; @@ -10,7 +11,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'field_name_input.dart'; import 'field_type_option_editor.dart'; -class FieldEditor extends StatelessWidget { +class FieldEditor extends StatefulWidget { final String gridId; final String fieldName; @@ -22,13 +23,29 @@ class FieldEditor extends StatelessWidget { Key? key, }) : super(key: key); + @override + bool asBarrier() => true; + + @override + State createState() => _FieldEditorState(); +} + +class _FieldEditorState extends State { + late PopoverMutex popoverMutex; + + @override + void initState() { + popoverMutex = PopoverMutex(); + super.initState(); + } + @override Widget build(BuildContext context) { return BlocProvider( create: (context) => FieldEditorBloc( - gridId: gridId, - fieldName: fieldName, - loader: typeOptionLoader, + gridId: widget.gridId, + fieldName: widget.fieldName, + loader: widget.typeOptionLoader, )..add(const FieldEditorEvent.initial()), child: BlocBuilder( buildWhen: (p, c) => false, @@ -41,20 +58,22 @@ class FieldEditor extends StatelessWidget { const VSpace(10), const _FieldNameCell(), const VSpace(10), - const _FieldTypeOptionCell(), + _FieldTypeOptionCell(popoverMutex: popoverMutex), ], ); }, ), ); } - - @override - bool asBarrier() => true; } class _FieldTypeOptionCell extends StatelessWidget { - const _FieldTypeOptionCell({Key? key}) : super(key: key); + final PopoverMutex popoverMutex; + + const _FieldTypeOptionCell({ + Key? key, + required this.popoverMutex, + }) : super(key: key); @override Widget build(BuildContext context) { @@ -66,7 +85,10 @@ class _FieldTypeOptionCell extends StatelessWidget { (fieldContext) { final dataController = context.read().dataController; - return FieldTypeOptionEditor(dataController: dataController); + return FieldTypeOptionEditor( + dataController: dataController, + popoverMutex: popoverMutex, + ); }, ); }, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index a545a9b2b7..2a67af114d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -26,9 +26,11 @@ typedef SwitchToFieldCallback class FieldTypeOptionEditor extends StatefulWidget { final TypeOptionDataController dataController; + final PopoverMutex popoverMutex; const FieldTypeOptionEditor({ required this.dataController, + required this.popoverMutex, Key? key, }) : super(key: key); @@ -37,9 +39,15 @@ class FieldTypeOptionEditor extends StatefulWidget { } class _FieldTypeOptionEditorState extends State { - final popover = PopoverController(); + late PopoverController popover; String? currentOverlayIdentifier; + @override + void initState() { + popover = PopoverController(mutex: widget.popoverMutex); + super.initState(); + } + @override Widget build(BuildContext context) { return BlocProvider( @@ -114,6 +122,7 @@ class _FieldTypeOptionEditorState extends State { context: context, overlayDelegate: overlayDelegate, dataController: widget.dataController, + popoverMutex: widget.popoverMutex, ); } @@ -138,6 +147,6 @@ class _FieldTypeOptionEditorState extends State { } } -abstract class TypeOptionWidget extends StatelessWidget { +abstract class TypeOptionWidget extends StatefulWidget { const TypeOptionWidget({Key? key}) : super(key: key); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart index 2ea19eb1e8..44763354d0 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_data_controller.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/multi_select_type_option.pb.dart'; @@ -46,18 +47,19 @@ Widget? makeTypeOptionWidget({ required BuildContext context, required TypeOptionDataController dataController, required TypeOptionOverlayDelegate overlayDelegate, + required PopoverMutex popoverMutex, }) { final builder = makeTypeOptionWidgetBuilder( - dataController: dataController, - overlayDelegate: overlayDelegate, - ); + dataController: dataController, + overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex); return builder.build(context); } -TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder({ - required TypeOptionDataController dataController, - required TypeOptionOverlayDelegate overlayDelegate, -}) { +TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( + {required TypeOptionDataController dataController, + required TypeOptionOverlayDelegate overlayDelegate, + required PopoverMutex popoverMutex}) { final gridId = dataController.gridId; final fieldType = dataController.field.fieldType; @@ -72,13 +74,12 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder({ ); case FieldType.DateTime: return DateTypeOptionWidgetBuilder( - makeTypeOptionContextWithDataController( - gridId: gridId, - fieldType: fieldType, - dataController: dataController, - ), - overlayDelegate, - ); + makeTypeOptionContextWithDataController( + gridId: gridId, + fieldType: fieldType, + dataController: dataController, + ), + popoverMutex); case FieldType.SingleSelect: return SingleSelectTypeOptionWidgetBuilder( makeTypeOptionContextWithDataController( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index 51433037a3..bae1dc175d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -11,6 +11,7 @@ import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option_entities.pb.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:appflowy_popover/popover.dart'; import '../../../layout/sizes.dart'; import '../field_type_option_editor.dart'; import 'builder.dart'; @@ -20,10 +21,10 @@ class DateTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { DateTypeOptionWidgetBuilder( DateTypeOptionContext typeOptionContext, - TypeOptionOverlayDelegate overlayDelegate, + PopoverMutex popoverMutex, ) : _widget = DateTypeOptionWidget( typeOptionContext: typeOptionContext, - overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, ); @override @@ -34,22 +35,36 @@ class DateTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { class DateTypeOptionWidget extends TypeOptionWidget { final DateTypeOptionContext typeOptionContext; - final TypeOptionOverlayDelegate overlayDelegate; - + final PopoverMutex popoverMutex; const DateTypeOptionWidget({ required this.typeOptionContext, - required this.overlayDelegate, + required this.popoverMutex, Key? key, }) : super(key: key); + @override + State createState() => _DateTypeOptionWidgetState(); +} + +class _DateTypeOptionWidgetState extends State { + late PopoverController dateFormatPopover; + late PopoverController timeFormatPopover; + + @override + void initState() { + dateFormatPopover = PopoverController(mutex: widget.popoverMutex); + timeFormatPopover = PopoverController(mutex: widget.popoverMutex); + super.initState(); + } + @override Widget build(BuildContext context) { return BlocProvider( create: (context) => - DateTypeOptionBloc(typeOptionContext: typeOptionContext), + DateTypeOptionBloc(typeOptionContext: widget.typeOptionContext), child: BlocConsumer( listener: (context, state) => - typeOptionContext.typeOption = state.typeOption, + widget.typeOptionContext.typeOption = state.typeOption, builder: (context, state) { return Column(children: [ _renderDateFormatButton(context, state.typeOption.dateFormat), @@ -62,39 +77,71 @@ class DateTypeOptionWidget extends TypeOptionWidget { } Widget _renderDateFormatButton(BuildContext context, DateFormat dataFormat) { - return DateFormatButton(onTap: () { - final list = DateFormatList( - selectedFormat: dataFormat, - onSelected: (format) { - context - .read() - .add(DateTypeOptionEvent.didSelectDateFormat(format)); - }, - ); - overlayDelegate.showOverlay(context, list); - }); - } - - Widget _renderTimeFormatButton(BuildContext context, TimeFormat timeFormat) { - return TimeFormatButton( - timeFormat: timeFormat, - onTap: () { - final list = TimeFormatList( - selectedFormat: timeFormat, + return Popover( + controller: dateFormatPopover, + child: DateFormatButton(onTap: () { + dateFormatPopover.show(); + }, onHover: ((hover) { + if (hover) { + dateFormatPopover.show(); + } + })), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: DateFormatList( + selectedFormat: dataFormat, onSelected: (format) { context .read() - .add(DateTypeOptionEvent.didSelectTimeFormat(format)); - }); - overlayDelegate.showOverlay(context, list); + .add(DateTypeOptionEvent.didSelectDateFormat(format)); + }, + ), + ); + }, + ); + } + + Widget _renderTimeFormatButton(BuildContext context, TimeFormat timeFormat) { + return Popover( + controller: timeFormatPopover, + child: TimeFormatButton( + timeFormat: timeFormat, + onTap: () { + timeFormatPopover.show(); + }, + onHover: (hover) { + if (hover) { + timeFormatPopover.show(); + } + }, + ), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: TimeFormatList( + selectedFormat: timeFormat, + onSelected: (format) { + context + .read() + .add(DateTypeOptionEvent.didSelectTimeFormat(format)); + })); }, ); } } class DateFormatButton extends StatelessWidget { - final VoidCallback onTap; - const DateFormatButton({required this.onTap, Key? key}) : super(key: key); + final VoidCallback? onTap; + final void Function(bool)? onHover; + const DateFormatButton({this.onTap, this.onHover, Key? key}) + : super(key: key); @override Widget build(BuildContext context) { @@ -107,6 +154,7 @@ class DateFormatButton extends StatelessWidget { margin: GridSize.typeOptionContentInsets, hoverColor: theme.hover, onTap: onTap, + onHover: onHover, rightIcon: svgWidget("grid/more", color: theme.iconColor), ), ); @@ -115,9 +163,10 @@ class DateFormatButton extends StatelessWidget { class TimeFormatButton extends StatelessWidget { final TimeFormat timeFormat; - final VoidCallback onTap; + final VoidCallback? onTap; + final void Function(bool)? onHover; const TimeFormatButton( - {required this.timeFormat, required this.onTap, Key? key}) + {required this.timeFormat, this.onTap, this.onHover, Key? key}) : super(key: key); @override @@ -131,6 +180,7 @@ class TimeFormatButton extends StatelessWidget { margin: GridSize.typeOptionContentInsets, hoverColor: theme.hover, onTap: onTap, + onHover: onHover, rightIcon: svgWidget("grid/more", color: theme.iconColor), ), ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart index ab8a628146..6d67c9a589 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart @@ -35,13 +35,19 @@ class MultiSelectTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); + @override + State createState() => _MultiSelectTypeOptionWidgetState(); +} + +class _MultiSelectTypeOptionWidgetState + extends State { @override Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( - options: selectOptionAction.typeOption.options, - beginEdit: () => overlayDelegate.hideOverlay(context), - overlayDelegate: overlayDelegate, - typeOptionAction: selectOptionAction, + options: widget.selectOptionAction.typeOption.options, + beginEdit: () => widget.overlayDelegate.hideOverlay(context), + overlayDelegate: widget.overlayDelegate, + typeOptionAction: widget.selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index d15be4a6a0..508fb2a300 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -42,17 +42,22 @@ class NumberTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); + @override + State createState() => _NumberTypeOptionWidgetState(); +} + +class _NumberTypeOptionWidgetState extends State { @override Widget build(BuildContext context) { final theme = context.watch(); return BlocProvider( create: (context) => - NumberTypeOptionBloc(typeOptionContext: typeOptionContext), + NumberTypeOptionBloc(typeOptionContext: widget.typeOptionContext), child: SizedBox( height: GridSize.typeOptionItemHeight, child: BlocConsumer( listener: (context, state) => - typeOptionContext.typeOption = state.typeOption, + widget.typeOptionContext.typeOption = state.typeOption, builder: (context, state) { return FlowyButton( text: Row( @@ -76,7 +81,7 @@ class NumberTypeOptionWidget extends TypeOptionWidget { }, selectedFormat: state.typeOption.format, ); - overlayDelegate.showOverlay( + widget.overlayDelegate.showOverlay( context, list, ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart index d9d699fdff..096426c432 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart @@ -34,13 +34,19 @@ class SingleSelectTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); + @override + State createState() => _SingleSelectTypeOptionWidgetState(); +} + +class _SingleSelectTypeOptionWidgetState + extends State { @override Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( - options: selectOptionAction.typeOption.options, - beginEdit: () => overlayDelegate.hideOverlay(context), - overlayDelegate: overlayDelegate, - typeOptionAction: selectOptionAction, + options: widget.selectOptionAction.typeOption.options, + beginEdit: () => widget.overlayDelegate.hideOverlay(context), + overlayDelegate: widget.overlayDelegate, + typeOptionAction: widget.selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); } diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 3e5699b334..956e1fdbaa 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -7,14 +7,14 @@ class PopoverMenu extends StatefulWidget { } class _PopoverMenuState extends State { - final PopoverExclusive exclusive = PopoverExclusive(); + final PopoverMutex exclusive = PopoverMutex(); late PopoverController firstPopover; late PopoverController secondPopover; @override void initState() { - firstPopover = PopoverController(exclusive: exclusive); - secondPopover = PopoverController(exclusive: exclusive); + firstPopover = PopoverController(mutex: exclusive); + secondPopover = PopoverController(mutex: exclusive); super.initState(); } diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index e25ac26d56..aae3d514bb 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -2,28 +2,28 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -class PopoverExclusive { +class PopoverMutex { PopoverController? controller; } class PopoverController { PopoverState? state; - PopoverExclusive? exclusive; + PopoverMutex? mutex; - PopoverController({this.exclusive}); + PopoverController({this.mutex}); close() { state?.close(); - if (exclusive != null && exclusive!.controller == this) { - exclusive!.controller = null; + if (mutex != null && mutex!.controller == this) { + mutex!.controller = null; } } show() { - if (exclusive != null) { + if (mutex != null) { debugPrint("show popover"); - exclusive!.controller?.close(); - exclusive!.controller = this; + mutex!.controller?.close(); + mutex!.controller = this; } state?.showOverlay(); } @@ -71,9 +71,15 @@ class PopoverState extends State { _recognizer.onTap = (() { debugPrint("ggg tap"); }); + WidgetsBinding.instance.pointerRouter + .addGlobalRoute(_handleGlobalPointerEvent); super.initState(); } + _handleGlobalPointerEvent(PointerEvent event) { + // debugPrint("mouse down: ${event}"); + } + showOverlay() { debugPrint("show overlay"); close(); @@ -126,6 +132,8 @@ class PopoverState extends State { @override void deactivate() { debugPrint("deactivate"); + WidgetsBinding.instance.pointerRouter + .removeGlobalRoute(_handleGlobalPointerEvent); close(); super.deactivate(); } From a7f02ec7df21e1752ae15ee5e73355f29a849805 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 14:13:47 +0800 Subject: [PATCH 15/33] refactor: number field to use popover --- .../widgets/header/type_option/builder.dart | 1 + .../widgets/header/type_option/number.dart | 74 ++++++++++++------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart index 44763354d0..acbeafe8df 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart @@ -106,6 +106,7 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( dataController: dataController, ), overlayDelegate, + popoverMutex, ); case FieldType.RichText: return RichTextTypeOptionWidgetBuilder( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index 508fb2a300..3c8c0575e8 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -1,6 +1,7 @@ import 'package:app_flowy/plugins/grid/application/field/type_option/number_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/number_format_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; @@ -24,9 +25,11 @@ class NumberTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { NumberTypeOptionWidgetBuilder( NumberTypeOptionContext typeOptionContext, TypeOptionOverlayDelegate overlayDelegate, + PopoverMutex popoverMutex, ) : _widget = NumberTypeOptionWidget( typeOptionContext: typeOptionContext, overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, ); @override @@ -36,9 +39,11 @@ class NumberTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { class NumberTypeOptionWidget extends TypeOptionWidget { final TypeOptionOverlayDelegate overlayDelegate; final NumberTypeOptionContext typeOptionContext; + final PopoverMutex popoverMutex; const NumberTypeOptionWidget({ required this.typeOptionContext, required this.overlayDelegate, + required this.popoverMutex, Key? key, }) : super(key: key); @@ -47,6 +52,14 @@ class NumberTypeOptionWidget extends TypeOptionWidget { } class _NumberTypeOptionWidgetState extends State { + late PopoverController controller; + + @override + void initState() { + controller = PopoverController(mutex: widget.popoverMutex); + super.initState(); + } + @override Widget build(BuildContext context) { final theme = context.watch(); @@ -59,34 +72,45 @@ class _NumberTypeOptionWidgetState extends State { listener: (context, state) => widget.typeOptionContext.typeOption = state.typeOption, builder: (context, state) { - return FlowyButton( - text: Row( - children: [ - FlowyText.medium(LocaleKeys.grid_field_numberFormat.tr(), - fontSize: 12), - // const HSpace(6), - const Spacer(), - FlowyText.regular(state.typeOption.format.title(), - fontSize: 12), - ], + return Popover( + controller: controller, + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + child: FlowyButton( + margin: GridSize.typeOptionContentInsets, + hoverColor: theme.hover, + rightIcon: svgWidget("grid/more", color: theme.iconColor), + text: Row( + children: [ + FlowyText.medium(LocaleKeys.grid_field_numberFormat.tr(), + fontSize: 12), + // const HSpace(6), + const Spacer(), + FlowyText.regular(state.typeOption.format.title(), + fontSize: 12), + ], + ), + onTap: () => controller.show(), + onHover: (hover) { + if (hover) { + controller.show(); + } + }, ), - margin: GridSize.typeOptionContentInsets, - hoverColor: theme.hover, - onTap: () { - final list = NumberFormatList( - onSelected: (format) { - context - .read() - .add(NumberTypeOptionEvent.didSelectFormat(format)); - }, - selectedFormat: state.typeOption.format, - ); - widget.overlayDelegate.showOverlay( - context, - list, + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: NumberFormatList( + onSelected: (format) { + context + .read() + .add(NumberTypeOptionEvent.didSelectFormat(format)); + }, + selectedFormat: state.typeOption.format, + ), ); }, - rightIcon: svgWidget("grid/more", color: theme.iconColor), ); }, ), From 01a79c69c334361d2e774f9eb1df0f1d584d251a Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 14:51:25 +0800 Subject: [PATCH 16/33] feat: use popover in detail page --- .../widgets/header/field_editor.dart | 23 -------- .../header/field_type_option_editor.dart | 20 +++---- .../widgets/header/grid_header.dart | 16 +++--- .../presentation/widgets/row/row_detail.dart | 52 ++++++++++++------- .../widgets/toolbar/grid_property.dart | 14 ++--- .../lib/src/flowy_overlay/flowy_popover.dart | 44 ---------------- 6 files changed, 60 insertions(+), 109 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 835568fa88..7e40ea1ea7 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -116,26 +116,3 @@ class _FieldNameCell extends StatelessWidget { ); } } - -class FieldEditorPopOver { - static show( - BuildContext context, { - required BuildContext anchorContext, - required String gridId, - required String fieldName, - required IFieldTypeOptionLoader typeOptionLoader, - Key? key, - }) { - FlowyPopover.show( - context, - anchorContext: anchorContext, - builder: (BuildContext context) { - return FieldEditor( - gridId: gridId, - fieldName: fieldName, - typeOptionLoader: typeOptionLoader, - key: key); - }, - ); - } -} diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index 2a67af114d..ee33e06601 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -128,16 +128,16 @@ class _FieldTypeOptionEditorState extends State { void _showOverlay(BuildContext context, Widget child, {VoidCallback? onRemoved}) { - FlowyPopover.show( - context, - constraints: BoxConstraints.loose(const Size(460, 440)), - anchorContext: context, - anchorDirection: AnchorDirection.rightWithCenterAligned, - anchorOffset: const Offset(20, 0), - builder: (BuildContext context) { - return child; - }, - ); + // FlowyPopover.show( + // context, + // constraints: BoxConstraints.loose(const Size(460, 440)), + // anchorContext: context, + // anchorDirection: AnchorDirection.rightWithCenterAligned, + // anchorOffset: const Offset(20, 0), + // builder: (BuildContext context) { + // return child; + // }, + // ); } void _hideOverlay(BuildContext context) { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart index 7e2466173f..3b7410f61d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart @@ -157,13 +157,15 @@ class CreateFieldButton extends StatelessWidget { return FlowyButton( text: const FlowyText.medium('New column', fontSize: 12), hoverColor: theme.shader6, - onTap: () => FieldEditorPopOver.show( - context, - anchorContext: context, - gridId: gridId, - fieldName: "", - typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), - ), + onTap: () { + // FieldEditorPopOver.show( + // context, + // anchorContext: context, + // gridId: gridId, + // fieldName: "", + // typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), + // ) + }, leftIcon: svgWidget("home/add"), ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index ae5ec03031..bba80ab865 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -13,6 +13,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:appflowy_popover/popover.dart'; import '../../layout/sizes.dart'; import '../cell/cell_accessory.dart'; @@ -123,7 +124,7 @@ class _PropertyList extends StatelessWidget { } } -class _RowDetailCell extends StatelessWidget { +class _RowDetailCell extends StatefulWidget { final GridCellIdentifier cellId; final GridCellBuilder cellBuilder; const _RowDetailCell({ @@ -132,11 +133,18 @@ class _RowDetailCell extends StatelessWidget { Key? key, }) : super(key: key); + @override + State createState() => _RowDetailCellState(); +} + +class _RowDetailCellState extends State<_RowDetailCell> { + final PopoverController popover = PopoverController(); + @override Widget build(BuildContext context) { final theme = context.watch(); - final style = _customCellStyle(theme, cellId.fieldType); - final cell = cellBuilder.build(cellId, style: style); + final style = _customCellStyle(theme, widget.cellId.fieldType); + final cell = widget.cellBuilder.build(widget.cellId, style: style); final gesture = GestureDetector( behavior: HitTestBehavior.translucent, @@ -157,8 +165,29 @@ class _RowDetailCell extends StatelessWidget { children: [ SizedBox( width: 150, - child: FieldCellButton( - field: cellId.field, onTap: () => _showFieldEditor(context)), + child: Popover( + controller: popover, + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: FieldEditor( + gridId: widget.cellId.gridId, + fieldName: widget.cellId.field.name, + typeOptionLoader: FieldTypeOptionLoader( + gridId: widget.cellId.gridId, + field: widget.cellId.field, + ), + ), + ); + }, + child: FieldCellButton( + field: widget.cellId.field, + onTap: () => popover.show(), + ), + ), ), const HSpace(10), Expanded(child: gesture), @@ -167,19 +196,6 @@ class _RowDetailCell extends StatelessWidget { ), ); } - - void _showFieldEditor(BuildContext context) { - FieldEditorPopOver.show( - context, - anchorContext: context, - gridId: cellId.gridId, - fieldName: cellId.field.name, - typeOptionLoader: FieldTypeOptionLoader( - gridId: cellId.gridId, - field: cellId.field, - ), - ); - } } GridCellStyle? _customCellStyle(AppTheme theme, FieldType fieldType) { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 3cef420a53..6320855cca 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -119,13 +119,13 @@ class _GridPropertyCell extends StatelessWidget { hoverColor: theme.hover, leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), onTap: () { - FieldEditorPopOver.show( - context, - anchorContext: context, - gridId: gridId, - fieldName: field.name, - typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field), - ); + // FieldEditorPopOver.show( + // context, + // anchorContext: context, + // gridId: gridId, + // fieldName: field.name, + // typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field), + // ); }, ); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart index 6a773799cf..361486d00b 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -25,50 +25,6 @@ class FlowyPopover extends StatefulWidget { this.constraints, }) : super(key: key); - static show( - BuildContext context, { - required Widget Function(BuildContext context) builder, - BuildContext? anchorContext, - Offset? anchorPosition, - AnchorDirection? anchorDirection, - Size? anchorSize, - Offset? anchorOffset, - BoxConstraints? constraints, - }) { - final offset = anchorOffset ?? Offset.zero; - Offset targetAnchorPosition = anchorPosition ?? Offset.zero; - Size targetAnchorSize = anchorSize ?? Size.zero; - if (anchorContext != null) { - RenderObject renderObject = anchorContext.findRenderObject()!; - assert( - renderObject is RenderBox, - 'Unexpected non-RenderBox render object caught.', - ); - final renderBox = renderObject as RenderBox; - targetAnchorPosition = renderBox.localToGlobal(Offset.zero); - targetAnchorSize = renderBox.size; - } - final anchorRect = Rect.fromLTWH( - targetAnchorPosition.dx + offset.dx, - targetAnchorPosition.dy + offset.dy, - targetAnchorSize.width, - targetAnchorSize.height, - ); - - showDialog( - barrierColor: Colors.transparent, - context: context, - builder: (BuildContext context) { - return FlowyPopover( - anchorRect: anchorRect, - anchorDirection: anchorDirection, - constraints: constraints, - builder: (BuildContext context) { - return builder(context); - }); - }); - } - @override State createState() => _FlowyPopoverState(); } From 6ef7b6cf68c40f3c27737f058458f8aa23400ce0 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 15:29:37 +0800 Subject: [PATCH 17/33] feat: use popover in date cell --- .../widgets/cell/date_cell/date_cell.dart | 48 ++++++----- .../widgets/cell/date_cell/date_editor.dart | 81 +++++++++---------- .../appflowy_popover/lib/popover.dart | 13 ++- 3 files changed, 74 insertions(+), 68 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart index fa5be5f9bd..77a739e164 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart @@ -3,6 +3,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/prelude.dart'; +import 'package:appflowy_popover/popover.dart'; import '../cell_builder.dart'; import 'date_editor.dart'; @@ -39,10 +40,12 @@ class GridDateCell extends GridCellWidget { } class _DateCellState extends GridCellState { + late PopoverController _popover; late DateCellBloc _cellBloc; @override void initState() { + _popover = PopoverController(); final cellController = widget.cellControllerBuilder.build(); _cellBloc = getIt(param1: cellController) ..add(const DateCellEvent.initial()); @@ -58,19 +61,35 @@ class _DateCellState extends GridCellState { value: _cellBloc, child: BlocBuilder( builder: (context, state) { - return SizedBox.expand( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () => _showCalendar(context), - child: MouseRegion( - opaque: false, - cursor: SystemMouseCursors.click, - child: Align( - alignment: alignment, - child: FlowyText.medium(state.dateStr, fontSize: 12), + return Popover( + controller: _popover, + targetAnchor: Alignment.bottomLeft, + followerAnchor: Alignment.topLeft, + offset: const Offset(0, 20), + child: SizedBox.expand( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => _showCalendar(context), + child: MouseRegion( + opaque: false, + cursor: SystemMouseCursors.click, + child: Align( + alignment: alignment, + child: FlowyText.medium(state.dateStr, fontSize: 12), + ), ), ), ), + popupBuilder: (BuildContext popoverContent) { + final bloc = context.read(); + return DateCellEditor( + cellController: bloc.cellController.clone(), + onDismissed: () => widget.onCellEditing.value = false, + ); + }, + onClose: () { + widget.onCellEditing.value = false; + }, ); }, ), @@ -78,14 +97,7 @@ class _DateCellState extends GridCellState { } void _showCalendar(BuildContext context) { - final bloc = context.read(); - widget.onCellEditing.value = true; - final calendar = - DateCellEditor(onDismissed: () => widget.onCellEditing.value = false); - calendar.show( - context, - cellController: bloc.cellController.clone(), - ); + _popover.show(); } @override diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart index f6ddf42fba..c5a34517f4 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart @@ -1,6 +1,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/plugins/grid/application/cell/date_cal_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:app_flowy/startup/tasks/platform_service.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -23,58 +24,54 @@ final kFirstDay = DateTime(kToday.year, kToday.month - 3, kToday.day); final kLastDay = DateTime(kToday.year, kToday.month + 3, kToday.day); const kMargin = EdgeInsets.symmetric(horizontal: 6, vertical: 10); -class DateCellEditor with FlowyOverlayDelegate { +class DateCellEditor extends StatefulWidget { final VoidCallback onDismissed; + final GridDateCellController cellController; const DateCellEditor({ + Key? key, required this.onDismissed, - }); + required this.cellController, + }) : super(key: key); - Future show( - BuildContext context, { - required GridDateCellController cellController, - }) async { - DateCellEditor.remove(context); + @override + State createState() => _DateCellEditor(); +} - final result = - await cellController.getFieldTypeOption(DateTypeOptionDataParser()); +class _DateCellEditor extends State { + DateTypeOptionPB? _dateTypeOptionPB; - result.fold( - (dateTypeOptionPB) { - final calendar = _CellCalendarWidget( - cellContext: cellController, - dateTypeOptionPB: dateTypeOptionPB, - ); + @override + void initState() { + super.initState(); + _fetchData(); + } - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: calendar, - constraints: BoxConstraints.loose(const Size(320, 500)), - ), - identifier: DateCellEditor.identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.leftWithCenterAligned, - style: FlowyOverlayStyle(blur: false), - delegate: this, - ); - }, - (err) => Log.error(err), + _fetchData() async { + final result = await widget.cellController + .getFieldTypeOption(DateTypeOptionDataParser()); + + result.fold((dateTypeOptionPB) { + setState(() { + _dateTypeOptionPB = dateTypeOptionPB; + }); + }, (err) => Log.error(err)); + } + + @override + Widget build(BuildContext context) { + if (_dateTypeOptionPB == null) { + return Container(); + } + + return OverlayContainer( + child: _CellCalendarWidget( + cellContext: widget.cellController, + dateTypeOptionPB: _dateTypeOptionPB!, + ), + constraints: BoxConstraints.loose(const Size(320, 500)), ); } - - static void remove(BuildContext context) { - FlowyOverlay.of(context).remove(identifier()); - } - - static String identifier() { - return (DateCellEditor).toString(); - } - - @override - void didRemove() => onDismissed(); - - @override - bool asBarrier() => true; } class _CellCalendarWidget extends StatelessWidget { diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index aae3d514bb..45b5a692e4 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -37,6 +37,7 @@ class Popover extends StatefulWidget { final Alignment targetAnchor; final Alignment followerAnchor; final Widget Function(BuildContext context) popupBuilder; + final void Function()? onClose; const Popover({ Key? key, @@ -47,6 +48,7 @@ class Popover extends StatefulWidget { this.maskDecoration, this.targetAnchor = Alignment.topLeft, this.followerAnchor = Alignment.topLeft, + this.onClose, }) : super(key: key); @override @@ -71,15 +73,9 @@ class PopoverState extends State { _recognizer.onTap = (() { debugPrint("ggg tap"); }); - WidgetsBinding.instance.pointerRouter - .addGlobalRoute(_handleGlobalPointerEvent); super.initState(); } - _handleGlobalPointerEvent(PointerEvent event) { - // debugPrint("mouse down: ${event}"); - } - showOverlay() { debugPrint("show overlay"); close(); @@ -126,14 +122,15 @@ class PopoverState extends State { if (_popoverWithMask == this) { _popoverWithMask = null; } + if (widget.onClose != null) { + widget.onClose!(); + } } } @override void deactivate() { debugPrint("deactivate"); - WidgetsBinding.instance.pointerRouter - .removeGlobalRoute(_handleGlobalPointerEvent); close(); super.deactivate(); } From 33e45a86c414862077d6aa427237b3f0d6756dec Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 18:04:27 +0800 Subject: [PATCH 18/33] refactor: select option cell --- .../select_option_cell.dart | 60 +++++++++++++++---- .../select_option_editor.dart | 2 + 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart index a8d3993a2f..6a070feed4 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart @@ -1,7 +1,9 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/prelude.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; // ignore: unused_import import 'package:flowy_sdk/log.dart'; @@ -133,7 +135,7 @@ class _MultiSelectCellState extends State { } } -class SelectOptionWrap extends StatelessWidget { +class SelectOptionWrap extends StatefulWidget { final List selectOptions; final void Function(bool)? onFocus; final SelectOptionCellStyle? cellStyle; @@ -146,15 +148,28 @@ class SelectOptionWrap extends StatelessWidget { Key? key, }) : super(key: key); + @override + State createState() => _SelectOptionWrapState(); +} + +class _SelectOptionWrapState extends State { + late PopoverController _popover; + + @override + void initState() { + _popover = PopoverController(); + super.initState(); + } + @override Widget build(BuildContext context) { final theme = context.watch(); final Widget child; - if (selectOptions.isEmpty && cellStyle != null) { + if (widget.selectOptions.isEmpty && widget.cellStyle != null) { child = Align( alignment: Alignment.centerLeft, child: FlowyText.medium( - cellStyle!.placeholder, + widget.cellStyle!.placeholder, fontSize: 14, color: theme.shader3, ), @@ -163,7 +178,7 @@ class SelectOptionWrap extends StatelessWidget { child = Align( alignment: Alignment.centerLeft, child: Wrap( - children: selectOptions + children: widget.selectOptions .map((option) => SelectOptionTag.fromOption( context: context, option: option, @@ -179,14 +194,37 @@ class SelectOptionWrap extends StatelessWidget { alignment: AlignmentDirectional.center, fit: StackFit.expand, children: [ - child, + Popover( + controller: _popover, + child: child, + targetAnchor: Alignment.bottomCenter, + followerAnchor: Alignment.topCenter, + offset: const Offset(0, 20), + popupBuilder: (BuildContext context) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + widget.onFocus?.call(true); + }); + return OverlayContainer( + constraints: BoxConstraints.loose( + Size(SelectOptionCellEditor.editorPanelWidth, 300)), + child: SizedBox( + width: SelectOptionCellEditor.editorPanelWidth, + child: SelectOptionCellEditor( + cellController: widget.cellControllerBuilder.build() + as GridSelectOptionCellController, + onDismissed: () { + widget.onFocus?.call(false); + }, + ), + ), + ); + }, + onClose: () { + widget.onFocus?.call(false); + }, + ), InkWell(onTap: () { - onFocus?.call(true); - SelectOptionCellEditor.show( - context, - cellControllerBuilder.build() as GridSelectOptionCellController, - () => onFocus?.call(false), - ); + _popover.show(); }), ], ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart index c07eef5617..241ee9d309 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart @@ -28,6 +28,8 @@ class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate { final GridSelectOptionCellController cellController; final VoidCallback onDismissed; + static double editorPanelWidth = 300; + const SelectOptionCellEditor({ required this.cellController, required this.onDismissed, From 27557c52a3ceb31f44151fbb0b83b3ac4acf0775 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 18:26:44 +0800 Subject: [PATCH 19/33] feat: add flags to popover --- .../example/lib/example_button.dart | 50 ++++---------- .../appflowy_popover/lib/popover.dart | 68 ++++++++++++------- 2 files changed, 54 insertions(+), 64 deletions(-) diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 956e1fdbaa..80b06422ed 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -7,16 +7,7 @@ class PopoverMenu extends StatefulWidget { } class _PopoverMenuState extends State { - final PopoverMutex exclusive = PopoverMutex(); - late PopoverController firstPopover; - late PopoverController secondPopover; - - @override - void initState() { - firstPopover = PopoverController(mutex: exclusive); - secondPopover = PopoverController(mutex: exclusive); - super.initState(); - } + final PopoverMutex popOverMutex = PopoverMutex(); @override Widget build(BuildContext context) { @@ -27,7 +18,9 @@ class _PopoverMenuState extends State { child: ListView(children: [ const Text("App"), Popover( - controller: firstPopover, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + mutex: popOverMutex, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, @@ -35,19 +28,14 @@ class _PopoverMenuState extends State { return PopoverMenu(); }, child: TextButton( - onPressed: () { - firstPopover.show(); - }, - onHover: (value) { - if (value) { - firstPopover.show(); - } - }, + onPressed: () {}, child: const Text("First"), ), ), Popover( - controller: secondPopover, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + mutex: popOverMutex, offset: const Offset(10, 0), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, @@ -55,14 +43,7 @@ class _PopoverMenuState extends State { return PopoverMenu(); }, child: TextButton( - onPressed: () { - secondPopover.show(); - }, - onHover: (value) { - if (value) { - secondPopover.show(); - } - }, + onPressed: () {}, child: const Text("Second"), ), ), @@ -72,14 +53,12 @@ class _PopoverMenuState extends State { } class ExampleButton extends StatelessWidget { - final PopoverController _popover = PopoverController(); - final String label; final Alignment targetAnchor; final Alignment followerAnchor; final Offset? offset; - ExampleButton({ + const ExampleButton({ Key? key, required this.label, this.targetAnchor = Alignment.topLeft, @@ -90,16 +69,11 @@ class ExampleButton extends StatelessWidget { @override Widget build(BuildContext context) { return Popover( - controller: _popover, targetAnchor: targetAnchor, followerAnchor: followerAnchor, + triggerActions: PopoverTriggerActionFlags.click, offset: offset, - child: TextButton( - onPressed: (() { - _popover.show(); - }), - child: Text(label), - ), + child: TextButton(child: Text(label), onPressed: () {}), popupBuilder: (BuildContext context) { return PopoverMenu(); }, diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index 45b5a692e4..dfa0c3a850 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -3,32 +3,26 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class PopoverMutex { - PopoverController? controller; + PopoverState? state; } class PopoverController { PopoverState? state; - PopoverMutex? mutex; - - PopoverController({this.mutex}); close() { state?.close(); - if (mutex != null && mutex!.controller == this) { - mutex!.controller = null; - } } show() { - if (mutex != null) { - debugPrint("show popover"); - mutex!.controller?.close(); - mutex!.controller = this; - } state?.showOverlay(); } } +class PopoverTriggerActionFlags { + static int click = 0x01; + static int hover = 0x02; +} + class Popover extends StatefulWidget { final Widget child; final PopoverController? controller; @@ -37,6 +31,8 @@ class Popover extends StatefulWidget { final Alignment targetAnchor; final Alignment followerAnchor; final Widget Function(BuildContext context) popupBuilder; + final int triggerActions; + final PopoverMutex? mutex; final void Function()? onClose; const Popover({ @@ -48,6 +44,8 @@ class Popover extends StatefulWidget { this.maskDecoration, this.targetAnchor = Alignment.topLeft, this.followerAnchor = Alignment.topLeft, + this.triggerActions = 0, + this.mutex, this.onClose, }) : super(key: key); @@ -59,20 +57,12 @@ class PopoverState extends State { final LayerLink layerLink = LayerLink(); OverlayEntry? _overlayEntry; bool hasMask = true; - late TapGestureRecognizer _recognizer; static PopoverState? _popoverWithMask; @override void initState() { widget.controller?.state = this; - _recognizer = TapGestureRecognizer(); - _recognizer.onTapDown = (details) { - debugPrint("ggg tapdown"); - }; - _recognizer.onTap = (() { - debugPrint("ggg tap"); - }); super.initState(); } @@ -80,12 +70,19 @@ class PopoverState extends State { debugPrint("show overlay"); close(); + if (widget.mutex != null) { + if (widget.mutex!.state != null && widget.mutex!.state != this) { + widget.mutex!.state!.close(); + } + + widget.mutex!.state = this; + } + if (_popoverWithMask == null) { _popoverWithMask = this; } else { hasMask = false; } - debugPrint("has mask: $hasMask"); final newEntry = OverlayEntry(builder: (context) { final children = []; @@ -126,6 +123,10 @@ class PopoverState extends State { widget.onClose!(); } } + + if (widget.mutex?.state == this) { + widget.mutex!.state = null; + } } @override @@ -135,15 +136,30 @@ class PopoverState extends State { super.deactivate(); } - @override - void dispose() { - _recognizer.dispose(); - super.dispose(); + _handleTargetPointerDown(PointerDownEvent event) { + if (widget.triggerActions & PopoverTriggerActionFlags.click != 0) { + showOverlay(); + } + } + + _handleTargetPointerEnter(PointerEnterEvent event) { + if (widget.triggerActions & PopoverTriggerActionFlags.hover != 0) { + showOverlay(); + } } @override Widget build(BuildContext context) { - return CompositedTransformTarget(link: layerLink, child: widget.child); + return CompositedTransformTarget( + link: layerLink, + child: MouseRegion( + onEnter: _handleTargetPointerEnter, + child: Listener( + onPointerDown: _handleTargetPointerDown, + child: widget.child, + ), + ), + ); } } From 1718d03884810f413a495fb0bab89fc51572c7c5 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 19:19:52 +0800 Subject: [PATCH 20/33] feat: use stateless widget --- .../header/field_type_option_editor.dart | 41 +++++----------- .../widgets/header/type_option/date.dart | 47 ++++--------------- .../header/type_option/multi_select.dart | 14 ++---- .../widgets/header/type_option/number.dart | 27 ++--------- .../header/type_option/single_select.dart | 14 ++---- 5 files changed, 34 insertions(+), 109 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index ee33e06601..b3c0c87301 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -24,7 +24,7 @@ typedef SwitchToFieldCallback FieldType fieldType, ); -class FieldTypeOptionEditor extends StatefulWidget { +class FieldTypeOptionEditor extends StatelessWidget { final TypeOptionDataController dataController; final PopoverMutex popoverMutex; @@ -34,29 +34,15 @@ class FieldTypeOptionEditor extends StatefulWidget { Key? key, }) : super(key: key); - @override - State createState() => _FieldTypeOptionEditorState(); -} - -class _FieldTypeOptionEditorState extends State { - late PopoverController popover; - String? currentOverlayIdentifier; - - @override - void initState() { - popover = PopoverController(mutex: widget.popoverMutex); - super.initState(); - } - @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => FieldTypeOptionEditBloc(widget.dataController) + create: (context) => FieldTypeOptionEditBloc(dataController) ..add(const FieldTypeOptionEditEvent.initial()), child: BlocBuilder( builder: (context, state) { List children = [ - _switchFieldTypeButton(context, widget.dataController.field) + _switchFieldTypeButton(context, dataController.field) ]; final typeOptionWidget = _typeOptionWidget(context: context, state: state); @@ -79,13 +65,15 @@ class _FieldTypeOptionEditorState extends State { return SizedBox( height: GridSize.typeOptionItemHeight, child: Popover( - controller: popover, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + mutex: popoverMutex, offset: const Offset(20, 0), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, popupBuilder: (context) { final list = FieldTypeList(onSelectField: (newFieldType) { - widget.dataController.switchToField(newFieldType); + dataController.switchToField(newFieldType); }); return OverlayContainer( constraints: BoxConstraints.loose(const Size(460, 440)), @@ -96,11 +84,6 @@ class _FieldTypeOptionEditorState extends State { text: FlowyText.medium(field.fieldType.title(), fontSize: 12), margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), hoverColor: theme.hover, - onHover: (bool hover) { - if (hover) { - popover.show(); - } - }, leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), rightIcon: svgWidget("grid/more", color: theme.iconColor), @@ -121,8 +104,8 @@ class _FieldTypeOptionEditorState extends State { return makeTypeOptionWidget( context: context, overlayDelegate: overlayDelegate, - dataController: widget.dataController, - popoverMutex: widget.popoverMutex, + dataController: dataController, + popoverMutex: popoverMutex, ); } @@ -141,12 +124,10 @@ class _FieldTypeOptionEditorState extends State { } void _hideOverlay(BuildContext context) { - if (currentOverlayIdentifier != null) { - FlowyOverlay.of(context).remove(currentOverlayIdentifier!); - } + // } } -abstract class TypeOptionWidget extends StatefulWidget { +abstract class TypeOptionWidget extends StatelessWidget { const TypeOptionWidget({Key? key}) : super(key: key); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index bae1dc175d..81fcf00402 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -42,29 +42,14 @@ class DateTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); - @override - State createState() => _DateTypeOptionWidgetState(); -} - -class _DateTypeOptionWidgetState extends State { - late PopoverController dateFormatPopover; - late PopoverController timeFormatPopover; - - @override - void initState() { - dateFormatPopover = PopoverController(mutex: widget.popoverMutex); - timeFormatPopover = PopoverController(mutex: widget.popoverMutex); - super.initState(); - } - @override Widget build(BuildContext context) { return BlocProvider( create: (context) => - DateTypeOptionBloc(typeOptionContext: widget.typeOptionContext), + DateTypeOptionBloc(typeOptionContext: typeOptionContext), child: BlocConsumer( listener: (context, state) => - widget.typeOptionContext.typeOption = state.typeOption, + typeOptionContext.typeOption = state.typeOption, builder: (context, state) { return Column(children: [ _renderDateFormatButton(context, state.typeOption.dateFormat), @@ -78,14 +63,10 @@ class _DateTypeOptionWidgetState extends State { Widget _renderDateFormatButton(BuildContext context, DateFormat dataFormat) { return Popover( - controller: dateFormatPopover, - child: DateFormatButton(onTap: () { - dateFormatPopover.show(); - }, onHover: ((hover) { - if (hover) { - dateFormatPopover.show(); - } - })), + mutex: popoverMutex, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + child: const DateFormatButton(), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), @@ -107,18 +88,10 @@ class _DateTypeOptionWidgetState extends State { Widget _renderTimeFormatButton(BuildContext context, TimeFormat timeFormat) { return Popover( - controller: timeFormatPopover, - child: TimeFormatButton( - timeFormat: timeFormat, - onTap: () { - timeFormatPopover.show(); - }, - onHover: (hover) { - if (hover) { - timeFormatPopover.show(); - } - }, - ), + mutex: popoverMutex, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + child: TimeFormatButton(timeFormat: timeFormat), targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart index 6d67c9a589..ab8a628146 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart @@ -35,19 +35,13 @@ class MultiSelectTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); - @override - State createState() => _MultiSelectTypeOptionWidgetState(); -} - -class _MultiSelectTypeOptionWidgetState - extends State { @override Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( - options: widget.selectOptionAction.typeOption.options, - beginEdit: () => widget.overlayDelegate.hideOverlay(context), - overlayDelegate: widget.overlayDelegate, - typeOptionAction: widget.selectOptionAction, + options: selectOptionAction.typeOption.options, + beginEdit: () => overlayDelegate.hideOverlay(context), + overlayDelegate: overlayDelegate, + typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index 3c8c0575e8..b98c073da7 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -47,33 +47,22 @@ class NumberTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); - @override - State createState() => _NumberTypeOptionWidgetState(); -} - -class _NumberTypeOptionWidgetState extends State { - late PopoverController controller; - - @override - void initState() { - controller = PopoverController(mutex: widget.popoverMutex); - super.initState(); - } - @override Widget build(BuildContext context) { final theme = context.watch(); return BlocProvider( create: (context) => - NumberTypeOptionBloc(typeOptionContext: widget.typeOptionContext), + NumberTypeOptionBloc(typeOptionContext: typeOptionContext), child: SizedBox( height: GridSize.typeOptionItemHeight, child: BlocConsumer( listener: (context, state) => - widget.typeOptionContext.typeOption = state.typeOption, + typeOptionContext.typeOption = state.typeOption, builder: (context, state) { return Popover( - controller: controller, + mutex: popoverMutex, + triggerActions: PopoverTriggerActionFlags.hover | + PopoverTriggerActionFlags.click, targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), @@ -91,12 +80,6 @@ class _NumberTypeOptionWidgetState extends State { fontSize: 12), ], ), - onTap: () => controller.show(), - onHover: (hover) { - if (hover) { - controller.show(); - } - }, ), popupBuilder: (BuildContext context) { return OverlayContainer( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart index 096426c432..d9d699fdff 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart @@ -34,19 +34,13 @@ class SingleSelectTypeOptionWidget extends TypeOptionWidget { Key? key, }) : super(key: key); - @override - State createState() => _SingleSelectTypeOptionWidgetState(); -} - -class _SingleSelectTypeOptionWidgetState - extends State { @override Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( - options: widget.selectOptionAction.typeOption.options, - beginEdit: () => widget.overlayDelegate.hideOverlay(context), - overlayDelegate: widget.overlayDelegate, - typeOptionAction: widget.selectOptionAction, + options: selectOptionAction.typeOption.options, + beginEdit: () => overlayDelegate.hideOverlay(context), + overlayDelegate: overlayDelegate, + typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); } From 8bab4cce613440c0ae8d49defd021cfc3727c81a Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Tue, 30 Aug 2022 19:32:13 +0800 Subject: [PATCH 21/33] feat: use pop over for date selector --- .../widgets/cell/date_cell/date_editor.dart | 116 +++++++++--------- .../widgets/toolbar/grid_toolbar.dart | 46 ++++++- 2 files changed, 98 insertions(+), 64 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart index c5a34517f4..f651baef9d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart @@ -1,7 +1,7 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/plugins/grid/application/cell/date_cal_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; -import 'package:app_flowy/startup/tasks/platform_service.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -166,17 +166,14 @@ class _CellCalendarWidget extends StatelessWidget { ); }, onDaySelected: (selectedDay, focusedDay) { - _CalDateTimeSetting.hide(context); context .read() .add(DateCalEvent.selectDay(selectedDay)); }, onFormatChanged: (format) { - _CalDateTimeSetting.hide(context); context.read().add(DateCalEvent.setCalFormat(format)); }, onPageChanged: (focusedDay) { - _CalDateTimeSetting.hide(context); context .read() .add(DateCalEvent.setFocusedDay(focusedDay)); @@ -244,7 +241,6 @@ class _TimeTextFieldState extends State<_TimeTextField> { if (widget.bloc.state.dateTypeOptionPB.includeTime) { _focusNode.addListener(() { if (mounted) { - _CalDateTimeSetting.hide(context); widget.bloc.add(DateCalEvent.setTime(_controller.text)); } }); @@ -307,25 +303,31 @@ class _DateTypeOptionButton extends StatelessWidget { return BlocSelector( selector: (state) => state.dateTypeOptionPB, builder: (context, dateTypeOptionPB) { - return FlowyButton( - text: FlowyText.medium(title, fontSize: 12), - hoverColor: theme.hover, - margin: kMargin, - onTap: () => _showTimeSetting(dateTypeOptionPB, context), - rightIcon: svgWidget("grid/more", color: theme.iconColor), + return Popover( + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + child: FlowyButton( + text: FlowyText.medium(title, fontSize: 12), + hoverColor: theme.hover, + margin: kMargin, + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ), + popupBuilder: (BuildContext popContext) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(140, 100)), + child: _CalDateTimeSetting( + dateTypeOptionPB: dateTypeOptionPB, + onEvent: (event) => context.read().add(event), + ), + ); + }, ); }, ); } - - void _showTimeSetting( - DateTypeOptionPB dateTypeOptionPB, BuildContext context) { - final setting = _CalDateTimeSetting( - dateTypeOptionPB: dateTypeOptionPB, - onEvent: (event) => context.read().add(event), - ); - setting.show(context); - } } class _CalDateTimeSetting extends StatefulWidget { @@ -337,53 +339,51 @@ class _CalDateTimeSetting extends StatefulWidget { @override State<_CalDateTimeSetting> createState() => _CalDateTimeSettingState(); - - static String identifier() { - return (_CalDateTimeSetting).toString(); - } - - void show(BuildContext context) { - hide(context); - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: this, - constraints: BoxConstraints.loose(const Size(140, 100)), - ), - identifier: _CalDateTimeSetting.identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.rightWithCenterAligned, - anchorOffset: const Offset(20, 0), - ); - } - - static void hide(BuildContext context) { - FlowyOverlay.of(context).remove(identifier()); - } } class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { String? overlayIdentifier; + final _popoverMutex = PopoverMutex(); @override Widget build(BuildContext context) { List children = [ - DateFormatButton(onTap: () { - final list = DateFormatList( - selectedFormat: widget.dateTypeOptionPB.dateFormat, - onSelected: (format) => - widget.onEvent(DateCalEvent.setDateFormat(format)), - ); - _showOverlay(context, list); - }), - TimeFormatButton( - timeFormat: widget.dateTypeOptionPB.timeFormat, - onTap: () { - final list = TimeFormatList( - selectedFormat: widget.dateTypeOptionPB.timeFormat, - onSelected: (format) => - widget.onEvent(DateCalEvent.setTimeFormat(format)), + Popover( + mutex: _popoverMutex, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + child: const DateFormatButton(), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: DateFormatList( + selectedFormat: widget.dateTypeOptionPB.dateFormat, + onSelected: (format) => + widget.onEvent(DateCalEvent.setDateFormat(format)), + ), + ); + }, + ), + Popover( + mutex: _popoverMutex, + triggerActions: + PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, + child: TimeFormatButton(timeFormat: widget.dateTypeOptionPB.timeFormat), + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: TimeFormatList( + selectedFormat: widget.dateTypeOptionPB.timeFormat, + onSelected: (format) => + widget.onEvent(DateCalEvent.setTimeFormat(format)), + ), ); - _showOverlay(context, list); }, ), ]; diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart index 4ced06bf99..e6eb1bf41a 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart @@ -1,5 +1,8 @@ +import 'package:appflowy_popover/popover.dart'; +import 'package:app_flowy/plugins/grid/application/setting/setting_bloc.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/style_widget/extension.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/material.dart'; @@ -7,6 +10,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../application/field/field_cache.dart'; import '../../layout/sizes.dart'; +import 'grid_property.dart'; import 'grid_setting.dart'; class GridToolbarContext { @@ -49,12 +53,42 @@ class _SettingButton extends StatelessWidget { @override Widget build(BuildContext context) { final theme = context.watch(); - return FlowyIconButton( - hoverColor: theme.hover, - width: 22, - onPressed: () => GridSettingList.show(context, settingContext), - icon: - svgWidget("grid/setting/setting").padding(horizontal: 3, vertical: 3), + return Popover( + triggerActions: PopoverTriggerActionFlags.click, + targetAnchor: Alignment.bottomLeft, + followerAnchor: Alignment.topLeft, + offset: const Offset(0, 10), + child: FlowyIconButton( + width: 22, + hoverColor: theme.hover, + icon: svgWidget("grid/setting/setting") + .padding(horizontal: 3, vertical: 3), + ), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(140, 400)), + child: GridSettingList( + settingContext: settingContext, + onAction: (action, settingContext) { + switch (action) { + case GridSettingAction.filter: + break; + case GridSettingAction.sortBy: + break; + case GridSettingAction.properties: + GridPropertyList( + gridId: settingContext.gridId, + fieldCache: settingContext.fieldCache) + .show(context); + break; + } + }, + ), + ); + }, ); + // return FlowyIconButton( + // onPressed: () => GridSettingList.show(context, settingContext), + // ); } } From d79a7cb19404cc521546ec4902c741d503076169 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 31 Aug 2022 11:04:07 +0800 Subject: [PATCH 22/33] feat: use popover in property field --- .../widgets/header/field_cell.dart | 8 +- .../header/field_cell_action_sheet.dart | 109 ++++++++---------- .../widgets/header/type_option/date.dart | 2 +- .../widgets/toolbar/grid_property.dart | 60 ++++------ .../widgets/toolbar/grid_setting.dart | 32 +---- .../widgets/toolbar/grid_toolbar.dart | 63 ++++++---- 6 files changed, 119 insertions(+), 155 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index a28fa3060f..aef241b1bd 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -3,7 +3,6 @@ import 'package:app_flowy/plugins/grid/application/field/field_service.dart'; import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; -import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/hover.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; @@ -44,11 +43,8 @@ class _GridFieldCellState extends State { followerAnchor: Alignment.topLeft, offset: const Offset(0, 10), popupBuilder: (BuildContext context) { - return OverlayContainer( - constraints: BoxConstraints.loose(const Size(240, 200)), - child: GridFieldCellActionSheet( - cellContext: widget.cellContext, - ), + return GridFieldCellActionSheet( + cellContext: widget.cellContext, ); }, ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart index c560a333a6..3991b841b8 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart @@ -11,92 +11,85 @@ import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:appflowy_popover/popover.dart'; import 'package:app_flowy/generated/locale_keys.g.dart'; import '../../layout/sizes.dart'; -class GridFieldCellActionSheet extends StatelessWidget - with FlowyOverlayDelegate { +class GridFieldCellActionSheet extends StatefulWidget { final GridFieldCellContext cellContext; const GridFieldCellActionSheet({required this.cellContext, Key? key}) : super(key: key); + @override + State createState() => _GridFieldCellActionSheetState(); +} + +class _GridFieldCellActionSheetState extends State { + bool _showFieldEditor = false; + @override Widget build(BuildContext context) { + if (_showFieldEditor) { + final field = widget.cellContext.field; + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: FieldEditor( + gridId: widget.cellContext.gridId, + fieldName: field.name, + typeOptionLoader: FieldTypeOptionLoader( + gridId: widget.cellContext.gridId, + field: field, + ), + ), + ); + } return BlocProvider( - create: (context) => getIt(param1: cellContext), - child: SingleChildScrollView( - child: Column( - children: [ - _EditFieldButton( - cellContext: cellContext, - ), - const VSpace(6), - _FieldOperationList(cellContext, - () => FlowyOverlay.of(context).remove(identifier())), - ], + create: (context) => + getIt(param1: widget.cellContext), + child: OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: SingleChildScrollView( + child: Column( + children: [ + _EditFieldButton( + cellContext: widget.cellContext, + onTap: () { + setState(() { + _showFieldEditor = true; + }); + }, + ), + const VSpace(6), + _FieldOperationList(widget.cellContext, () {}), + ], + ), ), ), ); } - - static String identifier() { - return (GridFieldCellActionSheet).toString(); - } - - @override - bool asBarrier() { - return true; - } } -class _EditFieldButton extends StatefulWidget { +class _EditFieldButton extends StatelessWidget { final GridFieldCellContext cellContext; - const _EditFieldButton({required this.cellContext, Key? key}) + final void Function()? onTap; + const _EditFieldButton({required this.cellContext, Key? key, this.onTap}) : super(key: key); - @override - State createState() => _EditFieldButtonState(); -} - -class _EditFieldButtonState extends State<_EditFieldButton> { - final popover = PopoverController(); - @override Widget build(BuildContext context) { final theme = context.watch(); + return BlocBuilder( builder: (context, state) { return SizedBox( height: GridSize.typeOptionItemHeight, - child: Popover( - controller: popover, - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, - offset: const Offset(20, 0), - popupBuilder: (context) { - final field = widget.cellContext.field; - return OverlayContainer( - constraints: BoxConstraints.loose(const Size(240, 200)), - child: FieldEditor( - gridId: widget.cellContext.gridId, - fieldName: field.name, - typeOptionLoader: FieldTypeOptionLoader( - gridId: widget.cellContext.gridId, - field: field, - ), - ), - ); - }, - child: FlowyButton( - text: FlowyText.medium( - LocaleKeys.grid_field_editProperty.tr(), - fontSize: 12, - ), - hoverColor: theme.hover, - onTap: () => popover.show(), + child: FlowyButton( + text: FlowyText.medium( + LocaleKeys.grid_field_editProperty.tr(), + fontSize: 12, ), + hoverColor: theme.hover, + onTap: onTap, ), ); }, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index 81fcf00402..f7d1df0a3d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -70,7 +70,7 @@ class DateTypeOptionWidget extends TypeOptionWidget { targetAnchor: Alignment.topRight, followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), - popupBuilder: (context) { + popupBuilder: (popoverContext) { return OverlayContainer( constraints: BoxConstraints.loose(const Size(460, 440)), child: DateFormatList( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 6320855cca..453d2b838a 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -1,7 +1,9 @@ import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; +import 'package:app_flowy/plugins/grid/presentation/widgets/header/field_editor.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/setting/property_bloc.dart'; import 'package:app_flowy/plugins/grid/presentation/widgets/header/field_type_extension.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; @@ -16,9 +18,8 @@ import 'package:styled_widget/styled_widget.dart'; import '../../../application/field/field_cache.dart'; import '../../layout/sizes.dart'; -import '../header/field_editor.dart'; -class GridPropertyList extends StatelessWidget with FlowyOverlayDelegate { +class GridPropertyList extends StatelessWidget { final String gridId; final GridFieldCache fieldCache; const GridPropertyList({ @@ -27,20 +28,6 @@ class GridPropertyList extends StatelessWidget with FlowyOverlayDelegate { Key? key, }) : super(key: key); - void show(BuildContext context) { - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: this, - constraints: BoxConstraints.loose(const Size(260, 400)), - ), - identifier: identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.bottomRight, - style: FlowyOverlayStyle(blur: false), - delegate: this, - ); - } - @override Widget build(BuildContext context) { return BlocProvider( @@ -68,13 +55,6 @@ class GridPropertyList extends StatelessWidget with FlowyOverlayDelegate { ), ); } - - String identifier() { - return (GridPropertyList).toString(); - } - - @override - bool asBarrier() => true; } class _GridPropertyCell extends StatelessWidget { @@ -113,19 +93,27 @@ class _GridPropertyCell extends StatelessWidget { ); } - FlowyButton _editFieldButton(AppTheme theme, BuildContext context) { - return FlowyButton( - text: FlowyText.medium(field.name, fontSize: 12), - hoverColor: theme.hover, - leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), - onTap: () { - // FieldEditorPopOver.show( - // context, - // anchorContext: context, - // gridId: gridId, - // fieldName: field.name, - // typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field), - // ); + Widget _editFieldButton(AppTheme theme, BuildContext context) { + return Popover( + triggerActions: PopoverTriggerActionFlags.click, + targetAnchor: Alignment.topRight, + followerAnchor: Alignment.topLeft, + offset: const Offset(20, 0), + child: FlowyButton( + text: FlowyText.medium(field.name, fontSize: 12), + hoverColor: theme.hover, + leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), + ), + popupBuilder: (BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: FieldEditor( + gridId: gridId, + fieldName: field.name, + typeOptionLoader: + FieldTypeOptionLoader(gridId: gridId, field: field), + ), + ); }, ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart index f555b6266a..276b66cae4 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart @@ -1,4 +1,5 @@ import 'package:app_flowy/plugins/grid/application/setting/setting_bloc.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -32,37 +33,6 @@ class GridSettingList extends StatelessWidget { {required this.settingContext, required this.onAction, Key? key}) : super(key: key); - static void show(BuildContext context, GridSettingContext settingContext) { - final list = GridSettingList( - settingContext: settingContext, - onAction: (action, settingContext) { - switch (action) { - case GridSettingAction.filter: - break; - case GridSettingAction.sortBy: - break; - case GridSettingAction.properties: - GridPropertyList( - gridId: settingContext.gridId, - fieldCache: settingContext.fieldCache) - .show(context); - break; - } - }, - ); - - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: list, - constraints: BoxConstraints.loose(const Size(140, 400)), - ), - identifier: list.identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.bottomRight, - style: FlowyOverlayStyle(blur: false), - ); - } - @override Widget build(BuildContext context) { return BlocProvider( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart index e6eb1bf41a..7327cefc86 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart @@ -65,30 +65,47 @@ class _SettingButton extends StatelessWidget { .padding(horizontal: 3, vertical: 3), ), popupBuilder: (BuildContext context) { - return OverlayContainer( - constraints: BoxConstraints.loose(const Size(140, 400)), - child: GridSettingList( - settingContext: settingContext, - onAction: (action, settingContext) { - switch (action) { - case GridSettingAction.filter: - break; - case GridSettingAction.sortBy: - break; - case GridSettingAction.properties: - GridPropertyList( - gridId: settingContext.gridId, - fieldCache: settingContext.fieldCache) - .show(context); - break; - } - }, - ), - ); + return _GridSettingListPopover(settingContext: settingContext); }, ); - // return FlowyIconButton( - // onPressed: () => GridSettingList.show(context, settingContext), - // ); + } +} + +class _GridSettingListPopover extends StatefulWidget { + final GridSettingContext settingContext; + + const _GridSettingListPopover({Key? key, required this.settingContext}) + : super(key: key); + + @override + State createState() => _GridSettingListPopoverState(); +} + +class _GridSettingListPopoverState extends State<_GridSettingListPopover> { + GridSettingAction? _action; + + @override + Widget build(BuildContext context) { + if (_action == GridSettingAction.properties) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(260, 400)), + child: GridPropertyList( + gridId: widget.settingContext.gridId, + fieldCache: widget.settingContext.fieldCache, + ), + ); + } + + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(140, 400)), + child: GridSettingList( + settingContext: widget.settingContext, + onAction: (action, settingContext) { + setState(() { + _action = action; + }); + }, + ), + ); } } From 14c1959d63dcb1d7bd6680ac2f52034239889818 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 31 Aug 2022 15:36:47 +0800 Subject: [PATCH 23/33] feat: use custom follower --- .../appflowy_popover/lib/follower.dart | 84 +++++ .../packages/appflowy_popover/lib/layout.dart | 339 ++++++++++++++++++ .../appflowy_popover/lib/popover.dart | 52 ++- 3 files changed, 464 insertions(+), 11 deletions(-) create mode 100644 frontend/app_flowy/packages/appflowy_popover/lib/follower.dart create mode 100644 frontend/app_flowy/packages/appflowy_popover/lib/layout.dart diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart b/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart new file mode 100644 index 0000000000..5e337e51b5 --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart @@ -0,0 +1,84 @@ +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +class PopoverCompositedTransformFollower extends CompositedTransformFollower { + const PopoverCompositedTransformFollower({ + super.key, + required super.link, + super.showWhenUnlinked = true, + super.offset = Offset.zero, + super.targetAnchor = Alignment.topLeft, + super.followerAnchor = Alignment.topLeft, + super.child, + }); + + @override + PopoverRenderFollowerLayer createRenderObject(BuildContext context) { + final screenSize = MediaQuery.of(context).size; + return PopoverRenderFollowerLayer( + screenSize: screenSize, + link: link, + showWhenUnlinked: showWhenUnlinked, + offset: offset, + leaderAnchor: targetAnchor, + followerAnchor: followerAnchor, + ); + } + + @override + void updateRenderObject( + BuildContext context, PopoverRenderFollowerLayer renderObject) { + final screenSize = MediaQuery.of(context).size; + renderObject + ..screenSize = screenSize + ..link = link + ..showWhenUnlinked = showWhenUnlinked + ..offset = offset + ..leaderAnchor = targetAnchor + ..followerAnchor = followerAnchor; + } +} + +class PopoverRenderFollowerLayer extends RenderFollowerLayer { + Size screenSize; + + PopoverRenderFollowerLayer({ + required super.link, + super.showWhenUnlinked = true, + super.offset = Offset.zero, + super.leaderAnchor = Alignment.topLeft, + super.followerAnchor = Alignment.topLeft, + super.child, + required this.screenSize, + }); + + @override + void paint(PaintingContext context, Offset offset) { + super.paint(context, offset); + + final global = localToGlobal(offset); + + if (link.leader == null) { + return; + } + + if (link.leader!.offset.dx + link.leaderSize!.width + size.width > + screenSize.width) { + debugPrint("over flow"); + } + debugPrint( + "right: ${link.leader!.offset.dx + link.leaderSize!.width + size.width}, screen with: ${screenSize.width}"); + // debugPrint( + // "offset: $offset, global: $global, link: ${link.leader?.offset}, link size: ${link.leaderSize}"); + // debugPrint("follower size: ${this.size}, screen size: ${this.screenSize}"); + } +} + +class EdgeFollowerLayer extends FollowerLayer { + EdgeFollowerLayer({ + required super.link, + super.showWhenUnlinked = true, + super.unlinkedOffset = Offset.zero, + super.linkedOffset = Offset.zero, + }); +} diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart b/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart new file mode 100644 index 0000000000..ee97c7161a --- /dev/null +++ b/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart @@ -0,0 +1,339 @@ +import 'dart:math' as math; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import './popover.dart'; + +class PopoverLayoutDelegate extends SingleChildLayoutDelegate { + PopoverLink link; + PopoverDirection direction; + + PopoverLayoutDelegate({ + required this.link, + required this.direction, + }); + + @override + bool shouldRelayout(PopoverLayoutDelegate oldDelegate) { + if (direction != oldDelegate.direction) { + return true; + } + + if (link != oldDelegate.link) { + return true; + } + + if (link.leaderOffset != oldDelegate.link.leaderOffset) { + return true; + } + + if (link.leaderSize != oldDelegate.link.leaderSize) { + return true; + } + + return false; + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + return constraints.loosen(); + // assert(link.leaderSize != null); + // // if (link.leaderSize == null) { + // // return constraints.loosen(); + // // } + // final anchorRect = Rect.fromLTWH( + // link.leaderOffset!.dx, + // link.leaderOffset!.dy, + // link.leaderSize!.width, + // link.leaderSize!.height, + // ); + // BoxConstraints childConstraints; + // switch (direction) { + // case PopoverDirection.topLeft: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // anchorRect.top, + // )); + // break; + // case PopoverDirection.topRight: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.right, + // anchorRect.top, + // )); + // break; + // case PopoverDirection.bottomLeft: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // constraints.maxHeight - anchorRect.bottom, + // )); + // break; + // case PopoverDirection.bottomRight: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.right, + // constraints.maxHeight - anchorRect.bottom, + // )); + // break; + // case PopoverDirection.center: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth, + // constraints.maxHeight, + // )); + // break; + // case PopoverDirection.topWithLeftAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.left, + // anchorRect.top, + // )); + // break; + // case PopoverDirection.topWithCenterAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth, + // anchorRect.top, + // )); + // break; + // case PopoverDirection.topWithRightAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.right, + // anchorRect.top, + // )); + // break; + // case PopoverDirection.rightWithTopAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.right, + // constraints.maxHeight - anchorRect.top, + // )); + // break; + // case PopoverDirection.rightWithCenterAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.right, + // constraints.maxHeight, + // )); + // break; + // case PopoverDirection.rightWithBottomAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth - anchorRect.right, + // anchorRect.bottom, + // )); + // break; + // case PopoverDirection.bottomWithLeftAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // constraints.maxHeight - anchorRect.bottom, + // )); + // break; + // case PopoverDirection.bottomWithCenterAligned: + // childConstraints = BoxConstraints.loose(Size( + // constraints.maxWidth, + // constraints.maxHeight - anchorRect.bottom, + // )); + // break; + // case PopoverDirection.bottomWithRightAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.right, + // constraints.maxHeight - anchorRect.bottom, + // )); + // break; + // case PopoverDirection.leftWithTopAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // constraints.maxHeight - anchorRect.top, + // )); + // break; + // case PopoverDirection.leftWithCenterAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // constraints.maxHeight, + // )); + // break; + // case PopoverDirection.leftWithBottomAligned: + // childConstraints = BoxConstraints.loose(Size( + // anchorRect.left, + // anchorRect.bottom, + // )); + // break; + // case PopoverDirection.custom: + // childConstraints = constraints.loosen(); + // break; + // default: + // throw UnimplementedError(); + // } + // return childConstraints; + } + + @override + Offset getPositionForChild(Size size, Size childSize) { + if (link.leaderSize == null) { + return Offset.zero; + } + final anchorRect = Rect.fromLTWH( + link.leaderOffset!.dx, + link.leaderOffset!.dy, + link.leaderSize!.width, + link.leaderSize!.height, + ); + Offset position; + switch (direction) { + case PopoverDirection.topLeft: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top - childSize.height, + ); + break; + case PopoverDirection.topRight: + position = Offset( + anchorRect.right, + anchorRect.top - childSize.height, + ); + break; + case PopoverDirection.bottomLeft: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.bottom, + ); + break; + case PopoverDirection.bottomRight: + position = Offset( + anchorRect.right, + anchorRect.bottom, + ); + break; + case PopoverDirection.center: + position = anchorRect.center; + break; + case PopoverDirection.topWithLeftAligned: + position = Offset( + anchorRect.left, + anchorRect.top - childSize.height, + ); + break; + case PopoverDirection.topWithCenterAligned: + position = Offset( + anchorRect.left + anchorRect.width / 2.0 - childSize.width / 2.0, + anchorRect.top - childSize.height, + ); + break; + case PopoverDirection.topWithRightAligned: + position = Offset( + anchorRect.right - childSize.width, + anchorRect.top - childSize.height, + ); + break; + case PopoverDirection.rightWithTopAligned: + position = Offset(anchorRect.right, anchorRect.top); + break; + case PopoverDirection.rightWithCenterAligned: + position = Offset( + anchorRect.right, + anchorRect.top + anchorRect.height / 2.0 - childSize.height / 2.0, + ); + break; + case PopoverDirection.rightWithBottomAligned: + position = Offset( + anchorRect.right, + anchorRect.bottom - childSize.height, + ); + break; + case PopoverDirection.bottomWithLeftAligned: + position = Offset( + anchorRect.left, + anchorRect.bottom, + ); + break; + case PopoverDirection.bottomWithCenterAligned: + position = Offset( + anchorRect.left + anchorRect.width / 2.0 - childSize.width / 2.0, + anchorRect.bottom, + ); + break; + case PopoverDirection.bottomWithRightAligned: + position = Offset( + anchorRect.right - childSize.width, + anchorRect.bottom, + ); + break; + case PopoverDirection.leftWithTopAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top, + ); + break; + case PopoverDirection.leftWithCenterAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.top + anchorRect.height / 2.0 - childSize.height / 2.0, + ); + break; + case PopoverDirection.leftWithBottomAligned: + position = Offset( + anchorRect.left - childSize.width, + anchorRect.bottom - childSize.height, + ); + break; + default: + throw UnimplementedError(); + } + return Offset( + math.max(0.0, math.min(size.width - childSize.width, position.dx)), + math.max(0.0, math.min(size.height - childSize.height, position.dy)), + ); + } +} + +class PopoverTarget extends SingleChildRenderObjectWidget { + final PopoverLink link; + const PopoverTarget({ + super.key, + super.child, + required this.link, + }); + + @override + PopoverTargetRenderBox createRenderObject(BuildContext context) { + return PopoverTargetRenderBox( + link: link, + ); + } + + @override + void updateRenderObject( + BuildContext context, PopoverTargetRenderBox renderObject) { + renderObject.link = link; + } +} + +class PopoverTargetRenderBox extends RenderProxyBox { + PopoverLink link; + PopoverTargetRenderBox({required this.link, RenderBox? child}) : super(child); + + @override + bool get alwaysNeedsCompositing => true; + + @override + void performLayout() { + super.performLayout(); + link.leaderSize = size; + } + + @override + void paint(PaintingContext context, Offset offset) { + link.leaderOffset = localToGlobal(Offset.zero); + super.paint(context, offset); + } + + @override + void detach() { + link.leaderOffset = null; + link.leaderSize = null; + super.detach(); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('link', link)); + } +} + +class PopoverLink { + Offset? leaderOffset; + Size? leaderSize; +} diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index dfa0c3a850..3507c7d1bf 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -1,6 +1,8 @@ +import 'package:appflowy_popover/layout.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import './follower.dart'; class PopoverMutex { PopoverState? state; @@ -23,6 +25,31 @@ class PopoverTriggerActionFlags { static int hover = 0x02; } +enum PopoverDirection { + // Corner aligned with a corner of the SourceWidget + topLeft, + topRight, + bottomLeft, + bottomRight, + center, + + // Edge aligned with a edge of the SourceWidget + topWithLeftAligned, + topWithCenterAligned, + topWithRightAligned, + rightWithTopAligned, + rightWithCenterAligned, + rightWithBottomAligned, + bottomWithLeftAligned, + bottomWithCenterAligned, + bottomWithRightAligned, + leftWithTopAligned, + leftWithCenterAligned, + leftWithBottomAligned, + + custom, +} + class Popover extends StatefulWidget { final Widget child; final PopoverController? controller; @@ -33,6 +60,7 @@ class Popover extends StatefulWidget { final Widget Function(BuildContext context) popupBuilder; final int triggerActions; final PopoverMutex? mutex; + final PopoverDirection direction; final void Function()? onClose; const Popover({ @@ -45,6 +73,7 @@ class Popover extends StatefulWidget { this.targetAnchor = Alignment.topLeft, this.followerAnchor = Alignment.topLeft, this.triggerActions = 0, + this.direction = PopoverDirection.rightWithTopAligned, this.mutex, this.onClose, }) : super(key: key); @@ -54,7 +83,7 @@ class Popover extends StatefulWidget { } class PopoverState extends State { - final LayerLink layerLink = LayerLink(); + final PopoverLink popoverLink = PopoverLink(); OverlayEntry? _overlayEntry; bool hasMask = true; @@ -95,14 +124,15 @@ class PopoverState extends State { )); } - children.add(CompositedTransformFollower( - link: layerLink, - showWhenUnlinked: false, - offset: widget.offset ?? Offset.zero, - targetAnchor: widget.targetAnchor, - followerAnchor: widget.followerAnchor, - child: widget.popupBuilder(context), - )); + children.add( + CustomSingleChildLayout( + delegate: PopoverLayoutDelegate( + direction: widget.direction, + link: popoverLink, + ), + child: widget.popupBuilder(context), + ), + ); return Stack(children: children); }); @@ -150,8 +180,8 @@ class PopoverState extends State { @override Widget build(BuildContext context) { - return CompositedTransformTarget( - link: layerLink, + return PopoverTarget( + link: popoverLink, child: MouseRegion( onEnter: _handleTargetPointerEnter, child: Listener( From 4c31c0dcf0d8f442b93619e6f0add6a626a50a9d Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 31 Aug 2022 18:06:41 +0800 Subject: [PATCH 24/33] feat: remove legacy alignment --- .../widgets/cell/date_cell/date_cell.dart | 2 - .../widgets/cell/date_cell/date_editor.dart | 6 -- .../select_option_cell.dart | 2 - .../widgets/header/field_cell.dart | 2 - .../header/field_type_option_editor.dart | 2 - .../widgets/header/type_option/date.dart | 24 +++---- .../widgets/header/type_option/number.dart | 2 - .../presentation/widgets/row/row_detail.dart | 2 - .../widgets/toolbar/grid_property.dart | 2 - .../widgets/toolbar/grid_toolbar.dart | 2 - .../example/lib/example_button.dart | 6 -- .../packages/appflowy_popover/lib/layout.dart | 6 +- .../appflowy_popover/lib/popover.dart | 69 +++++++++++++++---- 13 files changed, 71 insertions(+), 56 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart index 77a739e164..fbdc2ec9ab 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart @@ -63,8 +63,6 @@ class _DateCellState extends GridCellState { builder: (context, state) { return Popover( controller: _popover, - targetAnchor: Alignment.bottomLeft, - followerAnchor: Alignment.topLeft, offset: const Offset(0, 20), child: SizedBox.expand( child: GestureDetector( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart index f651baef9d..25ecf613a6 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart @@ -306,8 +306,6 @@ class _DateTypeOptionButton extends StatelessWidget { return Popover( triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), child: FlowyButton( text: FlowyText.medium(title, fontSize: 12), @@ -353,8 +351,6 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, child: const DateFormatButton(), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), popupBuilder: (BuildContext context) { return OverlayContainer( @@ -372,8 +368,6 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, child: TimeFormatButton(timeFormat: widget.dateTypeOptionPB.timeFormat), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), popupBuilder: (BuildContext context) { return OverlayContainer( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart index 6a070feed4..72794adee3 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart @@ -197,8 +197,6 @@ class _SelectOptionWrapState extends State { Popover( controller: _popover, child: child, - targetAnchor: Alignment.bottomCenter, - followerAnchor: Alignment.topCenter, offset: const Offset(0, 20), popupBuilder: (BuildContext context) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index aef241b1bd..abdbbdb3ab 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -39,8 +39,6 @@ class _GridFieldCellState extends State { field: state.field, onTap: () => popover.show(), ), - targetAnchor: Alignment.bottomLeft, - followerAnchor: Alignment.topLeft, offset: const Offset(0, 10), popupBuilder: (BuildContext context) { return GridFieldCellActionSheet( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index b3c0c87301..6231ba5aba 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -69,8 +69,6 @@ class FieldTypeOptionEditor extends StatelessWidget { PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, mutex: popoverMutex, offset: const Offset(20, 0), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, popupBuilder: (context) { final list = FieldTypeList(onSelectField: (newFieldType) { dataController.switchToField(newFieldType); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index f7d1df0a3d..bd1c82a254 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -67,8 +67,6 @@ class DateTypeOptionWidget extends TypeOptionWidget { triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, child: const DateFormatButton(), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), popupBuilder: (popoverContext) { return OverlayContainer( @@ -92,19 +90,19 @@ class DateTypeOptionWidget extends TypeOptionWidget { triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, child: TimeFormatButton(timeFormat: timeFormat), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), - popupBuilder: (BuildContext context) { + popupBuilder: (BuildContext popoverContext) { return OverlayContainer( - constraints: BoxConstraints.loose(const Size(460, 440)), - child: TimeFormatList( - selectedFormat: timeFormat, - onSelected: (format) { - context - .read() - .add(DateTypeOptionEvent.didSelectTimeFormat(format)); - })); + constraints: BoxConstraints.loose(const Size(460, 440)), + child: TimeFormatList( + selectedFormat: timeFormat, + onSelected: (format) { + context + .read() + .add(DateTypeOptionEvent.didSelectTimeFormat(format)); + PopoverContainerState.of(popoverContext).close(); + }), + ); }, ); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index b98c073da7..d9df038d22 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -63,8 +63,6 @@ class NumberTypeOptionWidget extends TypeOptionWidget { mutex: popoverMutex, triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), child: FlowyButton( margin: GridSize.typeOptionContentInsets, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart index bba80ab865..7d22c51fab 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/row_detail.dart @@ -167,8 +167,6 @@ class _RowDetailCellState extends State<_RowDetailCell> { width: 150, child: Popover( controller: popover, - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), popupBuilder: (context) { return OverlayContainer( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 453d2b838a..1912dc8499 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -96,8 +96,6 @@ class _GridPropertyCell extends StatelessWidget { Widget _editFieldButton(AppTheme theme, BuildContext context) { return Popover( triggerActions: PopoverTriggerActionFlags.click, - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, offset: const Offset(20, 0), child: FlowyButton( text: FlowyText.medium(field.name, fontSize: 12), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart index 7327cefc86..38e95dc782 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_toolbar.dart @@ -55,8 +55,6 @@ class _SettingButton extends StatelessWidget { final theme = context.watch(); return Popover( triggerActions: PopoverTriggerActionFlags.click, - targetAnchor: Alignment.bottomLeft, - followerAnchor: Alignment.topLeft, offset: const Offset(0, 10), child: FlowyIconButton( width: 22, diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 80b06422ed..173baf823c 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -22,8 +22,6 @@ class _PopoverMenuState extends State { PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, mutex: popOverMutex, offset: const Offset(10, 0), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, popupBuilder: (BuildContext context) { return PopoverMenu(); }, @@ -37,8 +35,6 @@ class _PopoverMenuState extends State { PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, mutex: popOverMutex, offset: const Offset(10, 0), - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.topLeft, popupBuilder: (BuildContext context) { return PopoverMenu(); }, @@ -69,8 +65,6 @@ class ExampleButton extends StatelessWidget { @override Widget build(BuildContext context) { return Popover( - targetAnchor: targetAnchor, - followerAnchor: followerAnchor, triggerActions: PopoverTriggerActionFlags.click, offset: offset, child: TextButton(child: Text(label), onPressed: () {}), diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart b/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart index ee97c7161a..d589f18723 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/layout.dart @@ -6,10 +6,12 @@ import './popover.dart'; class PopoverLayoutDelegate extends SingleChildLayoutDelegate { PopoverLink link; PopoverDirection direction; + final Offset offset; PopoverLayoutDelegate({ required this.link, required this.direction, + required this.offset, }); @override @@ -165,8 +167,8 @@ class PopoverLayoutDelegate extends SingleChildLayoutDelegate { return Offset.zero; } final anchorRect = Rect.fromLTWH( - link.leaderOffset!.dx, - link.leaderOffset!.dy, + link.leaderOffset!.dx + offset.dx, + link.leaderOffset!.dy + offset.dy, link.leaderSize!.width, link.leaderSize!.height, ); diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index 3507c7d1bf..df51f7249d 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:appflowy_popover/layout.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -55,8 +57,6 @@ class Popover extends StatefulWidget { final PopoverController? controller; final Offset? offset; final Decoration? maskDecoration; - final Alignment targetAnchor; - final Alignment followerAnchor; final Widget Function(BuildContext context) popupBuilder; final int triggerActions; final PopoverMutex? mutex; @@ -70,8 +70,6 @@ class Popover extends StatefulWidget { this.controller, this.offset, this.maskDecoration, - this.targetAnchor = Alignment.topLeft, - this.followerAnchor = Alignment.topLeft, this.triggerActions = 0, this.direction = PopoverDirection.rightWithTopAligned, this.mutex, @@ -124,15 +122,13 @@ class PopoverState extends State { )); } - children.add( - CustomSingleChildLayout( - delegate: PopoverLayoutDelegate( - direction: widget.direction, - link: popoverLink, - ), - child: widget.popupBuilder(context), - ), - ); + children.add(PopoverContainer( + direction: widget.direction, + popoverLink: popoverLink, + offset: widget.offset ?? Offset.zero, + popupBuilder: widget.popupBuilder, + onClose: () => close(), + )); return Stack(children: children); }); @@ -244,3 +240,50 @@ class _PopoverMaskState extends State<_PopoverMask> { ); } } + +class PopoverContainer extends StatefulWidget { + final Widget Function(BuildContext context) popupBuilder; + final PopoverDirection direction; + final PopoverLink popoverLink; + final Offset offset; + final void Function() onClose; + + const PopoverContainer({ + Key? key, + required this.popupBuilder, + required this.direction, + required this.popoverLink, + required this.offset, + required this.onClose, + }) : super(key: key); + + @override + State createState() => PopoverContainerState(); +} + +class PopoverContainerState extends State { + @override + Widget build(BuildContext context) { + return CustomSingleChildLayout( + delegate: PopoverLayoutDelegate( + direction: widget.direction, + link: widget.popoverLink, + offset: widget.offset, + ), + child: widget.popupBuilder(context), + ); + } + + close() { + widget.onClose(); + } + + static PopoverContainerState of(BuildContext context) { + if (context is StatefulElement && context.state is PopoverContainerState) { + return context.state as PopoverContainerState; + } + final PopoverContainerState? result = + context.findAncestorStateOfType(); + return result!; + } +} From 8229371f6357d353ecdf073de13aa6bdf5404def Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 31 Aug 2022 19:15:20 +0800 Subject: [PATCH 25/33] feat: add mutex to property list --- .../select_option_editor.dart | 129 +++++++++--------- .../widgets/header/field_cell.dart | 1 + .../widgets/header/field_editor.dart | 1 - .../widgets/header/grid_header.dart | 32 +++-- .../widgets/header/type_option/date.dart | 3 +- .../header/type_option/multi_select.dart | 6 +- .../widgets/header/type_option/number.dart | 3 +- .../header/type_option/select_option.dart | 92 ++++++++----- .../header/type_option/single_select.dart | 6 +- .../widgets/toolbar/grid_property.dart | 37 ++++- .../appflowy_popover/lib/popover.dart | 16 ++- 11 files changed, 198 insertions(+), 128 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart index 241ee9d309..ef074ed7bb 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_editor.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'package:app_flowy/plugins/grid/application/cell/cell_service/cell_service.dart'; import 'package:app_flowy/plugins/grid/application/cell/select_option_editor_bloc.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -228,76 +229,82 @@ class _CreateOptionCell extends StatelessWidget { } } -class _SelectOptionCell extends StatelessWidget { +class _SelectOptionCell extends StatefulWidget { final SelectOptionPB option; final bool isSelected; const _SelectOptionCell(this.option, this.isSelected, {Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - final theme = context.watch(); - return SizedBox( - height: GridSize.typeOptionItemHeight, - child: Row( - children: [ - Flexible( - fit: FlexFit.loose, - child: SelectOptionTagCell( - option: option, - onSelected: (option) { - context - .read() - .add(SelectOptionEditorEvent.selectOption(option.id)); - }, - children: [ - if (isSelected) - Padding( - padding: const EdgeInsets.only(right: 6), - child: svgWidget("grid/checkmark"), - ), - ], - ), - ), - FlowyIconButton( - width: 30, - onPressed: () => _showEditPannel(context), - iconPadding: const EdgeInsets.fromLTRB(4, 4, 4, 4), - icon: svgWidget("editor/details", color: theme.iconColor), - ) - ], - ), - ); + State<_SelectOptionCell> createState() => _SelectOptionCellState(); +} + +class _SelectOptionCellState extends State<_SelectOptionCell> { + late PopoverController _popoverController; + + @override + void initState() { + _popoverController = PopoverController(); + super.initState(); } - void _showEditPannel(BuildContext context) { - final pannel = SelectOptionTypeOptionEditor( - option: option, - onDeleted: () { - context - .read() - .add(SelectOptionEditorEvent.deleteOption(option)); - }, - onUpdated: (updatedOption) { - context - .read() - .add(SelectOptionEditorEvent.updateOption(updatedOption)); - }, - key: ValueKey(option - .id), // Use ValueKey to refresh the UI, otherwise, it will remain the old value. - ); - final overlayIdentifier = (SelectOptionTypeOptionEditor).toString(); - - FlowyOverlay.of(context).remove(overlayIdentifier); - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - child: pannel, - constraints: BoxConstraints.loose(const Size(200, 300)), + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return Popover( + controller: _popoverController, + offset: const Offset(20, 0), + child: SizedBox( + height: GridSize.typeOptionItemHeight, + child: Row( + children: [ + Flexible( + fit: FlexFit.loose, + child: SelectOptionTagCell( + option: widget.option, + onSelected: (option) { + context + .read() + .add(SelectOptionEditorEvent.selectOption(option.id)); + }, + children: [ + if (widget.isSelected) + Padding( + padding: const EdgeInsets.only(right: 6), + child: svgWidget("grid/checkmark"), + ), + ], + ), + ), + FlowyIconButton( + width: 30, + onPressed: () => _popoverController.show(), + iconPadding: const EdgeInsets.fromLTRB(4, 4, 4, 4), + icon: svgWidget("editor/details", color: theme.iconColor), + ) + ], + ), ), - identifier: overlayIdentifier, - anchorContext: context, - anchorDirection: AnchorDirection.rightWithCenterAligned, - anchorOffset: Offset(2 * overlayContainerPadding.left, 0), + popupBuilder: (BuildContext popoverContext) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(200, 300)), + child: SelectOptionTypeOptionEditor( + option: widget.option, + onDeleted: () { + context + .read() + .add(SelectOptionEditorEvent.deleteOption(widget.option)); + }, + onUpdated: (updatedOption) { + context + .read() + .add(SelectOptionEditorEvent.updateOption(updatedOption)); + }, + key: ValueKey(widget.option + .id), // Use ValueKey to refresh the UI, otherwise, it will remain the old value. + ), + ); + }, ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index abdbbdb3ab..af912e1231 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -35,6 +35,7 @@ class _GridFieldCellState extends State { builder: (context, state) { final button = Popover( controller: popover, + direction: PopoverDirection.bottomWithLeftAligned, child: FieldCellButton( field: state.field, onTap: () => popover.show(), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 7e40ea1ea7..0abb26022b 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -2,7 +2,6 @@ import 'package:app_flowy/plugins/grid/application/field/field_editor_bloc.dart' import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; import 'package:appflowy_popover/popover.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flutter/material.dart'; diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart index 3b7410f61d..eae09ceefa 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart @@ -2,8 +2,10 @@ import 'package:app_flowy/plugins/grid/application/field/field_cache.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/plugins/grid/application/prelude.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; @@ -154,19 +156,25 @@ class CreateFieldButton extends StatelessWidget { Widget build(BuildContext context) { final theme = context.watch(); - return FlowyButton( - text: const FlowyText.medium('New column', fontSize: 12), - hoverColor: theme.shader6, - onTap: () { - // FieldEditorPopOver.show( - // context, - // anchorContext: context, - // gridId: gridId, - // fieldName: "", - // typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), - // ) + return Popover( + triggerActions: PopoverTriggerActionFlags.click, + direction: PopoverDirection.bottomWithRightAligned, + child: FlowyButton( + text: const FlowyText.medium('New column', fontSize: 12), + hoverColor: theme.shader6, + onTap: () {}, + leftIcon: svgWidget("home/add"), + ), + popupBuilder: (BuildContext popover) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(240, 200)), + child: FieldEditor( + gridId: gridId, + fieldName: "", + typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId), + ), + ); }, - leftIcon: svgWidget("home/add"), ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index bd1c82a254..f061ce726f 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -77,6 +77,7 @@ class DateTypeOptionWidget extends TypeOptionWidget { context .read() .add(DateTypeOptionEvent.didSelectDateFormat(format)); + PopoverContainerState.of(popoverContext).closeAll(); }, ), ); @@ -100,7 +101,7 @@ class DateTypeOptionWidget extends TypeOptionWidget { context .read() .add(DateTypeOptionEvent.didSelectTimeFormat(format)); - PopoverContainerState.of(popoverContext).close(); + PopoverContainerState.of(popoverContext).closeAll(); }), ); }, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart index ab8a628146..127bd1f68e 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart @@ -1,6 +1,7 @@ import 'package:app_flowy/plugins/grid/application/field/type_option/multi_select_type_option.dart'; import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; import 'package:flutter/material.dart'; +import 'package:appflowy_popover/popover.dart'; import '../field_type_option_editor.dart'; import 'builder.dart'; @@ -39,7 +40,10 @@ class MultiSelectTypeOptionWidget extends TypeOptionWidget { Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( options: selectOptionAction.typeOption.options, - beginEdit: () => overlayDelegate.hideOverlay(context), + beginEdit: () { + overlayDelegate.hideOverlay(context); + PopoverContainerState.of(context).closeAll(); + }, overlayDelegate: overlayDelegate, typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index d9df038d22..c61a2e417f 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -79,7 +79,7 @@ class NumberTypeOptionWidget extends TypeOptionWidget { ], ), ), - popupBuilder: (BuildContext context) { + popupBuilder: (BuildContext popoverContext) { return OverlayContainer( constraints: BoxConstraints.loose(const Size(460, 440)), child: NumberFormatList( @@ -87,6 +87,7 @@ class NumberTypeOptionWidget extends TypeOptionWidget { context .read() .add(NumberTypeOptionEvent.didSelectFormat(format)); + PopoverContainerState.of(popoverContext).closeAll(); }, selectedFormat: state.typeOption.format, ), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart index d36df1fea7..489b6ac8f5 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart @@ -1,6 +1,8 @@ import 'package:app_flowy/plugins/grid/application/field/type_option/select_option_type_option_bloc.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/widget/spacing.dart'; @@ -143,54 +145,70 @@ class _OptionList extends StatelessWidget { _OptionCell _makeOptionCell(BuildContext context, SelectOptionPB option) { return _OptionCell( option: option, - onSelected: (option) { - final pannel = SelectOptionTypeOptionEditor( - option: option, - onDeleted: () { - delegate.hideOverlay(context); - context - .read() - .add(SelectOptionTypeOptionEvent.deleteOption(option)); - }, - onUpdated: (updatedOption) { - delegate.hideOverlay(context); - context - .read() - .add(SelectOptionTypeOptionEvent.updateOption(updatedOption)); - }, - key: ValueKey(option.id), - ); - delegate.showOverlay(context, pannel); - }, ); } } -class _OptionCell extends StatelessWidget { +class _OptionCell extends StatefulWidget { final SelectOptionPB option; - final Function(SelectOptionPB) onSelected; - const _OptionCell({ - required this.option, - required this.onSelected, - Key? key, - }) : super(key: key); + const _OptionCell({required this.option, Key? key}) : super(key: key); + + @override + State<_OptionCell> createState() => _OptionCellState(); +} + +class _OptionCellState extends State<_OptionCell> { + late PopoverController _popoverController; + + @override + void initState() { + _popoverController = PopoverController(); + super.initState(); + } @override Widget build(BuildContext context) { final theme = context.watch(); - return SizedBox( - height: GridSize.typeOptionItemHeight, - child: SelectOptionTagCell( - option: option, - onSelected: onSelected, - children: [ - svgWidget( - "grid/details", - color: theme.iconColor, - ), - ], + return Popover( + controller: _popoverController, + offset: const Offset(20, 0), + child: SizedBox( + height: GridSize.typeOptionItemHeight, + child: SelectOptionTagCell( + option: widget.option, + onSelected: (SelectOptionPB pb) { + _popoverController.show(); + }, + children: [ + svgWidget( + "grid/details", + color: theme.iconColor, + ), + ], + ), ), + popupBuilder: (BuildContext popoverContext) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(460, 440)), + child: SelectOptionTypeOptionEditor( + option: widget.option, + onDeleted: () { + context + .read() + .add(SelectOptionTypeOptionEvent.deleteOption(widget.option)); + PopoverContainerState.of(popoverContext).closeAll(); + }, + onUpdated: (updatedOption) { + context + .read() + .add(SelectOptionTypeOptionEvent.updateOption(updatedOption)); + PopoverContainerState.of(popoverContext).closeAll(); + }, + key: ValueKey(widget.option.id), + ), + ); + }, ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart index d9d699fdff..3e889acd99 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart @@ -2,6 +2,7 @@ import 'package:app_flowy/plugins/grid/application/field/type_option/single_sele import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart'; import 'package:flutter/material.dart'; import '../field_type_option_editor.dart'; +import 'package:appflowy_popover/popover.dart'; import 'builder.dart'; import 'select_option.dart'; @@ -38,7 +39,10 @@ class SingleSelectTypeOptionWidget extends TypeOptionWidget { Widget build(BuildContext context) { return SelectOptionTypeOptionWidget( options: selectOptionAction.typeOption.options, - beginEdit: () => overlayDelegate.hideOverlay(context), + beginEdit: () { + overlayDelegate.hideOverlay(context); + PopoverContainerState.of(context).closeAll(); + }, overlayDelegate: overlayDelegate, typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 1912dc8499..85eb4287ef 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -19,7 +19,7 @@ import 'package:styled_widget/styled_widget.dart'; import '../../../application/field/field_cache.dart'; import '../../layout/sizes.dart'; -class GridPropertyList extends StatelessWidget { +class GridPropertyList extends StatefulWidget { final String gridId; final GridFieldCache fieldCache; const GridPropertyList({ @@ -28,17 +28,34 @@ class GridPropertyList extends StatelessWidget { Key? key, }) : super(key: key); + @override + State createState() => _GridPropertyListState(); +} + +class _GridPropertyListState extends State { + late PopoverMutex _popoverMutex; + + @override + void initState() { + _popoverMutex = PopoverMutex(); + super.initState(); + } + @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => - getIt(param1: gridId, param2: fieldCache) - ..add(const GridPropertyEvent.initial()), + create: (context) => getIt( + param1: widget.gridId, param2: widget.fieldCache) + ..add(const GridPropertyEvent.initial()), child: BlocBuilder( builder: (context, state) { final cells = state.fields.map((field) { return _GridPropertyCell( - gridId: gridId, field: field, key: ValueKey(field.id)); + popoverMutex: _popoverMutex, + gridId: widget.gridId, + field: field, + key: ValueKey(field.id), + ); }).toList(); return ListView.separated( @@ -60,8 +77,13 @@ class GridPropertyList extends StatelessWidget { class _GridPropertyCell extends StatelessWidget { final FieldPB field; final String gridId; - const _GridPropertyCell({required this.gridId, required this.field, Key? key}) - : super(key: key); + final PopoverMutex popoverMutex; + const _GridPropertyCell({ + required this.gridId, + required this.field, + required this.popoverMutex, + Key? key, + }) : super(key: key); @override Widget build(BuildContext context) { @@ -95,6 +117,7 @@ class _GridPropertyCell extends StatelessWidget { Widget _editFieldButton(AppTheme theme, BuildContext context) { return Popover( + mutex: popoverMutex, triggerActions: PopoverTriggerActionFlags.click, offset: const Offset(20, 0), child: FlowyButton( diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index df51f7249d..a22ac781f9 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -1,10 +1,7 @@ -import 'dart:ui'; - import 'package:appflowy_popover/layout.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import './follower.dart'; class PopoverMutex { PopoverState? state; @@ -128,6 +125,7 @@ class PopoverState extends State { offset: widget.offset ?? Offset.zero, popupBuilder: widget.popupBuilder, onClose: () => close(), + onCloseAll: () => closeAll(), )); return Stack(children: children); @@ -155,6 +153,10 @@ class PopoverState extends State { } } + closeAll() { + _popoverWithMask?.close(); + } + @override void deactivate() { debugPrint("deactivate"); @@ -247,6 +249,7 @@ class PopoverContainer extends StatefulWidget { final PopoverLink popoverLink; final Offset offset; final void Function() onClose; + final void Function() onCloseAll; const PopoverContainer({ Key? key, @@ -255,6 +258,7 @@ class PopoverContainer extends StatefulWidget { required this.popoverLink, required this.offset, required this.onClose, + required this.onCloseAll, }) : super(key: key); @override @@ -274,9 +278,9 @@ class PopoverContainerState extends State { ); } - close() { - widget.onClose(); - } + close() => widget.onClose(); + + closeAll() => widget.onCloseAll(); static PopoverContainerState of(BuildContext context) { if (context is StatefulElement && context.state is PopoverContainerState) { From 2bbba547eefa8c1313b4bb2214ddf138a49b567c Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 1 Sep 2022 11:48:01 +0800 Subject: [PATCH 26/33] fix: key issue of ReorderableRow --- .../widgets/header/field_cell.dart | 29 +++++++++---------- .../widgets/header/grid_header.dart | 20 ++++++++++++- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index af912e1231..c2c4d9efdf 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -14,36 +14,32 @@ import 'field_type_extension.dart'; import 'field_cell_action_sheet.dart'; -class GridFieldCell extends StatefulWidget { +class GridFieldCell extends StatelessWidget { final GridFieldCellContext cellContext; - const GridFieldCell(this.cellContext, {Key? key}) : super(key: key); - - @override - State createState() => _GridFieldCellState(); -} - -class _GridFieldCellState extends State { - final popover = PopoverController(); + const GridFieldCell({ + Key? key, + required this.cellContext, + }) : super(key: key); @override Widget build(BuildContext gridCellContext) { return BlocProvider( - create: (context) => FieldCellBloc(cellContext: widget.cellContext) - ..add(const FieldCellEvent.initial()), + create: (context) { + return FieldCellBloc(cellContext: cellContext); + }, child: BlocBuilder( - // buildWhen: (p, c) => p.field != c.field, builder: (context, state) { final button = Popover( - controller: popover, direction: PopoverDirection.bottomWithLeftAligned, + triggerActions: PopoverTriggerActionFlags.click, child: FieldCellButton( - field: state.field, - onTap: () => popover.show(), + field: cellContext.field, + onTap: () {}, ), offset: const Offset(0, 10), popupBuilder: (BuildContext context) { return GridFieldCellActionSheet( - cellContext: widget.cellContext, + cellContext: cellContext, ); }, ); @@ -112,6 +108,7 @@ class _DragToExpandLine extends StatelessWidget { child: GestureDetector( behavior: HitTestBehavior.opaque, onHorizontalDragUpdate: (value) { + debugPrint("update new width: ${value.delta.dx}"); context .read() .add(FieldCellEvent.startUpdateWidth(value.delta.dx)); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart index eae09ceefa..175e7272ef 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/grid_header.dart @@ -75,6 +75,21 @@ class _GridHeader extends StatefulWidget { } class _GridHeaderState extends State<_GridHeader> { + final Map> _gridMap = {}; + + /// This is a workaround for [ReorderableRow]. + /// [ReorderableRow] warps the child's key with a [GlobalKey]. + /// It will trigger the child's widget's to recreate. + /// The state will lose. + _getKeyById(String id) { + if (_gridMap.containsKey(id)) { + return _gridMap[id]; + } + final newKey = ValueKey(id); + _gridMap[id] = newKey; + return newKey; + } + @override Widget build(BuildContext context) { final theme = context.watch(); @@ -85,7 +100,10 @@ class _GridHeaderState extends State<_GridHeader> { .where((field) => field.visibility) .map((field) => GridFieldCellContext(gridId: widget.gridId, field: field)) - .map((ctx) => GridFieldCell(ctx, key: ValueKey(ctx.field.id))) + .map((ctx) => GridFieldCell( + key: _getKeyById(ctx.field.id), + cellContext: ctx, + )) .toList(); return Container( From ac91b25219a0a294b059e29829f73268162af24b Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 1 Sep 2022 14:59:05 +0800 Subject: [PATCH 27/33] feat: use popover on overlay --- .../presentation/toolbar/board_setting.dart | 78 +++++++++++-------- .../presentation/toolbar/board_toolbar.dart | 24 ++++-- .../appflowy_popover/lib/popover.dart | 2 - 3 files changed, 63 insertions(+), 41 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart index 76ab265a90..3404776c35 100644 --- a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart +++ b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart @@ -49,7 +49,7 @@ class BoardSettingList extends StatelessWidget { previous.selectedAction != current.selectedAction, listener: (context, state) { state.selectedAction.foldLeft(null, (_, action) { - FlowyOverlay.of(context).remove(identifier()); + // FlowyOverlay.of(context).remove(identifier()); onAction(action, settingContext); }); }, @@ -83,37 +83,6 @@ class BoardSettingList extends StatelessWidget { ), ); } - - static void show(BuildContext context, BoardSettingContext settingContext) { - final list = BoardSettingList( - settingContext: settingContext, - onAction: (action, settingContext) { - switch (action) { - case BoardSettingAction.properties: - GridPropertyList( - gridId: settingContext.viewId, - fieldCache: settingContext.fieldCache) - .show(context); - break; - } - }, - ); - - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - constraints: BoxConstraints.loose(const Size(140, 400)), - child: list, - ), - identifier: identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.bottomRight, - style: FlowyOverlayStyle(blur: false), - ); - } - - static String identifier() { - return (BoardSettingList).toString(); - } } class _SettingItem extends StatelessWidget { @@ -166,3 +135,48 @@ extension _GridSettingExtension on BoardSettingAction { } } } + +class BoardSettingListPopover extends StatefulWidget { + final BoardSettingContext settingContext; + + const BoardSettingListPopover({ + Key? key, + required this.settingContext, + }) : super(key: key); + + @override + State createState() => _BoardSettingListPopoverState(); +} + +class _BoardSettingListPopoverState extends State { + bool _showGridPropertyList = false; + + @override + Widget build(BuildContext context) { + if (_showGridPropertyList) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(260, 400)), + child: GridPropertyList( + gridId: widget.settingContext.viewId, + fieldCache: widget.settingContext.fieldCache, + ), + ); + } + + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(140, 400)), + child: BoardSettingList( + settingContext: widget.settingContext, + onAction: (action, settingContext) { + switch (action) { + case BoardSettingAction.properties: + setState(() { + _showGridPropertyList = true; + }); + break; + } + }, + ), + ); + } +} diff --git a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart index fae27851a9..914ced60d7 100644 --- a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart +++ b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart @@ -1,6 +1,8 @@ import 'package:app_flowy/plugins/grid/application/field/field_cache.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; @@ -47,14 +49,22 @@ class _SettingButton extends StatelessWidget { @override Widget build(BuildContext context) { final theme = context.read(); - return FlowyIconButton( - hoverColor: theme.hover, - width: 22, - onPressed: () => BoardSettingList.show(context, settingContext), - icon: Padding( - padding: const EdgeInsets.symmetric(vertical: 3.0, horizontal: 3.0), - child: svgWidget("grid/setting/setting"), + return Popover( + triggerActions: PopoverTriggerActionFlags.click, + child: FlowyIconButton( + hoverColor: theme.hover, + width: 22, + onPressed: () {}, + icon: Padding( + padding: const EdgeInsets.symmetric(vertical: 3.0, horizontal: 3.0), + child: svgWidget("grid/setting/setting"), + ), ), + popupBuilder: (BuildContext popoverContext) { + return BoardSettingListPopover( + settingContext: settingContext, + ); + }, ); } } diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index a22ac781f9..1854a74998 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -91,7 +91,6 @@ class PopoverState extends State { } showOverlay() { - debugPrint("show overlay"); close(); if (widget.mutex != null) { @@ -159,7 +158,6 @@ class PopoverState extends State { @override void deactivate() { - debugPrint("deactivate"); close(); super.deactivate(); } From 9574f282e7333990b4e546afaf612acfc97ddcc6 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 1 Sep 2022 15:28:16 +0800 Subject: [PATCH 28/33] fix: example of popover --- .../packages/appflowy_popover/README.md | 36 +++++++------- .../example/lib/example_button.dart | 7 ++- .../appflowy_popover/example/lib/main.dart | 48 +++++++++---------- .../appflowy_popover/lib/popover.dart | 39 +++++++++++---- 4 files changed, 74 insertions(+), 56 deletions(-) diff --git a/frontend/app_flowy/packages/appflowy_popover/README.md b/frontend/app_flowy/packages/appflowy_popover/README.md index 8b55e735b5..ce545e5339 100644 --- a/frontend/app_flowy/packages/appflowy_popover/README.md +++ b/frontend/app_flowy/packages/appflowy_popover/README.md @@ -1,39 +1,39 @@ - +# AppFlowy Popover + TODO: Put a short description of the package here that helps potential users know whether this package might be useful for them. ## Features -TODO: List what your package can do. Maybe include images, gifs, or videos. +> A popover is a transient view that appears above other content onscreen when you tap a control or in an area. Typically, a popover includes an arrow pointing to the location from which it emerged. Popovers can be nonmodal or modal. A nonmodal popover is dismissed by tapping another part of the screen or a button on the popover. A modal popover is dismissed by tapping a Cancel or other button on the popover. -## Getting started +Source: [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/views/popovers/). -TODO: List prerequisites and provide or point to information on how to -start using the package. +- Basic popover style +- Nested popover support +- Exclusive popover API -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +## Example ```dart -const like = 'sample'; +Popover( + triggerActions: PopoverTriggerActionFlags.click, + child: TextButton(child: Text("Popover"), onPressed: () {}), + popupBuilder(BuildContext context) { + return PopoverMenu(); + }, +); ``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 173baf823c..36f57f57fa 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -50,15 +50,13 @@ class _PopoverMenuState extends State { class ExampleButton extends StatelessWidget { final String label; - final Alignment targetAnchor; - final Alignment followerAnchor; final Offset? offset; + final PopoverDirection? direction; const ExampleButton({ Key? key, required this.label, - this.targetAnchor = Alignment.topLeft, - this.followerAnchor = Alignment.topLeft, + this.direction, this.offset = Offset.zero, }) : super(key: key); @@ -67,6 +65,7 @@ class ExampleButton extends StatelessWidget { return Popover( triggerActions: PopoverTriggerActionFlags.click, offset: offset, + direction: direction ?? PopoverDirection.rightWithTopAligned, child: TextButton(child: Text(label), onPressed: () {}), popupBuilder: (BuildContext context) { return PopoverMenu(); diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart index 7ce7798acb..178b075ee6 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:appflowy_popover/popover.dart'; import 'package:flutter/material.dart'; import "./example_button.dart"; @@ -65,65 +66,60 @@ class _MyHomePageState extends State { ), body: Row(children: [ Column(children: [ - ExampleButton( + const ExampleButton( label: "Left top", - targetAnchor: Alignment.bottomLeft, - offset: const Offset(0, 10), + offset: Offset(0, 10), + direction: PopoverDirection.bottomWithLeftAligned, ), Expanded(child: Container()), - ExampleButton( + const ExampleButton( label: "Left bottom", - followerAnchor: Alignment.bottomLeft, - offset: const Offset(0, -10), + offset: Offset(0, -10), + direction: PopoverDirection.topWithLeftAligned, ), ]), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - ExampleButton( + const ExampleButton( label: "Top", - targetAnchor: Alignment.bottomCenter, - followerAnchor: Alignment.topCenter, - offset: const Offset(0, 10), + offset: Offset(0, 10), + direction: PopoverDirection.bottomWithCenterAligned, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: const [ ExampleButton( label: "Central", - targetAnchor: Alignment.bottomCenter, - followerAnchor: Alignment.topCenter, - offset: const Offset(0, 10), + offset: Offset(0, 10), + direction: PopoverDirection.bottomWithCenterAligned, ), ], ), ), - ExampleButton( + const ExampleButton( label: "Bottom", - targetAnchor: Alignment.topCenter, - followerAnchor: Alignment.bottomCenter, - offset: const Offset(0, -10), + offset: Offset(0, -10), + direction: PopoverDirection.topWithCenterAligned, ), ], ), ), Column( children: [ - ExampleButton( + const ExampleButton( label: "Right top", - targetAnchor: Alignment.bottomRight, - followerAnchor: Alignment.topRight, - offset: const Offset(0, 10), + offset: Offset(0, 10), + direction: PopoverDirection.bottomWithRightAligned, ), Expanded(child: Container()), - ExampleButton( + const ExampleButton( label: "Right bottom", - targetAnchor: Alignment.topRight, - followerAnchor: Alignment.bottomRight, - offset: const Offset(0, -10), + offset: Offset(0, -10), + direction: PopoverDirection.topWithRightAligned, ), ], ) diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart index 1854a74998..2fc26aeb0c 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/popover.dart @@ -3,6 +3,8 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +/// If multiple popovers are exclusive, +/// pass the same mutex to them. class PopoverMutex { PopoverState? state; } @@ -50,16 +52,29 @@ enum PopoverDirection { } class Popover extends StatefulWidget { - final Widget child; final PopoverController? controller; + final Offset? offset; + final Decoration? maskDecoration; + + /// The function used to build the popover. final Widget Function(BuildContext context) popupBuilder; + final int triggerActions; + + /// If multiple popovers are exclusive, + /// pass the same mutex to them. final PopoverMutex? mutex; + + /// The direction of the popover final PopoverDirection direction; + final void Function()? onClose; + /// The content area of the popover. + final Widget child; + const Popover({ Key? key, required this.child, @@ -174,17 +189,25 @@ class PopoverState extends State { } } + _buildContent(BuildContext context) { + if (widget.triggerActions == 0) { + return widget.child; + } + + return MouseRegion( + onEnter: _handleTargetPointerEnter, + child: Listener( + onPointerDown: _handleTargetPointerDown, + child: widget.child, + ), + ); + } + @override Widget build(BuildContext context) { return PopoverTarget( link: popoverLink, - child: MouseRegion( - onEnter: _handleTargetPointerEnter, - child: Listener( - onPointerDown: _handleTargetPointerDown, - child: widget.child, - ), - ), + child: _buildContent(context), ); } } From 0cd384802e5e373e74ef5df27945108f0f353cdb Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 1 Sep 2022 15:49:47 +0800 Subject: [PATCH 29/33] feat: use popoer for select widget --- .../header/field_type_option_editor.dart | 24 --------------- .../widgets/header/type_option/builder.dart | 11 ++----- .../header/type_option/multi_select.dart | 13 ++++----- .../widgets/header/type_option/number.dart | 4 --- .../header/type_option/select_option.dart | 29 +++++++++++++------ .../header/type_option/single_select.dart | 13 ++++----- .../widgets/toolbar/grid_property.dart | 1 + 7 files changed, 36 insertions(+), 59 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart index 6231ba5aba..4827a5ac6d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_type_option_editor.dart @@ -94,36 +94,12 @@ class FieldTypeOptionEditor extends StatelessWidget { required BuildContext context, required FieldTypeOptionEditState state, }) { - final overlayDelegate = TypeOptionOverlayDelegate( - showOverlay: _showOverlay, - hideOverlay: _hideOverlay, - ); - return makeTypeOptionWidget( context: context, - overlayDelegate: overlayDelegate, dataController: dataController, popoverMutex: popoverMutex, ); } - - void _showOverlay(BuildContext context, Widget child, - {VoidCallback? onRemoved}) { - // FlowyPopover.show( - // context, - // constraints: BoxConstraints.loose(const Size(460, 440)), - // anchorContext: context, - // anchorDirection: AnchorDirection.rightWithCenterAligned, - // anchorOffset: const Offset(20, 0), - // builder: (BuildContext context) { - // return child; - // }, - // ); - } - - void _hideOverlay(BuildContext context) { - // - } } abstract class TypeOptionWidget extends StatelessWidget { diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart index acbeafe8df..3d355c188a 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/builder.dart @@ -46,19 +46,15 @@ abstract class TypeOptionWidgetBuilder { Widget? makeTypeOptionWidget({ required BuildContext context, required TypeOptionDataController dataController, - required TypeOptionOverlayDelegate overlayDelegate, required PopoverMutex popoverMutex, }) { final builder = makeTypeOptionWidgetBuilder( - dataController: dataController, - overlayDelegate: overlayDelegate, - popoverMutex: popoverMutex); + dataController: dataController, popoverMutex: popoverMutex); return builder.build(context); } TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( {required TypeOptionDataController dataController, - required TypeOptionOverlayDelegate overlayDelegate, required PopoverMutex popoverMutex}) { final gridId = dataController.gridId; final fieldType = dataController.field.fieldType; @@ -87,7 +83,7 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( fieldType: fieldType, dataController: dataController, ), - overlayDelegate, + popoverMutex, ); case FieldType.MultiSelect: return MultiSelectTypeOptionWidgetBuilder( @@ -96,7 +92,7 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( fieldType: fieldType, dataController: dataController, ), - overlayDelegate, + popoverMutex, ); case FieldType.Number: return NumberTypeOptionWidgetBuilder( @@ -105,7 +101,6 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder( fieldType: fieldType, dataController: dataController, ), - overlayDelegate, popoverMutex, ); case FieldType.RichText: diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart index 127bd1f68e..75ac6eeaa0 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/multi_select.dart @@ -12,14 +12,14 @@ class MultiSelectTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { MultiSelectTypeOptionWidgetBuilder( MultiSelectTypeOptionContext typeOptionContext, - TypeOptionOverlayDelegate overlayDelegate, + PopoverMutex popoverMutex, ) : _widget = MultiSelectTypeOptionWidget( selectOptionAction: MultiSelectAction( fieldId: typeOptionContext.fieldId, gridId: typeOptionContext.gridId, typeOptionContext: typeOptionContext, ), - overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, ); @override @@ -28,12 +28,12 @@ class MultiSelectTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { class MultiSelectTypeOptionWidget extends TypeOptionWidget { final MultiSelectAction selectOptionAction; - final TypeOptionOverlayDelegate overlayDelegate; + final PopoverMutex? popoverMutex; const MultiSelectTypeOptionWidget({ - required this.selectOptionAction, - required this.overlayDelegate, Key? key, + required this.selectOptionAction, + this.popoverMutex, }) : super(key: key); @override @@ -41,10 +41,9 @@ class MultiSelectTypeOptionWidget extends TypeOptionWidget { return SelectOptionTypeOptionWidget( options: selectOptionAction.typeOption.options, beginEdit: () { - overlayDelegate.hideOverlay(context); PopoverContainerState.of(context).closeAll(); }, - overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart index 0420ea42c3..cdc69eb4e6 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/number.dart @@ -24,11 +24,9 @@ class NumberTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { NumberTypeOptionWidgetBuilder( NumberTypeOptionContext typeOptionContext, - TypeOptionOverlayDelegate overlayDelegate, PopoverMutex popoverMutex, ) : _widget = NumberTypeOptionWidget( typeOptionContext: typeOptionContext, - overlayDelegate: overlayDelegate, popoverMutex: popoverMutex, ); @@ -37,12 +35,10 @@ class NumberTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { } class NumberTypeOptionWidget extends TypeOptionWidget { - final TypeOptionOverlayDelegate overlayDelegate; final NumberTypeOptionContext typeOptionContext; final PopoverMutex popoverMutex; const NumberTypeOptionWidget({ required this.typeOptionContext, - required this.overlayDelegate, required this.popoverMutex, Key? key, }) : super(key: key); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart index 489b6ac8f5..7b0be75515 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/select_option.dart @@ -15,20 +15,19 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import '../../../layout/sizes.dart'; import '../../cell/select_option_cell/extension.dart'; import '../../common/text_field.dart'; -import 'builder.dart'; import 'select_option_editor.dart'; class SelectOptionTypeOptionWidget extends StatelessWidget { final List options; final VoidCallback beginEdit; - final TypeOptionOverlayDelegate overlayDelegate; final ISelectOptionAction typeOptionAction; + final PopoverMutex? popoverMutex; const SelectOptionTypeOptionWidget({ required this.options, required this.beginEdit, - required this.overlayDelegate, required this.typeOptionAction, + this.popoverMutex, Key? key, }) : super(key: key); @@ -52,7 +51,7 @@ class SelectOptionTypeOptionWidget extends StatelessWidget { ), if (state.options.isEmpty && !state.isEditingOption) const _AddOptionButton(), - _OptionList(overlayDelegate) + _OptionList(popoverMutex: popoverMutex) ]; return Column(children: children); @@ -113,8 +112,8 @@ class _OptionTitleButton extends StatelessWidget { } class _OptionList extends StatelessWidget { - final TypeOptionOverlayDelegate delegate; - const _OptionList(this.delegate, {Key? key}) : super(key: key); + final PopoverMutex? popoverMutex; + const _OptionList({Key? key, this.popoverMutex}) : super(key: key); @override Widget build(BuildContext context) { @@ -124,7 +123,11 @@ class _OptionList extends StatelessWidget { }, builder: (context, state) { final cells = state.options.map((option) { - return _makeOptionCell(context, option); + return _makeOptionCell( + context: context, + option: option, + popoverMutex: popoverMutex, + ); }).toList(); return ListView.separated( @@ -142,16 +145,23 @@ class _OptionList extends StatelessWidget { ); } - _OptionCell _makeOptionCell(BuildContext context, SelectOptionPB option) { + _OptionCell _makeOptionCell({ + required BuildContext context, + required SelectOptionPB option, + PopoverMutex? popoverMutex, + }) { return _OptionCell( option: option, + popoverMutex: popoverMutex, ); } } class _OptionCell extends StatefulWidget { final SelectOptionPB option; - const _OptionCell({required this.option, Key? key}) : super(key: key); + final PopoverMutex? popoverMutex; + const _OptionCell({required this.option, Key? key, this.popoverMutex}) + : super(key: key); @override State<_OptionCell> createState() => _OptionCellState(); @@ -172,6 +182,7 @@ class _OptionCellState extends State<_OptionCell> { return Popover( controller: _popoverController, + mutex: widget.popoverMutex, offset: const Offset(20, 0), child: SizedBox( height: GridSize.typeOptionItemHeight, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart index 3e889acd99..27ffabb286 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/single_select.dart @@ -11,14 +11,14 @@ class SingleSelectTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { SingleSelectTypeOptionWidgetBuilder( SingleSelectTypeOptionContext singleSelectTypeOption, - TypeOptionOverlayDelegate overlayDelegate, + PopoverMutex popoverMutex, ) : _widget = SingleSelectTypeOptionWidget( selectOptionAction: SingleSelectAction( fieldId: singleSelectTypeOption.fieldId, gridId: singleSelectTypeOption.gridId, typeOptionContext: singleSelectTypeOption, ), - overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, ); @override @@ -27,12 +27,12 @@ class SingleSelectTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder { class SingleSelectTypeOptionWidget extends TypeOptionWidget { final SingleSelectAction selectOptionAction; - final TypeOptionOverlayDelegate overlayDelegate; + final PopoverMutex? popoverMutex; const SingleSelectTypeOptionWidget({ - required this.selectOptionAction, - required this.overlayDelegate, Key? key, + required this.selectOptionAction, + this.popoverMutex, }) : super(key: key); @override @@ -40,10 +40,9 @@ class SingleSelectTypeOptionWidget extends TypeOptionWidget { return SelectOptionTypeOptionWidget( options: selectOptionAction.typeOption.options, beginEdit: () { - overlayDelegate.hideOverlay(context); PopoverContainerState.of(context).closeAll(); }, - overlayDelegate: overlayDelegate, + popoverMutex: popoverMutex, typeOptionAction: selectOptionAction, // key: ValueKey(state.typeOption.hashCode), ); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart index 85eb4287ef..3f7b789c59 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_property.dart @@ -59,6 +59,7 @@ class _GridPropertyListState extends State { }).toList(); return ListView.separated( + controller: ScrollController(), shrinkWrap: true, itemCount: cells.length, itemBuilder: (BuildContext context, int index) { From a43259bddb460142dc6f1fabb40b1bd0d9154c67 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 1 Sep 2022 16:25:48 +0800 Subject: [PATCH 30/33] fix: lints for popover --- .../presentation/toolbar/board_toolbar.dart | 1 - .../widgets/cell/date_cell/date_editor.dart | 25 ++-------------- .../select_option_cell.dart | 4 ++- .../widgets/header/field_cell.dart | 10 +++---- .../widgets/header/field_editor.dart | 3 -- .../widgets/header/type_option/date.dart | 4 +-- .../widgets/toolbar/grid_setting.dart | 1 - .../packages/appflowy_popover/README.md | 3 +- .../example/lib/example_button.dart | 8 +++-- .../example/test/widget_test.dart | 30 ------------------- .../appflowy_popover/lib/follower.dart | 5 ---- .../lib/src/flowy_overlay/flowy_popover.dart | 2 +- 12 files changed, 20 insertions(+), 76 deletions(-) delete mode 100644 frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart diff --git a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart index 914ced60d7..0753c380b5 100644 --- a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart +++ b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_toolbar.dart @@ -2,7 +2,6 @@ import 'package:app_flowy/plugins/grid/application/field/field_cache.dart'; import 'package:appflowy_popover/popover.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; -import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart index 92b0a3233d..9c57e7ed3b 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_editor.dart @@ -65,11 +65,11 @@ class _DateCellEditor extends State { } return OverlayContainer( + constraints: BoxConstraints.loose(const Size(320, 500)), child: _CellCalendarWidget( cellContext: widget.cellController, dateTypeOptionPB: _dateTypeOptionPB!, ), - constraints: BoxConstraints.loose(const Size(320, 500)), ); } } @@ -349,7 +349,6 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { mutex: _popoverMutex, triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - child: const DateFormatButton(), offset: const Offset(20, 0), popupBuilder: (BuildContext context) { return OverlayContainer( @@ -361,12 +360,12 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { ), ); }, + child: const DateFormatButton(), ), Popover( mutex: _popoverMutex, triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - child: TimeFormatButton(timeFormat: widget.dateTypeOptionPB.timeFormat), offset: const Offset(20, 0), popupBuilder: (BuildContext context) { return OverlayContainer( @@ -378,6 +377,7 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { ), ); }, + child: TimeFormatButton(timeFormat: widget.dateTypeOptionPB.timeFormat), ), ]; @@ -396,23 +396,4 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { ), ); } - - void _showOverlay(BuildContext context, Widget child) { - if (overlayIdentifier != null) { - FlowyOverlay.of(context).remove(overlayIdentifier!); - } - - overlayIdentifier = child.toString(); - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - constraints: BoxConstraints.loose(const Size(460, 440)), - child: child, - ), - identifier: overlayIdentifier!, - anchorContext: context, - anchorDirection: AnchorDirection.rightWithCenterAligned, - style: FlowyOverlayStyle(blur: false), - anchorOffset: const Offset(20, 0), - ); - } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart index c09c5e93db..df7ddb0d9e 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/select_option_cell/select_option_cell.dart @@ -196,8 +196,9 @@ class _SelectOptionWrapState extends State { children: [ Popover( controller: _popover, - child: child, offset: const Offset(0, 20), + direction: PopoverDirection.bottomWithLeftAligned, + // triggerActions: PopoverTriggerActionFlags.c, popupBuilder: (BuildContext context) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onFocus?.call(true); @@ -220,6 +221,7 @@ class _SelectOptionWrapState extends State { onClose: () { widget.onFocus?.call(false); }, + child: child, ), InkWell(onTap: () { _popover.show(); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart index c2c4d9efdf..4436e61fb6 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell.dart @@ -22,7 +22,7 @@ class GridFieldCell extends StatelessWidget { }) : super(key: key); @override - Widget build(BuildContext gridCellContext) { + Widget build(BuildContext context) { return BlocProvider( create: (context) { return FieldCellBloc(cellContext: cellContext); @@ -32,16 +32,16 @@ class GridFieldCell extends StatelessWidget { final button = Popover( direction: PopoverDirection.bottomWithLeftAligned, triggerActions: PopoverTriggerActionFlags.click, - child: FieldCellButton( - field: cellContext.field, - onTap: () {}, - ), offset: const Offset(0, 10), popupBuilder: (BuildContext context) { return GridFieldCellActionSheet( cellContext: cellContext, ); }, + child: FieldCellButton( + field: cellContext.field, + onTap: () {}, + ), ); const line = Positioned( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart index 0abb26022b..83a6a27fda 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_editor.dart @@ -22,9 +22,6 @@ class FieldEditor extends StatefulWidget { Key? key, }) : super(key: key); - @override - bool asBarrier() => true; - @override State createState() => _FieldEditorState(); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart index f061ce726f..ae3dcf8682 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/type_option/date.dart @@ -66,7 +66,6 @@ class DateTypeOptionWidget extends TypeOptionWidget { mutex: popoverMutex, triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - child: const DateFormatButton(), offset: const Offset(20, 0), popupBuilder: (popoverContext) { return OverlayContainer( @@ -82,6 +81,7 @@ class DateTypeOptionWidget extends TypeOptionWidget { ), ); }, + child: const DateFormatButton(), ); } @@ -90,7 +90,6 @@ class DateTypeOptionWidget extends TypeOptionWidget { mutex: popoverMutex, triggerActions: PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - child: TimeFormatButton(timeFormat: timeFormat), offset: const Offset(20, 0), popupBuilder: (BuildContext popoverContext) { return OverlayContainer( @@ -105,6 +104,7 @@ class DateTypeOptionWidget extends TypeOptionWidget { }), ); }, + child: TimeFormatButton(timeFormat: timeFormat), ); } } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart index d9a5daa041..ca7209d50d 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_setting.dart @@ -13,7 +13,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:app_flowy/generated/locale_keys.g.dart'; import '../../../application/field/field_cache.dart'; import '../../layout/sizes.dart'; -import 'grid_property.dart'; class GridSettingContext { final String gridId; diff --git a/frontend/app_flowy/packages/appflowy_popover/README.md b/frontend/app_flowy/packages/appflowy_popover/README.md index ce545e5339..9d974e2253 100644 --- a/frontend/app_flowy/packages/appflowy_popover/README.md +++ b/frontend/app_flowy/packages/appflowy_popover/README.md @@ -13,8 +13,7 @@ and the Flutter guide for # AppFlowy Popover -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +A Popover can be used to display some content on top of another. ## Features diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index 36f57f57fa..e2eee64067 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:appflowy_popover/popover.dart'; class PopoverMenu extends StatefulWidget { + const PopoverMenu({Key? key}) : super(key: key); + @override State createState() => _PopoverMenuState(); } @@ -23,7 +25,7 @@ class _PopoverMenuState extends State { mutex: popOverMutex, offset: const Offset(10, 0), popupBuilder: (BuildContext context) { - return PopoverMenu(); + return const PopoverMenu(); }, child: TextButton( onPressed: () {}, @@ -36,7 +38,7 @@ class _PopoverMenuState extends State { mutex: popOverMutex, offset: const Offset(10, 0), popupBuilder: (BuildContext context) { - return PopoverMenu(); + return const PopoverMenu(); }, child: TextButton( onPressed: () {}, @@ -68,7 +70,7 @@ class ExampleButton extends StatelessWidget { direction: direction ?? PopoverDirection.rightWithTopAligned, child: TextButton(child: Text(label), onPressed: () {}), popupBuilder: (BuildContext context) { - return PopoverMenu(); + return const PopoverMenu(); }, ); } diff --git a/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart b/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart deleted file mode 100644 index 092d222f7e..0000000000 --- a/frontend/app_flowy/packages/appflowy_popover/example/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:example/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart b/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart index 5e337e51b5..ff54eaac61 100644 --- a/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart +++ b/frontend/app_flowy/packages/appflowy_popover/lib/follower.dart @@ -56,8 +56,6 @@ class PopoverRenderFollowerLayer extends RenderFollowerLayer { void paint(PaintingContext context, Offset offset) { super.paint(context, offset); - final global = localToGlobal(offset); - if (link.leader == null) { return; } @@ -68,9 +66,6 @@ class PopoverRenderFollowerLayer extends RenderFollowerLayer { } debugPrint( "right: ${link.leader!.offset.dx + link.leaderSize!.width + size.width}, screen with: ${screenSize.width}"); - // debugPrint( - // "offset: $offset, global: $global, link: ${link.leader?.offset}, link size: ${link.leaderSize}"); - // debugPrint("follower size: ${this.size}, screen size: ${this.screenSize}"); } } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart index 361486d00b..d1a52e50d9 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_popover.dart @@ -15,7 +15,7 @@ class FlowyPopover extends StatefulWidget { final EdgeInsets padding; final BoxConstraints? constraints; - FlowyPopover({ + const FlowyPopover({ Key? key, required this.builder, required this.anchorRect, From 6296367efc76799eaf5a306994a10834e45616d0 Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Fri, 2 Sep 2022 14:25:06 +0800 Subject: [PATCH 31/33] refactor: use Popover in URL cell --- .../widgets/cell/cell_accessory.dart | 42 ++++++-- .../widgets/cell/cell_builder.dart | 6 +- .../widgets/cell/cell_container.dart | 2 +- .../widgets/cell/date_cell/date_cell.dart | 1 + .../widgets/cell/url_cell/cell_editor.dart | 69 +++++-------- .../widgets/cell/url_cell/url_cell.dart | 98 +++++++++++++++---- .../presentation/widgets/row/grid_row.dart | 15 ++- 7 files changed, 151 insertions(+), 82 deletions(-) diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_accessory.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_accessory.dart index 8a88316473..341d4095b0 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_accessory.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_accessory.dart @@ -20,14 +20,36 @@ class GridCellAccessoryBuildContext { }); } -abstract class GridCellAccessory implements Widget { +class GridCellAccessoryBuilder { + final GlobalKey _key = GlobalKey(); + + final Widget Function(Key key) _builder; + + GridCellAccessoryBuilder({required Widget Function(Key key) builder}) + : _builder = builder; + + Widget build() => _builder(_key); + + void onTap() { + (_key.currentState as GridCellAccessoryState).onTap(); + } + + bool enable() { + if (_key.currentState == null) { + return true; + } + return (_key.currentState as GridCellAccessoryState).enable(); + } +} + +abstract class GridCellAccessoryState { void onTap(); // The accessory will be hidden if enable() return false; bool enable() => true; } -class PrimaryCellAccessory extends StatelessWidget with GridCellAccessory { +class PrimaryCellAccessory extends StatefulWidget { final VoidCallback onTapCallback; final bool isCellEditing; const PrimaryCellAccessory({ @@ -36,9 +58,15 @@ class PrimaryCellAccessory extends StatelessWidget with GridCellAccessory { Key? key, }) : super(key: key); + @override + State createState() => _PrimaryCellAccessoryState(); +} + +class _PrimaryCellAccessoryState extends State + with GridCellAccessoryState { @override Widget build(BuildContext context) { - if (isCellEditing) { + if (widget.isCellEditing) { return const SizedBox(); } else { final theme = context.watch(); @@ -53,10 +81,10 @@ class PrimaryCellAccessory extends StatelessWidget with GridCellAccessory { } @override - void onTap() => onTapCallback(); + void onTap() => widget.onTapCallback(); @override - bool enable() => !isCellEditing; + bool enable() => !widget.isCellEditing; } class AccessoryHover extends StatefulWidget { @@ -170,7 +198,7 @@ class _Background extends StatelessWidget { } class CellAccessoryContainer extends StatelessWidget { - final List accessories; + final List accessories; const CellAccessoryContainer({required this.accessories, Key? key}) : super(key: key); @@ -186,7 +214,7 @@ class CellAccessoryContainer extends StatelessWidget { width: 26, height: 26, padding: const EdgeInsets.all(3), - child: accessory, + child: accessory.build(), ), ); return GestureDetector( diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_builder.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_builder.dart index 0a7c3a48a7..1f885c3821 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_builder.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_builder.dart @@ -94,7 +94,7 @@ abstract class CellEditable { ValueNotifier get onCellEditing; } -typedef AccessoryBuilder = List Function( +typedef AccessoryBuilder = List Function( GridCellAccessoryBuildContext buildContext); abstract class CellAccessory extends Widget { @@ -125,8 +125,8 @@ abstract class GridCellWidget extends StatefulWidget final ValueNotifier onCellEditing = ValueNotifier(false); @override - List Function(GridCellAccessoryBuildContext buildContext)? - get accessoryBuilder => null; + List Function( + GridCellAccessoryBuildContext buildContext)? get accessoryBuilder => null; @override final GridCellFocusListener beginFocus = GridCellFocusListener(); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_container.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_container.dart index eea58775dd..bbe22ffe8f 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_container.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/cell_container.dart @@ -80,7 +80,7 @@ class CellContainer extends StatelessWidget { class _GridCellEnterRegion extends StatelessWidget { final Widget child; - final List accessories; + final List accessories; const _GridCellEnterRegion( {required this.child, required this.accessories, Key? key}) : super(key: key); diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart index fbdc2ec9ab..2b7ef9b6ab 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/date_cell/date_cell.dart @@ -64,6 +64,7 @@ class _DateCellState extends GridCellState { return Popover( controller: _popover, offset: const Offset(0, 20), + direction: PopoverDirection.bottomWithLeftAligned, child: SizedBox.expand( child: GestureDetector( behavior: HitTestBehavior.opaque, diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/cell_editor.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/cell_editor.dart index b9e0f1ef48..e390104187 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/cell_editor.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/cell_editor.dart @@ -6,56 +6,13 @@ import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; -class URLCellEditor extends StatefulWidget with FlowyOverlayDelegate { +class URLCellEditor extends StatefulWidget { final GridURLCellController cellController; - final VoidCallback completed; - const URLCellEditor( - {required this.cellController, required this.completed, Key? key}) + const URLCellEditor({required this.cellController, Key? key}) : super(key: key); @override State createState() => _URLCellEditorState(); - - static void show( - BuildContext context, - GridURLCellController cellContext, - VoidCallback completed, - ) { - FlowyOverlay.of(context).remove(identifier()); - final editor = URLCellEditor( - cellController: cellContext, - completed: completed, - ); - - // - FlowyOverlay.of(context).insertWithAnchor( - widget: OverlayContainer( - constraints: BoxConstraints.loose(const Size(300, 160)), - child: SizedBox( - width: 200, - child: Padding(padding: const EdgeInsets.all(6), child: editor), - ), - ), - identifier: URLCellEditor.identifier(), - anchorContext: context, - anchorDirection: AnchorDirection.bottomWithCenterAligned, - delegate: editor, - ); - } - - static String identifier() { - return (URLCellEditor).toString(); - } - - @override - bool asBarrier() { - return true; - } - - @override - void didRemove() { - completed(); - } } class _URLCellEditorState extends State { @@ -114,3 +71,25 @@ class _URLCellEditorState extends State { } } } + +class URLEditorPopover extends StatelessWidget { + final GridURLCellController cellController; + const URLEditorPopover({required this.cellController, Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return OverlayContainer( + constraints: BoxConstraints.loose(const Size(300, 160)), + child: SizedBox( + width: 200, + child: Padding( + padding: const EdgeInsets.all(6), + child: URLCellEditor( + cellController: cellController, + ), + ), + ), + ); + } +} diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/url_cell.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/url_cell.dart index 102595e166..27e7d4433c 100644 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/url_cell.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/cell/url_cell/url_cell.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/plugins/grid/application/cell/url_cell_bloc.dart'; import 'package:app_flowy/workspace/presentation/home/toast.dart'; +import 'package:appflowy_popover/popover.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; @@ -48,27 +49,37 @@ class GridURLCell extends GridCellWidget { @override GridCellState createState() => _GridURLCellState(); - GridCellAccessory accessoryFromType( + GridCellAccessoryBuilder accessoryFromType( GridURLCellAccessoryType ty, GridCellAccessoryBuildContext buildContext) { switch (ty) { case GridURLCellAccessoryType.edit: final cellController = cellControllerBuilder.build() as GridURLCellController; - return _EditURLAccessory( + return GridCellAccessoryBuilder( + builder: (Key key) => _EditURLAccessory( + key: key, cellContext: cellController, - anchorContext: buildContext.anchorContext); + anchorContext: buildContext.anchorContext, + ), + ); case GridURLCellAccessoryType.copyURL: final cellContext = cellControllerBuilder.build() as GridURLCellController; - return _CopyURLAccessory(cellContext: cellContext); + return GridCellAccessoryBuilder( + builder: (Key key) => _CopyURLAccessory( + key: key, + cellContext: cellContext, + ), + ); } } @override - List Function(GridCellAccessoryBuildContext buildContext) + List Function( + GridCellAccessoryBuildContext buildContext) get accessoryBuilder => (buildContext) { - final List accessories = []; + final List accessories = []; if (cellStyle != null) { accessories.addAll(cellStyle!.accessoryTypes.map((ty) { return accessoryFromType(ty, buildContext); @@ -86,6 +97,8 @@ class GridURLCell extends GridCellWidget { } class _GridURLCellState extends GridCellState { + final _popoverController = PopoverController(); + GridURLCellController? _cellContext; late URLCellBloc _cellBloc; @override @@ -116,14 +129,28 @@ class _GridURLCellState extends GridCellState { ), ); - return SizedBox.expand( + return Popover( + controller: _popoverController, + direction: PopoverDirection.bottomWithLeftAligned, + offset: const Offset(0, 20), + child: SizedBox.expand( child: GestureDetector( - child: Align(alignment: Alignment.centerLeft, child: richText), - onTap: () async { - final url = context.read().state.url; - await _openUrlOrEdit(url); + child: Align(alignment: Alignment.centerLeft, child: richText), + onTap: () async { + final url = context.read().state.url; + await _openUrlOrEdit(url); + }, + ), + ), + popupBuilder: (BuildContext popoverContext) { + return URLEditorPopover( + cellController: _cellContext!, + ); }, - )); + onClose: () { + widget.onCellEditing.value = false; + }, + ); }, ), ); @@ -140,12 +167,10 @@ class _GridURLCellState extends GridCellState { if (url.isNotEmpty && await canLaunchUrl(uri)) { await launchUrl(uri); } else { - final cellContext = + _cellContext = widget.cellControllerBuilder.build() as GridURLCellController; widget.onCellEditing.value = true; - URLCellEditor.show(context, cellContext, () { - widget.onCellEditing.value = false; - }); + _popoverController.show(); } } @@ -163,7 +188,7 @@ class _GridURLCellState extends GridCellState { } } -class _EditURLAccessory extends StatelessWidget with GridCellAccessory { +class _EditURLAccessory extends StatefulWidget { final GridURLCellController cellContext; final BuildContext anchorContext; const _EditURLAccessory({ @@ -172,24 +197,55 @@ class _EditURLAccessory extends StatelessWidget with GridCellAccessory { Key? key, }) : super(key: key); + @override + State createState() => _EditURLAccessoryState(); +} + +class _EditURLAccessoryState extends State<_EditURLAccessory> + with GridCellAccessoryState { + late PopoverController _popoverController; + + @override + void initState() { + _popoverController = PopoverController(); + super.initState(); + } + @override Widget build(BuildContext context) { final theme = context.watch(); - return svgWidget("editor/edit", color: theme.iconColor); + return Popover( + controller: _popoverController, + direction: PopoverDirection.bottomWithLeftAligned, + triggerActions: PopoverTriggerActionFlags.click, + offset: const Offset(0, 20), + child: svgWidget("editor/edit", color: theme.iconColor), + popupBuilder: (BuildContext popoverContext) { + return URLEditorPopover( + cellController: widget.cellContext.clone(), + ); + }, + ); } @override void onTap() { - URLCellEditor.show(anchorContext, cellContext, () {}); + _popoverController.show(); } } -class _CopyURLAccessory extends StatelessWidget with GridCellAccessory { +class _CopyURLAccessory extends StatefulWidget { final GridURLCellController cellContext; const _CopyURLAccessory({required this.cellContext, Key? key}) : super(key: key); @override + State createState() => _CopyURLAccessoryState(); +} + +class _CopyURLAccessoryState extends State<_CopyURLAccessory> + with GridCellAccessoryState { + @override Widget build(BuildContext context) { final theme = context.watch(); return svgWidget("editor/copy", color: theme.iconColor); @@ -198,7 +254,7 @@ class _CopyURLAccessory extends StatelessWidget with GridCellAccessory { @override void onTap() { final content = - cellContext.getCellData(loadIfNotExist: false)?.content ?? ""; + widget.cellContext.getCellData(loadIfNotExist: false)?.content ?? ""; Clipboard.setData(ClipboardData(text: content)); showMessageToast(LocaleKeys.grid_row_copyProperty.tr()); } diff --git a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/grid_row.dart b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/grid_row.dart index 55ec7b9832..74e48db8b1 100755 --- a/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/grid_row.dart +++ b/frontend/app_flowy/lib/plugins/grid/presentation/widgets/row/grid_row.dart @@ -194,12 +194,17 @@ class RowContent extends StatelessWidget { Provider.of(context, listen: false), accessoryBuilder: (buildContext) { final builder = child.accessoryBuilder; - List accessories = []; + List accessories = []; if (cellId.field.isPrimary) { - accessories.add(PrimaryCellAccessory( - onTapCallback: onExpand, - isCellEditing: buildContext.isCellEditing, - )); + accessories.add( + GridCellAccessoryBuilder( + builder: (key) => PrimaryCellAccessory( + key: key, + onTapCallback: onExpand, + isCellEditing: buildContext.isCellEditing, + ), + ), + ); } if (builder != null) { From 21e90ffac0d82b1e33d48e6b5cdad72ddaa35d0d Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 5 Sep 2022 13:49:57 +0800 Subject: [PATCH 32/33] fix: lint of board_setting --- .../lib/plugins/board/presentation/toolbar/board_setting.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart index c9c39796f3..6bf06c39b9 100644 --- a/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart +++ b/frontend/app_flowy/lib/plugins/board/presentation/toolbar/board_setting.dart @@ -2,7 +2,6 @@ import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/plugins/board/application/toolbar/board_setting_bloc.dart'; import 'package:app_flowy/plugins/grid/application/field/field_controller.dart'; import 'package:app_flowy/plugins/grid/presentation/layout/sizes.dart'; -import 'package:app_flowy/plugins/grid/presentation/widgets/toolbar/grid_group.dart'; import 'package:app_flowy/plugins/grid/presentation/widgets/toolbar/grid_property.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/image.dart'; From caa6f0446b99ed255a9ad155217f8404fe62bdae Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 5 Sep 2022 16:04:51 +0800 Subject: [PATCH 33/33] feat(doc): add doc about how to use popover --- .../packages/appflowy_popover/README.md | 99 +++++++++++++++--- .../example/lib/example_button.dart | 87 +++++++++------ .../packages/appflowy_popover/screenshot.png | Bin 0 -> 455183 bytes 3 files changed, 138 insertions(+), 48 deletions(-) create mode 100644 frontend/app_flowy/packages/appflowy_popover/screenshot.png diff --git a/frontend/app_flowy/packages/appflowy_popover/README.md b/frontend/app_flowy/packages/appflowy_popover/README.md index 9d974e2253..11b608c860 100644 --- a/frontend/app_flowy/packages/appflowy_popover/README.md +++ b/frontend/app_flowy/packages/appflowy_popover/README.md @@ -1,38 +1,107 @@ - - # AppFlowy Popover A Popover can be used to display some content on top of another. -## Features +It can be used to display a dropdown menu. > A popover is a transient view that appears above other content onscreen when you tap a control or in an area. Typically, a popover includes an arrow pointing to the location from which it emerged. Popovers can be nonmodal or modal. A nonmodal popover is dismissed by tapping another part of the screen or a button on the popover. A modal popover is dismissed by tapping a Cancel or other button on the popover. Source: [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/views/popovers/). +## Features + - Basic popover style +- Follow the target automatically - Nested popover support -- Exclusive popover API +- Exclusive API + +![](./screenshot.png) ## Example ```dart Popover( + // Define how to trigger the popover triggerActions: PopoverTriggerActionFlags.click, child: TextButton(child: Text("Popover"), onPressed: () {}), + // Define the direction of the popover + direction: PopoverDirection.bottomWithLeftAligned, popupBuilder(BuildContext context) { return PopoverMenu(); }, ); ``` + +### Trigger the popover manually + +Sometimes, if you want to trigger the popover manually, you can use a `PopoverController`. + +```dart +class MyWidgetState extends State { + late PopoverController _popover; + + @override + void initState() { + _popover = PopoverController(); + super.initState(); + } + + // triggered by another widget + _onClick() { + _popover.show(); + } + + @override + Widget build(BuildContext context) { + return Popover( + controller: _popover, + ... + ) + } +} +``` + +### Make several popovers exclusive + +The popover has a mechanism to make sure there are only one popover is shown in a group of popovers. +It's called `PopoverMutex`. + +If you pass the same mutex object to the popovers, there will be only one popover is triggered. + +```dart +class MyWidgetState extends State { + final _popoverMutex = PopoverMutex(); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Popover( + mutex: _popoverMutex, + ... + ), + Popover( + mutex: _popoverMutex, + ... + ), + Popover( + mutex: _popoverMutex, + ... + ), + ] + ) + } +} +``` + +## API + +| Param | Description | Type | +| -------------- | ---------------------------------------------------------------- | --------------------------------------- | +| offset | The offset between the popover and the child | `Offset` | +| popupBuilder | The function used to build the popover | `Widget Function(BuildContext context)` | +| triggerActions | Define the actions about how to trigger the popover | `int` | +| mutex | If multiple popovers are exclusive, pass the same mutex to them. | `PopoverMutex` | +| direction | The direction where the popover should be placed | `PopoverDirection` | +| onClose | The callback will be called after the popover is closed | `void Function()` | +| child | The child to trigger the popover | `Widget` | diff --git a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart index e2eee64067..357941dc7f 100644 --- a/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart +++ b/frontend/app_flowy/packages/appflowy_popover/example/lib/example_button.dart @@ -13,40 +13,61 @@ class _PopoverMenuState extends State { @override Widget build(BuildContext context) { - return Container( - width: 200, - height: 200, - decoration: const BoxDecoration(color: Colors.yellow), - child: ListView(children: [ - const Text("App"), - Popover( - triggerActions: - PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - mutex: popOverMutex, - offset: const Offset(10, 0), - popupBuilder: (BuildContext context) { - return const PopoverMenu(); - }, - child: TextButton( - onPressed: () {}, - child: const Text("First"), + return Material( + type: MaterialType.transparency, + child: Container( + width: 200, + height: 200, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(8)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 7, + offset: const Offset(0, 3), // changes position of shadow + ), + ], ), - ), - Popover( - triggerActions: - PopoverTriggerActionFlags.hover | PopoverTriggerActionFlags.click, - mutex: popOverMutex, - offset: const Offset(10, 0), - popupBuilder: (BuildContext context) { - return const PopoverMenu(); - }, - child: TextButton( - onPressed: () {}, - child: const Text("Second"), - ), - ), - ]), - ); + child: ListView(children: [ + Container( + margin: const EdgeInsets.all(8), + child: const Text("Popover", + style: TextStyle( + fontSize: 14, + color: Colors.black, + fontStyle: null, + decoration: null)), + ), + Popover( + triggerActions: PopoverTriggerActionFlags.hover | + PopoverTriggerActionFlags.click, + mutex: popOverMutex, + offset: const Offset(10, 0), + popupBuilder: (BuildContext context) { + return const PopoverMenu(); + }, + child: TextButton( + onPressed: () {}, + child: const Text("First"), + ), + ), + Popover( + triggerActions: PopoverTriggerActionFlags.hover | + PopoverTriggerActionFlags.click, + mutex: popOverMutex, + offset: const Offset(10, 0), + popupBuilder: (BuildContext context) { + return const PopoverMenu(); + }, + child: TextButton( + onPressed: () {}, + child: const Text("Second"), + ), + ), + ]), + )); } } diff --git a/frontend/app_flowy/packages/appflowy_popover/screenshot.png b/frontend/app_flowy/packages/appflowy_popover/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..556559d7a20c3c570e966fff2ae4e22229b35b0d GIT binary patch literal 455183 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∾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ข=)M~dFJQw9-Iw6g-LHaNoD#K*J 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�fL& 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�*vt4#i>4rm!sd#L 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

2s|6`72d~ULjrIrk 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 z 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

RQSA7=Zbl^0Eme?%p2)PT(Ez-w`{0 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%0A)F-o}&+B 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

PNW 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٫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 literal 0 HcmV?d00001

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