view_page.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. SizedBox(
  41. width: width,
  42. height: width,
  43. child: svgForViewType(viewCtx.view.viewType)),
  44. const HSpace(6),
  45. Text(
  46. viewCtx.view.name,
  47. textAlign: TextAlign.start,
  48. style: const TextStyle(fontSize: 15),
  49. ),
  50. ];
  51. if (onHover) {
  52. _addedHover(children, width);
  53. }
  54. Widget widget = Row(children: children).padding(
  55. vertical: 5,
  56. left: AppPageSize.expandedPadding,
  57. right: 5,
  58. );
  59. if (isSelected) {
  60. widget = FlowyHoverBackground(child: widget, config: config);
  61. }
  62. return widget;
  63. }
  64. Function() _openView(BuildContext context) {
  65. return () => onOpen(viewCtx.view);
  66. }
  67. void _addedHover(List<Widget> children, double hoverWidth) {
  68. children.add(const Spacer());
  69. children.add(Align(
  70. alignment: Alignment.center,
  71. child: FlowyMoreButton(
  72. width: hoverWidth,
  73. onPressed: () {
  74. debugPrint('show view setting');
  75. },
  76. ),
  77. ));
  78. }
  79. }