// GENERATED — DO NOT EDIT

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

///|
pub(open) trait IWindowGroup {
  fn as_window_group(Self) -> WindowGroup
  fn add_window(Self, &IWindow) -> Unit = _
  fn list_windows(Self) -> Array[Window] = _
  fn remove_window(Self, &IWindow) -> Unit = _
}

///|
pub impl IWindowGroup for WindowGroup with fn as_window_group(self) {
  self
}

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

///|
#borrow(self_, window)
extern "c" fn moonbit_gtk_window_group_add_window(
  self_ : WindowGroup,
  window : Window,
) = "moonbit_gtk_window_group_add_window"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.WindowGroup.add_window.html).
pub fn WindowGroup::add_window(self : WindowGroup, window : &IWindow) -> Unit {
  moonbit_gtk_window_group_add_window(self, window.as_window())
}

///|
#borrow(self_, result)
extern "c" fn moonbit_gtk_window_group_list_windows(
  self_ : WindowGroup,
  result : Ref[FixedArray[Window]],
) = "moonbit_gtk_window_group_list_windows"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.WindowGroup.list_windows.html).
pub fn WindowGroup::list_windows(self : WindowGroup) -> Array[Window] {
  let result_ref : Ref[FixedArray[Window]] = Ref([])
  moonbit_gtk_window_group_list_windows(self, result_ref)
  let values : Array[Window] = Array::new(capacity=result_ref.val.length())
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(self_, window)
extern "c" fn moonbit_gtk_window_group_remove_window(
  self_ : WindowGroup,
  window : Window,
) = "moonbit_gtk_window_group_remove_window"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.WindowGroup.remove_window.html).
pub fn WindowGroup::remove_window(
  self : WindowGroup,
  window : &IWindow,
) -> Unit {
  moonbit_gtk_window_group_remove_window(self, window.as_window())
}

///|
impl IWindowGroup with fn add_window(self, window) -> Unit {
  self.as_window_group().add_window(window)
}

///|
impl IWindowGroup with fn list_windows(self) -> Array[Window] {
  self.as_window_group().list_windows()
}

///|
impl IWindowGroup with fn remove_window(self, window) -> Unit {
  self.as_window_group().remove_window(window)
}

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

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