# Atajos

> Una lista de atajos agrupada y con búsqueda. Un componente nativo de Pyzed para GUIs de escritorio en Python, con vista previa, ejemplos y su API.

Source: https://albakore.github.io/pyzed/es/library/shortcuts/

:::tip[En pocas palabras]
Una lista con buscador de todos los atajos de teclado de una app.
:::

Una lista de atajos agrupada y con búsqueda para un diálogo de Atajos de teclado. `groups` son pares `(título, [(acción, teclas), ...])`.

`ui.shortcuts` · Categoría: [Código y herramientas](https://albakore.github.io/pyzed/es/library/#código-y-herramientas) · [Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#shortcuts)

**Código:**

```python
pz.container(ui.shortcuts([
    ("File", [("Save", "ctrl-s"), ("Open file", "ctrl-p")]),
    ("View", [("Command palette", "ctrl-shift-p"), ("Toggle left dock", "ctrl-b")]),
], on_query=on_query, height=240), width=420)
```

## Cuándo usarlo

- Dentro de un `ui.modal` que se abre desde el menú Ayuda o con Ctrl+K Ctrl+S.

## Uso

```python
import pyzed as pz
from pyzed import ui

pz.container(ui.shortcuts([
    ("File", [("Save", "ctrl-s"), ("Open file", "ctrl-p")]),
    ("View", [("Command palette", "ctrl-shift-p"), ("Toggle left dock", "ctrl-b")]),
], on_query=on_query, height=240), width=420)
```

## Variantes

:::note[Sobre estas capturas]
Cada captura la graba pyzed mismo, fuera de pantalla a 2x, en One Dark o One Light según el tema de este sitio, y recortada al componente para que se vea a su tamaño real. El puntero pasa por encima, pulsa o escribe en él; un componente que no reacciona al puntero recorre algunos temas. Con movimiento reducido ves el primer fotograma. Abre **Código** bajo una captura para ver el fragmento que la dibuja; los nombres libres como `on_save` son tus propios callbacks.
:::

### Opciones

```python
pz.container(ui.shortcuts([("File", [("Save", "ctrl-s"), ("Open", "ctrl-o")])], on_query=on_query, height=130),
             width=360)
```

```python
pz.container(ui.shortcuts([("View", [("Command palette", "ctrl-shift-p"), ("Zoom in", "ctrl-=")])],
                          query="pal", on_query=on_query, height=110), width=360)
```

## Eventos

Atajos tiene **1 evento propios**, en la tabla de abajo. Como todo widget, también tiene los **18 eventos comunes** (`click`, `double_click`, `right_click`, `mouse_enter`, `drag`, `key_down`, `resize`…), que se conectan con `.on(...)`: mira [Eventos](https://albakore.github.io/pyzed/es/guides/events/) y [Eventos de cada componente](https://albakore.github.io/pyzed/es/library/events/).

| Evento | El handler recibe | Cuándo |
| --- | --- | --- |
| `on_query` | `(text)` | Añade un buscador. |

**El handler recibe** es lo que Pyzed le pasa a tu función: `()` es nada. Cualquier handler también puede ser un mensaje (un valor que no se puede llamar), que va a `update()`.

### Manejar los eventos

Los mismos eventos escritos de tres formas. **Imperativa**: métodos de la app que cambian `self`. **Declarativa**: los handlers producen mensajes y un único `update()` decide. **Funcional**: una función pura dibuja un estado inmutable y pide cambios con `set_state(...)`. Mira [Imperativo, declarativo y funcional](https://albakore.github.io/pyzed/es/guides/code-styles/).

**Imperativo:**

```python
class Help(pz.App):
    def __init__(self):
        self.query = ""

    def view(self):
        return ui.shortcuts([("File", [("Save", "ctrl-s"), ("Open file", "ctrl-p")])],
                            query=self.query, on_query=lambda q: setattr(self, "query", q))  # adds search
```

**Declarativo:**

```python
from dataclasses import dataclass

@dataclass
class Search:
    query: str

class Help(pz.App):
    query = ""

    def update(self, message):
        match message:
            case Search(query):
                self.query = query

    def view(self):
        return ui.shortcuts([("File", [("Save", "ctrl-s")])], query=self.query, on_query=Search)
```

**Funcional:**

```python
from dataclasses import dataclass

@dataclass(frozen=True)
class State:
    query: str = ""

def view(state, set_state):
    return ui.shortcuts([("File", [("Save", "ctrl-s"), ("Open file", "ctrl-p")])],
                        query=state.query, on_query=lambda q: set_state(query=q))
```

## Propiedades y API

### `ui.shortcuts`

```python
shortcuts(groups, *, query='', on_query=None, height=380, theme=None)
```

Una lista de atajos de teclado agrupada y con búsqueda (para un diálogo de atajos).

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `groups` | *obligatorio* | `[(título, [(etiqueta, teclas), ...]), ...]`, teclas como `"ctrl-s"`. |
| `query` | `""` | Texto del filtro. |
| `height` | `380` | Alto de la lista. |
| `theme` | `None` | Tema a usar en lugar del actual (`pyzed.theme.current()`). |

Eventos: `on_query` ([eventos](#eventos)).

[Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#shortcuts)

## Relacionados

- [Kbd](https://albakore.github.io/pyzed/es/library/kbd/): Atajos de teclado dibujados como teclas, con símbolos en macOS.
- [Pista de atajo](https://albakore.github.io/pyzed/es/library/keybinding-hint/): Una pista discreta tipo “Abrir archivo Ctrl P”.
- [Acerca de](https://albakore.github.io/pyzed/es/library/about/): Una caja Acerca de con icono, versión, detalles y enlaces.
