use crate::{Ui, sys};
impl Ui {
#[doc(alias = "PushItemWidth")]
pub fn push_item_width(&self, item_width: f32) -> ItemWidthStackToken<'_> {
self.run_with_bound_context(|| unsafe { sys::igPushItemWidth(item_width) });
ItemWidthStackToken::new(self)
}
#[doc(alias = "PushItemWidth")]
pub fn push_item_width_text(&self, text: impl AsRef<str>) -> ItemWidthStackToken<'_> {
let text = text.as_ref();
self.run_with_bound_context(|| unsafe {
let text_width = self.calc_text_size_bound(text, false, -1.0)[0];
sys::igPushItemWidth(text_width);
});
ItemWidthStackToken::new(self)
}
#[doc(alias = "PushTextWrapPos")]
pub fn push_text_wrap_pos(&self, wrap_pos_x: f32) -> TextWrapPosStackToken<'_> {
self.run_with_bound_context(|| unsafe { sys::igPushTextWrapPos(wrap_pos_x) });
TextWrapPosStackToken::new(self)
}
}
create_token!(
#[doc(alias = "PopItemWidth")]
pub struct ItemWidthStackToken<'ui>;
pop crate::scope::NativeScopePop::PopItemWidth;
#[doc(alias = "PopItemWidth")]
drop { unsafe { sys::igPopItemWidth() } }
);
create_token!(
#[doc(alias = "PopTextWrapPos")]
pub struct TextWrapPosStackToken<'ui>;
pop crate::scope::NativeScopePop::PopTextWrap;
#[doc(alias = "PopTextWrapPos")]
drop { unsafe { sys::igPopTextWrapPos() } }
);
#[cfg(test)]
mod tests {
fn setup_context() -> crate::Context {
let mut ctx = crate::Context::create();
ctx.io_mut().set_display_size([128.0, 128.0]);
ctx.io_mut().set_delta_time(1.0 / 60.0);
ctx.font_atlas()
.try_claim_legacy_renderer()
.expect("legacy renderer font atlas should be available")
.build();
ctx
}
#[test]
fn text_item_width_scope_matches_measurement_and_restores_previous_width() {
let mut ctx = setup_context();
let ui = ctx.frame();
ui.window("text_item_width").build(|| {
let original_width = ui.calc_item_width();
let text_width = ui.calc_text_size("measured width")[0];
{
let _width = ui.push_item_width_text("measured width");
assert_eq!(ui.calc_item_width(), text_width);
}
assert_eq!(ui.calc_item_width(), original_width);
});
}
}