Skip to content

Explorador de sets

Pablo Martínez López edited this page Oct 20, 2026 · 1 revision

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.

Explorar sets

Ficheros y punto de entrada

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.

Comandos de Rust

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í.

El tope de 175 cartas

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.

Comportamiento del diálogo

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.

  1. Al montarse, sets_list rellena la lista de la izquierda. Cada fila muestra el código en monoespaciada, el nombre y cardCount. El orden es el de Scryfall.
  2. 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.
  3. 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 bandera vigente en la limpieza del efecto descarta las respuestas que llegan después de una petición más reciente. NotFound no genera toast (rejilla vacía: «Sin resultados.»); los demás errores sí.
  4. Opciones de tipo: all, creature, instant, sorcery, artifact, enchantment, planeswalker, land, token. La opción «Fichas» filtra con t:token.
  5. La rejilla es RejillaCartas dentro del ScrollArea propio del diálogo, que publica su viewport mediante RaizScroll.Provider para que las miniaturas solo se monten cerca del viewport. Pulsar una carta la alterna en elegidas. «Elegir todas» / «Ninguna» actúan solo sobre las cartas cargadas.
  6. El pie muestra «N elegidas» y tres acciones, todas deshabilitadas con la selección vacía.

Reemplazar frente a añadir

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.

Modos de fallo

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

Tests

  • 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; comoLista no 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).

Por dónde empezar para ampliarlo

  • Paginación o «cargar el set entero»: amplía set_cards para seguir más páginas (necesitaría un límite superior a TOPE_BUSQUEDA en search) y añade paginación o una acción de «más» en Contenido.
  • Búsqueda por idioma o por todas las impresiones: pasa prints = true (como hace card_prints) y añade el filtro de idioma que ya ofrece FiltrosBusqueda.
  • Reemplazar las cartas del mazo desde aquí: reutiliza cargarLista(texto, "reemplazar", t), teniendo en cuenta que el panel pide confirmación antes cuando pedirConfirmacionAlCargar está activado.

Véase también

Documentation · Documentación

Language: English · Español

Use and build · Uso y desarrollo

Architecture · Arquitectura

Data · Datos

Getting cards · Conseguir cartas

Layout, images, PDF · Maquetación, imagen y PDF

Card designer · Diseñador de cartas

Game table · Mesa de juego

Frontend · Frontend

Reference · Referencia

Clone this wiki locally