// GENERATED — DO NOT EDIT

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

///|
pub(open) trait IPopover {
  fn as_popover(Self) -> Popover
  fn get_autohide(Self) -> Bool = _
  fn get_cascade_popdown(Self) -> Bool = _
  fn get_child(Self) -> Widget? = _
  fn get_has_arrow(Self) -> Bool = _
  fn get_mnemonics_visible(Self) -> Bool = _
  fn get_offset(Self) -> (Int, Int) = _
  fn get_pointing_to(Self) -> (@gdk.Rectangle, Bool) = _
  fn get_position(Self) -> PositionType = _
  fn popdown(Self) -> Unit = _
  fn popup(Self) -> Unit = _
  fn present(Self) -> Unit = _
  fn set_autohide(Self, Bool) -> Unit = _
  fn set_cascade_popdown(Self, Bool) -> Unit = _
  fn set_child(Self, &IWidget?) -> Unit = _
  fn set_default_widget(Self, &IWidget?) -> Unit = _
  fn set_has_arrow(Self, Bool) -> Unit = _
  fn set_mnemonics_visible(Self, Bool) -> Unit = _
  fn set_offset(Self, Int, Int) -> Unit = _
  fn set_pointing_to(Self, @gdk.Rectangle?) -> Unit = _
  fn set_position(Self, PositionType) -> Unit = _
  fn connect_activate_default(Self, (Popover) -> Unit) -> UInt64 = _
  fn connect_closed(Self, (Popover) -> Unit) -> UInt64 = _
}

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

///|
/// Implementation contract for Popover.activate_default. Self is the retained MoonBit state; the second parameter is the invoked Popover object.
pub(open) trait VPopoverActivateDefault {
  fn activate_default(Self, Popover) -> Unit
}

///|
/// Implementation contract for Popover.closed. Self is the retained MoonBit state; the second parameter is the invoked Popover object.
pub(open) trait VPopoverClosed {
  fn closed(Self, Popover) -> Unit
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/ctor.Popover.new.html).
pub extern "c" fn Popover::new() -> Popover = "moonbit_gtk_popover_new"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_autohide.html).
#borrow(self)
pub extern "c" fn Popover::get_autohide(self : Popover) -> Bool = "moonbit_gtk_popover_get_autohide"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_cascade_popdown.html).
#borrow(self)
pub extern "c" fn Popover::get_cascade_popdown(self : Popover) -> Bool = "moonbit_gtk_popover_get_cascade_popdown"

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_get_child(
  self_ : Popover,
) -> @glib.Nullable[Widget] = "moonbit_gtk_popover_get_child"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_child.html).
pub fn Popover::get_child(self : Popover) -> Widget? {
  let raw_result = moonbit_gtk_popover_get_child(self)
  raw_result.to_option()
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_has_arrow.html).
#borrow(self)
pub extern "c" fn Popover::get_has_arrow(self : Popover) -> Bool = "moonbit_gtk_popover_get_has_arrow"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_mnemonics_visible.html).
#borrow(self)
pub extern "c" fn Popover::get_mnemonics_visible(self : Popover) -> Bool = "moonbit_gtk_popover_get_mnemonics_visible"

///|
#borrow(self_, x_offset, y_offset)
extern "c" fn moonbit_gtk_popover_get_offset(
  self_ : Popover,
  x_offset : Ref[Int],
  y_offset : Ref[Int],
) = "moonbit_gtk_popover_get_offset"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_offset.html).
pub fn Popover::get_offset(self : Popover) -> (Int, Int) {
  let x_offset = Ref(0)
  let y_offset = Ref(0)
  moonbit_gtk_popover_get_offset(self, x_offset, y_offset)
  (x_offset.val, y_offset.val)
}

