factor/library/ui/tools/browser.factor

150 lines
4.0 KiB
Factor
Raw Normal View History

! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2006-03-24 03:28:46 -05:00
IN: gadgets-browser
USING: gadgets gadgets-buttons gadgets-labels gadgets-panes
gadgets-presentations gadgets-scrolling gadgets-search
gadgets-tabs gadgets-theme gadgets-tiles gadgets-tracks generic
hashtables help inspector kernel math prettyprint sequences
words ;
2006-05-20 16:42:33 -04:00
TUPLE: browser-track showing builder closer ;
C: browser-track ( builder closer -- gadget )
2006-05-26 03:29:41 -04:00
{ 0 1 0 } <track> over set-delegate
2006-05-20 16:42:33 -04:00
H{ } clone over set-browser-track-showing
[ set-browser-track-closer ] keep
[ set-browser-track-builder ] keep ;
: showing-asset? ( asset track -- ? )
browser-track-showing hash-member? ;
: (show-asset) ( gadget asset track -- )
[ browser-track-showing set-hash ] 3keep nip track-add ;
: show-asset ( asset track -- )
2dup showing-asset? [
2drop
] [
[ browser-track-builder call ] 2keep (show-asset)
] if ;
: hide-asset ( asset track -- )
[ dup browser-track-closer call ] 2keep
[ browser-track-showing remove-hash* ] keep track-remove ;
TUPLE: browser main-track vocab-track word-track ;
: find-browser [ browser? ] find-parent ;
2006-05-20 16:42:33 -04:00
: close-tile ( tile -- )
dup gadget-parent [
browser-track-showing hash>alist rassoc
] keep hide-asset ;
: <browser-tile> ( gadget title -- gadget )
[ close-tile ] <tile> ;
2006-05-20 16:42:33 -04:00
: showing-word? ( word browser -- ? )
browser-word-track showing-asset? ;
2006-03-24 03:28:46 -05:00
DEFER: show-vocab
2006-03-24 13:39:18 -05:00
: <word-pages> ( word -- tabs )
{
{ "Definition" [ see ] }
2006-06-16 23:12:40 -04:00
{ "Documentation" [ (help) ] }
{ "Calls in" [ usage. ] }
{ "Links in" [ links-in. ] }
{ "Properties" [ word-props describe ] }
} <pages> ;
2006-05-20 16:42:33 -04:00
: <word-view> ( word -- gadget )
[ <word-pages> ] keep article-title <browser-tile> ;
2006-05-20 16:42:33 -04:00
: show-word ( word browser -- )
2006-05-20 16:42:33 -04:00
over word-vocabulary over show-vocab
browser-word-track show-asset ;
2006-03-25 17:41:40 -05:00
: hide-word ( word browser -- )
2006-05-20 16:42:33 -04:00
browser-word-track hide-asset ;
: toggle-word ( word browser -- )
2dup showing-word? [ hide-word ] [ show-word ] if ;
: <word-button> ( word -- gadget )
dup word-name <label> swap
[ swap find-browser toggle-word ] curry
<roll-button> ;
2006-03-24 03:28:46 -05:00
2006-05-20 16:42:33 -04:00
: <vocab-view> ( vocab -- gadget )
2006-03-24 03:28:46 -05:00
[
words natural-sort
[ <word-button> ] map make-pile <scroller>
] keep <browser-tile> ;
2006-03-24 03:28:46 -05:00
: showing-vocab? ( vocab browser -- ? )
2006-05-20 16:42:33 -04:00
browser-vocab-track showing-asset? ;
: show-vocab ( vocab browser -- )
2006-05-30 18:57:34 -04:00
over [ browser-vocab-track show-asset ] [ 2drop ] if ;
: hide-vocab-words ( vocab browser -- )
[
2006-05-20 16:42:33 -04:00
browser-word-track browser-track-showing hash-keys
[ word-vocabulary = ] subset-with
] keep swap [ swap hide-word ] each-with ;
: hide-vocab ( vocab browser -- )
2006-05-20 16:42:33 -04:00
browser-vocab-track hide-asset ;
: toggle-vocab ( word browser -- )
2dup showing-vocab? [ hide-vocab ] [ show-vocab ] if ;
: <vocab-button> ( vocab -- gadget )
dup <label> swap
[ swap find-browser toggle-vocab ] curry
<roll-button> ;
: <vocabs> ( -- gadget )
vocabs [ <vocab-button> ] map make-pile <scroller>
2006-05-20 16:42:33 -04:00
"Vocabularies" f <tile> ;
: <apropos-gadget>
[ apropos ] <search-gadget> "Apropos" f <tile> ;
TUPLE: main-track vocabs apropos ;
C: main-track ( -- gadget )
{
{ [ <vocabs> ] set-main-track-vocabs 2/3 }
{ [ <apropos-gadget> ] set-main-track-apropos 1/3 }
} { 0 1 0 } make-track* ;
2006-05-20 16:42:33 -04:00
: <vocab-track> ( -- track )
[ <vocab-view> ] [ find-browser hide-vocab-words ]
<browser-track> ;
: <word-track> ( -- track )
[ <word-view> ] [ 2drop ] <browser-track> ;
C: browser ( -- browser )
{
{ [ <main-track> ] set-browser-main-track 1/5 }
2006-05-26 02:29:44 -04:00
{ [ <vocab-track> ] set-browser-vocab-track 1/5 }
{ [ <word-track> ] set-browser-word-track 3/5 }
} { 1 0 0 } make-track* ;
2006-05-26 02:29:44 -04:00
M: browser gadget-title drop "Browser" ;
M: browser focusable-child*
browser-main-track main-track-apropos ;
2006-05-26 02:29:44 -04:00
: browser-window ( -- ) <browser> open-window ;
: browser-tool
[ browser? ]
[ <browser> ]
[ show-word ] ;
M: word show ( word -- ) browser-tool call-tool ;