use crate::Ui;
use crate::scope::{NativeScopePop, NativeScopeToken};
#[must_use]
#[doc(alias = "EndDisabled")]
pub struct DisabledToken<'ui> {
scope: NativeScopeToken<'ui>,
}
impl<'ui> DisabledToken<'ui> {
fn new(ui: &'ui Ui, restores_alpha: bool) -> Self {
Self {
scope: ui.begin_native_scope(
NativeScopePop::EndDisabled { restores_alpha },
"DisabledToken",
),
}
}
pub fn end(self) {
}
}
impl<'ui> Drop for DisabledToken<'ui> {
fn drop(&mut self) {
self.scope.finish();
}
}
impl Ui {
#[doc(alias = "BeginDisabled")]
pub fn begin_disabled(&self) -> DisabledToken<'_> {
self.begin_disabled_with_cond(true)
}
#[doc(alias = "BeginDisabled")]
pub fn begin_disabled_with_cond(&self, disabled: bool) -> DisabledToken<'_> {
let restores_alpha = self.run_with_bound_context(|| unsafe {
let context = self.context_raw();
let was_disabled =
(*context).CurrentItemFlags & sys::ImGuiItemFlags_Disabled as i32 != 0;
sys::igBeginDisabled(disabled);
disabled && !was_disabled
});
DisabledToken::new(self, restores_alpha)
}
#[doc(alias = "BeginDisabled", alias = "EndDisabled")]
pub fn with_disabled<R>(&self, f: impl FnOnce() -> R) -> R {
self.with_disabled_if(true, f)
}
#[doc(alias = "BeginDisabled", alias = "EndDisabled")]
pub fn with_disabled_if<R>(&self, disabled: bool, f: impl FnOnce() -> R) -> R {
let token = self.begin_disabled_with_cond(disabled);
let result = f();
drop(token);
result
}
}