///|
#borrow(self_, native_result)
extern "c" fn moonbit_gtk_popover_get_pointing_to(
  self_ : Popover,
  native_result : Ref[Int],
) -> @gdk.Rectangle = "moonbit_gtk_popover_get_pointing_to"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_pointing_to.html).
pub fn Popover::get_pointing_to(self : Popover) -> (@gdk.Rectangle, Bool) {
  let native_result = Ref(0)
  let __result = moonbit_gtk_popover_get_pointing_to(self, native_result)
  (__result, native_result.val != 0)
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.get_position.html).
#borrow(self)
pub extern "c" fn Popover::get_position(self : Popover) -> PositionType = "moonbit_gtk_popover_get_position"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.popdown.html).
#borrow(self)
pub extern "c" fn Popover::popdown(self : Popover) = "moonbit_gtk_popover_popdown"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.popup.html).
#borrow(self)
pub extern "c" fn Popover::popup(self : Popover) = "moonbit_gtk_popover_popup"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.present.html).
#borrow(self)
pub extern "c" fn Popover::present(self : Popover) = "moonbit_gtk_popover_present"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_autohide.html).
#borrow(self)
pub extern "c" fn Popover::set_autohide(self : Popover, autohide : Bool) = "moonbit_gtk_popover_set_autohide"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_cascade_popdown.html).
#borrow(self)
pub extern "c" fn Popover::set_cascade_popdown(
  self : Popover,
  cascade_popdown : Bool,
) = "moonbit_gtk_popover_set_cascade_popdown"

///|
#borrow(self_, child)
extern "c" fn moonbit_gtk_popover_set_child(
  self_ : Popover,
  child : @glib.Nullable[Widget],
) = "moonbit_gtk_popover_set_child"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_child.html).
pub fn Popover::set_child(self : Popover, child : &IWidget?) -> Unit {
  moonbit_gtk_popover_set_child(
    self,
    match child {
      Some(v) => @glib.Nullable::some(v.as_widget())
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, widget)
extern "c" fn moonbit_gtk_popover_set_default_widget(
  self_ : Popover,
  widget : @glib.Nullable[Widget],
) = "moonbit_gtk_popover_set_default_widget"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_default_widget.html).
pub fn Popover::set_default_widget(self : Popover, widget : &IWidget?) -> Unit {
  moonbit_gtk_popover_set_default_widget(
    self,
    match widget {
      Some(v) => @glib.Nullable::some(v.as_widget())
      None => @glib.Nullable::null()
    },
  )
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_has_arrow.html).
#borrow(self)
pub extern "c" fn Popover::set_has_arrow(self : Popover, has_arrow : Bool) = "moonbit_gtk_popover_set_has_arrow"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_mnemonics_visible.html).
#borrow(self)
pub extern "c" fn Popover::set_mnemonics_visible(
  self : Popover,
  mnemonics_visible : Bool,
) = "moonbit_gtk_popover_set_mnemonics_visible"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_offset.html).
#borrow(self)
pub extern "c" fn Popover::set_offset(
  self : Popover,
  x_offset : Int,
  y_offset : Int,
) = "moonbit_gtk_popover_set_offset"

///|
#borrow(self_, rect)
extern "c" fn moonbit_gtk_popover_set_pointing_to(
  self_ : Popover,
  rect : @glib.Nullable[@gdk.Rectangle],
) = "moonbit_gtk_popover_set_pointing_to"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_pointing_to.html).
pub fn Popover::set_pointing_to(self : Popover, rect : @gdk.Rectangle?) -> Unit {
  moonbit_gtk_popover_set_pointing_to(
    self,
    match rect {
      Some(v) => @glib.Nullable::some(v)
      None => @glib.Nullable::null()
    },
  )
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Popover.set_position.html).
#borrow(self)
pub extern "c" fn Popover::set_position(
  self : Popover,
  position : PositionType,
) = "moonbit_gtk_popover_set_position"

