factor/library/ui/browser.factor

123 lines
3.4 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
2006-03-25 01:06:52 -05:00
USING: arrays gadgets gadgets-buttons gadgets-labels
2006-03-24 03:28:46 -05:00
gadgets-layouts gadgets-panes gadgets-scrolling gadgets-theme
2006-05-15 01:01:47 -04:00
generic hashtables help inspector kernel math namespaces
2006-03-24 03:28:46 -05:00
prettyprint sequences words ;
2006-03-25 01:06:52 -05:00
SYMBOL: components
H{ } clone components set-global
: get-components ( class -- assoc )
components get-global hash [
{ "Slots" [ describe ] }
] unless* ;
2006-03-25 01:06:52 -05:00
{
{ "Definition" [ help ] }
{ "Calls in" [ usage. ] }
{ "Calls out" [ uses. ] }
{ "Links in" [ links-in. ] }
{ "Links out" [ links-out. ] }
{ "Vocabulary" [ word-vocabulary words. ] }
{ "Properties" [ word-props describe ] }
2006-03-25 01:06:52 -05:00
} \ word components get-global set-hash
{
{ "Article" [ help ] }
{ "Links in" [ links-in. ] }
{ "Links out" [ links-out. ] }
2006-03-25 01:06:52 -05:00
} \ link components get-global set-hash
{
{ "Call stack" [ continuation-call callstack. ] }
{ "Data stack" [ continuation-data stack. ] }
{ "Retain stack" [ continuation-retain stack. ] }
{ "Name stack" [ continuation-name stack. ] }
{ "Catch stack" [ continuation-catch stack. ] }
} \ continuation components get-global set-hash
2006-03-24 03:28:46 -05:00
TUPLE: book page pages ;
: show-page ( key book -- )
dup book-page unparent
[ book-pages assoc ] keep
2006-03-24 03:28:46 -05:00
[ set-book-page ] 2keep
add-gadget ;
C: book ( pages -- book )
2006-03-24 03:28:46 -05:00
dup delegate>gadget
[ set-book-pages ] 2keep
2006-03-24 22:58:03 -05:00
[ >r first first r> show-page ] keep ;
2006-03-24 03:28:46 -05:00
2006-03-25 17:01:39 -05:00
M: book pref-dim* ( book -- dim ) book-page pref-dim ;
2006-03-24 03:28:46 -05:00
M: book layout* ( book -- )
dup rect-dim swap book-page set-gadget-dim ;
: component-pages ( obj -- assoc )
2006-03-24 22:58:03 -05:00
dup class get-components
[ first2 swapd make-pane <scroller> 2array ] map-with ;
2006-03-24 03:28:46 -05:00
: <tab> ( name book -- button )
2006-03-25 17:01:39 -05:00
dupd [ show-page drop ] curry curry
2006-03-24 03:28:46 -05:00
>r <label> r> <bevel-button> ;
: tabs ( assoc book gadget -- )
>r swap [ first swap <tab> ] map-with r> add-gadgets ;
2006-03-24 03:28:46 -05:00
2006-03-24 13:39:18 -05:00
TUPLE: browser object history tabs ;
: save-current ( browser -- )
dup browser-object swap browser-history push ;
2006-03-24 03:28:46 -05:00
: browse ( obj browser -- )
2006-03-24 13:39:18 -05:00
[ set-browser-object ] 2keep
dup browser-tabs clear-gadget
>r component-pages dup <book> r>
[ @center frame-add ] 2keep browser-tabs tabs ;
: find-browser [ browser? ] find-parent ;
: browse-back ( browser -- )
dup browser-history dup empty?
[ 2drop ] [ pop swap browse ] if ;
2006-03-24 03:28:46 -05:00
C: browser ( obj -- browser )
V{ } clone over set-browser-history
dup delegate>frame [
"<" <label> [ find-browser browse-back ] <bevel-button> ,
<shelf> dup pick set-browser-tabs ,
] { } make make-shelf dup highlight-theme
over @top frame-add
[ browse ] keep ;
2006-03-24 03:28:46 -05:00
TUPLE: browser-button object ;
2006-03-24 22:58:03 -05:00
: browser-window ( obj -- ) <browser> "Browser" open-window ;
2006-03-24 13:39:18 -05:00
: browser-button-action ( button -- )
2006-03-25 17:41:40 -05:00
[ browser-button-object ] keep find-browser [
2006-03-25 17:01:39 -05:00
find-browser dup save-current browse
2006-03-25 17:41:40 -05:00
] [
browser-window
] if* ;
: browser-button-gestures ( gadget -- )
[
[ browser-button-object browser-window ] if-clicked
2006-05-18 22:01:38 -04:00
] T{ button-up f 3 } set-action ;
2006-03-24 03:28:46 -05:00
C: browser-button ( gadget object -- button )
[ set-browser-button-object ] keep
[
2006-03-24 13:39:18 -05:00
>r [ browser-button-action ] <roll-button> r>
2006-03-24 03:28:46 -05:00
set-gadget-delegate
2006-03-25 17:41:40 -05:00
] keep
dup browser-button-gestures ;
2006-03-24 03:28:46 -05:00
M: browser-button gadget-help ( button -- string )
browser-button-object dup word? [ synopsis ] [ summary ] if ;