//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

// NS_TYPED_EXTENSIBLE_ENUM
pub type UIMenuIdentifier = NSString;

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIMenuOptions(pub NSUInteger);
bitflags::bitflags! {
    impl UIMenuOptions: NSUInteger {
        #[doc(alias = "UIMenuOptionsDisplayInline")]
        const DisplayInline = 1<<0;
        #[doc(alias = "UIMenuOptionsDestructive")]
        const Destructive = 1<<1;
        #[doc(alias = "UIMenuOptionsSingleSelection")]
        const SingleSelection = 1<<5;
        #[doc(alias = "UIMenuOptionsDisplayAsPalette")]
        const DisplayAsPalette = 1<<7;
    }
}

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

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIMenuElementSize(pub NSInteger);
impl UIMenuElementSize {
    #[doc(alias = "UIMenuElementSizeSmall")]
    pub const Small: Self = Self(0);
    #[doc(alias = "UIMenuElementSizeMedium")]
    pub const Medium: Self = Self(1);
    #[doc(alias = "UIMenuElementSizeLarge")]
    pub const Large: Self = Self(2);
    #[doc(alias = "UIMenuElementSizeAutomatic")]
    pub const Automatic: Self = Self(-1);
}

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

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

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

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

#[cfg(feature = "UIMenuElement")]
unsafe impl NSCoding for UIMenu {}

#[cfg(feature = "UIMenuElement")]
unsafe impl NSCopying for UIMenu {}

#[cfg(feature = "UIMenuElement")]
unsafe impl NSObjectProtocol for UIMenu {}

#[cfg(feature = "UIMenuElement")]
unsafe impl NSSecureCoding for UIMenu {}

extern_methods!(
    #[cfg(feature = "UIMenuElement")]
    unsafe impl UIMenu {
        #[method_id(@__retain_semantics Other identifier)]
        pub unsafe fn identifier(&self) -> Retained<UIMenuIdentifier>;

        #[method(options)]
        pub unsafe fn options(&self) -> UIMenuOptions;

        #[method(preferredElementSize)]
        pub unsafe fn preferredElementSize(&self) -> UIMenuElementSize;

        #[method(setPreferredElementSize:)]
        pub unsafe fn setPreferredElementSize(&self, preferred_element_size: UIMenuElementSize);

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

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

        #[cfg(feature = "UIMenuDisplayPreferences")]
        #[method_id(@__retain_semantics Other displayPreferences)]
        pub unsafe fn displayPreferences(&self) -> Option<Retained<UIMenuDisplayPreferences>>;

        #[cfg(feature = "UIMenuDisplayPreferences")]
        #[method(setDisplayPreferences:)]
        pub unsafe fn setDisplayPreferences(
            &self,
            display_preferences: Option<&UIMenuDisplayPreferences>,
        );

        #[method_id(@__retain_semantics Other menuWithChildren:)]
        pub unsafe fn menuWithChildren(
            children: &NSArray<UIMenuElement>,
            mtm: MainThreadMarker,
        ) -> Retained<UIMenu>;

        #[method_id(@__retain_semantics Other menuWithTitle:children:)]
        pub unsafe fn menuWithTitle_children(
            title: &NSString,
            children: &NSArray<UIMenuElement>,
            mtm: MainThreadMarker,
        ) -> Retained<UIMenu>;

        #[cfg(feature = "UIImage")]
        #[method_id(@__retain_semantics Other menuWithTitle:image:identifier:options:children:)]
        pub unsafe fn menuWithTitle_image_identifier_options_children(
            title: &NSString,
            image: Option<&UIImage>,
            identifier: Option<&UIMenuIdentifier>,
            options: UIMenuOptions,
            children: &NSArray<UIMenuElement>,
            mtm: MainThreadMarker,
        ) -> Retained<UIMenu>;

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

        #[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>;

        #[method_id(@__retain_semantics Other menuByReplacingChildren:)]
        pub unsafe fn menuByReplacingChildren(
            &self,
            new_children: &NSArray<UIMenuElement>,
        ) -> Retained<UIMenu>;
    }
);

extern "C" {
    pub static UIMenuApplication: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuFile: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuEdit: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuView: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuWindow: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuHelp: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuAbout: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuPreferences: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuServices: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuHide: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuQuit: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuNewScene: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuOpenRecent: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuClose: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuPrint: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuDocument: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuUndoRedo: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuStandardEdit: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuFind: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuReplace: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuShare: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuTextStyle: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSpelling: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSpellingPanel: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSpellingOptions: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSubstitutions: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSubstitutionsPanel: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSubstitutionOptions: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuTransformations: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSpeech: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuLookup: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuLearn: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuFormat: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuAutoFill: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuFont: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuTextSize: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuTextColor: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuTextStylePasteboard: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuText: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuWritingDirection: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuAlignment: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuToolbar: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuSidebar: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuFullscreen: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuMinimizeAndZoom: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuBringAllToFront: &'static UIMenuIdentifier;
}

extern "C" {
    pub static UIMenuRoot: &'static UIMenuIdentifier;
}
