2009-08-09 1 views
1

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

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

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

ответ

2

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

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 
+0

Привет спасибо Gregg для всех ваших ответов! –

2

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

IMAGE останется нетронутым, в то время как вы можете использовать IMAGE2 в макете.

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

1

Давайте что снова попробовать:

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

Вы можете отредактировать свои ответы, не нужно делать двойной пост. – Sekhat

4

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

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

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

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

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 
Смежные вопросы