1+ use cocoa:: base:: id;
2+ use objc:: { runtime:: Sel , msg_send, sel, sel_impl, class} ;
3+
4+ use crate :: MouseCursor ;
5+
6+ #[ derive( Debug ) ]
7+ pub enum Cursor {
8+ Native ( & ' static str ) ,
9+ Undocumented ( & ' static str ) ,
10+ }
11+
12+ impl From < MouseCursor > for Cursor {
13+ fn from ( cursor : MouseCursor ) -> Self {
14+ match cursor {
15+ MouseCursor :: Default => Cursor :: Native ( "arrowCursor" ) ,
16+ MouseCursor :: Pointer => Cursor :: Native ( "pointingHandCursor" ) ,
17+ MouseCursor :: Hand => Cursor :: Native ( "openHandCursor" ) ,
18+ MouseCursor :: HandGrabbing => Cursor :: Native ( "closedHandCursor" ) ,
19+ MouseCursor :: Text => Cursor :: Native ( "IBeamCursor" ) ,
20+ MouseCursor :: VerticalText => Cursor :: Native ( "IBeamCursorForVerticalLayout" ) ,
21+ MouseCursor :: Copy => Cursor :: Native ( "dragCopyCursor" ) ,
22+ MouseCursor :: Alias => Cursor :: Native ( "dragLinkCursor" ) ,
23+ MouseCursor :: NotAllowed | MouseCursor :: PtrNotAllowed => {
24+ Cursor :: Native ( "operationNotAllowedCursor" )
25+ }
26+ // MouseCursor:: => Cursor::Native("contextualMenuCursor"),
27+ MouseCursor :: Crosshair => Cursor :: Native ( "crosshairCursor" ) ,
28+ MouseCursor :: EResize => Cursor :: Native ( "resizeRightCursor" ) ,
29+ MouseCursor :: NResize => Cursor :: Native ( "resizeUpCursor" ) ,
30+ MouseCursor :: WResize => Cursor :: Native ( "resizeLeftCursor" ) ,
31+ MouseCursor :: SResize => Cursor :: Native ( "resizeDownCursor" ) ,
32+ MouseCursor :: EwResize | MouseCursor :: ColResize => Cursor :: Native ( "resizeLeftRightCursor" ) ,
33+ MouseCursor :: NsResize | MouseCursor :: RowResize => Cursor :: Native ( "resizeUpDownCursor" ) ,
34+
35+ MouseCursor :: Help => Cursor :: Undocumented ( "_helpCursor" ) ,
36+ MouseCursor :: ZoomIn => Cursor :: Undocumented ( "_zoomInCursor" ) ,
37+ MouseCursor :: ZoomOut => Cursor :: Undocumented ( "_zoomOutCursor" ) ,
38+ MouseCursor :: NeResize => Cursor :: Undocumented ( "_windowResizeNorthEastCursor" ) ,
39+ MouseCursor :: NwResize => Cursor :: Undocumented ( "_windowResizeNorthWestCursor" ) ,
40+ MouseCursor :: SeResize => Cursor :: Undocumented ( "_windowResizeSouthEastCursor" ) ,
41+ MouseCursor :: SwResize => Cursor :: Undocumented ( "_windowResizeSouthWestCursor" ) ,
42+ MouseCursor :: NeswResize => Cursor :: Undocumented ( "_windowResizeNorthEastSouthWestCursor" ) ,
43+ MouseCursor :: NwseResize => Cursor :: Undocumented ( "_windowResizeNorthWestSouthEastCursor" ) ,
44+
45+ MouseCursor :: Working | MouseCursor :: PtrWorking => {
46+ Cursor :: Undocumented ( "busyButClickableCursor" )
47+ }
48+
49+ _ => Cursor :: Native ( "arrowCursor" ) ,
50+
51+ // MouseCursor::Hidden => todo!(),
52+ // MouseCursor::Move => todo!(),
53+ // MouseCursor::AllScroll => todo!(),
54+ // MouseCursor::Cell => todo!(),
55+ }
56+ }
57+ }
58+
59+ impl Cursor {
60+ pub unsafe fn load ( & self ) -> id {
61+ match self {
62+ Cursor :: Native ( cursor_name) => {
63+ let sel = Sel :: register ( cursor_name) ;
64+ msg_send ! [ class!( NSCursor ) , performSelector: sel]
65+ }
66+ Cursor :: Undocumented ( cursor_name) => {
67+ let class = class ! ( NSCursor ) ;
68+ let sel = Sel :: register ( cursor_name) ;
69+ let sel = if msg_send ! [ class, respondsToSelector: sel] {
70+ sel
71+ } else {
72+ sel ! ( arrowCursor)
73+ } ;
74+ msg_send ! [ class, performSelector: sel]
75+ }
76+ }
77+ }
78+ }
0 commit comments