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 ;
16 CONSTANT: NSVariableStatusItemLength -1.0
17 CONSTANT: NSSquareStatusItemLength -2.0
19 : get-system-statusbar ( -- alien )
20 NSStatusBar -> systemStatusBar ;
22 TUPLE: platform-menu name items ;
23 TUPLE: platform-menu-item title quot key-equivalent selector target ;
25 : menu>dummy-class ( menu -- object )
26 [ name>> "NSObject" V{ } ]
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
35 [ define-objc-class ] with-compilation-unit
37 name>> objc_getClass -> alloc -> init
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: ;
47 :: menu>alien ( menu -- menu-alien )
48 NSMenu -> alloc -> init :> ns-menu
49 menu menu>dummy-class :> dummy-class
50 ! NSMenu objc-dummy menu
52 >NSMenuItem [ dummy-class -> setTarget: ] keep
53 ] map :> ns-menu-items
54 ns-menu ns-menu-items [ -> addItem: ] with each
57 :: show-menu ( menu -- menu-alien statusbar-item-alien )
58 menu menu>alien :> menu-alien
59 get-system-statusbar :> 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 ;
66 : enable-menu-item ( alien -- ) 1 -> setEnabled: ;
67 : disable-menu-item ( alien -- ) 0 -> setEnabled: ;
69 : hide-statusbar-item ( statusbar-item-alien -- )
70 [ get-system-statusbar ] dip -> removeStatusItem: ;