]> gitweb.factorcode.org Git - factor.git/blob - basis/cocoa/statusbar/statusbar.factor
factor: trim more using lists.
[factor.git] / basis / cocoa / statusbar / statusbar.factor
1 ! Copyright (C) 2021 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types arrays cocoa cocoa.application
4 cocoa.classes cocoa.messages cocoa.runtime cocoa.subclassing
5 compiler.units kernel locals.backend math.parser sequences ;
6 IN: cocoa.statusbar
7
8 << {
9     "NSStatusBar"
10     "NSStatusItem"
11 } [
12     [ ] import-objc-class
13 ] each
14 >>
15
16 CONSTANT: NSVariableStatusItemLength -1.0
17 CONSTANT: NSSquareStatusItemLength -2.0
18
19 : get-system-statusbar ( -- alien )
20     NSStatusBar -> systemStatusBar ;
21
22 TUPLE: platform-menu name items ;
23 TUPLE: platform-menu-item title quot key-equivalent selector target ;
24
25 : menu>dummy-class ( menu -- object )
26     [ name>> "NSObject" V{ } ]
27     [
28         items>> [
29             swap
30             [
31                 [ number>string "dummy" prepend void { id SEL } ]
32                 [ quot>> [ 2 load-locals 2 drop-locals ] prepose ] bi* 4array
33             ] keep over first >>selector drop
34         ] map-index
35         [ define-objc-class ] with-compilation-unit
36     ] [
37         name>> objc_getClass -> alloc -> init
38     ] tri ;
39
40 : >NSMenuItem ( menu-item -- NSMenuItem )
41     [ NSMenuItem -> alloc ] dip
42     [ title>> <NSString> ]
43     [ selector>> <selector> cocoa.messages:selector ]
44     [ key-equivalent>> "" or <NSString> ] tri
45     -> initWithTitle:action:keyEquivalent: ;
46
47 :: menu>alien ( menu -- menu-alien )
48     NSMenu -> alloc -> init :> ns-menu
49     menu menu>dummy-class :> dummy-class
50     ! NSMenu objc-dummy menu
51     menu items>> [
52         >NSMenuItem [ dummy-class -> setTarget: ] keep
53     ] map :> ns-menu-items
54     ns-menu ns-menu-items [ -> addItem: ] with each
55     ns-menu ;
56
57 :: show-menu ( menu -- menu-alien statusbar-item-alien )
58     menu menu>alien :> menu-alien
59     get-system-statusbar :> system-alien
60     system-alien
61         NSVariableStatusItemLength -> statusItemWithLength: [ -> retain ] keep :> ns-status-item
62     ns-status-item menu name>> <NSString> -> setTitle:
63     menu-alien -> setMenu:
64     menu-alien ns-status-item ;
65
66 : enable-menu-item ( alien -- ) 1 -> setEnabled: ;
67 : disable-menu-item ( alien -- ) 0 -> setEnabled: ;
68
69 : hide-statusbar-item ( statusbar-item-alien -- )
70     [ get-system-statusbar ] dip -> removeStatusItem: ;