document.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. library document_plugin;
  2. import 'package:appflowy/generated/locale_keys.g.dart';
  3. import 'package:appflowy/plugins/document/document_page.dart';
  4. import 'package:appflowy/plugins/document/presentation/more/cubit/document_appearance_cubit.dart';
  5. import 'package:appflowy/plugins/document/presentation/more/more_button.dart';
  6. import 'package:appflowy/plugins/document/presentation/share/share_button.dart';
  7. import 'package:appflowy/plugins/util.dart';
  8. import 'package:appflowy/startup/plugin/plugin.dart';
  9. import 'package:appflowy/workspace/presentation/home/home_stack.dart';
  10. import 'package:appflowy/workspace/presentation/widgets/left_bar_item.dart';
  11. import 'package:easy_localization/easy_localization.dart';
  12. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:flutter_bloc/flutter_bloc.dart';
  15. class DocumentPluginBuilder extends PluginBuilder {
  16. @override
  17. Plugin build(dynamic data) {
  18. if (data is ViewPB) {
  19. return DocumentPlugin(pluginType: pluginType, view: data);
  20. } else {
  21. throw FlowyPluginException.invalidData;
  22. }
  23. }
  24. @override
  25. String get menuName => LocaleKeys.document_menuName.tr();
  26. @override
  27. String get menuIcon => "editor/documents";
  28. @override
  29. PluginType get pluginType => PluginType.editor;
  30. @override
  31. ViewLayoutPB? get layoutType => ViewLayoutPB.Document;
  32. }
  33. class DocumentPlugin extends Plugin<int> {
  34. late PluginType _pluginType;
  35. @override
  36. final ViewPluginNotifier notifier;
  37. DocumentPlugin({
  38. required PluginType pluginType,
  39. required ViewPB view,
  40. bool listenOnViewChanged = false,
  41. Key? key,
  42. }) : notifier = ViewPluginNotifier(view: view) {
  43. _pluginType = pluginType;
  44. }
  45. @override
  46. PluginWidgetBuilder get widgetBuilder {
  47. return DocumentPluginWidgetBuilder(
  48. notifier: notifier,
  49. );
  50. }
  51. @override
  52. PluginType get pluginType => _pluginType;
  53. @override
  54. PluginId get id => notifier.view.id;
  55. }
  56. class DocumentPluginWidgetBuilder extends PluginWidgetBuilder
  57. with NavigationItem {
  58. final ViewPluginNotifier notifier;
  59. ViewPB get view => notifier.view;
  60. int? deletedViewIndex;
  61. DocumentPluginWidgetBuilder({
  62. required this.notifier,
  63. Key? key,
  64. });
  65. @override
  66. EdgeInsets get contentPadding => EdgeInsets.zero;
  67. @override
  68. Widget buildWidget({PluginContext? context}) {
  69. notifier.isDeleted.addListener(() {
  70. notifier.isDeleted.value.fold(() => null, (deletedView) {
  71. if (deletedView.hasIndex()) {
  72. deletedViewIndex = deletedView.index;
  73. }
  74. });
  75. });
  76. return BlocBuilder<DocumentAppearanceCubit, DocumentAppearance>(
  77. builder: (_, state) {
  78. return DocumentPage(
  79. view: view,
  80. onDeleted: () => context?.onDeleted(view, deletedViewIndex),
  81. key: ValueKey(view.id),
  82. );
  83. },
  84. );
  85. }
  86. @override
  87. Widget get leftBarItem => ViewLeftBarItem(view: view);
  88. @override
  89. Widget? get rightBarItem {
  90. return Row(
  91. children: [
  92. DocumentShareButton(
  93. key: ValueKey(view.id),
  94. view: view,
  95. ),
  96. const SizedBox(width: 10),
  97. const DocumentMoreButton(),
  98. ],
  99. );
  100. }
  101. @override
  102. List<NavigationItem> get navigationItems => [this];
  103. }