document.dart 3.4 KB

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