public CompletableFuture updateMouse()

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;
  }