.. Comment: this file is automatically generated by `update_example_docs.py`.
   It should not be modified manually.

Mesh click events
==========================================


Click on meshes to select them. The index of the last clicked mesh is displayed in the GUI.



.. code-block:: python
        :linenos:


        import time

        import matplotlib

        import viser


        def main() -> None:
            grid_shape = (4, 5)
            server = viser.ViserServer()

            with server.gui.add_folder("Last clicked"):
                x_value = server.gui.add_number(
                    label="x",
                    initial_value=0,
                    disabled=True,
                    hint="x coordinate of the last clicked mesh",
                )
                y_value = server.gui.add_number(
                    label="y",
                    initial_value=0,
                    disabled=True,
                    hint="y coordinate of the last clicked mesh",
                )

            def add_swappable_mesh(i: int, j: int) -> None:
                """Simple callback that swaps between:
                 - a gray box
                 - a colored box
                 - a colored sphere

                Color is chosen based on the position (i, j) of the mesh in the grid.
                """

                colormap = matplotlib.colormaps["tab20"]

                def create_mesh(counter: int) -> None:
                    if counter == 0:
                        color = (0.8, 0.8, 0.8)
                    else:
                        index = (i * grid_shape[1] + j) / (grid_shape[0] * grid_shape[1])
                        color = colormap(index)[:3]

                    if counter in (0, 1):
                        handle = server.scene.add_box(
                            name=f"/sphere_{i}_{j}",
                            position=(i, j, 0.0),
                            color=color,
                            dimensions=(0.5, 0.5, 0.5),
                        )
                    else:
                        handle = server.scene.add_icosphere(
                            name=f"/sphere_{i}_{j}",
                            radius=0.4,
                            color=color,
                            position=(i, j, 0.0),
                        )

                    @handle.on_click
                    def _(_) -> None:
                        x_value.value = i
                        y_value.value = j

                        # The new mesh will replace the old one because the names
                        # /sphere_{i}_{j} are the same.
                        create_mesh((counter + 1) % 3)

                create_mesh(0)

            for i in range(grid_shape[0]):
                for j in range(grid_shape[1]):
                    add_swappable_mesh(i, j)

            while True:
                time.sleep(10.0)


        if __name__ == "__main__":
            main()
