1
+ import 'dart:math' ;
2
+
1
3
import 'package:flutter/material.dart' ;
2
4
3
5
class CirclesHomeWidget extends StatefulWidget {
@@ -24,7 +26,7 @@ class PannableCircleGrid extends StatefulWidget {
24
26
class _PannableCircleGridState extends State <PannableCircleGrid > {
25
27
Offset _offset = Offset .zero;
26
28
int ? _selectedIndex;
27
- final double _circleSize = 60 ;
29
+ final double _circleSize = 40 ;
28
30
final double _spacing = 20 ;
29
31
final int _columns = 1000 ; // Arbitrary large number for columns
30
32
@@ -61,7 +63,6 @@ class _PannableCircleGridState extends State<PannableCircleGrid> {
61
63
int row =
62
64
((tapPosition.dy - _offset.dy) / (_circleSize + _spacing)).floor ();
63
65
int index = row * _columns + col;
64
-
65
66
setState (() {
66
67
_selectedIndex = (_selectedIndex == index) ? null : index;
67
68
});
@@ -104,17 +105,40 @@ class CircleGridPainter extends CustomPainter {
104
105
105
106
for (int row = startRow; row <= endRow; row++ ) {
106
107
for (int col = startCol; col <= endCol; col++ ) {
107
- final circleOffset = Offset (
108
+ int index = row * columns + col;
109
+ bool isSelected = selectedIndex == index;
110
+
111
+ Offset circleOffset = Offset (
108
112
col * (circleSize + spacing) + offset.dx,
109
113
row * (circleSize + spacing) + offset.dy,
110
114
);
111
115
112
- int index = row * columns + col;
113
- bool isSelected = selectedIndex == index;
116
+ // If a circle is selected, adjust positions of surrounding circles
117
+ if (selectedIndex != null ) {
118
+ int selectedCol = selectedIndex! % columns;
119
+ int selectedRow = selectedIndex! ~ / columns;
120
+
121
+ double distanceX = (col - selectedCol).abs () * (circleSize + spacing);
122
+ double distanceY = (row - selectedRow).abs () * (circleSize + spacing);
123
+ double distance = sqrt (distanceX * distanceX + distanceY * distanceY);
124
+
125
+ if (distance > 0 && distance <= 2 * (circleSize + spacing)) {
126
+ double angle = atan2 (row - selectedRow, col - selectedCol);
127
+ double pushDistance = circleSize *
128
+ 0.5 ; // Adjust this value to control the push effect
129
+
130
+ circleOffset += Offset (
131
+ cos (angle) * pushDistance,
132
+ sin (angle) * pushDistance,
133
+ );
134
+ }
135
+ }
136
+
137
+ double currentCircleSize = isSelected ? circleSize : circleSize * 0.8 ;
114
138
115
139
canvas.drawCircle (
116
140
circleOffset,
117
- isSelected ? circleSize * 0.6 : circleSize * 0.5 ,
141
+ currentCircleSize ,
118
142
isSelected ? selectedPaint : paint,
119
143
);
120
144
0 commit comments