carousel — u_pbt_carousel #
← Referencia de componentes · Índice de la guía
carousel hace desfilar elementos de los que solo uno está al frente: el Cover Flow de iTunes — el elemento actual de frente, sus vecinos inclinados en perspectiva y superpuestos, un reflejo debajo —, una franja plana donde se ven enteros varios elementos, una pila de tarjetas, o un banner a toda la superficie que muestra un elemento a la vez. Cada elemento es una imagen, un texto enriquecido o una tarjeta (imagen, título, subtítulo, cuerpo escrito por una plantilla, etiquetas, insignia). El usuario hace clic en un vecino, desliza con inercia, gira la rueda, teclea las primeras letras de un título o usa el teclado;
ue_current_changedle dice qué elemento está al frente. El carrusel se llena a mano o desde un DataStore, y puede avanzar solo, con un botón PAUSA.
▶ Verlo en vivo — Aplicación de demostración, mosaico Carousel: la vista previa, el código que lo genera y esta página, uno al lado del otro.
De un vistazo #
| Userobject | u_pbt_carousel |
| Clase de elementos | n_pbt_carousel_item (of_item(key)) |
| Sirve para | Hojear portadas, productos, fotos, fichas, noticias o pasos de bienvenida |
| Principio | Un elemento tiene una clave única; solo uno está al frente a la vez, y se dibuja como imagen, texto o tarjeta |
| Opciones opt-in | ib_veto_changes, ib_loop, ib_reflection, il_autoplay_ms |
| Límite en modo demo | Los 6 primeros elementos visibles dibujados — véase el modo demo |
Inicio rápido #
// Three album covers : a key, a title, a picture
uo_covers.of_add_item(/*key*/ "c1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_covers.of_add_item(/*key*/ "c2", /*title*/ "Blue Hour", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-02")
uo_covers.of_add_item(/*key*/ "c3", /*title*/ "Evergreen", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-03")
// A reflection under the covers, as on a glossy floor
uo_covers.ib_reflection = true
// event ue_current_changed of uo_covers : (string as_from_key, string as_key)
// The album now in front, in the title of the window ("" : the carousel is empty)
if as_key <> "" then Parent.Title = this.of_item(/*key*/ as_key).is_title
Cuatro disposiciones, tres caras #
is_style elige la disposición: STYLE_COVERFLOW (por defecto) pone el elemento actual de frente e inclina sus vecinos en perspectiva, superpuestos, repartidos por el ancho disponible y más oscuros con la distancia (ii_angle, ii_spacing, ib_shade); STYLE_CAROUSEL alinea una franja plana donde se ven enteros varios elementos; STYLE_STACK apila tarjetas — la actual delante, las siguientes detrás, las anteriores apartadas a un lado; STYLE_HERO muestra un solo elemento en toda la superficie, el siguiente deslizándose o fundiéndose (is_transition): el banner de un cuadro de mando. Un mosaico conserva una proporción (is_item_ratio; vacío: 1:1 para imágenes, 3:4 para tarjetas, 16:9 para textos) y el contenido de una tarjeta o de un texto sigue su tamaño, entre un mínimo legible y un máximo. ib_reflection pone un reflejo bajo los elementos, ii_item_width e ii_item_height fijan el tamaño al píxel.
¿Por qué caras en lugar de componentes dentro del carrusel? Cada componente de la biblioteca es un control propio, con su propia página web (un WebView2): no puede alojarse en la página de otro. El carrusel dibuja pues por sí mismo lo que mostrarían una imagen, un statictext o una tarjeta del kanban — son las tres caras de un mismo elemento, y mil elementos cuestan un solo control. is_item_style elige la cara de todos los elementos, is_style de un elemento elige la suya (vacío: sigue al carrusel). Con ITEM_AUTO (por defecto), la cara se deduce de lo que el elemento lleva:
- una plantilla de tarjeta puesta (
is_card_template), o etiquetas, o a la vez una imagen y un texto → una tarjeta; - una imagen → una imagen, que llena el mosaico (
is_fit); su título y su subtítulo se convierten en el pie justo debajo, su insignia se posa en su esquina; - un texto solo → un texto: texto enriquecido con etiquetas sobre un panel con el tema, como un statictext; una zona
[action=x]lanzaue_action_clicked; - nada más que un título → una tarjeta.
of_item(key).of_face() dice la cara elegida. Una imagen es un archivo del equipo, un recurso archivo.dll:nombre, un glifo mono: o tint: dibujado con el tema, o una dirección https://; una dirección http:// se rechaza y lanza ue_image_failed con REASON_INSECURE, un archivo ausente con REASON_NOT_FOUND.
// The covers as a pile of cards, the whole picture in each tile
uo_covers.is_style = u_pbt_carousel.STYLE_STACK
uo_covers.is_fit = u_pbt_carousel.FIT_CONTAIN
// This item is a card, whatever it holds
uo_covers.of_item(/*key*/ "c2").is_style = u_pbt_carousel.ITEM_CARD
Una fila alineada al inicio #
En una franja plana (STYLE_CAROUSEL), is_align = ALIGN_START da la fila de un servicio de vídeo: los elementos parten del borde de inicio (el derecho en lectura de derecha a izquierda), todos enteros y planos, y la última pantalla está llena — ningún hueco tras el último elemento; un elemento cortado por un borde invita a desplazarse. El elemento actual ya no está en el centro: es el que el usuario eligió, siempre entero en pantalla. Las flechas y Re Pág / Av Pág avanzan una pantalla (los elementos que muestra enteros) y el elemento actual pasa a ser el primero que la pantalla trajo; las teclas de flecha avanzan un elemento y solo desplazan lo necesario para mantenerlo entero; la rueda y el arrastre desplazan y se posan en un elemento entero, el elemento actual solo sigue si iba a salir; un clic en un elemento entero lo hace actual y lanza ue_item_clicked. Las flechas viven en los márgenes, solo se muestran bajo el puntero o con el teclado, y desaparecen en un extremo. Los puntos cuentan pantallas (un punto es un lugar donde la franja puede posarse); el contador sigue contando elementos. La reproducción automática avanza una pantalla y, al final, la primera pantalla vuelve por el lado. Con ib_loop, la fila da la vuelta cuando es lo bastante larga para dar la vuelta a la pantalla (unos tres elementos más de los que muestra). ALIGN_START no tiene efecto en las demás disposiciones.
// The row of a video service : the covers from the start edge, a screen at a time
uo_covers.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_covers.is_align = u_pbt_carousel.ALIGN_START
// Small covers : the row holds several screens
uo_covers.ii_item_height = 150
El elemento al frente #
El elemento actual es el que está al frente; of_current_key() lee su clave en directo. Un clic en un vecino lo trae al frente; un clic en el elemento al frente lanza ue_item_clicked, un doble clic (o Intro) ue_item_opened. Un cambio del usuario — clic, teclado, rueda, deslizamiento, punto, flecha, reproducción automática — y un cambio de su código (of_select_item, of_next, of_previous) lanzan el mismo ue_current_changed, como SelectItem lanza el evento del clic. Con ib_veto_changes, ue_current_changing se plantea antes, en ambos casos: devolver FALSE deja el elemento al frente, y of_select_item devuelve entonces -4. ue_current_changed se lanza también cuando el elemento al frente se va (oculto, quitado: el más cercano ocupa su lugar) y cuando el primer elemento llega a un carrusel vacío (as_from_key vacío). Una orden de su código dentro de ue_current_changing (otro elemento seleccionado) prevalece: la respuesta que sigue ya no cambia nada. of_select_row trae al frente el elemento de una fila y of_current_row lee la fila del elemento al frente; con ib_sync_row, el DataWindow dado a of_from_datastore sigue al elemento al frente — el maestro-detalle de un DataWindow.
Un elemento desactivado (ib_enabled = false) se queda en su lugar, pero el usuario no puede ni traerlo al frente ni hacer clic en él: el teclado, la rueda, Re Pág / Av Pág, la barra de desplazamiento y un lanzamiento lo saltan; su código lo selecciona de todos modos. Un elemento oculto (ib_visible = false) sale del carrusel conservando su clave y su lugar. Con ib_loop (tres elementos como mínimo), el primero sigue al último. Un doble clic en un vecino lo trae al frente y se detiene ahí: ni ue_item_clicked ni ue_item_opened. il_autoplay_ms hace avanzar el carrusel solo, cada tantos milisegundos (500 como mínimo): un botón PAUSA / REPRODUCIR aparece debajo (ib_autoplay_button) y la pausa del usuario se mantiene hasta REPRODUCIR (of_pause, of_play, ue_autoplay_changed); también se interrumpe bajo el puntero, mientras el teclado está en el componente y mientras el carrusel está oculto. Al final de un carrusel sin bucle, el primer elemento vuelve por un lado. Cada paso pasa por ue_current_changing como un gesto: un elemento rechazado se salta, se pregunta por el siguiente. A un lector de pantalla no se le avisa de cada paso durante la reproducción.
Tarjetas y pie escritos por plantilla #
Una tarjeta muestra su imagen arriba, su título (is_title), su subtítulo (is_subtitle), su cuerpo (is_text), sus etiquetas (is_tags, separadas por comas, coloreadas por is_tag_tones: New=success|Sale=danger) y una insignia (is_badge). El cuerpo de todas las tarjetas puede escribirse con una plantilla, is_card_template, y el pie bajo el carrusel con is_caption_template: texto enriquecido con etiquetas donde {price} es un campo del elemento — uno de los suyos (of_set_field), una columna del DataStore del que procede, o un campo integrado (key, title, subtitle, text, image, badge, tags, position, count). {position} y {count} cuentan los elementos dibujados, como el contador. {sold:dd/mm/yyyy hh:mm} escribe una fecha o una fecha-hora, {price:#,##0.00} un número: los formatos de visualización de una columna de DataWindow (mm tras una hora = los minutos, [shortdate], [longdate], [time], secciones positivo;negativo;cero), en el idioma de visualización — un valor que el formato no sabe escribir se muestra tal cual. {?x}…{/x} conserva un fragmento cuando el campo dice algo, {!x}…{/x} cuando no dice nada, {{ }} son llaves. Un valor se muestra tal cual, nunca se lee como etiquetas; {x:raw} lo conserva como etiquetas — resérvelo a sus propios campos: en una columna de base de datos leería el dato como etiquetas, zonas de acción incluidas. {title}, {subtitle}, {text} y {badge} escritos por su código son etiquetas, como en el pie; leídos de una columna, texto.
// A price, a field of our own, then the body of every card
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "{?price}From [b]{price}[/b]{/price}{!price}Price on request{/price}"
// Under the carousel : the place of the item in front, then its title
uo_shop.is_caption_template = "{position} / {count} - [b]{title}[/b]"
Desde un DataStore #
of_from_datastore hace un elemento de cada fila de un DataStore, de un DataWindow o de un DataWindowChild — la misma llamada. Su clave es el RowID de la fila — nombra su fila mientras el DataStore no se vacíe ni se vuelva a leer (Reset, Retrieve e ImportString vuelven a dar los RowID 1, 2, 3), y of_item(key).of_row() la encuentra — o el valor de la columna ROLE_KEY, la clave que hay que dar en cuanto se refresca. Una fila cuya clave está vacía, no es válida, ya se vio o está tomada por un elemento añadido a mano no se carga: la llamada devuelve 0 y of_get_last_error la nombra — dé a sus elementos a mano claves que no sean números. Una columna desempeña un rol cuando se llama como él (key, title, subtitle, text, image, badge, tags, color) o cuando of_map lo dice; la columna ROLE_COLOR (un RGB() o #rrggbb) pinta la franja de una tarjeta. of_map y of_reload_row actualizan los elementos en su sitio (indicadores, campos, handle y lugar se quedan). También una segunda carga, con ROLE_KEY: un elemento cuya clave vuelve conserva sus indicadores, sus campos y su handle. Sin ROLE_KEY, una segunda carga es una nueva época: un RowID que vuelve puede nombrar otro registro, cada elemento de las filas se rehace (nada se hereda, los handles de los antiguos se liberan) y, si la clave al frente vuelve, ue_current_changed lo dice con as_from_key = as_key. En todos los casos los elementos toman el orden de las filas (un of_move_item no sobrevive a una carga), los de las filas desaparecidas se van, los añadidos a mano se quedan, después de las filas; un elemento de fila quitado con of_remove_item vuelve con su fila — mejor ocúltelo (ib_visible). Las fechas se leen en el orden regional del puesto, los números se escriben con punto, los valores CHAR sin su relleno, en la carga como tras of_reload_row. Lo que da una columna es texto, nunca etiquetas — un [action=x] llegado de la base de datos no es clicable —, y una imagen de una columna nunca va a buscar una ruta de red (\\servidor\recurso: ue_image_failed con REASON_UNC). Cuando la columna ROLE_KEY de una fila releída cambia, el elemento toma la nueva clave: el handle de la antigua se libera. Todas las columnas son campos de las plantillas.
// The rows of the albums : columns named title and subtitle play their role
ids_albums.Retrieve()
// The picture is in a column with another name
uo_covers.of_map(/*role*/ u_pbt_carousel.ROLE_IMAGE, /*column*/ "cover_file")
// One item per row, its key the RowID of the row
uo_covers.of_from_datastore(/*ads*/ ids_albums)
// Master-detail : the DataWindow follows the item in front, and the carousel reads its rows
uo_covers.ib_sync_row = true
uo_covers.of_from_datastore(/*adw*/ dw_albums)
// event rowfocuschanged of dw_albums : the item of the row comes in front
uo_covers.of_select_row(/*row*/ currentrow)
Propiedades #
| Propiedad | Tipo | Predeterminado | Función | ||
|---|---|---|---|---|---|
is_style | string | STYLE_COVERFLOW | La disposición: STYLE_COVERFLOW (el actual de frente, sus vecinos inclinados en perspectiva), STYLE_CAROUSEL (una franja plana, varios elementos enteros), STYLE_STACK (una pila de tarjetas), STYLE_HERO (un solo elemento en toda la superficie, un banner). Otro valor se rechaza: el antiguo se queda, of_get_last_error dice por qué | ||
is_item_style | string | ITEM_AUTO | La cara de cada elemento que no elige una por sí mismo: ITEM_AUTO (según lo que lleva, ver más arriba), ITEM_IMAGE, ITEM_TEXT, ITEM_CARD. Otro valor se rechaza | ||
is_fit | string | FIT_COVER | Cómo una imagen llena su mosaico: FIT_COVER (el mosaico está lleno, la imagen recortada) o FIT_CONTAIN (la imagen entera). Otro valor se rechaza | ||
ib_reflection | boolean | false | Un reflejo bajo los elementos, como sobre un suelo brillante | ||
ib_loop | boolean | false | Tras el último elemento viene el primero (y antes del primero, el último). Hacen falta tres elementos como mínimo | ||
il_autoplay_ms | long | 0 | Reproducción automática: el elemento siguiente viene al frente cada il_autoplay_ms milisegundos (500 como mínimo, un valor menor se sube a él); 0 la detiene. Un botón PAUSA / REPRODUCIR aparece bajo el carrusel (ib_autoplay_button); también se interrumpe bajo el puntero, mientras el teclado está en el componente y mientras el carrusel está oculto. Al final de un carrusel sin bucle, el primero vuelve por un lado; un elemento que ue_current_changing rechaza se salta | ||
ib_show_caption | boolean | true | El pie del elemento al frente: su título (y su subtítulo), subrayado con el acento, o lo que escribe is_caption_template; se sitúa justo debajo o sobre su base (is_caption_position) | ||
is_caption_position | string | CAPTION_AUTO | Dónde se sitúa el pie: CAPTION_BELOW (justo debajo del elemento al frente, bajo su reflejo si lo tiene), CAPTION_OVERLAY (sobre su base, en blanco sobre un velo oscuro), CAPTION_AUTO (bajo una imagen — sobre su base en un banner —, y ninguno bajo tarjetas o textos que ya escriben su título, salvo que is_caption_template diga qué escribir). Otro valor se rechaza | ||
ib_autoplay_button | boolean | true | Un botón PAUSA / REPRODUCIR bajo el carrusel mientras il_autoplay_ms gira, y una fina barra que se llena hasta el próximo elemento: quien lee puede detener lo que se mueve. La pausa del usuario se mantiene hasta REPRODUCIR; ue_autoplay_changed lo dice. false: sin botón | ||
is_indicator | string | INDICATOR_AUTO | Lo que muestra dónde se está, bajo el pie: INDICATOR_AUTO (puntos hasta 12 elementos, una barra de desplazamiento más allá), INDICATOR_DOTS (puntos en los que se puede hacer clic, hasta 48 elementos: más allá, la barra), INDICATOR_SCROLLBAR (una barra que se pulsa y se arrastra), INDICATOR_COUNTER (3 / 12), INDICATOR_NONE. Otro valor se rechaza | ||
ib_arrows | boolean | true | Los dos botones de flecha a los lados: el de la izquierda va siempre hacia la izquierda | ||
ii_item_width | integer | 0 | La anchura de un mosaico, en píxeles (de 24 a 4000, un valor fuera se devuelve dentro); 0: según el tamaño del componente e is_item_ratio. Una anchura puesta con una altura 0: la altura sigue la proporción. Sin efecto en STYLE_HERO: su elemento ocupa toda la superficie | ||
ii_item_height | integer | 0 | La altura de un mosaico, en píxeles (de 24 a 4000); 0: según el tamaño del componente, dejando ver los vecinos y el pie. Una altura puesta con una anchura 0: la anchura sigue la proporción. Sin efecto en STYLE_HERO | ||
is_item_ratio | string | "" | La proporción de un mosaico, anchura:altura: "1:1", "3:4", "16:9"… El mosaico la conserva sea cual sea el tamaño del componente. Vacío: según la cara de la mayoría de los elementos — 1:1 para imágenes, 3:4 para tarjetas, 16:9 para textos. Un valor que no sea dos números positivos unidos por : se rechaza. Sin efecto en STYLE_HERO | ||
ii_angle | integer | 62 | El giro de las portadas a los lados del Cover Flow, en grados, de 0 (planas) a 80; 62 es el de iTunes | ||
ii_spacing | integer | 100 | La separación de las portadas del Cover Flow y de los mosaicos de una franja, en porcentaje de lo que calcula el carrusel: 100 reparte las portadas por el ancho disponible, de 25 a 300 las junta o las separa | ||
ib_shade | boolean | true | Las portadas a los lados se oscurecen con su distancia, para que el elemento al frente atraiga la mirada; las tarjetas que esperan detrás de una pila también | ||
is_transition | string | TRANSITION_SLIDE | Cómo un banner (STYLE_HERO) cambia de elemento: TRANSITION_SLIDE (el siguiente se desliza desde un lado) o TRANSITION_FADE (aparece fundiéndose). Otro valor se rechaza | ||
is_align | string | ALIGN_CENTER | Dónde está el elemento actual en una franja (STYLE_CAROUSEL): ALIGN_CENTER (en el centro) o ALIGN_START (la fila de un servicio de vídeo, alineada al borde de inicio, que avanza una pantalla: ver más arriba). Sin efecto en las demás disposiciones. Otro valor se rechaza | ||
is_card_template | string | "" | El cuerpo de cada tarjeta, escrito por una plantilla (ver más arriba). Poner una plantilla hace de cada elemento ITEM_AUTO una tarjeta. Vacío: el texto del elemento (is_text) | ||
is_caption_template | string | "" | El pie bajo el carrusel, escrito por una plantilla (los mismos campos). Vacío: el título, y el subtítulo debajo | ||
is_tag_tones | string | "" | El tono de cada etiqueta, etiqueta=tono unidos por ` | : New=success | Sale=danger. Tonos: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (el acento), TONE_NEUTRAL`. Una etiqueta no listada, o un tono desconocido, es neutra |
is_badge_format | string | "" | El formato de visualización de las insignias que son un número o una fecha — una columna ROLE_BADGE del DataStore, o un valor que su código escribe: "$#,##0.00", "dd/mm/yyyy", el formato de una columna de DataWindow, en el idioma de visualización. Una insignia que no es ninguna de las dos cosas (etiquetas, una palabra) se muestra tal cual. Vacío: cada insignia tal cual | ||
ib_sync_row | boolean | false | Maestro-detalle: el DataWindow (o DataWindowChild) dado a of_from_datastore sigue al elemento al frente — ScrollToRow en su fila a cada cambio, gesto o código. En el otro sentido, llame a of_select_row desde su RowFocusChanged. Un DataStore no tiene fila que mostrar: nada se mueve; un elemento añadido a mano no tiene fila | ||
ib_veto_changes | boolean | false | Opt-in: preguntar ue_current_changing antes de cada cambio del elemento al frente, del usuario, de la reproducción automática como de of_select_item. La reproducción automática salta un elemento rechazado; el teclado se queda donde está — un elemento siempre rechazado mejor desactivarlo. Una orden de su código en ue_current_changing prevalece: la respuesta que sigue no cambia nada. Desactivado por defecto, como todo evento cancelable de la biblioteca | ||
ib_animated | boolean | true | Los elementos se deslizan hasta su nuevo lugar. Un puesto configurado para reducir las animaciones salta directamente, salvo que la aplicación insista (PBT_SetAnimationPolicy) | ||
ii_anim_duration | integer | 450 | Duración de un movimiento, en milisegundos (de 0 a 5000) | ||
is_anim_easing | string | EASING_EASE_OUT | La curva del movimiento: EASING_LINEAR, EASING_EASE_OUT, EASING_BACK_OUT (se pasa un poco y vuelve), EASING_BOUNCE_OUT (rebota), EASING_ELASTIC_OUT (oscila) | ||
ib_enabled | boolean | true | false desactiva el carrusel: los elementos siguen visibles, ya nada responde al usuario (clic, teclado, rueda, deslizamiento, reproducción automática) | ||
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio | ||
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio | ||
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) | ||
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente | ||
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) | ||
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) | ||
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Propiedades de un elemento — n_pbt_carousel_item #
Su handle, mediante of_item(key). Una lectura pregunta al carrusel cómo está ahora.
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_title | string | "" | Título del elemento: el pie cuando está al frente, y la primera línea de una tarjeta. Acepta el texto enriquecido con etiquetas. Vacío, el elemento muestra su clave |
is_subtitle | string | "" | La segunda línea, bajo el título de una tarjeta y del pie (etiquetas aceptadas). Una imagen con subtítulo sigue siendo una imagen: el subtítulo va a su pie |
is_text | string | "" | El texto (etiquetas aceptadas): toda la cara de un elemento de texto, el cuerpo de una tarjeta mientras is_card_template esté vacío. Una zona [action=x] lanza ue_action_clicked en el elemento al frente |
is_image | string | "" | La imagen: un archivo del equipo, un recurso archivo.dll:nombre, un glifo mono: / tint: dibujado con el tema, una dirección https://. http:// se rechaza (ue_image_failed, REASON_INSECURE), y también una ruta de red venida de una columna de DataStore (REASON_UNC). Un esqueleto con el tema se muestra mientras llega la imagen |
is_badge | string | "" | Pequeña insignia (etiquetas aceptadas): un precio, un número, en el acento — arriba a la derecha de una tarjeta, sobre la esquina de una imagen. Una imagen con insignia sigue siendo una imagen |
is_tags | string | "" | Etiquetas de una tarjeta, separadas por comas: Vinyl, Sale. Cada una es una pastilla coloreada por is_tag_tones del carrusel |
is_style | string | "" | La cara de este elemento (ITEM_* de u_pbt_carousel); vacío: sigue is_item_style del carrusel. Otro valor se rechaza: el anterior se queda, of_get_last_error del carrusel dice por qué |
ib_visible | boolean | true | false quita el elemento del carrusel; conserva su clave y su lugar. Si estaba al frente, el más cercano ocupa su lugar (ue_current_changed) |
ib_enabled | boolean | true | false desactiva el elemento: el usuario no puede ni traerlo al frente ni hacer clic en él, el teclado y la rueda lo saltan. Su código lo selecciona de todos modos |
of_position ( ) → long | — | — | Devuelve el lugar del elemento en el carrusel ahora, contado desde 1 (elementos ocultos incluidos); 0 cuando el carrusel no lo contiene |
of_row ( ) → long | — | — | Devuelve el número de fila de hoy, en las filas dadas a of_from_datastore, de la fila de la que viene el elemento — tras una ordenación, un filtro o la eliminación de otras filas, mientras el DataStore no se vacíe ni se vuelva a leer; 0 para un elemento añadido a mano o cuya fila ha desaparecido |
of_face ( ) → string | — | — | La cara con la que se dibuja el elemento ahora: "image", "text" o "card" (ITEM_IMAGE, ITEM_TEXT, ITEM_CARD) — lo que eligió is_style o lo que dedujo ITEM_AUTO; vacío cuando el carrusel no lo contiene |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el item |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido del item (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido del item (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido del item |
il_accent | long | -1 | Acento del elemento: la franja de arriba de una tarjeta (que hace aparecer) y de un panel de texto, y la insignia, lo toman; prevalece sobre el color de una columna ROLE_COLOR. Los puntos y el pie mantienen el acento del componente. -1 = el del componente |
il_back_color | long | -1 | Fondo de una cara de texto o de tarjeta, en RGB(r,g,b) (-1 = lo que da el tema). Una cara de imagen no tiene fondo |
il_text_color | long | -1 | Color del texto de una cara de texto o de tarjeta (-1 = lo que da el tema) |
il_back_color_hover | long | -1 | Fondo de una cara de texto o de tarjeta bajo el puntero, en RGB(r,g,b) (-1 = su fondo habitual). Nada se mueve al pasar el ratón : solo cambia el color |
il_text_color_hover | long | -1 | Color del texto de una cara de texto o de tarjeta bajo el puntero (-1 = su color habitual) |
Tres lecturas del handle, solo lectura: of_position() devuelve el lugar del elemento desde 1, of_row() el número de su fila en el DataStore (0 para un elemento añadido a mano), of_face() la cara elegida. Un elemento se mueve con of_move_item del carrusel.
Métodos #
| Método | Función | |
|---|---|---|
of_add_item (string as_key, string as_title) | Añade un elemento al final del carrusel, un título solo (una tarjeta): su imagen, su texto, su subtítulo… se ponen en su handle. Su clave es única en el carrusel. El primer elemento de un carrusel vacío viene al frente (ue_current_changed). Devuelve 0 una vez añadido, -5 para una clave vacía, con / o ` | , que empieza por __, o ya ocupada (elementos de un DataStore incluidos), -2` cuando el componente no está creado |
of_add_item (string as_key, string as_title, string as_image) | Lo mismo con su imagen. Con ITEM_AUTO, una imagen y un título solos hacen un elemento imagen, el título como pie. Devuelve 0 una vez añadido, -5 como arriba, -2 cuando el componente no está creado | |
of_clear ( ) | Vacía el carrusel: elementos (los de un DataStore incluidos) y sus handles; el DataStore sigue enlazado para un nuevo of_from_datastore, las opciones se quedan. Sigue ue_current_changed, con una clave vacía, si había un elemento al frente. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado | |
of_current_key ( ) | La clave del elemento al frente, sea quien sea quien lo haya traído; vacía cuando el carrusel está vacío. Leída en directo | |
of_current_row ( ) | El número de fila de hoy, en las filas dadas a of_from_datastore, del elemento al frente — tras una ordenación, un filtro o la eliminación de otras filas. Devuelve 0 cuando el carrusel está vacío, cuando el elemento al frente se añadió a mano o su fila ha desaparecido | |
of_from_datastore (datastore ads) | Hace un elemento de cada fila del DataStore (ver más arriba). Una segunda carga actualiza los elementos en su sitio con ROLE_KEY, los rehace sin ella (una nueva época: nada se hereda); los de las filas desaparecidas se van (handles liberados), los añadidos a mano se quedan, después de las filas; una fila no cargada la nombra of_get_last_error. Devuelve 0 una vez cargado, -5 cuando el DataStore no es válido, -2 cuando el componente no está creado | |
of_from_datastore (datawindow adw) | Lo mismo desde las filas de un DataWindow, leídas por un DataStore que las comparte (ShareData). Devuelve 0 una vez cargado, -5 cuando el DataWindow no es válido o se niega a compartir sus filas (of_get_last_error lo dice), -2 cuando el componente no está creado | |
of_from_datastore (datawindowchild adwc) | Lo mismo desde las filas de un DataWindowChild (una lista desplegable DataWindow, un informe anidado). Devuelve 0 una vez cargado, -5 cuando no es válido, -2 cuando el componente no está creado | |
of_get_field (string as_key, string as_field) | Lee un campo de un elemento, en directo: uno de los suyos, una columna de su DataStore o un campo integrado (title, position, count…). Una cadena vacía cuando no tiene | |
of_get_last_error ( ) | Por qué falló la última llamada: un método que devolvió -5 o -4, un valor rechazado (is_style, is_item_style, is_indicator, is_fit, is_caption_position, is_transition, is_item_ratio, is_align, is_style de un elemento), una llamada hecha durante una espera (nada pudo juzgarse), las filas que una carga dejó fuera. Vaciado por cada método que actúa (una lectura lo deja); si no, el último error de la biblioteca | |
of_insert_item (string as_key, string as_title, string as_image, long al_position) | Añade un elemento en un lugar contado desde 1 (más allá del último: al final). El elemento al frente se queda al frente. Devuelve 0 una vez añadido, -5 como of_add_item, -2 cuando el componente no está creado | |
of_is_playing ( ) | TRUE mientras la reproducción automática está en marcha: il_autoplay_ms está puesto y nadie pulsó PAUSA (un puntero sobre el carrusel la suspende un instante: sigue en marcha). Leído en directo | |
of_item (string as_key) | Devuelve el handle de un elemento (creado en el primer acceso, liberado cuando se quita el elemento) | |
of_map (string as_role, string as_column) | Da un rol a una columna del DataStore cuando su nombre no lo dice (ROLE_KEY, ROLE_TITLE, ROLE_SUBTITLE, ROLE_TEXT, ROLE_IMAGE, ROLE_BADGE, ROLE_TAGS, ROLE_COLOR). Antes o después de of_from_datastore: después, las filas se vuelven a leer en su sitio. Una columna vacía devuelve el rol a la columna que se llama como él; un nuevo ROLE_KEY da nuevas claves a los elementos (los handles de las antiguas se liberan). Devuelve 0 una vez fijado, -5 para un rol desconocido o una columna que el DataStore no tiene, -2 cuando el componente no está creado | |
of_move_item (string as_key, long al_position) | Mueve un elemento a un lugar contado desde 1 (más allá del último: el último). El elemento al frente se queda al frente. Devuelve 0 una vez movido, -5 para un elemento desconocido, -2 cuando el componente no está creado | |
of_next ( ) | Trae al frente el elemento siguiente (los desactivados se saltan; tras el último, el primero con ib_loop), como la tecla de flecha hacia él (Derecha, Izquierda de derecha a izquierda), y lanza ue_current_changed. Devuelve 0 una vez hecho (también al final: nada se mueve, nada se lanza), -4 cuando ue_current_changing rechazó, -5 durante una espera (nada pudo juzgarse), -2 cuando el componente no está creado | |
of_pause ( ) | Pausa la reproducción automática, como el botón PAUSA: el elemento al frente se queda hasta of_play (o REPRODUCIR). Sigue ue_autoplay_changed — una orden del código lo lanza como el botón. Devuelve 0 una vez en pausa (también si ya lo está: nada se lanza), -5 cuando il_autoplay_ms vale 0, -2 cuando el componente no está creado | |
of_play ( ) | Reanuda la reproducción automática tras una pausa — el botón PAUSA del usuario u of_pause. Sigue ue_autoplay_changed. Devuelve 0 una vez reanudada (también si ya está en marcha: nada se lanza), -5 cuando il_autoplay_ms vale 0 (nada que reproducir), -2 cuando el componente no está creado | |
of_previous ( ) | Trae al frente el elemento anterior, como la tecla de flecha hacia él. Devuelve 0 una vez hecho (también al principio: nada se mueve, nada se lanza), -4 cuando ue_current_changing rechazó, -5 durante una espera, -2 cuando el componente no está creado | |
of_reload_row (long al_row) | Vuelve a enviar al carrusel una fila del DataStore de of_from_datastore, leída ahora, después de que su código la haya cambiado (SetItem, una ventana de edición); su elemento se actualiza en su sitio (indicadores, campos, handle y lugar se quedan). Una fila que el carrusel aún no tiene (InsertRow) llega tras el último elemento de fila. Cuando la columna ROLE_KEY de la fila ha cambiado, el elemento toma la nueva clave: el handle de la antigua se libera y, si estaba al frente, ue_current_changed lo dice. Devuelve 0 una vez enviada, -5 cuando nada está enlazado, la fila no existe o su clave está vacía, no es válida o la tiene otro elemento (of_get_last_error lo dice), -2 cuando el componente no está creado | |
of_remove_item (string as_key) | Quita un elemento y libera su handle; quitar el elemento al frente trae al frente el más cercano (ue_current_changed). Un elemento de fila de un DataStore vuelve con su fila (of_reload_row, una nueva carga): ocúltelo (ib_visible) o elimine la fila. Devuelve 0 una vez quitado, -5 para un elemento desconocido, -2 cuando el componente no está creado | |
of_reset ( ) | Vacía el carrusel, olvida el DataStore y devuelve cada propiedad a su valor por defecto. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado | |
of_select_item (string as_key) | Trae un elemento al frente, como un clic: se desliza hasta allí y sigue ue_current_changed. Con ib_veto_changes, ue_current_changing se plantea primero. Un elemento desactivado se selecciona de todos modos: la desactivación detiene al usuario, no a su código. Devuelve 0 una vez hecho (o ya al frente: no se lanza nada), -4 cuando ue_current_changing ha rechazado, -5 para un elemento desconocido o no dibujado (oculto, más allá del límite demo), -2 cuando el componente no está creado | |
of_select_row (long al_row) | Trae al frente el elemento de una fila de las filas dadas a of_from_datastore — al_row es el número de fila de hoy, diga lo que diga ROLE_KEY: el maestro-detalle de un DataWindow, llamado desde su RowFocusChanged. Como of_select_item sobre su clave: sigue ue_current_changed, ib_veto_changes pregunta primero. Devuelve 0 una vez al frente (o ya al frente), -4 cuando ue_current_changing ha rechazado, -5 cuando nada está enlazado, la fila no existe o no dio ningún elemento (dejada fuera por la carga, quitada, oculta, más allá del límite demo), -2 cuando el componente no está creado | |
of_set_field (string as_key, string as_field, string as_value) | Da a un elemento un campo suyo, para las plantillas: {price}; prevalece sobre una columna del DataStore del mismo nombre. Un nombre de campo: letras, cifras y _, sin cifra inicial. Devuelve 0 una vez fijado, -5 para un elemento desconocido o un nombre no válido, -2 cuando el componente no está creado |
Eventos #
| Evento | Se activa cuando |
|---|---|
ue_current_changed (string as_from_key, string as_key) | El elemento al frente ha cambiado: un clic en un vecino, el teclado, la rueda, un deslizamiento, un punto, una flecha, la reproducción automática, o su código (of_select_item, of_next, of_previous). También cuando el elemento al frente se va (oculto, quitado: el más cercano ocupa su lugar) cuando el primer elemento llega a un carrusel vacío (as_from_key vacío), y cuando una nueva carga sin ROLE_KEY da la clave al frente a otro registro (as_from_key = as_key). as_key vacío: el carrusel está vacío. Con ib_sync_row, el DataWindow enlazado ya muestra la fila |
ue_current_changing (string as_from_key, string as_key) → boolean | Cancelable, planteado antes de un cambio del elemento al frente, solo cuando ib_veto_changes = true: gesto, reproducción automática y of_select_item (así pues of_next, of_previous). Devolver FALSE deja el elemento al frente, y of_select_item devuelve entonces -4. Por defecto: TRUE |
ue_item_clicked (string as_key) | Se hizo clic en el elemento al frente (o se pulsó Espacio). Un clic en un vecino lo trae al frente en su lugar (ue_current_changed) — y un doble clic en un vecino solo lo trae, sin este evento; una zona [action=x] lanza ue_action_clicked en su lugar; un elemento desactivado no lanza nada |
ue_item_opened (string as_key) | Un doble clic en el elemento al frente, o Intro: ábralo. Un doble clic en un vecino solo lo trae al frente |
ue_item_rclicked (string as_key, long al_x, long al_y) | Un clic derecho en un elemento, o la tecla de menú (o Mayús + F10) en el elemento al frente. al_x, al_y son píxeles de pantalla; para un menú PowerBuilder, PopMenu(PointerX(), PointerY()) de su ventana |
ue_action_clicked (string as_key, string as_action) | Se ha hecho clic en una zona [action=x] del texto del elemento al frente: as_action = "x" |
ue_autoplay_changed (boolean ab_playing) | La reproducción automática se pausó (ab_playing = false) o se reanudó (true): el botón PAUSA / REPRODUCIR bajo el carrusel, o su código (of_pause, of_play también lo lanzan). Un puntero sobre el carrusel la suspende sin lanzarlo |
ue_image_failed (string as_key, string as_reason) | La imagen de un elemento no pudo mostrarse: as_reason vale REASON_INSECURE (una dirección http://), REASON_UNC (una ruta de red venida de una columna de DataStore, rechazada antes de toda petición) o REASON_NOT_FOUND (archivo no encontrado). Dicho una vez por elemento y por imagen |
ue_ready ( ) | El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido |
ue_runtime_missing ( ) | El runtime WebView2 está ausente: el componente permanece vacío |
ue_bg_color (long al_color) | El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor) |
Teclado y ratón #
- Clic en un vecino: viene al frente; en el elemento al frente:
ue_item_clicked; doble clic:ue_item_opened(en un vecino: viene al frente, nada más); clic derecho:ue_item_rclicked. - Arrastrar o deslizar: la franja sigue al puntero; al soltar, su velocidad la lleva unos elementos más allá. Sin
ib_loop, los bordes son elásticos. Soltado fuera del carrusel, el arrastre termina igualmente. - Rueda: sigue su velocidad — una muesca, un elemento; un gran giro, varios; un panel táctil acumula sus pequeños pasos.
- Izquierda / Derecha: el elemento anterior, el siguiente — invertidas en una aplicación de derecha a izquierda; Arriba / Abajo: lo mismo; Inicio / Fin: el primero, el último; Re Pág / Av Pág: de tantos elementos como muestra la escena. Los elementos desactivados se saltan, en todas partes.
- Las primeras letras de un título lo traen al frente (mayúsculas y acentos ignorados); la misma letra otra vez va al siguiente que empieza por ella.
- Intro:
ue_item_opened; Espacio:ue_item_clicked; tecla Menú o Mayús + F10:ue_item_rclickedsobre el elemento al frente. - Las flechas laterales (
ib_arrows, en sus canaletas: no cubren ningún mosaico), los puntos y la barra de desplazamiento (is_indicator) se pulsan; la barra también se arrastra. El botón PAUSA / REPRODUCIR (ib_autoplay_button) se pulsa o se alcanza con el teclado. - El carrusel es una parada de la tecla Tab (dos con el botón PAUSA); un anillo del acento rodea el elemento al frente mientras el teclado está en él.
Ejemplos #
Un escaparate de productos #
// A flat strip : several products in full, a counter under it
uo_shop.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_shop.is_indicator = u_pbt_carousel.INDICATOR_COUNTER
// A product : a picture and a title, then a badge and tags (it becomes a card)
uo_shop.of_add_item(/*key*/ "p1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_shop.of_item(/*key*/ "p1").is_badge = "New"
uo_shop.of_item(/*key*/ "p1").is_tags = "Vinyl, Sale"
// The tone of each tag, and the price in the body of every card
uo_shop.is_tag_tones = "Vinyl=info|Sale=danger"
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "From [b]{price}[/b]"
Preguntar antes de cambiar de elemento #
// Once : ask before the item in front changes
uo_covers.ib_veto_changes = true
// event ue_current_changing of uo_covers : not while the form beside it is not saved
if ib_unsaved then return false
return true
Abrir un elemento de un DataStore en su ventana #
// Local variables
long ll_row
// event ue_item_opened of uo_covers : the row of the item, edited in a RESPONSE window (the code waits for it)
ll_row = uo_covers.of_item(/*key*/ as_key).of_row()
OpenWithParm(w_album_edit, ll_row)
// The row may have changed : the item follows it
uo_covers.of_reload_row(/*row*/ ll_row)
Noticias que avanzan solas #
// A banner : one item on the whole surface
uo_news.is_style = u_pbt_carousel.STYLE_HERO
// Text items : rich text on a themed panel, with an [action] zone
uo_news.of_add_item(/*key*/ "n1", /*title*/ "Release")
uo_news.of_item(/*key*/ "n1").is_text = "[b]Version 5.0[/b] is out. [action=notes]Read the notes[/action]"
uo_news.of_add_item(/*key*/ "n2", /*title*/ "Webinar")
uo_news.of_item(/*key*/ "n2").is_text = "[b]Webinar[/b] on Thursday at 10:00."
uo_news.of_add_item(/*key*/ "n3", /*title*/ "Support")
uo_news.of_item(/*key*/ "n3").is_text = "[b]Support[/b] answers within one day."
// A new one every 5 seconds, faded in, the first again after the last :
// a PAUSE button shows under the banner
uo_news.is_transition = u_pbt_carousel.TRANSITION_FADE
uo_news.il_autoplay_ms = 5000
uo_news.ib_loop = true
// event ue_action_clicked of uo_news : (string as_key, string as_action)
// The zone [action=notes] of the first item opens the release notes
if as_action = "notes" then Open(w_release_notes)
Un gran catálogo #
// The products : one row = one item, its key the product code
ids_products.Retrieve()
uo_shop.of_map(/*role*/ u_pbt_carousel.ROLE_KEY, /*column*/ "code")
uo_shop.of_from_datastore(/*ads*/ ids_products)
// Only the tiles near the one in front are drawn : thousands of rows cost nothing.
// Beyond 12 items a scrollbar replaces the dots ; the user types a name to reach it
uo_shop.of_select_item(/*key*/ "P250")
Buenas prácticas #
- Imágenes de las mismas proporciones: el Cover Flow se lee de un vistazo cuando los mosaicos tienen la misma forma;
is_item_ratiola fija,FIT_CONTAINmuestra la imagen entera. - Poco texto por cara: una tarjeta se lee en dos líneas, el detalle va a su ventana (
ue_item_opened). - Una reproducción automática lenta (de cuatro a seis segundos), con su botón PAUSA: quien lee debe poder detener lo que se mueve.
- Claves que no sean números para sus elementos a mano, en un carrusel alimentado por un DataStore: un elemento de clave
12impide cargar la fila de RowID 12 (of_get_last_errorlo dice). ROLE_KEYen cuanto refresque un DataStore (Retrieve,Reset): sin ella, una recarga rehace cada elemento, porque un RowID que vuelve puede nombrar otro registro.- Muchos elementos no cuestan nada: solo se dibujan los que están al alcance del elemento al frente, y una imagen solo se carga cuando se acerca — el usuario alcanza un título tecleándolo.
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |
Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.