dear-imgui-rs 0.14.0

High-level Rust bindings to Dear ImGui v1.92.7 with docking, WGPU/GL backends, and extensions (ImPlot/ImPlot3D, ImNodes, ImGuizmo, file browser, reflection-based UI)
Documentation
use super::flags::{ColorButtonFlags, ColorEditFlags, ColorPickerFlags};
use crate::sys;

#[inline]
pub(super) const fn color_display_mask() -> u32 {
    sys::ImGuiColorEditFlags_DisplayMask_ as u32
}

#[inline]
pub(super) const fn color_data_type_mask() -> u32 {
    sys::ImGuiColorEditFlags_DataTypeMask_ as u32
}

#[inline]
pub(super) const fn color_picker_mask() -> u32 {
    sys::ImGuiColorEditFlags_PickerMask_ as u32
}

#[inline]
pub(super) const fn color_input_mask() -> u32 {
    sys::ImGuiColorEditFlags_InputMask_ as u32
}

#[inline]
pub(super) const fn color_choice_mask() -> u32 {
    color_display_mask() | color_data_type_mask() | color_picker_mask() | color_input_mask()
}

#[inline]
pub(super) const fn color_edit_supported_mask() -> u32 {
    ColorEditFlags::all().bits() | color_choice_mask()
}

#[inline]
pub(super) const fn color_picker_supported_mask() -> u32 {
    ColorPickerFlags::all().bits()
        | color_display_mask()
        | color_data_type_mask()
        | color_picker_mask()
        | color_input_mask()
}

#[inline]
pub(super) const fn color_button_supported_mask() -> u32 {
    ColorButtonFlags::all().bits() | color_input_mask()
}

pub(super) fn validate_color_edit_flags(caller: &str, flags: ColorEditFlags) {
    let unsupported = flags.bits() & !ColorEditFlags::all().bits();
    assert!(
        unsupported == 0,
        "{caller} received unsupported ColorEditFlags bits: 0x{unsupported:X}"
    );
}

pub(super) fn validate_color_picker_flags(caller: &str, flags: ColorPickerFlags) {
    let unsupported = flags.bits() & !ColorPickerFlags::all().bits();
    assert!(
        unsupported == 0,
        "{caller} received unsupported ColorPickerFlags bits: 0x{unsupported:X}"
    );
}

pub(super) fn validate_color_button_flags(caller: &str, flags: ColorButtonFlags) {
    let unsupported = flags.bits() & !ColorButtonFlags::all().bits();
    assert!(
        unsupported == 0,
        "{caller} received unsupported ColorButtonFlags bits: 0x{unsupported:X}"
    );
}

pub(super) fn validate_color_supported_bits(caller: &str, bits: u32, supported: u32) {
    let unsupported = bits & !supported;
    assert!(
        unsupported == 0,
        "{caller} received unsupported ImGuiColorEditFlags bits: 0x{unsupported:X}"
    );
}

pub(super) fn assert_color_single_choice_mask(caller: &str, bits: u32, mask: u32, name: &str) {
    assert!(
        (bits & mask).count_ones() <= 1,
        "{caller} accepts at most one color {name}"
    );
}

pub(super) fn assert_finite_color3(caller: &str, name: &str, color: &[f32; 3]) {
    assert!(
        color.iter().all(|component| component.is_finite()),
        "{caller} {name} must contain finite values"
    );
}

pub(super) fn assert_finite_color4(caller: &str, name: &str, color: &[f32; 4]) {
    assert!(
        color.iter().all(|component| component.is_finite()),
        "{caller} {name} must contain finite values"
    );
}

pub(super) fn assert_non_negative_finite_vec2(caller: &str, name: &str, value: [f32; 2]) {
    assert!(
        value[0].is_finite() && value[1].is_finite(),
        "{caller} {name} must contain finite values"
    );
    assert!(
        value[0] >= 0.0 && value[1] >= 0.0,
        "{caller} {name} must contain non-negative values"
    );
}