app_widget.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // ignore: import_of_legacy_library_into_null_safe
  2. import 'package:app_flowy/home/presentation/widgets/menu/hom_menu_size.dart';
  3. import 'package:expandable/expandable.dart';
  4. import 'package:flowy_infra/size.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. class AppWidget extends StatelessWidget {
  10. final App app;
  11. const AppWidget(this.app, {Key? key}) : super(key: key);
  12. @override
  13. Widget build(BuildContext context) {
  14. return Container();
  15. }
  16. ExpandableNotifier expandableWrapper(BuildContext context, Widget child) {
  17. return ExpandableNotifier(
  18. child: ScrollOnExpand(
  19. scrollOnExpand: true,
  20. scrollOnCollapse: false,
  21. child: Card(
  22. clipBehavior: Clip.antiAlias,
  23. child: Column(
  24. children: <Widget>[
  25. ExpandablePanel(
  26. theme: const ExpandableThemeData(
  27. headerAlignment: ExpandablePanelHeaderAlignment.center,
  28. tapBodyToExpand: false,
  29. tapBodyToCollapse: false,
  30. iconPadding: EdgeInsets.zero,
  31. hasIcon: false,
  32. ),
  33. header: AppHeader(app),
  34. expanded: Padding(
  35. padding: EdgeInsets.only(left: Sizes.iconMed),
  36. child: child,
  37. ),
  38. ),
  39. ],
  40. ),
  41. ),
  42. ),
  43. );
  44. }
  45. }
  46. class AppHeader extends StatelessWidget {
  47. final App app;
  48. const AppHeader(
  49. this.app, {
  50. Key? key,
  51. }) : super(key: key);
  52. @override
  53. Widget build(BuildContext context) {
  54. return Container(
  55. color: Colors.white,
  56. child: Padding(
  57. padding: EdgeInsets.symmetric(vertical: Insets.m),
  58. child: Row(
  59. mainAxisAlignment: MainAxisAlignment.center,
  60. crossAxisAlignment: CrossAxisAlignment.center,
  61. children: [
  62. ExpandableIcon(
  63. theme: ExpandableThemeData(
  64. expandIcon: Icons.arrow_right,
  65. collapseIcon: Icons.arrow_drop_down,
  66. iconColor: Colors.black,
  67. iconSize: HomeMenuSize.collapseIconSize,
  68. iconPadding: EdgeInsets.zero,
  69. hasIcon: false,
  70. ),
  71. ),
  72. Expanded(
  73. child: Text(app.name),
  74. ),
  75. SizedBox(
  76. height: HomeMenuSize.createViewButtonSize,
  77. child: createViewPopupMenu(context),
  78. ),
  79. ],
  80. ),
  81. ),
  82. );
  83. }
  84. Widget createViewPopupMenu(BuildContext context) {
  85. return PopupMenuButton(
  86. iconSize: 24,
  87. tooltip: 'create new view',
  88. icon: const Icon(Icons.add),
  89. padding: EdgeInsets.zero,
  90. onSelected: (viewType) =>
  91. handleCreateView(viewType as ViewType, context),
  92. itemBuilder: (context) => menuItemBuilder());
  93. }
  94. List<PopupMenuEntry> menuItemBuilder() {
  95. return ViewType.values
  96. // .where((element) => element != ViewType.ViewTypeUnknown)
  97. .map((ty) {
  98. return PopupMenuItem<ViewType>(
  99. value: ty,
  100. child: Row(
  101. children: <Widget>[Text(ty.name)],
  102. ));
  103. }).toList();
  104. }
  105. void handleCreateView(ViewType viewType, BuildContext context) {
  106. switch (viewType) {
  107. case ViewType.Docs:
  108. // context
  109. // .read<AppEditBloc>()
  110. // .add(AppEditEvent.createView(app.id, 'Grid View'));
  111. break;
  112. }
  113. }
  114. }