handleMouseEvent method
Intercepts mouse drag/press events over the divider.
Implementation
@override
void handleMouseEvent(MouseEvent event, int localX, int localY) {
final split = widget as SplitPane;
if (split._lastArea == null) return;
split._initLimits();
final totalSize = split.direction == LayoutDirection.horizontal
? split._lastArea!.width
: split._lastArea!.height;
if (totalSize <= 0) return;
final mousePos = split.direction == LayoutDirection.horizontal
? localX
: localY;
if (event.type == MouseEventType.press) {
if (mousePos == split._dividerX) {
split._isDragging = true;
}
} else if (event.type == MouseEventType.release) {
split._isDragging = false;
} else if (event.type == MouseEventType.drag && split._isDragging) {
int newDividerPos = mousePos;
// Solve bounds/limits
int minW1 = split._origMin1 ?? 0;
int maxW1 = split._origMax1 ?? (totalSize - 1);
if (split._origMin2 != null) {
maxW1 = min(maxW1, totalSize - split._origMin2! - 1);
}
if (split._origMax2 != null) {
minW1 = max(minW1, totalSize - split._origMax2! - 1);
}
minW1 = minW1.clamp(0, totalSize - 1);
maxW1 = maxW1.clamp(0, totalSize - 1);
if (minW1 > maxW1) minW1 = maxW1;
newDividerPos = newDividerPos.clamp(minW1, maxW1);
// Mutate constraints in place
final c1 = split.constraint1;
if (c1 is LengthConstraint) {
split.constraint1 = LengthConstraint(newDividerPos);
split.constraint2 = LengthConstraint(totalSize - newDividerPos - 1);
} else if (c1 is PercentageConstraint) {
final p1 = (newDividerPos * 100 / totalSize).round().clamp(0, 100);
split.constraint1 = PercentageConstraint(p1);
split.constraint2 = PercentageConstraint(100 - p1);
} else if (c1 is FlexConstraint) {
split.constraint1 = FlexConstraint(newDividerPos);
split.constraint2 = FlexConstraint(totalSize - newDividerPos - 1);
} else if (c1 is MinMaxConstraint) {
// Here we keep the min limits but update the current value via a new MinMaxConstraint.
// Wait, since MinMaxConstraint uses min to represent the preferred size, we update the min.
// But the original min limit is stored in _origMin1, so we still clamp correctly.
split.constraint1 = MinMaxConstraint(
min: newDividerPos,
max: split._origMax1 ?? 99999,
);
if (split.constraint2 is MinMaxConstraint) {
split.constraint2 = MinMaxConstraint(
min: totalSize - newDividerPos - 1,
max: split._origMax2 ?? 99999,
);
} else {
split.constraint2 = MinMaxConstraint(
min: totalSize - newDividerPos - 1,
);
}
}
split._dividerX = newDividerPos;
}
}