Repository navigation
Explorador de sets
English · Español
«Explorar sets» es un diálogo modal (src/features/set-browser/set-browser-dialog.tsx) para elegir un set de Magic de la lista de Scryfall, filtrarlo opcionalmente por tipo de carta, seleccionar cartas en una rejilla de miniaturas y cargarlas directamente en el mazo o enviarlas a la lista de texto. Su parte de Rust son dos comandos en src-tauri/src/commands/cards.rs: sets_list y set_cards.

| Fichero | Responsabilidad |
|---|---|
src/features/set-browser/set-browser-dialog.tsx |
SetBrowserDialog (carcasa de abrir/cerrar) y su Contenido (lista de sets, filtro de tipo, rejilla, acciones del pie), comoLista
|
src/features/variants/rejilla-cartas.tsx |
RejillaCartas: la rejilla de miniaturas compartida (véase Añadir carta y variantes) |
src/features/decklist/acciones.ts |
cargarLista: lo usa «Cargar cartas» |
src-tauri/src/commands/cards.rs |
sets_list, set_cards, consulta_set, resumir
|
src-tauri/src/scryfall/client.rs |
Scryfall::sets, CardApi::search, buscar_paginas
|
src-tauri/src/scryfall/models.rs |
SetInfo, SetRaw, SetList
|
El diálogo se monta en src/App.tsx y se abre con el botón «Sets» de la cabecera del Panel de la lista del mazo mediante useUi.getState().abrir({ tipo: "sets" }) (el botón está deshabilitado mientras corre un trabajo en segundo plano). Se abre con cambiosSinGuardar={false} porque no tiene ediciones sin guardar.
| Comando | Argumentos | Devuelve | Notas |
|---|---|---|---|
sets_list |
ninguno | SetInfo[] |
state.scryfall.sets() -> GET /sets. SetInfo = { code, name, setType, releasedAt?, cardCount } (models.rs). Un 404 produce una lista vacía. El cliente no la guarda en memoria: se pide cada vez que se abre el diálogo. |
set_cards |
code, typeFilter?
|
CardSummary[] |
Construye una consulta con consulta_set y ejecuta state.scryfall.search(&q, false, 175), y luego resumir (resúmenes + registro de miniaturas). |
consulta_set(code, type_filter) construye e:<code> y, opcionalmente, t:<type>. Decisión: ambas entradas se filtran a caracteres seguros (code: alfanuméricos ASCII; type: solo letras ASCII, limpiado antes de comprobar si está vacío). Motivo: vienen de la pantalla y se interpolan en una consulta de Scryfall; esto evita inyectar cláusulas adicionales (neo) or (e:dmu se convierte en e:neooredmu) y que un tipo como -! deje un t: colgando. Lo fija el test el_set_y_el_tipo_no_dejan_colar_otra_consulta.
La búsqueda se llama con prints = false: sin unique=prints ni include_multilingual, de modo que la rejilla muestra una entrada por carta en el idioma por defecto del set (inglés), no todas las impresiones. La combinación de fichas de Cockatrice que hace card_search no se hace aquí.
CardApi::search limita el límite a TOPE_BUSQUEDA = 175 (client.rs), que equivale al tamaño de página de Scryfall; buscar_paginas sigue next_page solo hasta alcanzar limit. Consecuencia: en los sets con más de 175 cartas coincidentes, la rejilla muestra las primeras 175 y «Elegir todas» selecciona solo esas. Para conseguir el resto, usa el filtro de tipo para partir el set (por ejemplo criaturas y luego instantáneos). Deducido: la rejilla no tiene paginación ni control de «más» (no aparece ninguno en set-browser-dialog.tsx).
Los resultados de búsqueda se recuerdan en memoria durante una hora (VIDA_BUSQUEDA, busquedas.rs), así que volver a un set o a un tipo ya visto no vuelve a consultar a Scryfall.
Estado en Contenido: sets, filtroSet, set (el SetInfo seleccionado), tipo ("all" o un tipo en minúsculas), cartas, elegidas (Set<string> de ids de carta), cargando.
- Al montarse,
sets_listrellena la lista de la izquierda. Cada fila muestra el código en monoespaciada, el nombre ycardCount. El orden es el de Scryfall. - El campo de búsqueda filtra la lista cargada en el cliente: subcadena del nombre sin distinguir mayúsculas, o igualdad exacta con el código.
- Al pulsar un set (o cambiar el selector de tipo) se ejecuta un efecto que llama a
set_cards { code: set.code, typeFilter: tipo === "all" ? null : tipo }y limpia la selección. Una banderavigenteen la limpieza del efecto descarta las respuestas que llegan después de una petición más reciente.NotFoundno genera toast (rejilla vacía: «Sin resultados.»); los demás errores sí. - Opciones de tipo: all,
creature,instant,sorcery,artifact,enchantment,planeswalker,land,token. La opción «Fichas» filtra cont:token. - La rejilla es
RejillaCartasdentro delScrollAreapropio del diálogo, que publica su viewport medianteRaizScroll.Providerpara que las miniaturas solo se monten cerca del viewport. Pulsar una carta la alterna enelegidas. «Elegir todas» / «Ninguna» actúan solo sobre las cartas cargadas. - El pie muestra «N elegidas» y tres acciones, todas deshabilitadas con la selección vacía.
| Botón | Qué hace | Toca |
|---|---|---|
| «Reemplazar lista» | Escribe las cartas seleccionadas, una por línea, como el texto completo del cuadro de la lista | Solo deck.decklistText (mediante setSinHistorial); no se crea ninguna carta |
| «Añadir a la lista» | Añade las líneas al texto existente (se recortan los espacios finales, separador de nueva línea; si el texto está vacío, simplemente lo establece) | Solo deck.decklistText
|
| «Cargar cartas» | Cierra el diálogo y ejecuta cargarLista(texto, "anadir", t): resuelve las líneas y añade las cartas al mazo |
deck.cards; el cuadro de texto no se toca |
Los dos botones de lista anuncian «N cartas llevadas a la lista» y cierran el diálogo; el usuario pulsa entonces «Cargar lista» en el Panel de la lista del mazo (que reemplaza las cartas del mazo) o «Añadir» (que las añade). No hay forma de reemplazar directamente las cartas del mazo desde este diálogo: «Cargar cartas» siempre añade.
Cada línea que produce comoLista lleva la impresión exacta: 1 <name> (<SET>) <collectorNumber> con el código del set en mayúsculas. Motivo: un nombre a secas dejaría que el resolutor eligiera una impresión según la política de imágenes; con set y número se obtiene la impresión sobre la que el usuario hizo clic. La cantidad es siempre 1.
«Cargar cartas» pasa por el trabajo normal del resolutor (progreso en el pie del panel, cancelable, Busy si corre otro trabajo; toast de aviso para las líneas sin resolver), de modo que descarga las imágenes exactamente igual que pegar las mismas líneas. Usa las preferencias actuales de idioma y fichas del panel (useUi.lang, addTokens): con un idioma distinto del inglés cada impresión puede cambiarse por una traducida o recurrir al inglés, y con addTokens activado también se añaden las fichas creadas por las cartas cargadas. Detalles en Panel de la lista del mazo.
| Situación | Resultado |
|---|---|
| Sin red |
sets_list falla -> toast de error, lista vacía con indicador de carga; set_cards -> toast de error, rejilla vacía |
| Límite de peticiones |
RateLimited tras los reintentos (toast) |
| Set sin cartas para el filtro | Rejilla vacía, «Sin resultados.» |
| Cerrar durante una carga | La limpieza del efecto ignora la respuesta tardía; el contenido del diálogo se desmonta, así que no se filtra estado |
-
src-tauri/src/commands/cards.rs:el_set_y_el_tipo_no_dejan_colar_otra_consulta(saneado de la consulta). - No existe ningún fichero de Vitest para el diálogo;
comoListano se exporta, así que el formato de línea solo queda cubierto indirectamente por los tests del parser (véase Parseo de la lista del mazo).
- Paginación o «cargar el set entero»: amplía
set_cardspara seguir más páginas (necesitaría un límite superior aTOPE_BUSQUEDAensearch) y añade paginación o una acción de «más» enContenido. - Búsqueda por idioma o por todas las impresiones: pasa
prints = true(como hacecard_prints) y añade el filtro de idioma que ya ofreceFiltrosBusqueda. - Reemplazar las cartas del mazo desde aquí: reutiliza
cargarLista(texto, "reemplazar", t), teniendo en cuenta que el panel pide confirmación antes cuandopedirConfirmacionAlCargarestá activado.
Use and build · Uso y desarrollo
- User-Guide · Guía de usuario
- Development-Setup · Preparación del entorno de desarrollo
- Testing-and-CI · Tests y CI
- Releases-and-Auto-Updates · Versiones y actualizaciones automáticas
- Conventions · Convenciones
Architecture · Arquitectura
- Architecture · Arquitectura
- IPC-and-Error-Handling · IPC y manejo de errores
- Rust-App-Layer · Capa de aplicación Rust
Data · Datos
- Deck-Model · Modelo del mazo
- Storage-and-Blobs · Almacenamiento y blobs
- Deck-Package-Format · Formato del paquete de mazo
- Deck-Library · Biblioteca de mazos
Getting cards · Conseguir cartas
- Decklist-Parsing · Parseo de la lista del mazo
- Scryfall-Integration · Integración con Scryfall
- External-Sources · Fuentes externas
- Card-Identification-and-OCR · Identificación de cartas y OCR
Layout, images, PDF · Maquetación, imagen y PDF
- Layout-Engine · Motor de maquetación
- Imaging-and-PDF · Imagen y PDF
- Export · Exportación
- Live-Preview · Vista previa en vivo
- Statistics · Estadísticas
Card designer · Diseñador de cartas
- Designer-Overview · Visión general del diseñador
- Designer-Engine · Motor del diseñador
- Designer-Composition · Composición del diseñador
- Frame-Packs · Packs de marcos
- Designer-App-Layer · Capa de aplicación del diseñador
- Designer-UI · Interfaz del diseñador
- Card-Editor-Dialog · Diálogo Editar carta
Game table · Mesa de juego
Frontend · Frontend
- Frontend-Architecture · Arquitectura del frontend
- State-Stores · Stores de estado
- Internationalization · Internacionalización
- Themes-and-Skins · Temas y skins
- Settings-and-Shell · Ajustes y shell
- Tutorials · Tutoriales
- Decklist-Panel · Panel de la lista del mazo
- Add-Card-and-Variants · Añadir carta y variantes
- Set-Browser · Explorador de sets
Reference · Referencia