REBOL [
    Title: "Iconic Image Browser"
    File:   %icon-browse.r
    Date:   4-Jun-2000
    Version: 1.1.0
    Author: "Carl Sassenrath"
    Purpose: {
        Browse a directory of images using a scrolling list of icons.
        Displays a progress bar while icons are being created.
    }
    Category: [view VID 3]
]

files: []
icons: []
num: 0
selection: none
carlwaves: if exists? %carlwaves.jpg [load %carlwaves.jpg]

;-- Progress box:
view/new layout [
    backtile carlwaves effect [tile gradcol 1x1 0.0.160 200.0.0]
    text "Iconifying Images..." bold
    filn: text 120x20
    prog: progress 200x14
]
    
;-- Read directory, find image files:
files: read %.
while [not tail? files] [
    either find [%.bmp %.jpg %.gif] find/last first files "." [
        files: next files][remove files]
]
files: head files

;-- Create icons from images:
icons: []
incr: 200 / max 1 length? files
total: 0
foreach f files [
    filn/text: f  show filn
    prog/data: to-integer total: total + incr show prog
    append icons to-image make face [
        size: 40x40
        color: 40.40.80
        image: load-image f
        effect: [aspect]
    ]
]
unview/all

;-- Main display:
view layout [
    backtile carlwaves effect [tile gradcol 1x1 0.0.160 200.0.0]
    title reform ["REBOL" system/script/header/title 
        system/script/header/version] font [size: 16]
    across space 0
    vx: list 84x600 200.200.200 [
        size 80x74 space 0
        at 20x4 i: image 40x40 [
            img/image: load selection: i/data show vx show img]
        at 1x44 text 78x32 center font [
            size: 10 color: black shadow: none]
    ] supply [
        face/show?: true
        count: count + num
        if count > length? files [face/show?: false exit]
        either index = 2 [face/text: files/:count][
            face/effect: if selection = files/:count [[invert]]
            face/image: icons/:count
            face/data: files/:count
        ]
    ]
    vv: slider vx/size * 0x1 + 16x0 length? files [
        num: vv/data - 1 show vx]
    pad 20
    img: frame 600x600 40.40.80 effect none
    at 638x20
    tgl: toggle 50x24 #"s" "Fit" [
        img/effect: either tgl/state ['aspect][none] show img
    ]
    button "Quit" 50x24 #"^(ESC)" [quit]
]
