1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UICollisionBehaviorMode(pub NSUInteger);
bitflags::bitflags! {
    impl UICollisionBehaviorMode: NSUInteger {
        #[doc(alias = "UICollisionBehaviorModeItems")]
        const Items = 1<<0;
        #[doc(alias = "UICollisionBehaviorModeBoundaries")]
        const Boundaries = 1<<1;
        #[doc(alias = "UICollisionBehaviorModeEverything")]
        const Everything = NSUIntegerMax as _;
    }
}

unsafe impl Encode for UICollisionBehaviorMode {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

unsafe impl RefEncode for UICollisionBehaviorMode {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_protocol!(
    pub unsafe trait UICollisionBehaviorDelegate:
        NSObjectProtocol + IsMainThreadOnly
    {
        #[cfg(feature = "UIDynamicBehavior")]
        #[optional]
        #[method(collisionBehavior:beganContactForItem:withItem:atPoint:)]
        unsafe fn collisionBehavior_beganContactForItem_withItem_atPoint(
            &self,
            behavior: &UICollisionBehavior,
            item1: &ProtocolObject<dyn UIDynamicItem>,
            item2: &ProtocolObject<dyn UIDynamicItem>,
            p: CGPoint,
        );

        #[cfg(feature = "UIDynamicBehavior")]
        #[optional]
        #[method(collisionBehavior:endedContactForItem:withItem:)]
        unsafe fn collisionBehavior_endedContactForItem_withItem(
            &self,
            behavior: &UICollisionBehavior,
            item1: &ProtocolObject<dyn UIDynamicItem>,
            item2: &ProtocolObject<dyn UIDynamicItem>,
        );

        #[cfg(feature = "UIDynamicBehavior")]
        #[optional]
        #[method(collisionBehavior:beganContactForItem:withBoundaryIdentifier:atPoint:)]
        unsafe fn collisionBehavior_beganContactForItem_withBoundaryIdentifier_atPoint(
            &self,
            behavior: &UICollisionBehavior,
            item: &ProtocolObject<dyn UIDynamicItem>,
            identifier: Option<&ProtocolObject<dyn NSCopying>>,
            p: CGPoint,
        );

        #[cfg(feature = "UIDynamicBehavior")]
        #[optional]
        #[method(collisionBehavior:endedContactForItem:withBoundaryIdentifier:)]
        unsafe fn collisionBehavior_endedContactForItem_withBoundaryIdentifier(
            &self,
            behavior: &UICollisionBehavior,
            item: &ProtocolObject<dyn UIDynamicItem>,
            identifier: Option<&ProtocolObject<dyn NSCopying>>,
        );
    }

    unsafe impl ProtocolType for dyn UICollisionBehaviorDelegate {}
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "UIDynamicBehavior")]
    pub struct UICollisionBehavior;

    #[cfg(feature = "UIDynamicBehavior")]
    unsafe impl ClassType for UICollisionBehavior {
        #[inherits(NSObject)]
        type Super = UIDynamicBehavior;
        type Mutability = MainThreadOnly;
    }
);

#[cfg(feature = "UIDynamicBehavior")]
unsafe impl NSObjectProtocol for UICollisionBehavior {}

extern_methods!(
    #[cfg(feature = "UIDynamicBehavior")]
    unsafe impl UICollisionBehavior {
        #[method_id(@__retain_semantics Init initWithItems:)]
        pub unsafe fn initWithItems(
            this: Allocated<Self>,
            items: &NSArray<ProtocolObject<dyn UIDynamicItem>>,
        ) -> Retained<Self>;

        #[method(addItem:)]
        pub unsafe fn addItem(&self, item: &ProtocolObject<dyn UIDynamicItem>);

        #[method(removeItem:)]
        pub unsafe fn removeItem(&self, item: &ProtocolObject<dyn UIDynamicItem>);

        #[method_id(@__retain_semantics Other items)]
        pub unsafe fn items(&self) -> Retained<NSArray<ProtocolObject<dyn UIDynamicItem>>>;

        #[method(collisionMode)]
        pub unsafe fn collisionMode(&self) -> UICollisionBehaviorMode;

        #[method(setCollisionMode:)]
        pub unsafe fn setCollisionMode(&self, collision_mode: UICollisionBehaviorMode);

        #[method(translatesReferenceBoundsIntoBoundary)]
        pub unsafe fn translatesReferenceBoundsIntoBoundary(&self) -> bool;

        #[method(setTranslatesReferenceBoundsIntoBoundary:)]
        pub unsafe fn setTranslatesReferenceBoundsIntoBoundary(
            &self,
            translates_reference_bounds_into_boundary: bool,
        );

        #[cfg(feature = "UIGeometry")]
        #[method(setTranslatesReferenceBoundsIntoBoundaryWithInsets:)]
        pub unsafe fn setTranslatesReferenceBoundsIntoBoundaryWithInsets(
            &self,
            insets: UIEdgeInsets,
        );

        #[cfg(feature = "UIBezierPath")]
        #[method(addBoundaryWithIdentifier:forPath:)]
        pub unsafe fn addBoundaryWithIdentifier_forPath(
            &self,
            identifier: &ProtocolObject<dyn NSCopying>,
            bezier_path: &UIBezierPath,
        );

        #[method(addBoundaryWithIdentifier:fromPoint:toPoint:)]
        pub unsafe fn addBoundaryWithIdentifier_fromPoint_toPoint(
            &self,
            identifier: &ProtocolObject<dyn NSCopying>,
            p1: CGPoint,
            p2: CGPoint,
        );

        #[cfg(feature = "UIBezierPath")]
        #[method_id(@__retain_semantics Other boundaryWithIdentifier:)]
        pub unsafe fn boundaryWithIdentifier(
            &self,
            identifier: &ProtocolObject<dyn NSCopying>,
        ) -> Option<Retained<UIBezierPath>>;

        #[method(removeBoundaryWithIdentifier:)]
        pub unsafe fn removeBoundaryWithIdentifier(
            &self,
            identifier: &ProtocolObject<dyn NSCopying>,
        );

        #[method_id(@__retain_semantics Other boundaryIdentifiers)]
        pub unsafe fn boundaryIdentifiers(
            &self,
        ) -> Option<Retained<NSArray<ProtocolObject<dyn NSCopying>>>>;

        #[method(removeAllBoundaries)]
        pub unsafe fn removeAllBoundaries(&self);

        #[method_id(@__retain_semantics Other collisionDelegate)]
        pub unsafe fn collisionDelegate(
            &self,
        ) -> Option<Retained<ProtocolObject<dyn UICollisionBehaviorDelegate>>>;

        #[method(setCollisionDelegate:)]
        pub unsafe fn setCollisionDelegate(
            &self,
            collision_delegate: Option<&ProtocolObject<dyn UICollisionBehaviorDelegate>>,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "UIDynamicBehavior")]
    unsafe impl UICollisionBehavior {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);