#![allow(
clippy::cast_possible_truncation,
clippy::cast_sign_loss,
clippy::as_conversions
)]
use crate::Ui;
use crate::sys;
bitflags::bitflags! {
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct ButtonFlags: i32 {
const NONE = 0;
const ALLOW_OVERLAP = sys::ImGuiButtonFlags_AllowOverlap as i32;
const MOUSE_BUTTON_LEFT = sys::ImGuiButtonFlags_MouseButtonLeft as i32;
const MOUSE_BUTTON_RIGHT = sys::ImGuiButtonFlags_MouseButtonRight as i32;
const MOUSE_BUTTON_MIDDLE = sys::ImGuiButtonFlags_MouseButtonMiddle as i32;
}
}
pub use crate::Direction as ArrowDirection;
impl Ui {
#[doc(alias = "Bullet")]
pub fn bullet(&self) {
unsafe {
sys::igBullet();
}
}
#[doc(alias = "BulletText")]
pub fn bullet_text(&self, text: impl AsRef<str>) {
let text_ptr = self.scratch_txt(text);
unsafe {
const FMT: &[u8; 3] = b"%s\0";
sys::igBulletText(FMT.as_ptr() as *const std::os::raw::c_char, text_ptr);
}
}
}
impl Ui {
#[doc(alias = "SmallButton")]
pub fn small_button(&self, label: impl AsRef<str>) -> bool {
let label_ptr = self.scratch_txt(label);
unsafe { sys::igSmallButton(label_ptr) }
}
#[doc(alias = "InvisibleButton")]
pub fn invisible_button(&self, str_id: impl AsRef<str>, size: impl Into<[f32; 2]>) -> bool {
self.invisible_button_flags(str_id, size, crate::widget::ButtonFlags::NONE)
}
#[doc(alias = "InvisibleButton")]
pub fn invisible_button_flags(
&self,
str_id: impl AsRef<str>,
size: impl Into<[f32; 2]>,
flags: crate::widget::ButtonFlags,
) -> bool {
let id_ptr = self.scratch_txt(str_id);
let size_vec: sys::ImVec2 = size.into().into();
unsafe { sys::igInvisibleButton(id_ptr, size_vec, flags.bits()) }
}
#[doc(alias = "ArrowButton")]
pub fn arrow_button(&self, str_id: impl AsRef<str>, dir: crate::Direction) -> bool {
let id_ptr = self.scratch_txt(str_id);
unsafe { sys::igArrowButton(id_ptr, dir as i32) }
}
}
#[must_use]
pub struct DisabledToken<'ui> {
_ui: &'ui Ui,
}
impl<'ui> DisabledToken<'ui> {
fn new(ui: &'ui Ui) -> Self {
DisabledToken { _ui: ui }
}
pub fn end(self) {
}
}
impl<'ui> Drop for DisabledToken<'ui> {
fn drop(&mut self) {
unsafe { sys::igEndDisabled() }
}
}
impl Ui {
#[doc(alias = "BeginDisabled")]
pub fn begin_disabled(&self) -> DisabledToken<'_> {
unsafe { sys::igBeginDisabled(true) }
DisabledToken::new(self)
}
#[doc(alias = "BeginDisabled")]
pub fn begin_disabled_with_cond(&self, disabled: bool) -> DisabledToken<'_> {
unsafe { sys::igBeginDisabled(disabled) }
DisabledToken::new(self)
}
}
impl Ui {
#[doc(alias = "PushButtonRepeat")]
pub fn push_button_repeat(&self, repeat: bool) {
unsafe { sys::igPushItemFlag(sys::ImGuiItemFlags_ButtonRepeat as i32, repeat) }
}
#[doc(alias = "PopButtonRepeat")]
pub fn pop_button_repeat(&self) {
unsafe { sys::igPopItemFlag() }
}
}
impl Ui {
#[doc(alias = "SetItemKeyOwner")]
pub fn set_item_key_owner(&self, key: crate::input::Key) {
let k: sys::ImGuiKey = key as sys::ImGuiKey;
unsafe { sys::igSetItemKeyOwner_Nil(k) }
}
#[doc(alias = "SetItemKeyOwner")]
pub fn set_item_key_owner_with_flags(
&self,
key: crate::input::Key,
flags: crate::input::ItemKeyOwnerFlags,
) {
let k: sys::ImGuiKey = key as sys::ImGuiKey;
unsafe { sys::igSetItemKeyOwner_InputFlags(k, flags.raw()) }
}
}