// GENERATED — DO NOT EDIT

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

///|
pub(open) trait IMenuItem {
  fn as_menu_item(Self) -> MenuItem
  fn get_link(Self, String) -> MenuModel? = _
  fn set_action_and_target_value(Self, String?, &@glib.IVariant?) -> Unit = _
  fn set_attribute_value(Self, String, &@glib.IVariant?) -> Unit = _
  fn set_detailed_action(Self, String) -> Unit = _
  fn set_icon(Self, &IIcon) -> Unit = _
  fn set_label(Self, String?) -> Unit = _
  fn set_link(Self, String, &IMenuModel?) -> Unit = _
  fn set_section(Self, &IMenuModel?) -> Unit = _
  fn set_submenu(Self, &IMenuModel?) -> Unit = _
}

///|
pub impl IMenuItem for MenuItem with fn as_menu_item(self) {
  self
}

///|
#borrow(label, detailed_action)
extern "c" fn moonbit_g_menu_item_new(
  label : @glib.Nullable[Bytes],
  detailed_action : @glib.Nullable[Bytes],
) -> MenuItem = "moonbit_g_menu_item_new"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.MenuItem.new.html).
pub fn MenuItem::new(label : String?, detailed_action : String?) -> MenuItem {
  moonbit_g_menu_item_new(
    match label {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    match detailed_action {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(model)
extern "c" fn moonbit_g_menu_item_new_from_model(
  model : MenuModel,
  item_index : Int,
) -> MenuItem = "moonbit_g_menu_item_new_from_model"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.MenuItem.new_from_model.html).
pub fn MenuItem::new_from_model(
  model : &IMenuModel,
  item_index : Int,
) -> MenuItem {
  moonbit_g_menu_item_new_from_model(model.as_menu_model(), item_index)
}

///|
#borrow(label, section)
extern "c" fn moonbit_g_menu_item_new_section(
  label : @glib.Nullable[Bytes],
  section : MenuModel,
) -> MenuItem = "moonbit_g_menu_item_new_section"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.MenuItem.new_section.html).
pub fn MenuItem::new_section(
  label : String?,
  section : &IMenuModel,
) -> MenuItem {
  moonbit_g_menu_item_new_section(
    match label {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    section.as_menu_model(),
  )
}

///|
#borrow(label, submenu)
extern "c" fn moonbit_g_menu_item_new_submenu(
  label : @glib.Nullable[Bytes],
  submenu : MenuModel,
) -> MenuItem = "moonbit_g_menu_item_new_submenu"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.MenuItem.new_submenu.html).
pub fn MenuItem::new_submenu(
  label : String?,
  submenu : &IMenuModel,
) -> MenuItem {
  moonbit_g_menu_item_new_submenu(
    match label {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    submenu.as_menu_model(),
  )
}

///|
#borrow(self_, link)
extern "c" fn moonbit_g_menu_item_get_link(
  self_ : MenuItem,
  link : Bytes,
) -> @glib.Nullable[MenuModel] = "moonbit_g_menu_item_get_link"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.get_link.html).
pub fn MenuItem::get_link(self : MenuItem, link : String) -> MenuModel? {
  let raw_result = moonbit_g_menu_item_get_link(
    self,
    @encoding/utf8.encode(link),
  )
  raw_result.to_option()
}

///|
#borrow(self_, action, target_value)
extern "c" fn moonbit_g_menu_item_set_action_and_target_value(
  self_ : MenuItem,
  action : @glib.Nullable[Bytes],
  target_value : @glib.Nullable[@glib.Variant],
) = "moonbit_g_menu_item_set_action_and_target_value"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_action_and_target_value.html).
pub fn MenuItem::set_action_and_target_value(
  self : MenuItem,
  action : String?,
  target_value : &@glib.IVariant?,
) -> Unit {
  moonbit_g_menu_item_set_action_and_target_value(
    self,
    match action {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    match target_value {
      Some(v) => @glib.Nullable::some(v.as_variant())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, attribute, value)
extern "c" fn moonbit_g_menu_item_set_attribute_value(
  self_ : MenuItem,
  attribute : Bytes,
  value : @glib.Nullable[@glib.Variant],
) = "moonbit_g_menu_item_set_attribute_value"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_attribute_value.html).
pub fn MenuItem::set_attribute_value(
  self : MenuItem,
  attribute : String,
  value : &@glib.IVariant?,
) -> Unit {
  moonbit_g_menu_item_set_attribute_value(
    self,
    @encoding/utf8.encode(attribute),
    match value {
      Some(v) => @glib.Nullable::some(v.as_variant())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, detailed_action)
extern "c" fn moonbit_g_menu_item_set_detailed_action(
  self_ : MenuItem,
  detailed_action : Bytes,
) = "moonbit_g_menu_item_set_detailed_action"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_detailed_action.html).
pub fn MenuItem::set_detailed_action(
  self : MenuItem,
  detailed_action : String,
) -> Unit {
  moonbit_g_menu_item_set_detailed_action(
    self,
    @encoding/utf8.encode(detailed_action),
  )
}

///|
#borrow(self_, icon)
extern "c" fn moonbit_g_menu_item_set_icon(self_ : MenuItem, icon : Icon) = "moonbit_g_menu_item_set_icon"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_icon.html).
pub fn MenuItem::set_icon(self : MenuItem, icon : &IIcon) -> Unit {
  moonbit_g_menu_item_set_icon(self, icon.as_icon())
}

///|
#borrow(self_, label)
extern "c" fn moonbit_g_menu_item_set_label(
  self_ : MenuItem,
  label : @glib.Nullable[Bytes],
) = "moonbit_g_menu_item_set_label"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_label.html).
pub fn MenuItem::set_label(self : MenuItem, label : String?) -> Unit {
  moonbit_g_menu_item_set_label(
    self,
    match label {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, link, model)
extern "c" fn moonbit_g_menu_item_set_link(
  self_ : MenuItem,
  link : Bytes,
  model : @glib.Nullable[MenuModel],
) = "moonbit_g_menu_item_set_link"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.MenuItem.set_link.html).
pub fn MenuItem::set_link(
  self : MenuItem,
  link : String,
  model : &IMenuModel?,
) -> Unit {
  moonbit_g_menu_item_set_link(
    self,
    @encoding/utf8.encode(link),
    match model {
      Some(v) => @glib.Nullable::some(v.as_menu_model())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, section)
extern "c" fn moonbit_g_menu_item_set_section(
  self_ : MenuItem,
  section : @glib.Nullable[MenuModel],
) = "moonbit_g_menu_item_set_section"

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

///|
#borrow(self_, submenu)
extern "c" fn moonbit_g_menu_item_set_submenu(
  self_ : MenuItem,
  submenu : @glib.Nullable[MenuModel],
) = "moonbit_g_menu_item_set_submenu"

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

///|
impl IMenuItem with fn get_link(self, link) -> MenuModel? {
  self.as_menu_item().get_link(link)
}

///|
impl IMenuItem with fn set_action_and_target_value(self, action, target_value) -> Unit {
  self.as_menu_item().set_action_and_target_value(action, target_value)
}

///|
impl IMenuItem with fn set_attribute_value(self, attribute, value) -> Unit {
  self.as_menu_item().set_attribute_value(attribute, value)
}

///|
impl IMenuItem with fn set_detailed_action(self, detailed_action) -> Unit {
  self.as_menu_item().set_detailed_action(detailed_action)
}

///|
impl IMenuItem with fn set_icon(self, icon) -> Unit {
  self.as_menu_item().set_icon(icon)
}

///|
impl IMenuItem with fn set_label(self, label) -> Unit {
  self.as_menu_item().set_label(label)
}

///|
impl IMenuItem with fn set_link(self, link, model) -> Unit {
  self.as_menu_item().set_link(link, model)
}

///|
impl IMenuItem with fn set_section(self, section) -> Unit {
  self.as_menu_item().set_section(section)
}

///|
impl IMenuItem with fn set_submenu(self, submenu) -> Unit {
  self.as_menu_item().set_submenu(submenu)
}

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

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