app_header.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'package:app_flowy/workspace/application/app/app_bloc.dart';
  2. import 'package:expandable/expandable.dart';
  3. import 'package:flowy_infra/image.dart';
  4. import 'package:flowy_infra/theme.dart';
  5. import 'package:flowy_infra_ui/style_widget/text.dart';
  6. import 'package:flowy_infra_ui/widget/spacing.dart';
  7. import 'package:flowy_infra_ui/style_widget/text_button.dart';
  8. import 'package:flowy_infra/flowy_icon_data_icons.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:flutter_bloc/flutter_bloc.dart';
  13. import 'app_page.dart';
  14. class AppHeader extends StatelessWidget {
  15. final App app;
  16. const AppHeader(
  17. this.app, {
  18. Key? key,
  19. }) : super(key: key);
  20. @override
  21. Widget build(BuildContext context) {
  22. final theme = context.watch<AppTheme>();
  23. return Row(
  24. mainAxisAlignment: MainAxisAlignment.start,
  25. crossAxisAlignment: CrossAxisAlignment.center,
  26. children: [
  27. InkWell(
  28. onTap: () {
  29. ExpandableController.of(context,
  30. rebuildOnChange: false, required: true)
  31. ?.toggle();
  32. },
  33. child: ExpandableIcon(
  34. theme: ExpandableThemeData(
  35. expandIcon: FlowyIconData.drop_down_show,
  36. collapseIcon: FlowyIconData.drop_down_hide,
  37. iconColor: theme.shader1,
  38. iconSize: AppPageSize.expandedIconSize,
  39. iconPadding: EdgeInsets.zero,
  40. hasIcon: false,
  41. ),
  42. ),
  43. ),
  44. HSpace(AppPageSize.expandedIconRightSpace),
  45. Expanded(
  46. child: GestureDetector(
  47. onTapDown: (_) {
  48. ExpandableController.of(context,
  49. rebuildOnChange: false, required: true)
  50. ?.toggle();
  51. },
  52. child: FlowyText(
  53. app.name,
  54. fontSize: 12,
  55. ),
  56. )),
  57. // FlowyIconButton(
  58. // icon: const Icon(Icons.add),
  59. // onPressed: () {
  60. // debugPrint('add view');
  61. // FlowyOverlay.of(context)
  62. // .insert(widget: Text('test'), identifier: 'identifier');
  63. // },
  64. // ),
  65. PopupMenuButton(
  66. iconSize: 16,
  67. tooltip: 'create new view',
  68. icon: svg("home/add"),
  69. padding: EdgeInsets.zero,
  70. onSelected: (viewType) =>
  71. _createView(viewType as ViewType, context),
  72. itemBuilder: (context) => menuItemBuilder())
  73. ],
  74. );
  75. }
  76. List<PopupMenuEntry> menuItemBuilder() {
  77. return ViewType.values
  78. .where((element) => element != ViewType.Blank)
  79. .map((ty) {
  80. return PopupMenuItem<ViewType>(
  81. value: ty,
  82. child: Row(
  83. children: <Widget>[Text(ty.name)],
  84. ));
  85. }).toList();
  86. }
  87. void _createView(ViewType viewType, BuildContext context) {
  88. context.read<AppBloc>().add(AppEvent.createView("New view", "", viewType));
  89. }
  90. }