Selects all children of a space when selecting a parent.

This commit is contained in:
Faris Armoush
2025-06-24 10:26:56 +03:00
parent 87b45fff1d
commit 0fb9149613
2 changed files with 32 additions and 14 deletions

View File

@ -7,21 +7,21 @@ class SpacesConnectionsArrowPainter extends CustomPainter {
final Map<String, Offset> positions; final Map<String, Offset> positions;
final double cardWidth = 150.0; final double cardWidth = 150.0;
final double cardHeight = 90.0; final double cardHeight = 90.0;
final String? selectedSpaceUuid; final Set<String> highlightedUuids;
SpacesConnectionsArrowPainter({ SpacesConnectionsArrowPainter({
required this.connections, required this.connections,
required this.positions, required this.positions,
this.selectedSpaceUuid, required this.highlightedUuids,
}); });
@override @override
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
for (final connection in connections) { for (final connection in connections) {
final isSelected = connection.to == selectedSpaceUuid; final isSelected = highlightedUuids.contains(connection.from);
final paint = Paint() final paint = Paint()
..color = isSelected ..color = isSelected
? ColorsManager.primaryColor ? ColorsManager.blackColor
: ColorsManager.blackColor.withValues(alpha: 0.5) : ColorsManager.blackColor.withValues(alpha: 0.5)
..strokeWidth = 2.0 ..strokeWidth = 2.0
..style = PaintingStyle.stroke; ..style = PaintingStyle.stroke;
@ -46,7 +46,7 @@ class SpacesConnectionsArrowPainter extends CustomPainter {
final circlePaint = Paint() final circlePaint = Paint()
..color = isSelected ..color = isSelected
? ColorsManager.primaryColor ? ColorsManager.blackColor
: ColorsManager.blackColor.withValues(alpha: 0.5) : ColorsManager.blackColor.withValues(alpha: 0.5)
..style = PaintingStyle.fill ..style = PaintingStyle.fill
..blendMode = BlendMode.srcIn; ..blendMode = BlendMode.srcIn;

View File

@ -62,6 +62,15 @@ class _CommunityStructureCanvasState extends State<CommunityStructureCanvas>
super.dispose(); super.dispose();
} }
Set<String> _getAllDescendantUuids(SpaceModel space) {
final uuids = <String>{};
for (final child in space.children) {
uuids.add(child.uuid);
uuids.addAll(_getAllDescendantUuids(child));
}
return uuids;
}
void _runAnimation(Matrix4 target) { void _runAnimation(Matrix4 target) {
final animation = Matrix4Tween( final animation = Matrix4Tween(
begin: _transformationController.value, begin: _transformationController.value,
@ -174,16 +183,23 @@ class _CommunityStructureCanvasState extends State<CommunityStructureCanvas>
_calculateLayout(community.spaces, 0, {}); _calculateLayout(community.spaces, 0, {});
final selectedSpace = widget.selectedSpace;
final highlightedUuids = <String>{};
if (selectedSpace != null) {
highlightedUuids.add(selectedSpace.uuid);
highlightedUuids.addAll(_getAllDescendantUuids(selectedSpace));
}
final widgets = <Widget>[]; final widgets = <Widget>[];
final connections = <SpaceConnectionModel>[]; final connections = <SpaceConnectionModel>[];
_generateWidgets(community.spaces, widgets, connections); _generateWidgets(community.spaces, widgets, connections, highlightedUuids);
return [ return [
CustomPaint( CustomPaint(
painter: SpacesConnectionsArrowPainter( painter: SpacesConnectionsArrowPainter(
connections: connections, connections: connections,
positions: _positions, positions: _positions,
selectedSpaceUuid: widget.selectedSpace?.uuid, highlightedUuids: highlightedUuids,
), ),
child: Stack(alignment: AlignmentDirectional.center, children: widgets), child: Stack(alignment: AlignmentDirectional.center, children: widgets),
), ),
@ -194,11 +210,15 @@ class _CommunityStructureCanvasState extends State<CommunityStructureCanvas>
List<SpaceModel> spaces, List<SpaceModel> spaces,
List<Widget> widgets, List<Widget> widgets,
List<SpaceConnectionModel> connections, List<SpaceConnectionModel> connections,
Set<String> highlightedUuids,
) { ) {
for (final space in spaces) { for (final space in spaces) {
final position = _positions[space.uuid]; final position = _positions[space.uuid];
if (position == null) continue; if (position == null) continue;
final isHighlighted = highlightedUuids.contains(space.uuid);
final hasNoSelectedSpace = widget.selectedSpace == null;
widgets.add( widgets.add(
Positioned( Positioned(
left: position.dx, left: position.dx,
@ -208,11 +228,7 @@ class _CommunityStructureCanvasState extends State<CommunityStructureCanvas>
child: SpaceCardWidget( child: SpaceCardWidget(
buildSpaceContainer: () { buildSpaceContainer: () {
return Opacity( return Opacity(
opacity: widget.selectedSpace == null opacity: hasNoSelectedSpace || isHighlighted ? 1.0 : 0.5,
? 1.0
: widget.selectedSpace?.uuid != space.uuid
? 0.5
: 1.0,
child: SpaceCell( child: SpaceCell(
onTap: () => _onSpaceTapped(space), onTap: () => _onSpaceTapped(space),
icon: space.icon, icon: space.icon,
@ -229,9 +245,11 @@ class _CommunityStructureCanvasState extends State<CommunityStructureCanvas>
); );
for (final child in space.children) { for (final child in space.children) {
connections.add(SpaceConnectionModel(from: space.uuid, to: child.uuid)); connections.add(
SpaceConnectionModel(from: space.uuid, to: child.uuid),
);
} }
_generateWidgets(space.children, widgets, connections); _generateWidgets(space.children, widgets, connections, highlightedUuids);
} }
} }