Как справиться с событиями Rebol, когда макет построен программно? - PullRequest
1 голос
/ 10 августа 2009

Я знаю, как динамически создавать галерею изображений, как теперь разрешить запускать событие, когда пользователь нажимает на изображение?

Я не хочу использовать функцию зацепления внутри макета, но снаружи: возможно ли это?

Не уверен, что я ясен, так скажите мне.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2013

Как уже было сказано, лучше всего создать стиль для минимизации кода в макете. Таким образом, стиль уже настроен на нужные вам действия.

Для галереи изображений я бы создал стиль большого пальца с моими требованиями.

Но вам не нужно использовать функцию «задействовать» для простых вещей! Если вам требуется обработка левой / правой кнопкой мыши, то достаточно одного или двух блоков действий, которые намного проще.

Вот полный пример:

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
2 голосов
/ 10 августа 2009

Есть много способов сделать это. Вы не указываете, как вы строите галерею изображений, но я предполагаю, что вы создаете макет стилей IMAGE и затем отображаете этот макет.

Звучит так, будто вы хотите, чтобы у каждого изображения была своя свобода, поэтому я предлагаю вам создать отдельный стиль, возможно, полученный из IMAGE. Вы можете сделать это так:

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

Поставьте код перед макетом. Таким образом, вы можете сохранить сложный код для поведения IMAGE вне блока макета. Когда вы работаете таким образом, стиль меняется глобально.

Вы также можете просто создать новый стиль, изменив имя:

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

ИЗОБРАЖЕНИЕ останется нетронутым, в то время как вы можете использовать IMAGE2 в макете.

Почему СТИЛИЗ / МАСТЕР? Я использую STYLIZE / MASTER по привычке, поэтому мне не нужно указывать конкретный список стилей в макете, и я могу сбрить строку кода для каждого макета.

2 голосов
/ 10 августа 2009

Довольно простой трюк состоит в том, чтобы установить стиль с нужным вам действием, и он должен взглянуть на значение пользовательских данных, которое вы задали при создании лица, если это необходимо.

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
1 голос
/ 10 августа 2009

Давайте попробуем это снова:

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