// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/class.PopoverMenu.html).
pub type PopoverMenu

///|
pub(open) trait IPopoverMenu {
  fn as_popover_menu(Self) -> PopoverMenu
  fn add_child(Self, &IWidget, String) -> Bool = _
  fn get_flags(Self) -> PopoverMenuFlags = _
  fn get_menu_model(Self) -> @gio.MenuModel? = _
  fn remove_child(Self, &IWidget) -> Bool = _
  fn set_flags(Self, PopoverMenuFlags) -> Unit = _
  fn set_menu_model(Self, &@gio.IMenuModel?) -> Unit = _
}

///|
pub impl IPopoverMenu for PopoverMenu with fn as_popover_menu(self) {
  self
}

///|
#borrow(model)
extern "c" fn moonbit_gtk_popover_menu_new_from_model(
  model : @glib.Nullable[@gio.MenuModel],
) -> PopoverMenu = "moonbit_gtk_popover_menu_new_from_model"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/ctor.PopoverMenu.new_from_model.html).
pub fn PopoverMenu::new_from_model(model : &@gio.IMenuModel?) -> PopoverMenu {
  moonbit_gtk_popover_menu_new_from_model(
    match model {
      Some(v) => @glib.Nullable::some(v.as_menu_model())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(model)
extern "c" fn moonbit_gtk_popover_menu_new_from_model_full(
  model : @gio.MenuModel,
  flags : Int,
) -> PopoverMenu = "moonbit_gtk_popover_menu_new_from_model_full"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/ctor.PopoverMenu.new_from_model_full.html).
pub fn PopoverMenu::new_from_model_full(
  model : &@gio.IMenuModel,
  flags : PopoverMenuFlags,
) -> PopoverMenu {
  moonbit_gtk_popover_menu_new_from_model_full(
    model.as_menu_model(),
    flags.to_int(),
  )
}

///|
#borrow(self_, child, id)
extern "c" fn moonbit_gtk_popover_menu_add_child(
  self_ : PopoverMenu,
  child : Widget,
  id : Bytes,
) -> Bool = "moonbit_gtk_popover_menu_add_child"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.add_child.html).
pub fn PopoverMenu::add_child(
  self : PopoverMenu,
  child : &IWidget,
  id : String,
) -> Bool {
  moonbit_gtk_popover_menu_add_child(
    self,
    child.as_widget(),
    @encoding/utf8.encode(id),
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_menu_get_flags(self_ : PopoverMenu) -> Int = "moonbit_gtk_popover_menu_get_flags"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.get_flags.html).
pub fn PopoverMenu::get_flags(self : PopoverMenu) -> PopoverMenuFlags {
  PopoverMenuFlags::from_int(moonbit_gtk_popover_menu_get_flags(self))
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_menu_get_menu_model(
  self_ : PopoverMenu,
) -> @glib.Nullable[@gio.MenuModel] = "moonbit_gtk_popover_menu_get_menu_model"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.get_menu_model.html).
pub fn PopoverMenu::get_menu_model(self : PopoverMenu) -> @gio.MenuModel? {
  let raw_result = moonbit_gtk_popover_menu_get_menu_model(self)
  raw_result.to_option()
}

///|
#borrow(self_, child)
extern "c" fn moonbit_gtk_popover_menu_remove_child(
  self_ : PopoverMenu,
  child : Widget,
) -> Bool = "moonbit_gtk_popover_menu_remove_child"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.remove_child.html).
pub fn PopoverMenu::remove_child(self : PopoverMenu, child : &IWidget) -> Bool {
  moonbit_gtk_popover_menu_remove_child(self, child.as_widget())
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_menu_set_flags(
  self_ : PopoverMenu,
  flags : Int,
) = "moonbit_gtk_popover_menu_set_flags"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.set_flags.html).
pub fn PopoverMenu::set_flags(
  self : PopoverMenu,
  flags : PopoverMenuFlags,
) -> Unit {
  moonbit_gtk_popover_menu_set_flags(self, flags.to_int())
}

///|
#borrow(self_, model)
extern "c" fn moonbit_gtk_popover_menu_set_menu_model(
  self_ : PopoverMenu,
  model : @glib.Nullable[@gio.MenuModel],
) = "moonbit_gtk_popover_menu_set_menu_model"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.PopoverMenu.set_menu_model.html).
pub fn PopoverMenu::set_menu_model(
  self : PopoverMenu,
  model : &@gio.IMenuModel?,
) -> Unit {
  moonbit_gtk_popover_menu_set_menu_model(
    self,
    match model {
      Some(v) => @glib.Nullable::some(v.as_menu_model())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_menu_get_visible_submenu(
  self_ : PopoverMenu,
) -> Bytes = "moonbit_gtk_popover_menu_get_visible_submenu"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/property.PopoverMenu.visible-submenu.html).
pub fn PopoverMenu::get_visible_submenu(self : PopoverMenu) -> String {
  @encoding/utf8.decode_lossy(
    moonbit_gtk_popover_menu_get_visible_submenu(self),
  )
}

///|
#borrow(self_, value)
extern "c" fn moonbit_gtk_popover_menu_set_visible_submenu(
  self_ : PopoverMenu,
  value : Bytes,
) = "moonbit_gtk_popover_menu_set_visible_submenu"

///|
pub fn PopoverMenu::set_visible_submenu(
  self : PopoverMenu,
  value : String,
) -> Unit {
  moonbit_gtk_popover_menu_set_visible_submenu(
    self,
    @encoding/utf8.encode(value),
  )
}

///|
impl IPopoverMenu with fn add_child(self, child, id) -> Bool {
  self.as_popover_menu().add_child(child, id)
}

///|
impl IPopoverMenu with fn get_flags(self) -> PopoverMenuFlags {
  self.as_popover_menu().get_flags()
}

///|
impl IPopoverMenu with fn get_menu_model(self) -> @gio.MenuModel? {
  self.as_popover_menu().get_menu_model()
}

///|
impl IPopoverMenu with fn remove_child(self, child) -> Bool {
  self.as_popover_menu().remove_child(child)
}

///|
impl IPopoverMenu with fn set_flags(self, flags) -> Unit {
  self.as_popover_menu().set_flags(flags)
}

///|
impl IPopoverMenu with fn set_menu_model(self, model) -> Unit {
  self.as_popover_menu().set_menu_model(model)
}

///|
pub fn PopoverMenu::as_popover(self : PopoverMenu) -> Popover = "%identity"

///|
pub impl IPopover for PopoverMenu with fn as_popover(self) {
  self.as_popover()
}

///|
pub fn PopoverMenu::as_widget(self : PopoverMenu) -> Widget = "%identity"

///|
pub impl IWidget for PopoverMenu with fn as_widget(self) {
  self.as_widget()
}

///|
pub fn PopoverMenu::as_gobject_object(self : PopoverMenu) -> @gobject.Object = "%identity"

///|
pub impl @gobject.IObject for PopoverMenu with fn as_object(self) {
  self.as_gobject_object()
}

///|
pub fn PopoverMenu::as_native(self : PopoverMenu) -> Native = "%identity"

///|
pub impl INative for PopoverMenu with fn as_native(self) {
  self.as_native()
}