use crate::sizers::WxSizer as WxSizerTrait;
use crate::sizers::base::{Orientation, Sizer};
use std::marker::PhantomData;
use std::ops::Deref;
use wxdragon_sys as ffi;
widget_style_enum!(
name: WrapSizerFlag,
doc: "Style flags for WrapSizer.",
variants: {
ExtendLastOnEachLine: ffi::WXD_EXTEND_LAST_ON_EACH_LINE, "Extend the last item on each line to fill available space.",
RemoveLeadingSpaces: ffi::WXD_REMOVE_LEADING_SPACES, "Remove leading spacers from the beginning of each line.",
DefaultFlags: ffi::WXD_WRAPSIZER_DEFAULT_FLAGS, "Default flags (ExtendLastOnEachLine | RemoveLeadingSpaces)."
},
default_variant: DefaultFlags
);
#[derive(Clone, Copy)]
pub struct WrapSizer {
raw_specific_ptr: *mut ffi::wxd_WrapSizer_t, sizer_base: Sizer, }
impl WrapSizer {
pub(crate) unsafe fn from_ptr(ptr: *mut ffi::wxd_WrapSizer_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| WrapSizer {
raw_specific_ptr: ptr,
sizer_base,
})
}
}
}
#[allow(dead_code)]
pub(crate) fn as_wrap_sizer_ptr(&self) -> *mut ffi::wxd_WrapSizer_t {
self.raw_specific_ptr
}
pub fn builder(orientation: Orientation) -> WrapSizerBuilder {
WrapSizerBuilder::new(orientation)
}
}
impl WxSizerTrait for WrapSizer {
fn as_sizer_ptr(&self) -> *mut ffi::wxd_Sizer_t {
self.sizer_base.as_sizer_ptr()
}
}
impl Deref for WrapSizer {
type Target = Sizer;
fn deref(&self) -> &Self::Target {
&self.sizer_base
}
}
pub struct WrapSizerBuilder {
orientation: Orientation,
flags: WrapSizerFlag,
_marker: PhantomData<()>,
}
impl WrapSizerBuilder {
fn new(orientation: Orientation) -> Self {
Self {
orientation,
flags: WrapSizerFlag::DefaultFlags,
_marker: PhantomData,
}
}
pub fn with_flags(mut self, flags: WrapSizerFlag) -> Self {
self.flags = flags;
self
}
pub fn build(self) -> WrapSizer {
let ptr = unsafe { ffi::wxd_WrapSizer_Create(self.orientation.bits() as i32, self.flags.bits() as i32) };
unsafe { WrapSizer::from_ptr(ptr).expect("Failed to create wxWrapSizer") }
}
}