]> gitweb.factorcode.org Git - factor.git/blob - extra/gopher/ui/ui.factor
edcc48fe6f9fc7b47f0131c57a22b9848d05f6ef
[factor.git] / extra / gopher / ui / ui.factor
1 ! Copyright (C) 2014 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
3
4 USING: accessors arrays debugger fonts gopher gopher.private
5 kernel math.vectors models present sequences ui ui.commands
6 ui.gadgets ui.gadgets.editors ui.gadgets.panes
7 ui.gadgets.scrollers ui.gadgets.status-bar ui.gadgets.toolbar
8 ui.gadgets.tracks ui.gadgets.viewports ui.gestures ui.operations
9 ui.tools.browser ui.tools.browser.history ui.tools.common urls
10 webbrowser ;
11
12 IN: gopher.ui
13
14 TUPLE: gopher-gadget < tool history scroller url-field ;
15
16 gopher-gadget default-font-size { 50 50 } n*v set-tool-dim
17
18 M: gopher-gadget history-value
19     [ control-value ] [ scroller>> scroll-position ]
20     bi 2array ;
21
22 M: gopher-gadget set-history-value
23     [ first2 ] dip
24     [ set-control-value ] [ scroller>> set-scroll-position ]
25     bi-curry bi* ;
26
27 M: gopher-gadget model-changed
28     [ value>> present ]
29     [ url-field>> editor>> set-editor-string ] bi* ;
30
31 : ?gopher-url ( obj -- url )
32     present dup "://" subseq-index? [ "gopher://" prepend ] unless >url ;
33
34 : show-gopher ( url gopher-gadget -- )
35     [ [ ?gopher-url ] [ f ] if* ] dip
36     over [ protocol>> "gopher" = ] [ t ] if* [
37         [
38             2dup control-value =
39             [ 2drop ] [ nip history>> add-history ] if
40         ]
41         [ set-control-value ]
42         2bi
43     ] [ drop open-url ] if ;
44
45 : <url-field> ( gopher-gadget -- field )
46     '[ _ show-gopher ] <action-field>
47         "Gopher URL" >>default-text
48         white-interior ;
49
50 : <gopher-pane> ( gopher-gadget -- gadget )
51     model>> [ '[ _ [ gopher. ] when* ] try ] <pane-control> ;
52
53 : <gopher-toolbar> ( browser -- toolbar )
54     horizontal <track>
55         0 >>fill
56         1/2 >>align
57         { 5 5 } >>gap
58         over <toolbar> f track-add
59         swap url-field>> 1 track-add ;
60
61 : add-gopher-toolbar ( track -- track )
62     dup <gopher-toolbar> format-toolbar f track-add ;
63
64 : add-gopher-pane ( track -- track )
65     dup dup <gopher-pane> margins
66     <scroller> >>scroller scroller>> white-interior 1 track-add ;
67
68 : <gopher-gadget> ( -- gadget )
69     vertical gopher-gadget new-track with-lines
70         f <model> >>model
71         dup <history> >>history
72         dup <url-field> >>url-field
73         add-gopher-toolbar
74         add-gopher-pane ;
75
76 : open-gopher-window ( url -- )
77     <gopher-gadget>
78     [ "Gopher" open-status-window ]
79     [ show-gopher ] bi ;
80
81 : com-clear ( gopher -- )
82     f swap set-control-value ;
83
84 : com-gopher ( url -- )
85     [ gopher-gadget? ] find-window
86     [ [ raise-window ] [ gadget-child show-gopher ] bi ]
87     [ open-gopher-window ] if* ;
88
89 gopher-gadget "toolbar" f {
90     { f com-back }
91     { f com-forward }
92     { f com-clear }
93 } define-command-map
94
95 gopher-gadget "scrolling" f {
96     { T{ key-down f f "UP" } com-scroll-up }
97     { T{ key-down f f "DOWN" } com-scroll-down }
98     { T{ key-down f f "PAGE_UP" } com-page-up }
99     { T{ key-down f f "PAGE_DOWN" } com-page-down }
100 } define-command-map
101
102 [ gopher-link? ] \ com-gopher H{ { +primary+ t } } define-operation