Conversation
There was a problem hiding this comment.
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
/pickerTornado handler to accept voxel coordinates asx,y,zplusvertexandhemi, and callpickerfun(voxel, vertex, hemi). - Add a default
PickPosition.prototype.callbackimplementation that triggers a GET to/pickeron each pick. - Update
show()’spickerfundocstring / 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.
| voxel: tuple[int, int, int] = tuple(int(i) for i in self.get_argument("voxel").split(",")) | ||
| vertex: int = int(self.get_argument("vertex")) |
There was a problem hiding this comment.
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.
| 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 |
| vertex: int = int(self.get_argument("vertex")) | ||
| hemi: str = self.get_argument("hemi") | ||
| pickerfun(voxel, vertex, hemi) |
There was a problem hiding this comment.
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.
| callback: function(vec, hemi, ptidx) { | ||
| $.get("/picker?voxel=" + vec.x + "," + vec.y + "," + vec.z + "&vertex=" + ptidx + "&hemi=" + hemi); | ||
| }, |
There was a problem hiding this comment.
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).
| voxel: tuple[int, int, int] = tuple(int(i) for i in self.get_argument("voxel").split(",")) | ||
| vertex: int = int(self.get_argument("vertex")) |
There was a problem hiding this comment.
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.
This restores the old jQuery mechanism from 77a24b5 . I don't know what the pros/cons are of this versus the
notifymechanism from legacy (3595800).Fixes #598 .