// GENERATED — DO NOT EDIT

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

///|
pub(open) trait IFrame {
  fn as_frame(Self) -> Frame
  fn get_child(Self) -> Widget? = _
  fn get_label(Self) -> String? = _
  fn get_label_align(Self) -> Float = _
  fn get_label_widget(Self) -> Widget? = _
  fn set_child(Self, &IWidget?) -> Unit = _
  fn set_label(Self, String?) -> Unit = _
  fn set_label_align(Self, Float) -> Unit = _
  fn set_label_widget(Self, &IWidget?) -> Unit = _
}

///|
pub impl IFrame for Frame with fn as_frame(self) {
  self
}

///|
/// Implementation contract for Frame.compute_child_allocation. Self is the retained MoonBit state; the second parameter is the invoked Frame object.
pub(open) trait VFrameComputeChildAllocation {
  fn compute_child_allocation(Self, Frame, @gdk.Rectangle) -> Unit
}

///|
#borrow(label)
extern "c" fn moonbit_gtk_frame_new(label : @glib.Nullable[Bytes]) -> Frame = "moonbit_gtk_frame_new"

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

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

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

///|
#borrow(self_)
extern "c" fn moonbit_gtk_frame_get_label(
  self_ : Frame,
) -> @glib.Nullable[Bytes] = "moonbit_gtk_frame_get_label"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Frame.get_label.html).
pub fn Frame::get_label(self : Frame) -> String? {
  let result = moonbit_gtk_frame_get_label(self)
  match result.to_option() {
    Some(bytes) => Some(@encoding/utf8.decode_lossy(bytes))
    None => None
  }
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Frame.get_label_align.html).
#borrow(self)
pub extern "c" fn Frame::get_label_align(self : Frame) -> Float = "moonbit_gtk_frame_get_label_align"

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

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

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

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

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

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

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Frame.set_label_align.html).
#borrow(self)
pub extern "c" fn Frame::set_label_align(self : Frame, xalign : Float) = "moonbit_gtk_frame_set_label_align"

///|
#borrow(self_, label_widget)
extern "c" fn moonbit_gtk_frame_set_label_widget(
  self_ : Frame,
  label_widget : @glib.Nullable[Widget],
) = "moonbit_gtk_frame_set_label_widget"

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

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

///|
impl IFrame with fn get_label(self) -> String? {
  self.as_frame().get_label()
}

///|
impl IFrame with fn get_label_align(self) -> Float {
  self.as_frame().get_label_align()
}

///|
impl IFrame with fn get_label_widget(self) -> Widget? {
  self.as_frame().get_label_widget()
}

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

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

///|
impl IFrame with fn set_label_align(self, xalign) -> Unit {
  self.as_frame().set_label_align(xalign)
}

///|
impl IFrame with fn set_label_widget(self, label_widget) -> Unit {
  self.as_frame().set_label_widget(label_widget)
}

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

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

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

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