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

GUI basics
==========================================


Examples of basic GUI elements that we can create, read from, and write to.



.. code-block:: python
        :linenos:


        import time

        import numpy as np

        import viser


        def main() -> None:
            server = viser.ViserServer()

            # Add some common GUI elements: number inputs, sliders, vectors, checkboxes.
            with server.gui.add_folder("Read-only"):
                gui_counter = server.gui.add_number(
                    "Counter",
                    initial_value=0,
                    disabled=True,
                )
                gui_slider = server.gui.add_slider(
                    "Slider",
                    min=0,
                    max=100,
                    step=1,
                    initial_value=0,
                    disabled=True,
                )
                gui_progress = server.gui.add_progress_bar(25, animated=True)

            with server.gui.add_folder("Editable"):
                gui_vector2 = server.gui.add_vector2(
                    "Position",
                    initial_value=(0.0, 0.0),
                    step=0.1,
                )
                gui_vector3 = server.gui.add_vector3(
                    "Size",
                    initial_value=(1.0, 1.0, 1.0),
                    step=0.25,
                )
                with server.gui.add_folder("Text toggle"):
                    gui_checkbox_hide = server.gui.add_checkbox(
                        "Hide",
                        initial_value=False,
                    )
                    gui_text = server.gui.add_text(
                        "Text",
                        initial_value="Hello world",
                    )
                    gui_button = server.gui.add_button("Button")
                    gui_checkbox_disable = server.gui.add_checkbox(
                        "Disable",
                        initial_value=False,
                    )
                    gui_rgb = server.gui.add_rgb(
                        "Color",
                        initial_value=(255, 255, 0),
                    )
                    gui_multi_slider = server.gui.add_multi_slider(
                        "Multi slider",
                        min=0,
                        max=100,
                        step=1,
                        initial_value=(0, 30, 100),
                        marks=((0, "0"), (50, "5"), (70, "7"), 99),
                    )
                    gui_slider_positions = server.gui.add_slider(
                        "# sliders",
                        min=0,
                        max=10,
                        step=1,
                        initial_value=3,
                        marks=((0, "0"), (5, "5"), (7, "7"), 10),
                    )
                    gui_upload_button = server.gui.add_upload_button(
                        "Upload", icon=viser.Icon.UPLOAD
                    )

            @gui_upload_button.on_upload
            def _(_) -> None:
                """Callback for when a file is uploaded."""
                file = gui_upload_button.value
                print(file.name, len(file.content), "bytes")

            # Pre-generate a point cloud to send.
            point_positions = np.random.uniform(low=-1.0, high=1.0, size=(5000, 3))
            color_coeffs = np.random.uniform(0.4, 1.0, size=(point_positions.shape[0]))

            counter = 0
            while True:
                # We can set the value of an input to a particular value. Changes are
                # automatically reflected in connected clients.
                gui_counter.value = counter
                gui_slider.value = counter % 100

                # We can set the position of a scene node with `.position`, and read the value
                # of a gui element with `.value`. Changes are automatically reflected in
                # connected clients.
                server.scene.add_point_cloud(
                    "/point_cloud",
                    points=point_positions * np.array(gui_vector3.value, dtype=np.float32),
                    colors=(
                        np.tile(gui_rgb.value, point_positions.shape[0]).reshape((-1, 3))
                        * color_coeffs[:, None]
                    ).astype(np.uint8),
                    position=gui_vector2.value + (0,),
                    point_shape="circle",
                )

                gui_progress.value = float((counter % 100))

                # We can use `.visible` and `.disabled` to toggle GUI elements.
                gui_text.visible = not gui_checkbox_hide.value
                gui_button.visible = not gui_checkbox_hide.value
                gui_rgb.disabled = gui_checkbox_disable.value
                gui_button.disabled = gui_checkbox_disable.value
                gui_upload_button.disabled = gui_checkbox_disable.value

                # Update the number of handles in the multi-slider.
                if gui_slider_positions.value != len(gui_multi_slider.value):
                    gui_multi_slider.value = np.linspace(
                        0, 100, gui_slider_positions.value, dtype=np.int64
                    )

                counter += 1
                time.sleep(0.01)


        if __name__ == "__main__":
            main()
