in flutter-idea/src/io/flutter/editor/PreviewViewControllerBase.java [186:255]
public CompletableFuture<?> updateMouse(boolean navigateTo) {
final InspectorObjectGroupManager hoverGroups = getHovers();
if (hoverGroups == null || ((popupActive() || popopOpenInProgress) && !navigateTo)) {
return CompletableFuture.completedFuture(null);
}
final Screenshot latestScreenshot = getScreenshotNow();
if (screenshotBounds == null ||
latestScreenshot == null ||
lastPoint == null ||
!getScreenshotBoundsTight().contains(lastPoint) ||
getSelectedElement() == null) {
return CompletableFuture.completedFuture(null);
}
hoverGroups.cancelNext();
final InspectorService.ObjectGroup nextGroup = hoverGroups.getNext();
final Matrix4 matrix = buildTransformToScreenshot(latestScreenshot);
matrix.invert();
final Vector3 point = matrix.perspectiveTransform(new Vector3(lastPoint.getX(), lastPoint.getY(), 0));
final String file;
final int startLine, endLine;
if (controlDown || getVirtualFile() == null) {
file = null;
}
else {
file = toSourceLocationUri(getVirtualFile().getPath());
}
final TextRange activeRange = getActiveRange();
if (controlDown || activeRange == null || getDocument() == null) {
startLine = -1;
endLine = -1;
}
else {
startLine = getDocument().getLineNumber(activeRange.getStartOffset());
endLine = getDocument().getLineNumber(activeRange.getEndOffset());
}
final CompletableFuture<ArrayList<DiagnosticsNode>> hitResults =
nextGroup.hitTest(getSelectedElement(), point.getX(), point.getY(), file, startLine, endLine);
nextGroup.safeWhenComplete(hitResults, (hits, error) -> {
if (nextGroup.isDisposed()) return;
if (error != null || hits == null) {
return;
}
currentHits = hits;
hoverGroups.promoteNext();
// TODO(jacobr): consider removing the navigateTo option?
if (navigateTo && popopOpenInProgress) {
final DiagnosticsNode node = hits.size() > 0 ? hits.get(0) : null;
if (node == null) return;
final TransformedRect transform = node.getTransformToRoot();
if (transform != null) {
double x, y;
final Matrix4 transformMatrix = buildTransformToScreenshot(latestScreenshot);
transformMatrix.multiply(transform.getTransform());
final Rectangle2D rect = transform.getRectangle();
final Vector3 transformed = transformMatrix.perspectiveTransform(new Vector3(new double[]{rect.getCenterX(), rect.getMinY(), 0}));
final Point pendingPopupOpenLocation = new Point((int)Math.round(transformed.getX()), (int)Math.round(transformed.getY() + 1));
showPopup(pendingPopupOpenLocation, node);
}
popopOpenInProgress = false;
}
if (navigateTo && hits.size() > 0) {
getGroups().getCurrent().setSelection(hits.get(0).getValueRef(), false, false);
}
forceRender();
});
return hitResults;
}