view_widget.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_widget.dart';
  8. import 'package:styled_widget/styled_widget.dart';
  9. class ViewWidgetContext {
  10. final View view;
  11. bool isSelected;
  12. ViewWidgetContext(
  13. this.view, {
  14. this.isSelected = false,
  15. });
  16. Key valueKey() => ValueKey("${view.id}${view.version}");
  17. }
  18. typedef OpenViewCallback = void Function(View);
  19. class ViewWidget extends StatelessWidget {
  20. final ViewWidgetContext viewCtx;
  21. final OpenViewCallback onOpen;
  22. ViewWidget({Key? key, required this.viewCtx, required this.onOpen})
  23. : super(key: viewCtx.valueKey());
  24. @override
  25. Widget build(BuildContext context) {
  26. final config = HoverDisplayConfig(hoverColor: Colors.grey.shade200);
  27. return InkWell(
  28. onTap: _openView(context),
  29. child: FlowyHover(
  30. config: config,
  31. builder: (context, onHover) => _render(context, onHover, config),
  32. ),
  33. );
  34. }
  35. Widget _render(
  36. BuildContext context, bool onHover, HoverDisplayConfig config) {
  37. const double width = 22;
  38. List<Widget> children = [
  39. Image(
  40. fit: BoxFit.cover,
  41. width: width,
  42. height: width,
  43. image: assetImageForViewType(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: AppWidgetSize.expandedPadding,
  57. right: 5,
  58. );
  59. if (viewCtx.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. }