Skip to content

Commit d547f00

Browse files
committed
Heart breaking
1 parent f114c64 commit d547f00

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

lib/circles_selector/CirclesHomeWidget.dart

+29-19
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,32 @@ class CircleGridPainter extends CustomPainter {
103103
final startRow = (-offset.dy / (circleSize + spacing)).floor() - 1;
104104
final endRow = ((size.height - offset.dy) / (circleSize + spacing)).ceil();
105105

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
106132
for (int row = startRow; row <= endRow; row++) {
107133
for (int col = startCol; col <= endCol; col++) {
108134
int index = row * columns + col;
@@ -113,25 +139,9 @@ class CircleGridPainter extends CustomPainter {
113139
row * (circleSize + spacing) + offset.dy,
114140
);
115141

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)]!;
135145
}
136146

137147
double currentCircleSize = isSelected ? circleSize : circleSize * 0.8;

0 commit comments

Comments
 (0)