diff --git a/lib/pages/space_management_v2/main_module/widgets/community_structure_canvas.dart b/lib/pages/space_management_v2/main_module/widgets/community_structure_canvas.dart index 92c5add6..22b4536a 100644 --- a/lib/pages/space_management_v2/main_module/widgets/community_structure_canvas.dart +++ b/lib/pages/space_management_v2/main_module/widgets/community_structure_canvas.dart @@ -1,21 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/models/space_connection_model.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/painters/spaces_connections_arrow_painter.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/widgets/space_card_widget.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/widgets/space_cell.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/space_model.dart'; +import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_bloc.dart'; class CommunityStructureCanvas extends StatefulWidget { const CommunityStructureCanvas({ required this.community, + required this.selectedSpace, super.key, }); final CommunityModel community; + final SpaceModel? selectedSpace; @override - State createState() =>_CommunityStructureCanvasState(); + State createState() => _CommunityStructureCanvasState(); } class _CommunityStructureCanvasState extends State @@ -25,19 +29,30 @@ class _CommunityStructureCanvasState extends State final double _cardHeight = 90.0; final double _horizontalSpacing = 150.0; final double _verticalSpacing = 120.0; - String? _selectedSpaceUuid; late TransformationController _transformationController; late AnimationController _animationController; @override void initState() { - super.initState(); _transformationController = TransformationController(); _animationController = AnimationController( vsync: this, - duration: const Duration(milliseconds: 100), + duration: const Duration(milliseconds: 150), ); + super.initState(); + } + + @override + void didUpdateWidget(covariant CommunityStructureCanvas oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.selectedSpace?.uuid != oldWidget.selectedSpace?.uuid) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _animateToSpace(widget.selectedSpace); + } + }); + } } @override @@ -63,15 +78,16 @@ class _CommunityStructureCanvasState extends State }); } - void _onSpaceTapped(String spaceUuid) { - setState(() { - _selectedSpaceUuid = spaceUuid; - }); + void _animateToSpace(SpaceModel? space) { + if (space == null) { + _runAnimation(Matrix4.identity()); + return; + } - final position = _positions[spaceUuid]; + final position = _positions[space.uuid]; if (position == null) return; - const scale = 2.0; + const scale = 1.5; final viewSize = context.size; if (viewSize == null) return; @@ -86,11 +102,19 @@ class _CommunityStructureCanvasState extends State _runAnimation(matrix); } + void _onSpaceTapped(SpaceModel? space) { + context.read().add( + SelectSpaceEvent(community: widget.community, space: space), + ); + } + void _resetSelectionAndZoom() { - setState(() { - _selectedSpaceUuid = null; - }); - _runAnimation(Matrix4.identity()); + context.read().add( + SelectSpaceEvent( + community: widget.community, + space: null, + ), + ); } void _calculateLayout( @@ -159,7 +183,7 @@ class _CommunityStructureCanvasState extends State painter: SpacesConnectionsArrowPainter( connections: connections, positions: _positions, - selectedSpaceUuid: _selectedSpaceUuid, + selectedSpaceUuid: widget.selectedSpace?.uuid, ), child: Stack(alignment: AlignmentDirectional.center, children: widgets), ), @@ -182,24 +206,24 @@ class _CommunityStructureCanvasState extends State width: _cardWidth, height: _cardHeight, child: SpaceCardWidget( - index: spaces.indexOf(space), - onPositionChanged: (newPosition) {}, - buildSpaceContainer: (index) { + buildSpaceContainer: () { return Opacity( - opacity: 1.0, + opacity: widget.selectedSpace == null + ? 1.0 + : widget.selectedSpace?.uuid != space.uuid + ? 0.5 + : 1.0, child: SpaceCell( - index: index, - onTap: () => _onSpaceTapped(space.uuid), + onTap: () => _onSpaceTapped(space), icon: space.icon, name: space.spaceName, ), ); }, - screenSize: MediaQuery.sizeOf(context), - position: position, - isHovered: false, - onHoverChanged: (int index, bool isHovered) {}, - onButtonTap: (int index, Offset newPosition) {}, + onTap: () => showDialog( + context: context, + builder: (context) => const Text('123'), + ), ), ), ); @@ -218,7 +242,7 @@ class _CommunityStructureCanvasState extends State transformationController: _transformationController, boundaryMargin: EdgeInsets.symmetric( horizontal: MediaQuery.sizeOf(context).width * 0.3, - vertical: MediaQuery.sizeOf(context).height * 0.2, + vertical: MediaQuery.sizeOf(context).height * 0.3, ), minScale: 0.5, maxScale: 3.0, @@ -226,8 +250,8 @@ class _CommunityStructureCanvasState extends State child: GestureDetector( onTap: _resetSelectionAndZoom, child: SizedBox( - width: MediaQuery.sizeOf(context).width * 2, - height: MediaQuery.sizeOf(context).height * 2, + width: MediaQuery.sizeOf(context).width * 5, + height: MediaQuery.sizeOf(context).height * 5, child: Stack(children: treeWidgets), ), ), diff --git a/lib/pages/space_management_v2/main_module/widgets/plus_button_widget.dart b/lib/pages/space_management_v2/main_module/widgets/plus_button_widget.dart index 755a6ab9..68169861 100644 --- a/lib/pages/space_management_v2/main_module/widgets/plus_button_widget.dart +++ b/lib/pages/space_management_v2/main_module/widgets/plus_button_widget.dart @@ -2,15 +2,11 @@ import 'package:flutter/material.dart'; import 'package:syncrow_web/utils/color_manager.dart'; class PlusButtonWidget extends StatelessWidget { - final int index; - final String direction; final Offset offset; - final void Function(int index, Offset newPosition) onButtonTap; + final void Function() onButtonTap; const PlusButtonWidget({ super.key, - required this.index, - required this.direction, required this.offset, required this.onButtonTap, }); @@ -18,13 +14,7 @@ class PlusButtonWidget extends StatelessWidget { @override Widget build(BuildContext context) { return GestureDetector( - onTap: () { - if (direction == 'down') { - onButtonTap(index, const Offset(0, 150)); - } else { - onButtonTap(index, const Offset(150, 0)); - } - }, + onTap: onButtonTap, child: Container( width: 30, height: 30, diff --git a/lib/pages/space_management_v2/main_module/widgets/space_card_widget.dart b/lib/pages/space_management_v2/main_module/widgets/space_card_widget.dart index 1ce28502..e91e577f 100644 --- a/lib/pages/space_management_v2/main_module/widgets/space_card_widget.dart +++ b/lib/pages/space_management_v2/main_module/widgets/space_card_widget.dart @@ -1,60 +1,39 @@ import 'package:flutter/material.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/widgets/plus_button_widget.dart'; -class SpaceCardWidget extends StatelessWidget { - final int index; - final Size screenSize; - final Offset position; - final bool isHovered; - final void Function(int index, bool isHovered) onHoverChanged; - final void Function(int index, Offset newPosition) onButtonTap; - final Widget Function(int index) buildSpaceContainer; - final ValueChanged onPositionChanged; +class SpaceCardWidget extends StatefulWidget { + final void Function() onTap; + final Widget Function() buildSpaceContainer; const SpaceCardWidget({ - super.key, - required this.index, - required this.onPositionChanged, - required this.screenSize, - required this.position, - required this.isHovered, - required this.onHoverChanged, - required this.onButtonTap, + required this.onTap, required this.buildSpaceContainer, + super.key, }); + @override + State createState() => _SpaceCardWidgetState(); +} + +class _SpaceCardWidgetState extends State { + bool isHovered = false; @override Widget build(BuildContext context) { return MouseRegion( - onEnter: (_) => onHoverChanged(index, true), - onExit: (_) => onHoverChanged(index, false), + onEnter: (_) => setState(() => isHovered = true), + onExit: (_) => setState(() => isHovered = false), child: SizedBox( - width: 150, - height: 90, child: Stack( clipBehavior: Clip.none, alignment: Alignment.center, children: [ - buildSpaceContainer(index), - + widget.buildSpaceContainer(), if (isHovered) Positioned( bottom: 0, child: PlusButtonWidget( - index: index, - direction: 'down', offset: Offset.zero, - onButtonTap: onButtonTap, - ), - ), - if (isHovered) - Positioned( - right: -15, - child: PlusButtonWidget( - index: index, - direction: 'right', - offset: Offset.zero, - onButtonTap: onButtonTap, + onButtonTap: widget.onTap, ), ), ], diff --git a/lib/pages/space_management_v2/main_module/widgets/space_cell.dart b/lib/pages/space_management_v2/main_module/widgets/space_cell.dart index 1b08835a..bcde6560 100644 --- a/lib/pages/space_management_v2/main_module/widgets/space_cell.dart +++ b/lib/pages/space_management_v2/main_module/widgets/space_cell.dart @@ -1,29 +1,23 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; class SpaceCell extends StatelessWidget { - final int index; final String icon; final String name; - final VoidCallback? onDoubleTap; final VoidCallback? onTap; const SpaceCell({ super.key, - required this.index, required this.icon, required this.name, - this.onTap, - this.onDoubleTap, + required this.onTap, }); @override Widget build(BuildContext context) { - final theme = Theme.of(context); - return GestureDetector( - onDoubleTap: onDoubleTap, onTap: onTap, child: Container( width: 150, @@ -36,7 +30,7 @@ class SpaceCell extends StatelessWidget { Expanded( child: Text( name, - style: theme.textTheme.bodyLarge?.copyWith( + style: context.textTheme.bodyLarge?.copyWith( fontWeight: FontWeight.bold, color: ColorsManager.blackColor, ), @@ -63,7 +57,10 @@ class SpaceCell extends StatelessWidget { child: Center( child: SvgPicture.asset( icon, - color: ColorsManager.whiteColors, + colorFilter: const ColorFilter.mode( + ColorsManager.whiteColors, + BlendMode.srcIn, + ), width: 24, height: 24, ), diff --git a/lib/pages/space_management_v2/main_module/widgets/space_management_community_structure.dart b/lib/pages/space_management_v2/main_module/widgets/space_management_community_structure.dart index 11ee5078..6fe80835 100644 --- a/lib/pages/space_management_v2/main_module/widgets/space_management_community_structure.dart +++ b/lib/pages/space_management_v2/main_module/widgets/space_management_community_structure.dart @@ -9,14 +9,18 @@ class SpaceManagementCommunityStructure extends StatelessWidget { @override Widget build(BuildContext context) { - final selectedCommunity = - context.watch().state.selectedCommunity!; + final selectionBloc = context.watch().state; + final selectedCommunity = selectionBloc.selectedCommunity; + final selectedSpace = selectionBloc.selectedSpace; const spacer = Spacer(flex: 10); return Visibility( - visible: selectedCommunity.spaces.isNotEmpty, + visible: selectedCommunity!.spaces.isNotEmpty, replacement: const Row( children: [spacer, Expanded(child: CreateSpaceButton()), spacer]), - child: CommunityStructureCanvas(community: selectedCommunity), + child: CommunityStructureCanvas( + community: selectedCommunity, + selectedSpace: selectedSpace, + ), ); } } diff --git a/lib/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_event.dart b/lib/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_event.dart index 40a41f74..21088632 100644 --- a/lib/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_event.dart +++ b/lib/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_event.dart @@ -16,7 +16,7 @@ final class SelectCommunityEvent extends CommunitiesTreeSelectionEvent { } final class SelectSpaceEvent extends CommunitiesTreeSelectionEvent { - final SpaceModel space; + final SpaceModel? space; final CommunityModel community; const SelectSpaceEvent({required this.space, required this.community});