view_widget.dart 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'package:flowy_infra_ui/style_widget/styled_hover.dart';
  2. import 'package:flowy_infra_ui/style_widget/styled_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. }
  17. typedef OpenViewCallback = void Function(View);
  18. class ViewWidget extends StatelessWidget {
  19. final ViewWidgetContext viewCtx;
  20. final OpenViewCallback onOpen;
  21. const ViewWidget({Key? key, required this.viewCtx, required this.onOpen})
  22. : super(key: key);
  23. @override
  24. Widget build(BuildContext context) {
  25. final config = HoverDisplayConfig(hoverColor: Colors.grey.shade200);
  26. return InkWell(
  27. onTap: _openView(context),
  28. child: StyledHover(
  29. config: config,
  30. builder: (context, onHover) => _render(context, onHover, config),
  31. ),
  32. );
  33. }
  34. Widget _render(
  35. BuildContext context, bool onHover, HoverDisplayConfig config) {
  36. const double width = 22;
  37. List<Widget> children = [
  38. Image(
  39. fit: BoxFit.cover,
  40. width: width,
  41. height: width,
  42. image: assetImageForViewType(viewCtx.view.viewType)),
  43. const HSpace(6),
  44. Text(
  45. viewCtx.view.name,
  46. textAlign: TextAlign.start,
  47. style: const TextStyle(fontSize: 15),
  48. ),
  49. ];
  50. if (onHover) {
  51. _addedHover(children, width);
  52. }
  53. Widget widget = Row(children: children).padding(
  54. vertical: 5,
  55. left: AppWidgetSize.expandedPadding,
  56. right: 5,
  57. );
  58. if (viewCtx.isSelected) {
  59. widget = HoverBackground(child: widget, config: config);
  60. }
  61. return widget;
  62. }
  63. Function() _openView(BuildContext context) {
  64. return () => onOpen(viewCtx.view);
  65. }
  66. void _addedHover(List<Widget> children, double hoverWidth) {
  67. children.add(const Spacer());
  68. children.add(Align(
  69. alignment: Alignment.center,
  70. child: StyledMore(
  71. width: hoverWidth,
  72. onPressed: () {
  73. debugPrint('show view setting');
  74. },
  75. ),
  76. ));
  77. }
  78. }