view_page.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:flowy_infra/theme.dart';
  2. import 'package:flowy_infra_ui/style_widget/hover.dart';
  3. import 'package:flowy_infra_ui/style_widget/icon_button.dart';
  4. import 'package:flowy_infra_ui/style_widget/text.dart';
  5. import 'package:flowy_infra_ui/widget/spacing.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:app_flowy/workspace/domain/image.dart';
  9. import 'package:app_flowy/workspace/presentation/app/app_page.dart';
  10. import 'package:provider/provider.dart';
  11. import 'package:styled_widget/styled_widget.dart';
  12. class ViewWidgetContext {
  13. final View view;
  14. ViewWidgetContext(this.view);
  15. Key valueKey() => ValueKey("${view.id}${view.version}");
  16. }
  17. typedef OpenViewCallback = void Function(View);
  18. class ViewPage extends StatelessWidget {
  19. final ViewWidgetContext viewCtx;
  20. final bool isSelected;
  21. final OpenViewCallback onOpen;
  22. ViewPage({Key? key, required this.viewCtx, required this.onOpen, required this.isSelected})
  23. : super(key: viewCtx.valueKey());
  24. @override
  25. Widget build(BuildContext context) {
  26. final theme = context.watch<AppTheme>();
  27. final config = HoverDisplayConfig(hoverColor: theme.bg3);
  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(BuildContext context, bool onHover, HoverDisplayConfig config) {
  37. List<Widget> children = [
  38. SizedBox(
  39. width: 16,
  40. height: 16,
  41. child: svgForViewType(viewCtx.view.viewType),
  42. ),
  43. const HSpace(6),
  44. FlowyText.regular(
  45. viewCtx.view.name,
  46. fontSize: 12,
  47. ),
  48. ];
  49. if (onHover) {
  50. children.add(const Spacer());
  51. children.add(ViewMoreButton(
  52. width: 16,
  53. onPressed: () {
  54. debugPrint('show view setting');
  55. },
  56. ));
  57. }
  58. Widget widget = Container(
  59. child: Row(children: children).padding(
  60. left: AppPageSize.expandedPadding,
  61. right: 12,
  62. ),
  63. height: 24,
  64. alignment: Alignment.centerLeft,
  65. );
  66. if (isSelected) {
  67. widget = FlowyHoverBackground(child: widget, config: config);
  68. }
  69. return widget;
  70. }
  71. Function() _openView(BuildContext context) {
  72. return () => onOpen(viewCtx.view);
  73. }
  74. }