use std::ops::Deref;
use crate::sizers::WxSizer as WxSizerTrait;
use crate::sizers::base::Sizer;
use crate::widgets::button::Button;
use crate::window::WxWidget;
use wxdragon_sys as ffi;
#[derive(Clone, Copy)]
pub struct StdDialogButtonSizer {
raw_specific_ptr: *mut ffi::wxd_StdDialogButtonSizer_t,
sizer_base: Sizer,
}
impl StdDialogButtonSizer {
pub(crate) unsafe fn from_ptr(ptr: *mut ffi::wxd_StdDialogButtonSizer_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| StdDialogButtonSizer {
raw_specific_ptr: ptr,
sizer_base,
})
}
}
}
pub fn add_button(&self, button: &Button) {
unsafe {
ffi::wxd_StdDialogButtonSizer_AddButton(self.raw_specific_ptr, button.handle_ptr() as *mut ffi::wxd_Button_t);
}
}
pub fn realize(&self) {
unsafe {
ffi::wxd_StdDialogButtonSizer_Realize(self.raw_specific_ptr);
}
}
pub fn get_affirmative_button(&self) -> Option<Button> {
unsafe {
let ptr = ffi::wxd_StdDialogButtonSizer_GetAffirmativeButton(self.raw_specific_ptr);
if ptr.is_null() {
None
} else {
Some(Button::from_ptr(ptr as *mut ffi::wxd_Window_t))
}
}
}
pub fn get_apply_button(&self) -> Option<Button> {
unsafe {
let ptr = ffi::wxd_StdDialogButtonSizer_GetApplyButton(self.raw_specific_ptr);
if ptr.is_null() {
None
} else {
Some(Button::from_ptr(ptr as *mut ffi::wxd_Window_t))
}
}
}
pub fn get_negative_button(&self) -> Option<Button> {
unsafe {
let ptr = ffi::wxd_StdDialogButtonSizer_GetNegativeButton(self.raw_specific_ptr);
if ptr.is_null() {
None
} else {
Some(Button::from_ptr(ptr as *mut ffi::wxd_Window_t))
}
}
}
pub fn get_cancel_button(&self) -> Option<Button> {
unsafe {
let ptr = ffi::wxd_StdDialogButtonSizer_GetCancelButton(self.raw_specific_ptr);
if ptr.is_null() {
None
} else {
Some(Button::from_ptr(ptr as *mut ffi::wxd_Window_t))
}
}
}
pub fn get_help_button(&self) -> Option<Button> {
unsafe {
let ptr = ffi::wxd_StdDialogButtonSizer_GetHelpButton(self.raw_specific_ptr);
if ptr.is_null() {
None
} else {
Some(Button::from_ptr(ptr as *mut ffi::wxd_Window_t))
}
}
}
pub fn set_affirmative_button(&self, button: &Button) {
unsafe {
ffi::wxd_StdDialogButtonSizer_SetAffirmativeButton(
self.raw_specific_ptr,
button.handle_ptr() as *mut ffi::wxd_Button_t,
);
}
}
pub fn set_negative_button(&self, button: &Button) {
unsafe {
ffi::wxd_StdDialogButtonSizer_SetNegativeButton(self.raw_specific_ptr, button.handle_ptr() as *mut ffi::wxd_Button_t);
}
}
pub fn set_cancel_button(&self, button: &Button) {
unsafe {
ffi::wxd_StdDialogButtonSizer_SetCancelButton(self.raw_specific_ptr, button.handle_ptr() as *mut ffi::wxd_Button_t);
}
}
}
impl WxSizerTrait for StdDialogButtonSizer {
fn as_sizer_ptr(&self) -> *mut ffi::wxd_Sizer_t {
self.sizer_base.as_sizer_ptr()
}
}
impl Deref for StdDialogButtonSizer {
type Target = Sizer;
fn deref(&self) -> &Self::Target {
&self.sizer_base
}
}
pub struct StdDialogButtonSizerBuilder;
impl StdDialogButtonSizerBuilder {
pub fn new() -> Self {
StdDialogButtonSizerBuilder
}
pub fn build(self) -> StdDialogButtonSizer {
let ptr = unsafe { ffi::wxd_StdDialogButtonSizer_Create() };
unsafe { StdDialogButtonSizer::from_ptr(ptr).expect("Failed to create wxStdDialogButtonSizer") }
}
}
impl Default for StdDialogButtonSizerBuilder {
fn default() -> Self {
Self::new()
}
}