Skip to content

FIX pickerfun Python callback#600

Open
kroq-gar78 wants to merge 1 commit intogallantlab:mainfrom
kroq-gar78:pickerfun-fix
Open

FIX pickerfun Python callback#600
kroq-gar78 wants to merge 1 commit intogallantlab:mainfrom
kroq-gar78:pickerfun-fix

Conversation

@kroq-gar78
Copy link
Contributor

@kroq-gar78 kroq-gar78 commented Mar 8, 2026

This restores the old jQuery mechanism from 77a24b5 . I don't know what the pros/cons are of this versus the notify mechanism from legacy (3595800).

Fixes #598 .

@kroq-gar78 kroq-gar78 marked this pull request as ready for review March 8, 2026 22:11
@kroq-gar78 kroq-gar78 requested a review from Copilot March 12, 2026 03:25
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restores a jQuery-based surface-pick callback path so that pickerfun provided to cortex.webgl.show(...) is invoked from Python when the user clicks on the surface in the WebGL viewer (fixing #598).

Changes:

  • Update the /picker Tornado handler to accept voxel coordinates as x,y,z plus vertex and hemi, and call pickerfun(voxel, vertex, hemi).
  • Add a default PickPosition.prototype.callback implementation that triggers a GET to /picker on each pick.
  • Update show()’s pickerfun docstring / default callback behavior.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
cortex/webgl/view.py Updates picker callback contract and server-side /picker argument parsing/callback invocation.
cortex/webgl/resources/js/facepick.js Restores a jQuery $.get("/picker?...") request on picks by defining a default callback.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +890 to +891
voxel: tuple[int, int, int] = tuple(int(i) for i in self.get_argument("voxel").split(","))
vertex: int = int(self.get_argument("vertex"))
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parsing voxel assumes a comma-separated string of exactly 3 integers; if the query param is malformed (wrong length, whitespace, non-integer), this will currently throw and return a 500. Consider validating the split length and catching ValueError to return a 400 (or ignore the pick) so a bad request can’t crash the handler.

Suggested change
voxel: tuple[int, int, int] = tuple(int(i) for i in self.get_argument("voxel").split(","))
vertex: int = int(self.get_argument("vertex"))
voxel_arg = self.get_argument("voxel", None)
if voxel_arg is None:
self.set_status(400)
self.finish("Missing 'voxel' query parameter")
return
parts = voxel_arg.split(",")
if len(parts) != 3:
self.set_status(400)
self.finish("Invalid 'voxel' query parameter: expected 3 comma-separated integers")
return
try:
voxel: tuple[int, int, int] = tuple(int(i) for i in parts)
vertex: int = int(self.get_argument("vertex"))
except (TypeError, ValueError):
self.set_status(400)
self.finish("Invalid 'voxel' or 'vertex' query parameter")
return

Copilot uses AI. Check for mistakes.
Comment on lines +891 to +893
vertex: int = int(self.get_argument("vertex"))
hemi: str = self.get_argument("hemi")
pickerfun(voxel, vertex, hemi)
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This changes the pickerfun callback contract from 2 args to 3 args. Any existing user code that defines pickerfun(voxel, vertex) will now raise TypeError when a pick occurs. To avoid a breaking change, consider supporting both signatures (e.g., attempt the 3-arg call and fall back to 2 args) and/or deprecate the old signature first.

Copilot uses AI. Check for mistakes.
Comment on lines +251 to +253
callback: function(vec, hemi, ptidx) {
$.get("/picker?voxel=" + vec.x + "," + vec.y + "," + vec.z + "&vertex=" + ptidx + "&hemi=" + hemi);
},
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Defining callback on the prototype makes this.callback !== undefined always true, so every pick will now trigger a GET to /picker. This is a behavior change for static exports (python_interface=False) or any deployment without a /picker route, where clicks will start generating failing network requests (and potentially CORS/console noise). Consider only installing/enabling this callback when the Python picker endpoint is actually available (e.g., when running in python_interface mode, or when a callback was explicitly provided).

Copilot uses AI. Check for mistakes.
Comment on lines +890 to +891
voxel: tuple[int, int, int] = tuple(int(i) for i in self.get_argument("voxel").split(","))
vertex: int = int(self.get_argument("vertex"))
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

voxel: tuple[int, int, int] uses PEP 585 built-in generics, which are not supported on Python 3.8. The repo's CI matrix includes Python 3.8, so this will raise a TypeError: 'type' object is not subscriptable at import/runtime. Use typing.Tuple[int, int, int] (or drop the annotation) to keep 3.8 compatibility.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pickerfun does not get called in cortex.webshow

2 participants