//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;
use objc2_foundation::*;
#[cfg(feature = "objc2-quartz-core")]
#[cfg(not(target_os = "watchos"))]
use objc2_quartz_core::*;

use crate::*;

extern "C" {
    pub static UICollectionViewLayoutAutomaticDimension: CGFloat;
}

extern "C" {
    pub static UICollectionElementKindSectionHeader: &'static NSString;
}

extern "C" {
    pub static UICollectionElementKindSectionFooter: &'static NSString;
}

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UICollectionViewScrollDirection(pub NSInteger);
impl UICollectionViewScrollDirection {
    #[doc(alias = "UICollectionViewScrollDirectionVertical")]
    pub const Vertical: Self = Self(0);
    #[doc(alias = "UICollectionViewScrollDirectionHorizontal")]
    pub const Horizontal: Self = Self(1);
}

unsafe impl Encode for UICollectionViewScrollDirection {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UICollectionElementCategory(pub NSUInteger);
impl UICollectionElementCategory {
    #[doc(alias = "UICollectionElementCategoryCell")]
    pub const Cell: Self = Self(0);
    #[doc(alias = "UICollectionElementCategorySupplementaryView")]
    pub const SupplementaryView: Self = Self(1);
    #[doc(alias = "UICollectionElementCategoryDecorationView")]
    pub const DecorationView: Self = Self(2);
}

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

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

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct UICollectionViewLayoutAttributes;

