Как справиться с событиями Rebol, когда верстка построена программно?

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

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

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


person Rebol Tutorial    schedule 09.08.2009    source источник


Ответы (4)


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

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
person Community    schedule 10.08.2009

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

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

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

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

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
person DideC    schedule 22.02.2013

Есть много способов сделать это. Вы не указываете, как вы создаете галерею изображений, но я предполагаю, что вы создаете макет стилей 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 [
        ...
    ]
]

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

Почему STYLIZE / MASTER? Я использую STYLIZE / MASTER по привычке, поэтому мне не нужно указывать конкретный список стилей в макете, и я могу вырезать строку кода для каждого макета.

person Henrik Mikael Kristensen    schedule 10.08.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
person Community    schedule 10.08.2009