use crate::{
draw_2d::ImageTrait,
gui::{control::impl_control, event::EvButton, impl_layout},
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 trait PopUpTrait {
fn as_ptr(&self) -> *mut nappgui_sys::PopUp;
callback! {
on_select(EvButton) => popup_OnSelect;
}
fn tooltip(&self, text: &str) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_tooltip(self.as_ptr(), text.as_ptr());
}
}
fn add_element(&self, text: &str) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_add_elem(self.as_ptr(), text.as_ptr(), std::ptr::null());
}
}
fn add_image_element<T>(&self, text: &str, image: &T)
where
T: ImageTrait,
{
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_add_elem(self.as_ptr(), text.as_ptr(), image.as_ptr());
}
}
fn set_element(&self, index: u32, text: &str) {
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_set_elem(self.as_ptr(), index, text.as_ptr(), std::ptr::null());
}
}
fn set_image_element<T>(&self, index: u32, text: &str, image: &T)
where
T: ImageTrait,
{
let text = std::ffi::CString::new(text).unwrap();
unsafe {
popup_set_elem(self.as_ptr(), index, text.as_ptr(), image.as_ptr());
}
}
fn clear(&self) {
unsafe {
popup_clear(self.as_ptr());
}
}
fn count(&self) -> u32 {
unsafe { popup_count(self.as_ptr()) }
}
fn list_height(&self, elems: u32) {
unsafe {
popup_list_height(self.as_ptr(), elems);
}
}
fn selected(&self, index: u32) {
unsafe {
popup_selected(self.as_ptr(), index);
}
}
fn get_selected(&self) -> u32 {
unsafe { popup_get_selected(self.as_ptr()) }
}
fn get_text(&self, index: u32) -> String {
let text = unsafe { popup_get_text(self.as_ptr(), index) };
let text = unsafe { std::ffi::CStr::from_ptr(text) };
text.to_string_lossy().into_owned()
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug)]
pub struct PopUp {
pub(crate) inner: *mut nappgui_sys::PopUp,
}
impl PopUpTrait for PopUp {
fn as_ptr(&self) -> *mut nappgui_sys::PopUp {
self.inner
}
}
impl PopUp {
pub fn new() -> Self {
let popup = unsafe { popup_create() };
Self { inner: popup }
}
}
impl_control!(PopUp, guicontrol_popup);
impl_layout!(PopUp, PopUpTrait, layout_popup);