///|
#borrow(instance)
extern "c" fn gtk_popover_connect_activate_default(
  instance : Popover,
  function : FuncRef[(Popover, (Popover) -> Unit) -> Unit],
  closure : (Popover) -> Unit,
) -> UInt64 = "moonbit_gtk_popover_connect_activate_default"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/signal.Popover.activate-default.html).
pub fn Popover::connect_activate_default(
  self : Popover,
  f : (Popover) -> Unit,
) -> UInt64 {
  gtk_popover_connect_activate_default(
    self,
    fn(instance_, f) { f(instance_) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn gtk_popover_connect_closed(
  instance : Popover,
  function : FuncRef[(Popover, (Popover) -> Unit) -> Unit],
  closure : (Popover) -> Unit,
) -> UInt64 = "moonbit_gtk_popover_connect_closed"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/signal.Popover.closed.html).
pub fn Popover::connect_closed(self : Popover, f : (Popover) -> Unit) -> UInt64 {
  gtk_popover_connect_closed(self, fn(instance_, f) { f(instance_) }, f)
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_popover_get_default_widget(
  self_ : Popover,
) -> @glib.Nullable[Widget] = "moonbit_gtk_popover_get_default_widget"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/property.Popover.default-widget.html).
pub fn Popover::get_default_widget(self : Popover) -> Widget? {
  moonbit_gtk_popover_get_default_widget(self).to_option()
}

///|
impl IPopover with fn get_autohide(self) -> Bool {
  self.as_popover().get_autohide()
}

///|
impl IPopover with fn get_cascade_popdown(self) -> Bool {
  self.as_popover().get_cascade_popdown()
}

///|
impl IPopover with fn get_child(self) -> Widget? {
  self.as_popover().get_child()
}

///|
impl IPopover with fn get_has_arrow(self) -> Bool {
  self.as_popover().get_has_arrow()
}

///|
impl IPopover with fn get_mnemonics_visible(self) -> Bool {
  self.as_popover().get_mnemonics_visible()
}

///|
impl IPopover with fn get_offset(self) -> (Int, Int) {
  self.as_popover().get_offset()
}

///|
impl IPopover with fn get_pointing_to(self) -> (@gdk.Rectangle, Bool) {
  self.as_popover().get_pointing_to()
}

///|
impl IPopover with fn get_position(self) -> PositionType {
  self.as_popover().get_position()
}

///|
impl IPopover with fn popdown(self) -> Unit {
  self.as_popover().popdown()
}

///|
impl IPopover with fn popup(self) -> Unit {
  self.as_popover().popup()
}

///|
impl IPopover with fn present(self) -> Unit {
  self.as_popover().present()
}

///|
impl IPopover with fn set_autohide(self, autohide) -> Unit {
  self.as_popover().set_autohide(autohide)
}

///|
impl IPopover with fn set_cascade_popdown(self, cascade_popdown) -> Unit {
  self.as_popover().set_cascade_popdown(cascade_popdown)
}

///|
impl IPopover with fn set_child(self, child) -> Unit {
  self.as_popover().set_child(child)
}

///|
impl IPopover with fn set_default_widget(self, widget) -> Unit {
  self.as_popover().set_default_widget(widget)
}

///|
impl IPopover with fn set_has_arrow(self, has_arrow) -> Unit {
  self.as_popover().set_has_arrow(has_arrow)
}

///|
impl IPopover with fn set_mnemonics_visible(self, mnemonics_visible) -> Unit {
  self.as_popover().set_mnemonics_visible(mnemonics_visible)
}

///|
impl IPopover with fn set_offset(self, x_offset, y_offset) -> Unit {
  self.as_popover().set_offset(x_offset, y_offset)
}

///|
impl IPopover with fn set_pointing_to(self, rect) -> Unit {
  self.as_popover().set_pointing_to(rect)
}

///|
impl IPopover with fn set_position(self, position) -> Unit {
  self.as_popover().set_position(position)
}

///|
impl IPopover with fn connect_activate_default(self, f) -> UInt64 {
  self.as_popover().connect_activate_default(f)
}

///|
impl IPopover with fn connect_closed(self, f) -> UInt64 {
  self.as_popover().connect_closed(f)
}

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

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

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

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

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

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