@@ -103,6 +103,32 @@ class CircleGridPainter extends CustomPainter {
103
103
final startRow = (- offset.dy / (circleSize + spacing)).floor () - 1 ;
104
104
final endRow = ((size.height - offset.dy) / (circleSize + spacing)).ceil ();
105
105
106
+ // Calculate displacements for all affected circles
107
+ Map <Point <int >, Offset > displacements = {};
108
+ if (selectedIndex != null ) {
109
+ int selectedCol = selectedIndex! % columns;
110
+ int selectedRow = selectedIndex! ~ / columns;
111
+
112
+ for (int row = startRow - 1 ; row <= endRow + 1 ; row++ ) {
113
+ for (int col = startCol - 1 ; col <= endCol + 1 ; col++ ) {
114
+ int dx = (col - selectedCol).abs ();
115
+ int dy = (row - selectedRow).abs ();
116
+ int maxDist = max (dx, dy);
117
+
118
+ if (maxDist > 0 ) {
119
+ double angle = atan2 (row - selectedRow, col - selectedCol);
120
+ double pushDistance = max (0 , circleSize * 0.5 * (3 - maxDist) / 2 );
121
+
122
+ displacements[Point (col, row)] = Offset (
123
+ cos (angle) * pushDistance,
124
+ sin (angle) * pushDistance,
125
+ );
126
+ }
127
+ }
128
+ }
129
+ }
130
+
131
+ // Draw circles with calculated displacements
106
132
for (int row = startRow; row <= endRow; row++ ) {
107
133
for (int col = startCol; col <= endCol; col++ ) {
108
134
int index = row * columns + col;
@@ -113,25 +139,9 @@ class CircleGridPainter extends CustomPainter {
113
139
row * (circleSize + spacing) + offset.dy,
114
140
);
115
141
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
- }
142
+ // Apply displacement if exists
143
+ if (displacements.containsKey (Point (col, row))) {
144
+ circleOffset += displacements[Point (col, row)]! ;
135
145
}
136
146
137
147
double currentCircleSize = isSelected ? circleSize : circleSize * 0.8 ;
0 commit comments