[ALLY] Re: Scrolling views
From: gjones05:mail:orion at: 16-Feb-2001 12:40
Thanks, Brett for asking, and thanks Bo for answering. I was wondering
about this last week, and decided to just throw in a few pop-ups as
subdialogs instead of using one longer scrolling page. I guess I should
have asked. Have a nice weekend. And Bo, don't forget to turn the
lights off! ;-) (a little non-humorous CA humor)
--Scott
>From Bo:
>
> Brett,
>
> Here is a handy function (with examples) that may help you or others
make
> scrolling views easier. Last I heard VID was going to get scrolling
built
> in by default, but until then this function can be used.
>
> REBOL [
> Title: "Automated scrolling"
> Date: 22-Dec-2000
> Author: "Bohdan Lechnowsky"
> Email: [bo--rebol--com]
> File: %scroll-face.r
> Version: 1.0.0
> Purpose: {
> Demonstrates a way to write a scrollable face.
> }
> Comments: {
> This is a generalized function with 100%
environmentally-friendly
> local variables. It can operate on any number of scrollable
> windows in the same main face--even scrollable windows nested
> inside other scrollable windows--as the example shows.
> }
> History: [
> 0.9.0 ["Initial concept explored" "Bohdan Lechnowsky"]
> 0.9.1 ["Tweaks" "Bohdan Lechnowsky"]
> 1.0.0 ["Fully working version" "Bohdan Lechnowsky"]
> 1.1.0 ["Added arrows and size option plus minor mods"
Bohdan Lechnowsky
]
> 1.1.1 ["Bug fix with local variable" "Bohdan Lechnowsky"]
> 1.1.2 ["Another bug fix with local variable" "Bohdan
Lechnowsky"]
> ]
> ]
>
> scroll-face: func [
> {Returns vertically scrollable version of input face.}
> at {Face to attach scroll-face bar to}
> v {Visible size of the attach-to face}
> /arrows {Include up and down arrows}
> /size {Change size of scroll bar/arrows}
> s {New size for scroll bar/arrows}
> /local l a f
> ][
> if not size [s: 16]
> l: layout/offset [
> backdrop 0.0.0
> across
> at 0x0
> space 0
> size (v + (s * 1x0))
> box (v)
> slider (v * 0x1 + (s * 1x0)) []
> ] 0x0
>
> if arrows [
> l/pane/3/size/y: l/pane/3/size/y - (s * 2)
> arrow: layout/offset [
> arrow up (s * 1x1) [
> f: face/parent-face/pane
> f/2/offset/y: min 0 f/2/offset/y + 15
> f/3/data: negate f/2/offset/y / (f/2/size/y - v/y)
> show face/parent-face
> ]
> arrow down (s * 1x1) [
> f: face/parent-face/pane
> f/2/offset/y: max v/y - f/2/size/y f/2/offset/y - 15
> f/3/data: negate f/2/offset/y / (f/2/size/y - v/y)
> show face/parent-face
> ]
> ] 0x0
> arrow/pane/1/offset: l/pane/3/offset * 1x0 + (l/pane/3/size *
0x1)
> arrow/pane/2/offset: l/pane/3/offset * 1x0 + (l/pane/3/size *
0x1 + (s * 0x1))
> append l/pane arrow/pane
> ]
>
> l/pane/2: at
> l/pane/3/action: func [f a] compose [
> f/parent-face/pane/2/offset/y: (negate at/size/y - v/y) *
f/data
> show f/parent-face
> ]
> l/pane/3/redrag v/y / at/size/y
> l
> ]
>
> ; Simple example (JOL):
>
> view scroll-face/arrows/size layout/offset [text
system/view/VID/vid-styles
300 txt mold system/view/VID/vid-styles 300
as-is] 0x0 300x500 25
>
> ; Another easy example:
>
> e: func [t][request/ok rejoin ["Thank you for selecting button " t
!
]]