    unsafe impl ClassType for UICollectionViewLayoutAttributes {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSCopying for UICollectionViewLayoutAttributes {}

unsafe impl NSObjectProtocol for UICollectionViewLayoutAttributes {}

#[cfg(feature = "UIDynamicBehavior")]
unsafe impl UIDynamicItem for UICollectionViewLayoutAttributes {}

extern_methods!(
    unsafe impl UICollectionViewLayoutAttributes {
        #[method(frame)]
        pub unsafe fn frame(&self) -> CGRect;

        #[method(setFrame:)]
        pub unsafe fn setFrame(&self, frame: CGRect);

        #[method(center)]
        pub unsafe fn center(&self) -> CGPoint;

        #[method(setCenter:)]
        pub unsafe fn setCenter(&self, center: CGPoint);

        #[method(size)]
        pub unsafe fn size(&self) -> CGSize;

        #[method(setSize:)]
        pub unsafe fn setSize(&self, size: CGSize);

        #[cfg(feature = "objc2-quartz-core")]
        #[cfg(not(target_os = "watchos"))]
        #[method(transform3D)]
        pub unsafe fn transform3D(&self) -> CATransform3D;

        #[cfg(feature = "objc2-quartz-core")]
        #[cfg(not(target_os = "watchos"))]
        #[method(setTransform3D:)]
        pub unsafe fn setTransform3D(&self, transform3_d: CATransform3D);

        #[method(bounds)]
        pub unsafe fn bounds(&self) -> CGRect;

        #[method(setBounds:)]
        pub unsafe fn setBounds(&self, bounds: CGRect);

        #[method(transform)]
        pub unsafe fn transform(&self) -> CGAffineTransform;

        #[method(setTransform:)]
        pub unsafe fn setTransform(&self, transform: CGAffineTransform);

        #[method(alpha)]
        pub unsafe fn alpha(&self) -> CGFloat;

        #[method(setAlpha:)]
        pub unsafe fn setAlpha(&self, alpha: CGFloat);

        #[method(zIndex)]
        pub unsafe fn zIndex(&self) -> NSInteger;

        #[method(setZIndex:)]
        pub unsafe fn setZIndex(&self, z_index: NSInteger);

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

        #[method(setHidden:)]
        pub unsafe fn setHidden(&self, hidden: bool);

        #[method_id(@__retain_semantics Other indexPath)]
        pub unsafe fn indexPath(&self) -> Retained<NSIndexPath>;

        #[method(setIndexPath:)]
        pub unsafe fn setIndexPath(&self, index_path: &NSIndexPath);

        #[method(representedElementCategory)]
        pub unsafe fn representedElementCategory(&self) -> UICollectionElementCategory;

        #[method_id(@__retain_semantics Other representedElementKind)]
        pub unsafe fn representedElementKind(&self) -> Option<Retained<NSString>>;

        #[method_id(@__retain_semantics Other layoutAttributesForCellWithIndexPath:)]
        pub unsafe fn layoutAttributesForCellWithIndexPath(
            index_path: &NSIndexPath,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;

        #[method_id(@__retain_semantics Other layoutAttributesForSupplementaryViewOfKind:withIndexPath:)]
        pub unsafe fn layoutAttributesForSupplementaryViewOfKind_withIndexPath(
            element_kind: &NSString,
            index_path: &NSIndexPath,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;

        #[method_id(@__retain_semantics Other layoutAttributesForDecorationViewOfKind:withIndexPath:)]
        pub unsafe fn layoutAttributesForDecorationViewOfKind_withIndexPath(
            decoration_view_kind: &NSString,
            index_path: &NSIndexPath,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UICollectionViewLayoutAttributes {
        #[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>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct UICollectionViewLayoutInvalidationContext;

    unsafe impl ClassType for UICollectionViewLayoutInvalidationContext {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSObjectProtocol for UICollectionViewLayoutInvalidationContext {}

extern_methods!(
    unsafe impl UICollectionViewLayoutInvalidationContext {
        #[method(invalidateEverything)]
        pub unsafe fn invalidateEverything(&self) -> bool;

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

        #[method(invalidateItemsAtIndexPaths:)]
        pub unsafe fn invalidateItemsAtIndexPaths(&self, index_paths: &NSArray<NSIndexPath>);

        #[method(invalidateSupplementaryElementsOfKind:atIndexPaths:)]
        pub unsafe fn invalidateSupplementaryElementsOfKind_atIndexPaths(
            &self,
            element_kind: &NSString,
            index_paths: &NSArray<NSIndexPath>,
        );

        #[method(invalidateDecorationElementsOfKind:atIndexPaths:)]
        pub unsafe fn invalidateDecorationElementsOfKind_atIndexPaths(
            &self,
            element_kind: &NSString,
            index_paths: &NSArray<NSIndexPath>,
        );

        #[method_id(@__retain_semantics Other invalidatedItemIndexPaths)]
        pub unsafe fn invalidatedItemIndexPaths(&self) -> Option<Retained<NSArray<NSIndexPath>>>;

        #[method_id(@__retain_semantics Other invalidatedSupplementaryIndexPaths)]
        pub unsafe fn invalidatedSupplementaryIndexPaths(
            &self,
        ) -> Option<Retained<NSDictionary<NSString, NSArray<NSIndexPath>>>>;

        #[method_id(@__retain_semantics Other invalidatedDecorationIndexPaths)]
        pub unsafe fn invalidatedDecorationIndexPaths(
            &self,
        ) -> Option<Retained<NSDictionary<NSString, NSArray<NSIndexPath>>>>;

        #[method(contentOffsetAdjustment)]
        pub unsafe fn contentOffsetAdjustment(&self) -> CGPoint;

        #[method(setContentOffsetAdjustment:)]
        pub unsafe fn setContentOffsetAdjustment(&self, content_offset_adjustment: CGPoint);

        #[method(contentSizeAdjustment)]
        pub unsafe fn contentSizeAdjustment(&self) -> CGSize;

        #[method(setContentSizeAdjustment:)]
        pub unsafe fn setContentSizeAdjustment(&self, content_size_adjustment: CGSize);

        #[method_id(@__retain_semantics Other previousIndexPathsForInteractivelyMovingItems)]
        pub unsafe fn previousIndexPathsForInteractivelyMovingItems(
            &self,
        ) -> Option<Retained<NSArray<NSIndexPath>>>;

        #[method_id(@__retain_semantics Other targetIndexPathsForInteractivelyMovingItems)]
        pub unsafe fn targetIndexPathsForInteractivelyMovingItems(
            &self,
        ) -> Option<Retained<NSArray<NSIndexPath>>>;

        #[method(interactiveMovementTarget)]
        pub unsafe fn interactiveMovementTarget(&self) -> CGPoint;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UICollectionViewLayoutInvalidationContext {
        #[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>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct UICollectionViewLayout;

    unsafe impl ClassType for UICollectionViewLayout {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSCoding for UICollectionViewLayout {}

unsafe impl NSObjectProtocol for UICollectionViewLayout {}

extern_methods!(
    unsafe impl UICollectionViewLayout {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics Init initWithCoder:)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        #[cfg(all(
            feature = "UICollectionView",
            feature = "UIResponder",
            feature = "UIScrollView",
            feature = "UIView"
        ))]
        #[method_id(@__retain_semantics Other collectionView)]
        pub unsafe fn collectionView(&self) -> Option<Retained<UICollectionView>>;

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

        #[method(invalidateLayoutWithContext:)]
        pub unsafe fn invalidateLayoutWithContext(
            &self,
            context: &UICollectionViewLayoutInvalidationContext,
        );

        #[method(registerClass:forDecorationViewOfKind:)]
        pub unsafe fn registerClass_forDecorationViewOfKind(
            &self,
            view_class: Option<&AnyClass>,
            element_kind: &NSString,
        );

        #[cfg(feature = "UINib")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(registerNib:forDecorationViewOfKind:)]
        pub unsafe fn registerNib_forDecorationViewOfKind(
            &self,
            nib: Option<&UINib>,
            element_kind: &NSString,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UICollectionViewLayout {
        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);

extern_methods!(
    /// UISubclassingHooks
    unsafe impl UICollectionViewLayout {
        #[method(layoutAttributesClass)]
        pub unsafe fn layoutAttributesClass(mtm: MainThreadMarker) -> &'static AnyClass;

        #[method(invalidationContextClass)]
        pub unsafe fn invalidationContextClass(mtm: MainThreadMarker) -> &'static AnyClass;

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

        #[method_id(@__retain_semantics Other layoutAttributesForElementsInRect:)]
        pub unsafe fn layoutAttributesForElementsInRect(
            &self,
            rect: CGRect,
        ) -> Option<Retained<NSArray<UICollectionViewLayoutAttributes>>>;

        #[method_id(@__retain_semantics Other layoutAttributesForItemAtIndexPath:)]
        pub unsafe fn layoutAttributesForItemAtIndexPath(
            &self,
            index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other layoutAttributesForSupplementaryViewOfKind:atIndexPath:)]
        pub unsafe fn layoutAttributesForSupplementaryViewOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other layoutAttributesForDecorationViewOfKind:atIndexPath:)]
        pub unsafe fn layoutAttributesForDecorationViewOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method(shouldInvalidateLayoutForBoundsChange:)]
        pub unsafe fn shouldInvalidateLayoutForBoundsChange(&self, new_bounds: CGRect) -> bool;

        #[method_id(@__retain_semantics Other invalidationContextForBoundsChange:)]
        pub unsafe fn invalidationContextForBoundsChange(
            &self,
            new_bounds: CGRect,
        ) -> Retained<UICollectionViewLayoutInvalidationContext>;

        #[method(shouldInvalidateLayoutForPreferredLayoutAttributes:withOriginalAttributes:)]
        pub unsafe fn shouldInvalidateLayoutForPreferredLayoutAttributes_withOriginalAttributes(
            &self,
            preferred_attributes: &UICollectionViewLayoutAttributes,
            original_attributes: &UICollectionViewLayoutAttributes,
        ) -> bool;

        #[method_id(@__retain_semantics Other invalidationContextForPreferredLayoutAttributes:withOriginalAttributes:)]
        pub unsafe fn invalidationContextForPreferredLayoutAttributes_withOriginalAttributes(
            &self,
            preferred_attributes: &UICollectionViewLayoutAttributes,
            original_attributes: &UICollectionViewLayoutAttributes,
        ) -> Retained<UICollectionViewLayoutInvalidationContext>;

        #[method(targetContentOffsetForProposedContentOffset:withScrollingVelocity:)]
        pub unsafe fn targetContentOffsetForProposedContentOffset_withScrollingVelocity(
            &self,
            proposed_content_offset: CGPoint,
            velocity: CGPoint,
        ) -> CGPoint;

        #[method(targetContentOffsetForProposedContentOffset:)]
        pub unsafe fn targetContentOffsetForProposedContentOffset(
            &self,
            proposed_content_offset: CGPoint,
        ) -> CGPoint;

        #[method(collectionViewContentSize)]
        pub unsafe fn collectionViewContentSize(&self) -> CGSize;

        #[cfg(feature = "UIInterface")]
        #[method(developmentLayoutDirection)]
        pub unsafe fn developmentLayoutDirection(&self) -> UIUserInterfaceLayoutDirection;

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

extern_methods!(
    /// UIUpdateSupportHooks
    unsafe impl UICollectionViewLayout {
        #[cfg(feature = "UICollectionViewUpdateItem")]
        #[method(prepareForCollectionViewUpdates:)]
        pub unsafe fn prepareForCollectionViewUpdates(
            &self,
            update_items: &NSArray<UICollectionViewUpdateItem>,
        );

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

        #[method(prepareForAnimatedBoundsChange:)]
        pub unsafe fn prepareForAnimatedBoundsChange(&self, old_bounds: CGRect);

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

        #[method(prepareForTransitionToLayout:)]
        pub unsafe fn prepareForTransitionToLayout(&self, new_layout: &UICollectionViewLayout);

        #[method(prepareForTransitionFromLayout:)]
        pub unsafe fn prepareForTransitionFromLayout(&self, old_layout: &UICollectionViewLayout);

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

        #[method_id(@__retain_semantics Other initialLayoutAttributesForAppearingItemAtIndexPath:)]
        pub unsafe fn initialLayoutAttributesForAppearingItemAtIndexPath(
            &self,
            item_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other finalLayoutAttributesForDisappearingItemAtIndexPath:)]
        pub unsafe fn finalLayoutAttributesForDisappearingItemAtIndexPath(
            &self,
            item_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other initialLayoutAttributesForAppearingSupplementaryElementOfKind:atIndexPath:)]
        pub unsafe fn initialLayoutAttributesForAppearingSupplementaryElementOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            element_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:)]
        pub unsafe fn finalLayoutAttributesForDisappearingSupplementaryElementOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            element_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other initialLayoutAttributesForAppearingDecorationElementOfKind:atIndexPath:)]
        pub unsafe fn initialLayoutAttributesForAppearingDecorationElementOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            decoration_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other finalLayoutAttributesForDisappearingDecorationElementOfKind:atIndexPath:)]
        pub unsafe fn finalLayoutAttributesForDisappearingDecorationElementOfKind_atIndexPath(
            &self,
            element_kind: &NSString,
            decoration_index_path: &NSIndexPath,
        ) -> Option<Retained<UICollectionViewLayoutAttributes>>;

        #[method_id(@__retain_semantics Other indexPathsToDeleteForSupplementaryViewOfKind:)]
        pub unsafe fn indexPathsToDeleteForSupplementaryViewOfKind(
            &self,
            element_kind: &NSString,
        ) -> Retained<NSArray<NSIndexPath>>;

        #[method_id(@__retain_semantics Other indexPathsToDeleteForDecorationViewOfKind:)]
        pub unsafe fn indexPathsToDeleteForDecorationViewOfKind(
            &self,
            element_kind: &NSString,
        ) -> Retained<NSArray<NSIndexPath>>;

        #[method_id(@__retain_semantics Other indexPathsToInsertForSupplementaryViewOfKind:)]
        pub unsafe fn indexPathsToInsertForSupplementaryViewOfKind(
            &self,
            element_kind: &NSString,
        ) -> Retained<NSArray<NSIndexPath>>;

        #[method_id(@__retain_semantics Other indexPathsToInsertForDecorationViewOfKind:)]
        pub unsafe fn indexPathsToInsertForDecorationViewOfKind(
            &self,
            element_kind: &NSString,
        ) -> Retained<NSArray<NSIndexPath>>;
    }
);

extern_methods!(
    /// UIReorderingSupportHooks
    unsafe impl UICollectionViewLayout {
        #[method_id(@__retain_semantics Other targetIndexPathForInteractivelyMovingItem:withPosition:)]
        pub unsafe fn targetIndexPathForInteractivelyMovingItem_withPosition(
            &self,
            previous_index_path: &NSIndexPath,
            position: CGPoint,
        ) -> Retained<NSIndexPath>;

        #[method_id(@__retain_semantics Other layoutAttributesForInteractivelyMovingItemAtIndexPath:withTargetPosition:)]
        pub unsafe fn layoutAttributesForInteractivelyMovingItemAtIndexPath_withTargetPosition(
            &self,
            index_path: &NSIndexPath,
            position: CGPoint,
        ) -> Retained<UICollectionViewLayoutAttributes>;

        #[method_id(@__retain_semantics Other invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:)]
        pub unsafe fn invalidationContextForInteractivelyMovingItems_withTargetPosition_previousIndexPaths_previousPosition(
            &self,
            target_index_paths: &NSArray<NSIndexPath>,
            target_position: CGPoint,
            previous_index_paths: &NSArray<NSIndexPath>,
            previous_position: CGPoint,
        ) -> Retained<UICollectionViewLayoutInvalidationContext>;

        #[method_id(@__retain_semantics Other invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:previousIndexPaths:movementCancelled:)]
        pub unsafe fn invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths_previousIndexPaths_movementCancelled(
            &self,
            index_paths: &NSArray<NSIndexPath>,
            previous_index_paths: &NSArray<NSIndexPath>,
            movement_cancelled: bool,
        ) -> Retained<UICollectionViewLayoutInvalidationContext>;
    }
);
