view_page.dart 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import 'package:flowy_infra_ui/style_widget/hover.dart';
  2. import 'package:flowy_infra_ui/style_widget/icon_button.dart';
  3. import 'package:flowy_infra_ui/widget/spacing.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:app_flowy/workspace/domain/image.dart';
  7. import 'package:app_flowy/workspace/presentation/app/app_page.dart';
  8. import 'package:styled_widget/styled_widget.dart';
  9. class ViewWidgetContext {
  10. final View view;
  11. ViewWidgetContext(this.view);
  12. Key valueKey() => ValueKey("${view.id}${view.version}");
  13. }
  14. typedef OpenViewCallback = void Function(View);
  15. class ViewPage extends StatelessWidget {
  16. final ViewWidgetContext viewCtx;
  17. final bool isSelected;
  18. final OpenViewCallback onOpen;
  19. ViewPage(
  20. {Key? key,
  21. required this.viewCtx,
  22. required this.onOpen,
  23. required this.isSelected})
  24. : super(key: viewCtx.valueKey());
  25. @override
  26. Widget build(BuildContext context) {
  27. final config = HoverDisplayConfig(hoverColor: Colors.grey.shade200);
  28. return InkWell(
  29. onTap: _openView(context),
  30. child: FlowyHover(
  31. config: config,
  32. builder: (context, onHover) => _render(context, onHover, config),
  33. ),
  34. );
  35. }
  36. Widget _render(
  37. BuildContext context, bool onHover, HoverDisplayConfig config) {
  38. const double width = 22;
  39. List<Widget> children = [
  40. Image(
  41. fit: BoxFit.cover,
  42. width: width,
  43. height: width,
  44. image: assetImageForViewType(viewCtx.view.viewType)),
  45. const HSpace(6),
  46. Text(
  47. viewCtx.view.name,
  48. textAlign: TextAlign.start,
  49. style: const TextStyle(fontSize: 15),
  50. ),
  51. ];
  52. if (onHover) {
  53. _addedHover(children, width);
  54. }
  55. Widget widget = Row(children: children).padding(
  56. vertical: 5,
  57. left: AppPageSize.expandedPadding,
  58. right: 5,
  59. );
  60. if (isSelected) {
  61. widget = FlowyHoverBackground(child: widget, config: config);
  62. }
  63. return widget;
  64. }
  65. Function() _openView(BuildContext context) {
  66. return () => onOpen(viewCtx.view);
  67. }
  68. void _addedHover(List<Widget> children, double hoverWidth) {
  69. children.add(const Spacer());
  70. children.add(Align(
  71. alignment: Alignment.center,
  72. child: FlowyMoreButton(
  73. width: hoverWidth,
  74. onPressed: () {
  75. debugPrint('show view setting');
  76. },
  77. ),
  78. ));
  79. }
  80. }