]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/tools/button-list/button-list.factor
ui.tools.button-list: per-world popup
[factor.git] / basis / ui / tools / button-list / button-list.factor
1 ! Copyright (C) 2021 Kevin Cope.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs classes kernel math.rectangles
4 models models.arrow namespaces sequences ui ui.gadgets
5 ui.gadgets.buttons ui.gadgets.glass ui.gadgets.labeled
6 ui.gadgets.presentations ui.gadgets.search-tables
7 ui.gadgets.labels ui.gadgets.tables ui.gadgets.worlds
8 ui.gadgets.wrappers ui.gestures ui.theme ui.tools.browser.popups
9 ui.tools.common ;
10 FROM: ui.gadgets.wrappers => wrapper ;
11 IN: ui.tools.button-list
12
13 TUPLE: button-list-popup < wrapper ;
14
15 MIXIN: clickable
16 INSTANCE: button clickable
17
18 SYMBOL: active-buttons
19 active-buttons [ H{ } ] initialize
20
21 : label-from-button ( button -- str/f )
22     children>> [ label? ] find swap [ text>> ] [ drop f ] if ;
23
24 : world-buttons ( -- assoc )
25     world get active-buttons get [ drop H{ } clone ] cache ;
26
27 : store-labelled-button ( button -- str/f )
28     dup label-from-button [ [ world-buttons set-at ] keep ] [ drop f ] if* ;
29
30 : remove-labelled-button ( button -- str/f )
31     label-from-button [ dup world-buttons delete-at ] [ f ] if* ;
32
33 M: clickable graft*
34     [ store-labelled-button drop ] [ call-next-method ] bi ;
35
36 M: clickable ungraft*
37     [ remove-labelled-button drop ] [ call-next-method ] bi ;
38
39 : <active-buttons-table> ( model -- table )
40     [ keys [ ">" swap 2array ] map ] <arrow> trivial-renderer [ second ] <search-table> 
41     dup table>>
42         [ second world-buttons at invoke-primary ] >>action
43         [ hide-glass ] >>hook
44         t >>selection-required?
45         10 >>min-rows
46         10 >>max-rows
47         30 >>min-cols
48         30 >>max-cols
49     drop
50     ;
51
52 : <active-buttons-popup> ( model title -- gadget )
53     [ <active-buttons-table> white-interior ] dip
54     popup-color <framed-labeled-gadget> button-list-popup new-wrapper ;
55
56 button-list-popup H{
57     { T{ key-down f f "ESC" } [ hide-glass ] }
58 } set-gestures
59
60 : show-active-buttons-popup ( tool -- )
61     world-buttons <model> "Active Buttons" <active-buttons-popup>
62     [ hand-loc get-global point>rect show-glass ] [ request-focus ] bi ; inline