|
scroll-table - Source CodeThe scroll-table custom style, useful for showing single or multi-column lists of data. |
|
rebol [
Title: "Demo scroll-table style"
File: %demo-scroll-table.r
Date: 25-Mar-2004
Version: 1.0.6
Needs: [View]
Author: "Anton Rolls"
Language: 'English
Purpose: {Show the scroll-table style in the browser plugin}
Usage: {}
ToDo: {
- replace the main layout with a scroll-table itself.
- after downloader is finished, use only load-thru, not load-thru/update (no need to update)
}
History: [
1.0.0 [30-Oct-2003 {First version} "Anton"]
1.0.1 [30-Nov-2003 {resizable window} "Anton"]
1.0.2 [12-Jan-2004 {Made a "launcher" window} "Anton"]
1.0.3 [29-Feb-2004 {added more examples} "Anton"]
1.0.4 [11-Mar-2004 {commented query/clear, forced update of all necessary files} "Anton"]
1.0.5 [12-Mar-2004 {forked from gui/demo-scroll-table.r} "Anton"]
1.0.6 [25-Mar-2004 {added download progress bar and updated with gui/demo-scroll-table.r} "Anton"]
]
Notes: {}
]
view/new center-face layout [h1 "loading files" pr: progress]
bump-pr: func [v][pr/data: pr/data + v show pr]
site: select load-thru/update http://www.reboltech.com/index.r [folder "Anton"]
clear find site %index.r
bump-pr 0.1
do load-thru/update site/library/include.r
bump-pr 0.1
foreach file [scroll-table.r header-group.r list-sort-button.r check-label.r][
read-thru/update site/gui/:file
bump-pr 0.2
]
include [
site/gui/scroll-table.r [scroll-table-style]
site/gui/check-label.r [check-label-style]
]
unview
; create single-data, a block of the default colours
single-data: clear []
foreach word first system/words [
attempt [if tuple? word: get in system/words word [append single-data join word ""]]
]
; create multi-data, a block of data used in some of the examples
multi-data: clear []
foreach file read dir: join view-root %public/ [
append/only multi-data reduce [file size? dir/:file modified? dir/:file]
]
examples: [
"Simplest example with no data"
[scroll-table]
"Very short block of data"
[scroll-table data ["hello" "bonjour" "hallo"]]
"Inconsistent block of data"
[scroll-table data [bonjour [in a block] [] [1 2 3 4] hello]]
"Single-column"
[
scroll-table data single-data
]
"Single-column tabbing test"
[
across
scroll-table data single-data
scroll-table data single-data
return
field
]
"Single-column, with (single-click) action"
[
b: box 100x40
scroll-table data single-data [
pos: value
b/color: to-tuple b/text: pick face/list-data pos/2
show b
]
]
"Single-column, with double-click action"
[
scroll-table data single-data double-click [alert reform [pos pick face/list-data pos/2]]
]
"Single-column, with alt-click action"
[
scroll-table data single-data alt-click [alert reform [pos pick face/list-data pos/2]]
]
"Single-column, with header^/(column-width automatically calculated)"
[
scroll-table headers ["tuples"] data single-data
]
"Multi-column"
[
scroll-table data multi-data
]
"Multi-column, with headers, sizes specified^/and a big edge"
[
scroll-table 440x170 headers ["file" 100 "size" 80 "date" 190] data multi-data
;coal
edge [size: 8x8 color: sky effect: 'bevel]
]
"Multi-column, with sort column initially shown"
[
scroll-table headers ["file" "size" 80 "date"] data multi-data
with [sort-column: 1]
]
"Directory requester, restricts selection to directories,^/single-row select"
[
; this is like a directory requester
; multi-column, auto-sizing
scroll-table headers ["file" "size" 60 "date" ] data multi-data [
; action (called on a selection click)
; face = scroll-table face
; value = [col row]
;?? value ; = position
;print ["face/selection:" mold face/selection]
;print ["face/last-selected:" face/last-selected]
]
filter-click [
;?? pos
use [row][
row: pos/2
;print [ row mold multi-data/:row]
%"" <> find/last/tail multi-data/:row/1 #"/" ; not a directory ?
]
]
double-click [
;?? pos
use [row][
row: pos/2
alert reform ["Selected position:" pos "Directory:" multi-data/:row/1]
]
]
sort-comparator func [direc a b /local ret][
if file? a [
either %"" = find/last/tail a "/" [
if %"" <> find/last/tail b "/" [return direc = 'down]
][
if %"" = find/last/tail b "/" [return direc = 'up]
]
]
do reduce [either direc = 'up [:greater?][:lesser?] a b]
]
initial-sort [column 1]
with [selection-mode: [single row]]
]
"Multi-column selection-mode [single row]" [
scroll-table data multi-data
with [selection-mode: [single row]]
]
"Multi-column selection-mode [multi row]" [
scroll-table data multi-data
with [selection-mode: [multi row]]
]
"Multi-column selection-mode [single cell]" [
scroll-table data multi-data
with [selection-mode: [single cell]]
]
"Multi-column selection-mode [multi cell]" [
scroll-table data multi-data
with [selection-mode: [multi cell]]
]
"Multi-column selection-mode [single column]" [
scroll-table data multi-data
with [selection-mode: [single column]]
]
"Multi-column selection-mode [multi column]" [
scroll-table data multi-data headers ["file" "size" "date"]
with [selection-mode: [multi column]]
]
]
append examples ; debugging examples
[
"None data"
[scroll-table data (none)]
"Empty block of data"
[scroll-table data []]
"None data, with multiple headers"
[scroll-table data (none) headers ["hello" 80 "there" 90]]
"Empty data, with multiple headers"
[scroll-table data [] headers ["hello" "there"]]
"Empty data, with multiple headers (width specified)"
[scroll-table data [] headers ["hello" 80 "there" 90]]
"Sorting test" [
scroll-table data copy ["b" "c" "d" "a" "e" "f" "g"] headers ["file" 100]
with [selection-mode: [multi row]]
]
"Sorting test Multi-column" [
scroll-table data copy multi-data headers ["file" "size" "date"]
with [selection-mode: [multi row]]
]
"Single-column Multi-line"
[scroll-table data ["hello^/there" "bonjour" "hallo"]]
"Multi-column Multi-line"
[scroll-table data [["hello^/there" "bonjour"]["hallo"]]]
]
show-code: func [code][
context compose/only [
origin: 8x8
my-area: none
code: (code)
view/new/options center-face lay: layout [
origin (origin)
styles check-label-style
check-label "show common code" [
use [my-area][
my-area: face/parent-face/parent-face/feel/my-area
if my-area = system/view/focal-face [unfocus]
my-area/text: mold either face/data [build-code code][code]
show my-area
]
]
my-area: area 650x500 font-name font-fixed (mold code)
] 'resize
lay/feel: make lay/feel compose [
lay: (lay)
my-area: (my-area)
detect: func [face event][
if event/type = 'resize [
; resize the area
my-area/size: lay/size - my-area/offset - origin
show lay
]
event
]
]
]
]
build-code: func [code][
compose/only [
context (compose/only [
scroll-table: none
view/new/options lay: center-face layout (
append copy [
across
btn "set-face single" [set-face scroll-table single-data]
btn "set-face multi" [set-face scroll-table multi-data]
btn "reset-face" [reset-face scroll-table]
btn "get-face" [alert mold get-face scroll-table]
btn "clear-face" pink [clear-face scroll-table]
return
btn "show selection" [probe scroll-table/selection]
btn "copy selection" [probe scroll-table/feel/copy-selection scroll-table]
return
below
styles scroll-table-style
] code
) 'resize
; find the scroll-table
foreach face lay/pane [
if face/style = 'scroll-table [scroll-table: face break]
]
lay/feel: make lay/feel compose/deep [
detect: func [face event /local window scroll-table][
window: (lay)
scroll-table: (scroll-table)
if event/type = 'active [focus scroll-table]
if event/type = 'resize [
scroll-table/size: max 0x0 window/size - scroll-table/offset - 20x20
scroll-table/resize
show window
]
event
]
]
focus scroll-table
scroll-table/post-init
])
]
]
; make a block of blocks, such as scroll-table expects for multi-column data
examples-data: clear []
foreach [description example] examples [
append/only examples-data reduce [description trim/lines mold example]
]
lay-blk: [
;style code code as-is font [name: font-fixed colors: reduce [black yellow]] effect [merge luma 16]
;text as-is "Right-click to show code.^/Unless specified column widths are automatically calculated."
]
origin: 10x10
append lay-blk [
origin (origin)
styles scroll-table-style
eg-scroll-table: scroll-table data examples-data headers ["description" "example code"]
with [selection-mode: [single cell]]
double-click [
switch pos/x [
1 [do build-code pick examples (pos/y * 2)]
2 [ show-code pick examples (pos/y * 2)]
]
]
; <- alt-click action here
btn "notes on example code" [
view/new center-face layout [
across
style dot image 17x17 effect [draw [pen black fill-pen black circle 9x9 3]]
dot text "common code is a bit generic, to facilitate demonstrating so many examples" return
dot text "modifying window face feel to capture resize events" return
dot text "focus is necessary for scroll-wheel functionality (to receive scroll-line events)" return
dot text "post-init needs to be done after modifying the feel" return
]
]
]
main: center-face layout lay-blk
main/offset/x: 10
view/new/options main 'resize
main/feel: make main/feel [
detect: func [face event][
if find [down active] event/type [
if eg-scroll-table <> system/view/focal-face [focus eg-scroll-table]
]
if event/type = 'resize [
eg-scroll-table/size: main/size - eg-scroll-table/offset - origin - 0x30 ; origin + space for btns
eg-scroll-table/resize
; resize all the btns
foreach face main/pane [
if face/style = 'btn [face/offset/y: main/size/y - origin/y - face/size/y]
]
show main
]
event
]
]
focus eg-scroll-table
eg-scroll-table/post-init
wait none
|