use crate::{draw_2d::image::Image, util::macros::callback};
use nappgui_sys::{
popup_OnSelect, popup_add_elem, popup_clear, popup_count, popup_create, popup_get_selected,
popup_get_text, popup_list_height, popup_selected, popup_set_elem, popup_tooltip,
};
pub struct PopUp {
pub(crate) inner: *mut nappgui_sys::PopUp,
}
impl PopUp {
pub(crate) fn new(ptr: *mut nappgui_sys::PopUp) -> Self {
if ptr.is_null() {
panic!("ptr is null");
}
Self { inner: ptr }
}
pub fn create() -> Self {
let popup = unsafe { popup_create() };
Self::new(popup)
}
callback! {
pub on_select(PopUp) => popup_OnSelect;
}
pub fn tooltip(&self, text: &str) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_tooltip(self.inner, text.as_ptr());
}
}
pub fn add_elem(&self, text: &str, image: &Image) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_add_elem(self.inner, text.as_ptr(), image.inner);
}
}
pub fn set_elem(&self, index: u32, text: &str, image: &Image) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_set_elem(self.inner, index, text.as_ptr(), image.inner);
}
}
pub fn clear(&self) {
unsafe {
popup_clear(self.inner);
}
}
pub fn count(&self) -> u32 {
unsafe { popup_count(self.inner) }
}
pub fn list_height(&self, elems: u32) {
unsafe {
popup_list_height(self.inner, elems);
}
}
pub fn selected(&self, index: u32) {
unsafe {
popup_selected(self.inner, index);
}
}
pub fn get_selected(&self) -> u32 {
unsafe { popup_get_selected(self.inner) }
}
pub fn get_text(&self, index: u32) -> String {
let text = unsafe { popup_get_text(self.inner, index) };
let text = unsafe { std::ffi::CStr::from_ptr(text) };
text.to_string_lossy().into_owned()
}
}