use crate::{Ui, sys};
impl Ui {
#[doc(alias = "PushID")]
pub fn push_id<'a, T: Into<Id<'a>>>(&self, id: T) -> IdStackToken<'_> {
let id = id.into();
unsafe {
match id {
Id::Int(i) => sys::igPushID_Int(i),
Id::Str(s) => sys::igPushID_Str(self.scratch_txt(s)),
Id::Ptr(p) => sys::igPushID_Ptr(p),
}
}
IdStackToken::new(self)
}
}
create_token!(
pub struct IdStackToken<'ui>;
drop { unsafe { sys::igPopID() } }
);
impl IdStackToken<'_> {
pub fn pop(self) {
self.end()
}
}
create_token!(
pub struct FocusScopeToken<'ui>;
#[doc(alias = "PopFocusScope")]
drop { unsafe { sys::igPopFocusScope() } }
);
impl Ui {
#[doc(alias = "PushFocusScope")]
pub fn push_focus_scope(&self, id: crate::Id) -> FocusScopeToken<'_> {
unsafe { sys::igPushFocusScope(id.raw()) };
FocusScopeToken::new(self)
}
}
#[derive(Copy, Clone, Debug)]
pub enum Id<'a> {
Int(i32),
Str(&'a str),
Ptr(*const std::ffi::c_void),
}
impl From<i32> for Id<'_> {
fn from(i: i32) -> Self {
Id::Int(i)
}
}
impl From<usize> for Id<'_> {
fn from(i: usize) -> Self {
Id::Int(i as i32)
}
}
impl<'a> From<&'a str> for Id<'a> {
fn from(s: &'a str) -> Self {
Id::Str(s)
}
}
impl<'a> From<&'a String> for Id<'a> {
fn from(s: &'a String) -> Self {
Id::Str(s.as_str())
}
}
impl<T> From<*const T> for Id<'_> {
fn from(p: *const T) -> Self {
Id::Ptr(p as *const std::ffi::c_void)
}
}
impl<T> From<*mut T> for Id<'_> {
fn from(p: *mut T) -> Self {
Id::Ptr(p as *const std::ffi::c_void)
}
}