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