Come far fronte a eventi Rebol quando il layout è costruito a livello di codice?

StackOverflow https://stackoverflow.com/questions/1252561

  •  12-09-2019
  •  | 
  •  

Domanda

So come costruire una galleria immagini in modo dinamico, come faccio ora permetto per attivare un evento quando l'utente clicca su una foto?

Non voglio avere la funzione di impegnarsi all'interno del layout, ma al di fuori: è possibile

?

Non sono sicuro io sono chiaro così mi dicono.

È stato utile?

Soluzione

Un trucco abbastanza semplice è quello di creare uno stile con l'azione che si desidera, e hanno lo sguardo ad un valore user-dati si imposta quando si genera la faccia, se necessario.

lay: [
    across
    style my-box box [print [face/user-data face/color]]
]
repeat i 4 [
    repeat j 4 [
        repend lay [
            'my-box 50x50 get random/only [red green blue yellow] 
            'user-data to pair! reduce [i j]
        ]
    ]
    append lay 'return
]
view layout lay

Altri suggerimenti

Come già detto, la cosa migliore è di creare uno stile di minimizzato il codice nel layout. Quindi lo stile è già configurato per le azioni che si desidera.

Per una galleria di immagini, vorrei creare uno stile di pollice con le mie esigenze.

Ma non è necessario utilizzare un 'impegnarsi func per le cose semplici! Se quello che vi serve è a sinistra / destra movimentazione clic, quindi uno o due blocchi di azioni sono abbastanza e molto più semplice.

Ecco un esempio completo:

Rebol [
    title: "Basic image gallery"
]

thumb-size: 100x100 ; size of the thumbnails
thumbs-per-row: 6   ; number of thumbs per row

; Here is the actions I want to use when clicking/right clicking the image face.
; It's just a block: it's the 'layout function that will make it a function
; with 'face and 'value arguments
thumb-action: [
    ; left click: show full size image
    view/new layout [
        origin 2 space 2
        vh3 form (either any [file? face/user-data url? face/user-data text? face/user-data] [face/user-data] ["An image without reference"])
        image face/image
    ]
]
thumb-alt-action: [
    ; right click: open up the folder/web site where the file is
    switch/default type?/word face/user-data [
        file! [call/shell join "explorer " to-local-file first split-path face/user-data]
        url! [browse face/user-data]
    ] [alert rejoin ["Can't do anything with " type? face/user-data " type of value ! Sorry."]]
]

; Our styles for the gallery
gallery-styles: probe stylize [
    ; Here is a style for the thumbnails, with the actions wanted
    thumb: image thumb-size effect [aspect] thumb-action thumb-alt-action
]

; Some samples images
imgs: [
    ; This paths are for a typical Windows7 installation
    %/c/windows/web/wallpaper/nature/img1.jpg
    %/c/windows/web/wallpaper/nature/img2.jpg
    %/c/windows/web/wallpaper/nature/img3.jpg
    %/c/windows/web/wallpaper/nature/img4.jpg
    ; URLs as examples
    http://www.rebol.com/graphics/reb-logo.gif
    http://www.rebol.com/graphics/ref-card.jpg
]

; Base for your gallery layout
gallery-lay: copy [
    origin 2 space 2 across
    styles gallery-styles
    vh2 "Image gallery"
]

; Builds the final layout
count: 0
foreach img imgs [
    ; This for handling only a defined number of thumbs per row
    if 0 = (count // thumbs-per-row) [append gallery-lay 'return]
    count: count + 1
    ; Here you add the layout code for the current image
    append gallery-lay compose [thumb (img) user-data (img)]
]

; Here we are: the result
view layout gallery-lay

Ci sono molti modi per farlo. Non si specifica come si sta costruendo la pinacoteca, ma sto supponendo che si sta creando un layout di stili di immagine e poi la visualizzazione di quel layout.

suona anche come si desidera la libertà di fare determinate cose con ogni immagine, così vi suggerisco di costruire uno stile a parte, forse derivato da IMAGE. Potete farlo in questo modo:

stylize/master [
    image: image with [
        feel: make feel [
            engage: func [face act event] [
                ; do my custom engage function
            ]
        ]
    ]
]

Inserire il codice prima del layout. In questo modo, è possibile mantenere codice complesso per il comportamento di IMAGE al di fuori del blocco di layout. Quando si lavora in questo modo, lo stile è a livello globale modificato.

È anche possibile creare un nuovo stile, modificando il nome:

stylize/master [
    image2: image with [
        ...
    ]
]

IMAGE sarà lasciato intatto, mentre è possibile utilizzare IMAGE2 nel layout.

Perché stilizzare / MASTER? Io uso Stylize / MASTER per abitudine, in modo da non dover specificare un elenco stile specifico nel layout e posso radere una riga di codice per ogni layout.

Proviamo di nuovo:

lay: [
    across
    style my-box box [print [face/user-data face/color]]
]
repeat i 4 [
    repeat j 4 [
        repend lay [
            'my-box 50x50 get random/only [red green blue yellow] 
            'user-data to pair! reduce [i j]
        ]
    ]
    append lay 'return
]
view layout lay
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top