document.dart 3.4 KB

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