use crate::prelude::Size;
use crate::sizers::WxSizer as WxSizerTrait;
use crate::sizers::base::Sizer;
use crate::window::WxWidget;
use std::ops::Deref;
use wxdragon_sys as ffi;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct GBPosition {
pub row: i32,
pub col: i32,
}
impl GBPosition {
pub fn new(row: i32, col: i32) -> Self {
Self { row, col }
}
pub fn get_row(&self) -> i32 {
self.row
}
pub fn get_col(&self) -> i32 {
self.col
}
pub fn set_row(&mut self, row: i32) {
self.row = row;
}
pub fn set_col(&mut self, col: i32) {
self.col = col;
}
pub(crate) fn to_ffi(self) -> ffi::wxd_GBPosition {
ffi::wxd_GBPosition {
row: self.row,
col: self.col,
}
}
pub(crate) fn from_ffi(pos: ffi::wxd_GBPosition) -> Self {
Self {
row: pos.row,
col: pos.col,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct GBSpan {
pub rowspan: i32,
pub colspan: i32,
}
impl GBSpan {
pub fn new(rowspan: i32, colspan: i32) -> Self {
Self { rowspan, colspan }
}
pub fn get_rowspan(&self) -> i32 {
self.rowspan
}
pub fn get_colspan(&self) -> i32 {
self.colspan
}
pub fn set_rowspan(&mut self, rowspan: i32) {
self.rowspan = rowspan;
}
pub fn set_colspan(&mut self, colspan: i32) {
self.colspan = colspan;
}
pub(crate) fn to_ffi(self) -> ffi::wxd_GBSpan {
ffi::wxd_GBSpan {
rowspan: self.rowspan,
colspan: self.colspan,
}
}
pub(crate) fn from_ffi(span: ffi::wxd_GBSpan) -> Self {
Self {
rowspan: span.rowspan,
colspan: span.colspan,
}
}
}
pub const DEFAULT_GB_POSITION: GBPosition = GBPosition { row: 0, col: 0 };
pub const DEFAULT_GB_SPAN: GBSpan = GBSpan { rowspan: 1, colspan: 1 };
#[derive(Clone, Copy)]
pub struct GridBagSizer {
raw_specific_ptr: *mut ffi::wxd_GridBagSizer_t, sizer_base: Sizer, }
impl GridBagSizer {
pub(crate) unsafe fn from_ptr(ptr: *mut ffi::wxd_GridBagSizer_t) -> Option<Self> {
if ptr.is_null() {
None
} else {
let base_ptr = ptr as *mut ffi::wxd_Sizer_t;
unsafe {
Sizer::from_ptr(base_ptr).map(|sizer_base| GridBagSizer {
raw_specific_ptr: ptr,
sizer_base,
})
}
}
}
#[allow(dead_code)]
pub(crate) fn as_grid_bag_sizer_ptr(&self) -> *mut ffi::wxd_GridBagSizer_t {
self.raw_specific_ptr
}
pub fn builder() -> GridBagSizerBuilder {
GridBagSizerBuilder::new()
}
pub fn add_at<W: WxWidget>(&self, window: &W, pos: GBPosition, span: GBSpan, flag: crate::sizers::SizerFlag, border: i32) {
unsafe {
ffi::wxd_GridBagSizer_AddWindow(
self.raw_specific_ptr,
window.handle_ptr(),
pos.to_ffi(),
span.to_ffi(),
flag.bits() as i32,
border,
);
}
}
pub fn add_sizer_at<S: WxSizerTrait>(
&self,
sizer: &S,
pos: GBPosition,
span: GBSpan,
flag: crate::sizers::SizerFlag,
border: i32,
) {
unsafe {
ffi::wxd_GridBagSizer_AddSizer(
self.raw_specific_ptr,
sizer.as_sizer_ptr(),
pos.to_ffi(),
span.to_ffi(),
flag.bits() as i32,
border,
);
}
}
pub fn add_spacer_at(
&self,
width: i32,
height: i32,
pos: GBPosition,
span: GBSpan,
flag: crate::sizers::SizerFlag,
border: i32,
) {
unsafe {
ffi::wxd_GridBagSizer_AddSpacer(
self.raw_specific_ptr,
width,
height,
pos.to_ffi(),
span.to_ffi(),
flag.bits() as i32,
border,
);
}
}
pub fn get_item_position<W: WxWidget>(&self, window: &W) -> GBPosition {
let pos = unsafe { ffi::wxd_GridBagSizer_GetItemPosition_Window(self.raw_specific_ptr, window.handle_ptr()) };
GBPosition::from_ffi(pos)
}
pub fn get_sizer_position<S: WxSizerTrait>(&self, sizer: &S) -> GBPosition {
let pos = unsafe { ffi::wxd_GridBagSizer_GetItemPosition_Sizer(self.raw_specific_ptr, sizer.as_sizer_ptr()) };
GBPosition::from_ffi(pos)
}
pub fn get_item_position_by_index(&self, index: usize) -> GBPosition {
let pos = unsafe { ffi::wxd_GridBagSizer_GetItemPosition_Index(self.raw_specific_ptr, index) };
GBPosition::from_ffi(pos)
}
pub fn set_item_position<W: WxWidget>(&self, window: &W, pos: GBPosition) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemPosition_Window(self.raw_specific_ptr, window.handle_ptr(), pos.to_ffi()) }
}
pub fn set_sizer_position<S: WxSizerTrait>(&self, sizer: &S, pos: GBPosition) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemPosition_Sizer(self.raw_specific_ptr, sizer.as_sizer_ptr(), pos.to_ffi()) }
}
pub fn set_item_position_by_index(&self, index: usize, pos: GBPosition) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemPosition_Index(self.raw_specific_ptr, index, pos.to_ffi()) }
}
pub fn get_item_span<W: WxWidget>(&self, window: &W) -> GBSpan {
let span = unsafe { ffi::wxd_GridBagSizer_GetItemSpan_Window(self.raw_specific_ptr, window.handle_ptr()) };
GBSpan::from_ffi(span)
}
pub fn get_sizer_span<S: WxSizerTrait>(&self, sizer: &S) -> GBSpan {
let span = unsafe { ffi::wxd_GridBagSizer_GetItemSpan_Sizer(self.raw_specific_ptr, sizer.as_sizer_ptr()) };
GBSpan::from_ffi(span)
}
pub fn get_item_span_by_index(&self, index: usize) -> GBSpan {
let span = unsafe { ffi::wxd_GridBagSizer_GetItemSpan_Index(self.raw_specific_ptr, index) };
GBSpan::from_ffi(span)
}
pub fn set_item_span<W: WxWidget>(&self, window: &W, span: GBSpan) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemSpan_Window(self.raw_specific_ptr, window.handle_ptr(), span.to_ffi()) }
}
pub fn set_sizer_span<S: WxSizerTrait>(&self, sizer: &S, span: GBSpan) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemSpan_Sizer(self.raw_specific_ptr, sizer.as_sizer_ptr(), span.to_ffi()) }
}
pub fn set_item_span_by_index(&self, index: usize, span: GBSpan) -> bool {
unsafe { ffi::wxd_GridBagSizer_SetItemSpan_Index(self.raw_specific_ptr, index, span.to_ffi()) }
}
pub fn get_empty_cell_size(&self) -> Size {
let size = unsafe { ffi::wxd_GridBagSizer_GetEmptyCellSize(self.raw_specific_ptr) };
Size::new(size.width, size.height)
}
pub fn set_empty_cell_size(&self, size: Size) {
let ffi_size = ffi::wxd_Size {
width: size.width,
height: size.height,
};
unsafe { ffi::wxd_GridBagSizer_SetEmptyCellSize(self.raw_specific_ptr, ffi_size) };
}
pub fn get_cell_size(&self, row: i32, col: i32) -> Size {
let size = unsafe { ffi::wxd_GridBagSizer_GetCellSize(self.raw_specific_ptr, row, col) };
Size::new(size.width, size.height)
}
}
impl WxSizerTrait for GridBagSizer {
fn as_sizer_ptr(&self) -> *mut ffi::wxd_Sizer_t {
self.sizer_base.as_sizer_ptr()
}
}
impl Deref for GridBagSizer {
type Target = Sizer;
fn deref(&self) -> &Self::Target {
&self.sizer_base
}
}
pub struct GridBagSizerBuilder {
vgap: i32,
hgap: i32,
}
impl GridBagSizerBuilder {
fn new() -> Self {
Self { vgap: 0, hgap: 0 }
}
pub fn with_vgap(mut self, vgap: i32) -> Self {
self.vgap = vgap;
self
}
pub fn with_hgap(mut self, hgap: i32) -> Self {
self.hgap = hgap;
self
}
pub fn with_gap(mut self, gap: i32) -> Self {
self.vgap = gap;
self.hgap = gap;
self
}
pub fn build(self) -> GridBagSizer {
let ptr = unsafe { ffi::wxd_GridBagSizer_Create(self.vgap, self.hgap) };
unsafe { GridBagSizer::from_ptr(ptr).expect("Failed to create wxGridBagSizer") }
}
}