app_header.dart 3.0 KB

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