use bitflags::bitflags;
use std::ptr;
use crate::math::MintVec2;
use crate::math::MintVec3;
use crate::math::MintVec4;
use crate::sys;
use crate::Ui;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ColorEditInputMode {
Rgb,
Hsv,
}
impl ColorEditInputMode {
pub const RGB: Self = Self::Rgb;
pub const HSV: Self = Self::Hsv;
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ColorEditDisplayMode {
Rgb,
Hsv,
Hex,
}
impl ColorEditDisplayMode {
pub const RGB: Self = Self::Rgb;
pub const HSV: Self = Self::Hsv;
pub const HEX: Self = Self::Hex;
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ColorPickerMode {
HueBar,
HueWheel,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ColorFormat {
U8,
Float,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ColorPreview {
Opaque,
HalfAlpha,
Alpha,
}
bitflags! {
#[repr(transparent)]
pub struct ColorEditFlags: u32 {
const NO_ALPHA = sys::ImGuiColorEditFlags_NoAlpha;
const NO_PICKER = sys::ImGuiColorEditFlags_NoPicker;
const NO_OPTIONS = sys::ImGuiColorEditFlags_NoOptions;
const NO_SMALL_PREVIEW = sys::ImGuiColorEditFlags_NoSmallPreview;
const NO_INPUTS = sys::ImGuiColorEditFlags_NoInputs;
const NO_TOOLTIP = sys::ImGuiColorEditFlags_NoTooltip;
const NO_LABEL = sys::ImGuiColorEditFlags_NoLabel;
const NO_SIDE_PREVIEW = sys::ImGuiColorEditFlags_NoSidePreview;
const NO_DRAG_DROP = sys::ImGuiColorEditFlags_NoDragDrop;
const NO_BORDER = sys::ImGuiColorEditFlags_NoBorder;
const ALPHA_BAR = sys::ImGuiColorEditFlags_AlphaBar;
const ALPHA_PREVIEW = sys::ImGuiColorEditFlags_AlphaPreview;
const ALPHA_PREVIEW_HALF = sys::ImGuiColorEditFlags_AlphaPreviewHalf;
const HDR = sys::ImGuiColorEditFlags_HDR;
const DISPLAY_RGB = sys::ImGuiColorEditFlags_DisplayRGB;
const DISPLAY_HSV = sys::ImGuiColorEditFlags_DisplayHSV;
const DISPLAY_HEX = sys::ImGuiColorEditFlags_DisplayHex;
const UINT8 = sys::ImGuiColorEditFlags_Uint8;
const FLOAT = sys::ImGuiColorEditFlags_Float;
const PICKER_HUE_BAR = sys::ImGuiColorEditFlags_PickerHueBar;
const PICKER_HUE_WHEEL = sys::ImGuiColorEditFlags_PickerHueWheel;
const INPUT_RGB = sys::ImGuiColorEditFlags_InputRGB;
const INPUT_HSV = sys::ImGuiColorEditFlags_InputHSV;
}
}
#[derive(Debug)]
#[must_use]
pub struct ColorEdit3<'ui, 'a, Label, C> {
label: Label,
value: &'a mut C,
flags: ColorEditFlags,
ui: &'ui Ui,
}
impl<'ui, 'a, Label, C> ColorEdit3<'ui, 'a, Label, C>
where
Label: AsRef<str>,
C: Copy + Into<MintVec3>,
MintVec3: Into<C> + Into<[f32; 3]>,
{
#[deprecated(since = "0.9.0", note = "Use `ui.color_edit3(...)` instead")]
pub fn new(ui: &'ui Ui, label: Label, value: &'a mut C) -> Self {
ColorEdit3 {
label,
value,
flags: ColorEditFlags::empty(),
ui,
}
}
#[inline]
pub fn flags(mut self, flags: ColorEditFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn alpha(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_ALPHA, !value);
self
}
#[inline]
pub fn picker(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_PICKER, !value);
self
}
#[inline]
pub fn options(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_OPTIONS, !value);
self
}
#[inline]
pub fn small_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SMALL_PREVIEW, !value);
self
}
#[inline]
pub fn inputs(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_INPUTS, !value);
self
}
#[inline]
pub fn tooltip(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_TOOLTIP, !value);
self
}
#[inline]
pub fn label(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_LABEL, !value);
self
}
#[inline]
pub fn alpha_bar(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::ALPHA_BAR, value);
self
}
#[inline]
pub fn preview(mut self, preview: ColorPreview) -> Self {
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW_HALF,
preview == ColorPreview::HalfAlpha,
);
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW,
preview == ColorPreview::Alpha,
);
self
}
#[inline]
pub fn hdr(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::HDR, value);
self
}
#[inline]
pub fn input_mode(mut self, input_mode: ColorEditInputMode) -> Self {
self.flags.set(
ColorEditFlags::INPUT_RGB,
input_mode == ColorEditInputMode::RGB,
);
self.flags.set(
ColorEditFlags::INPUT_HSV,
input_mode == ColorEditInputMode::HSV,
);
self
}
#[inline]
pub fn display_mode(mut self, mode: ColorEditDisplayMode) -> Self {
self.flags.set(
ColorEditFlags::DISPLAY_RGB,
mode == ColorEditDisplayMode::RGB,
);
self.flags.set(
ColorEditFlags::DISPLAY_HSV,
mode == ColorEditDisplayMode::HSV,
);
self.flags.set(
ColorEditFlags::DISPLAY_HEX,
mode == ColorEditDisplayMode::HEX,
);
self
}
#[inline]
pub fn format(mut self, format: ColorFormat) -> Self {
self.flags
.set(ColorEditFlags::UINT8, format == ColorFormat::U8);
self.flags
.set(ColorEditFlags::FLOAT, format == ColorFormat::Float);
self
}
pub fn build(mut self) -> bool {
self.flags.insert(ColorEditFlags::NO_ALPHA);
let as_vec3: MintVec3 = (*self.value).into();
let mut as_vec3: [f32; 3] = as_vec3.into();
let changed = unsafe {
sys::igColorEdit3(
self.ui.scratch_txt(self.label),
as_vec3.as_mut_ptr(),
self.flags.bits() as _,
)
};
if changed {
let as_vec3: MintVec3 = as_vec3.into();
*self.value = as_vec3.into();
}
changed
}
}
impl Ui {
pub fn color_edit3<Label, C>(&self, label: Label, value: &mut C) -> bool
where
Label: AsRef<str>,
C: Copy + Into<MintVec3>,
MintVec3: Into<C> + Into<[f32; 3]>,
{
ColorEdit3 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
.build()
}
pub fn color_edit3_config<'a, Label, C>(
&self,
label: Label,
value: &'a mut C,
) -> ColorEdit3<'_, 'a, Label, C>
where
Label: AsRef<str>,
C: Copy + Into<MintVec3>,
MintVec3: Into<C> + Into<[f32; 3]>,
{
ColorEdit3 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
}
}
#[derive(Debug)]
#[must_use]
pub struct ColorEdit4<'ui, 'a, T, C> {
label: T,
value: &'a mut C,
flags: ColorEditFlags,
ui: &'ui Ui,
}
impl<'ui, 'a, T, C> ColorEdit4<'ui, 'a, T, C>
where
T: AsRef<str>,
C: Copy + Into<MintVec4>,
MintVec4: Into<C> + Into<[f32; 4]>,
{
#[deprecated(since = "0.9.0", note = "Use `ui.color_edit4(...)` instead")]
pub fn new(ui: &'ui Ui, label: T, value: &'a mut C) -> Self {
Self {
label,
value,
flags: ColorEditFlags::empty(),
ui,
}
}
#[inline]
pub fn flags(mut self, flags: ColorEditFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn alpha(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_ALPHA, !value);
self
}
#[inline]
pub fn picker(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_PICKER, !value);
self
}
#[inline]
pub fn options(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_OPTIONS, !value);
self
}
#[inline]
pub fn small_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SMALL_PREVIEW, !value);
self
}
#[inline]
pub fn inputs(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_INPUTS, !value);
self
}
#[inline]
pub fn tooltip(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_TOOLTIP, !value);
self
}
#[inline]
pub fn label(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_LABEL, !value);
self
}
#[inline]
pub fn alpha_bar(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::ALPHA_BAR, value);
self
}
#[inline]
pub fn preview(mut self, preview: ColorPreview) -> Self {
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW_HALF,
preview == ColorPreview::HalfAlpha,
);
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW,
preview == ColorPreview::Alpha,
);
self
}
#[inline]
pub fn hdr(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::HDR, value);
self
}
#[inline]
pub fn input_mode(mut self, input_mode: ColorEditInputMode) -> Self {
self.flags.set(
ColorEditFlags::INPUT_RGB,
input_mode == ColorEditInputMode::RGB,
);
self.flags.set(
ColorEditFlags::INPUT_HSV,
input_mode == ColorEditInputMode::HSV,
);
self
}
#[inline]
pub fn display_mode(mut self, mode: ColorEditDisplayMode) -> Self {
self.flags.set(
ColorEditFlags::DISPLAY_RGB,
mode == ColorEditDisplayMode::RGB,
);
self.flags.set(
ColorEditFlags::DISPLAY_HSV,
mode == ColorEditDisplayMode::HSV,
);
self.flags.set(
ColorEditFlags::DISPLAY_HEX,
mode == ColorEditDisplayMode::HEX,
);
self
}
#[inline]
pub fn format(mut self, format: ColorFormat) -> Self {
self.flags
.set(ColorEditFlags::UINT8, format == ColorFormat::U8);
self.flags
.set(ColorEditFlags::FLOAT, format == ColorFormat::Float);
self
}
pub fn build(self) -> bool {
let as_vec4: MintVec4 = (*self.value).into();
let mut as_vec4: [f32; 4] = as_vec4.into();
let changed = unsafe {
sys::igColorEdit4(
self.ui.scratch_txt(self.label),
as_vec4.as_mut_ptr(),
self.flags.bits() as _,
)
};
if changed {
let as_vec4: MintVec4 = as_vec4.into();
*self.value = as_vec4.into();
}
changed
}
}
impl Ui {
pub fn color_edit4<Label, C>(&self, label: Label, value: &mut C) -> bool
where
Label: AsRef<str>,
C: Copy + Into<MintVec4>,
MintVec4: Into<C> + Into<[f32; 4]>,
{
ColorEdit4 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
.build()
}
pub fn color_edit4_config<'a, Label, C>(
&self,
label: Label,
value: &'a mut C,
) -> ColorEdit4<'_, 'a, Label, C>
where
Label: AsRef<str>,
C: Copy + Into<MintVec4>,
MintVec4: Into<C> + Into<[f32; 4]>,
{
ColorEdit4 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
}
}
#[derive(Debug)]
#[must_use]
pub struct ColorPicker3<'ui, 'a, Label, Color> {
label: Label,
value: &'a mut Color,
flags: ColorEditFlags,
ui: &'ui Ui,
}
impl<'ui, 'a, Label, Color> ColorPicker3<'ui, 'a, Label, Color>
where
Label: AsRef<str>,
Color: Copy + Into<MintVec3>,
MintVec3: Into<Color> + Into<[f32; 3]>,
{
#[deprecated(since = "0.9.0", note = "Use `ui.color_picker3(...)` instead")]
pub fn new(ui: &'ui Ui, label: Label, value: &'a mut Color) -> Self {
ColorPicker3 {
label,
value,
flags: ColorEditFlags::empty(),
ui,
}
}
#[inline]
pub fn flags(mut self, flags: ColorEditFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn alpha(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_ALPHA, !value);
self
}
#[inline]
pub fn options(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_OPTIONS, !value);
self
}
#[inline]
pub fn small_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SMALL_PREVIEW, !value);
self
}
#[inline]
pub fn inputs(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_INPUTS, !value);
self
}
#[inline]
pub fn tooltip(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_TOOLTIP, !value);
self
}
#[inline]
pub fn label(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_LABEL, !value);
self
}
#[inline]
pub fn side_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SIDE_PREVIEW, !value);
self
}
#[inline]
pub fn alpha_bar(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::ALPHA_BAR, value);
self
}
#[inline]
pub fn preview(mut self, preview: ColorPreview) -> Self {
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW_HALF,
preview == ColorPreview::HalfAlpha,
);
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW,
preview == ColorPreview::Alpha,
);
self
}
#[inline]
pub fn input_mode(mut self, input_mode: ColorEditInputMode) -> Self {
self.flags.set(
ColorEditFlags::INPUT_RGB,
input_mode == ColorEditInputMode::RGB,
);
self.flags.set(
ColorEditFlags::INPUT_HSV,
input_mode == ColorEditInputMode::HSV,
);
self
}
#[inline]
pub fn display_rgb(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_RGB, value);
self
}
#[inline]
pub fn display_hsv(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_HSV, value);
self
}
#[inline]
pub fn display_hex(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_HEX, value);
self
}
#[inline]
pub fn mode(mut self, mode: ColorPickerMode) -> Self {
self.flags.set(
ColorEditFlags::PICKER_HUE_BAR,
mode == ColorPickerMode::HueBar,
);
self.flags.set(
ColorEditFlags::PICKER_HUE_WHEEL,
mode == ColorPickerMode::HueWheel,
);
self
}
#[inline]
pub fn format(mut self, format: ColorFormat) -> Self {
self.flags
.set(ColorEditFlags::UINT8, format == ColorFormat::U8);
self.flags
.set(ColorEditFlags::FLOAT, format == ColorFormat::Float);
self
}
pub fn build(mut self) -> bool {
self.flags.insert(ColorEditFlags::NO_ALPHA);
let mut value: [f32; 3] = (*self.value).into().into();
let changed = unsafe {
sys::igColorPicker3(
self.ui.scratch_txt(self.label),
value.as_mut_ptr(),
self.flags.bits() as _,
)
};
if changed {
let as_vec3: MintVec3 = value.into();
*self.value = as_vec3.into();
}
changed
}
}
impl Ui {
pub fn color_picker3<Label, C>(&self, label: Label, value: &mut C) -> bool
where
Label: AsRef<str>,
C: Copy + Into<MintVec3>,
MintVec3: Into<C> + Into<[f32; 3]>,
{
ColorPicker3 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
.build()
}
pub fn color_picker3_config<'a, Label, C>(
&self,
label: Label,
value: &'a mut C,
) -> ColorPicker3<'_, 'a, Label, C>
where
Label: AsRef<str>,
C: Copy + Into<MintVec3>,
MintVec3: Into<C> + Into<[f32; 3]>,
{
ColorPicker3 {
label,
value,
flags: ColorEditFlags::empty(),
ui: self,
}
}
}
#[derive(Debug)]
#[must_use]
pub struct ColorPicker4<'ui, 'a, Label, Color> {
label: Label,
value: &'a mut Color,
flags: ColorEditFlags,
ref_color: Option<[f32; 4]>,
ui: &'ui Ui,
}
impl<'ui, 'a, Label, Color> ColorPicker4<'ui, 'a, Label, Color>
where
Label: AsRef<str>,
Color: Copy + Into<MintVec4>,
MintVec4: Into<Color> + Into<[f32; 4]>,
{
#[deprecated(since = "0.9.0", note = "Use `ui.color_picker4(...)` instead")]
pub fn new(ui: &'ui Ui, label: Label, value: &'a mut Color) -> Self {
Self {
label,
value,
flags: ColorEditFlags::empty(),
ref_color: None,
ui,
}
}
#[inline]
pub fn flags(mut self, flags: ColorEditFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn alpha(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_ALPHA, !value);
self
}
#[inline]
pub fn options(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_OPTIONS, !value);
self
}
#[inline]
pub fn small_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SMALL_PREVIEW, !value);
self
}
#[inline]
pub fn inputs(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_INPUTS, !value);
self
}
#[inline]
pub fn tooltip(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_TOOLTIP, !value);
self
}
#[inline]
pub fn label(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_LABEL, !value);
self
}
#[inline]
pub fn side_preview(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_SIDE_PREVIEW, !value);
self
}
#[inline]
pub fn alpha_bar(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::ALPHA_BAR, value);
self
}
#[inline]
pub fn preview(mut self, preview: ColorPreview) -> Self {
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW_HALF,
preview == ColorPreview::HalfAlpha,
);
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW,
preview == ColorPreview::Alpha,
);
self
}
#[inline]
pub fn input_mode(mut self, input_mode: ColorEditInputMode) -> Self {
self.flags.set(
ColorEditFlags::INPUT_RGB,
input_mode == ColorEditInputMode::RGB,
);
self.flags.set(
ColorEditFlags::INPUT_HSV,
input_mode == ColorEditInputMode::HSV,
);
self
}
#[inline]
pub fn display_rgb(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_RGB, value);
self
}
#[inline]
pub fn display_hsv(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_HSV, value);
self
}
#[inline]
pub fn display_hex(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::DISPLAY_HEX, value);
self
}
#[inline]
pub fn mode(mut self, mode: ColorPickerMode) -> Self {
self.flags.set(
ColorEditFlags::PICKER_HUE_BAR,
mode == ColorPickerMode::HueBar,
);
self.flags.set(
ColorEditFlags::PICKER_HUE_WHEEL,
mode == ColorPickerMode::HueWheel,
);
self
}
#[inline]
pub fn format(mut self, format: ColorFormat) -> Self {
self.flags
.set(ColorEditFlags::UINT8, format == ColorFormat::U8);
self.flags
.set(ColorEditFlags::FLOAT, format == ColorFormat::Float);
self
}
#[inline]
pub fn reference_color(mut self, ref_color: impl Into<MintVec4>) -> Self {
self.ref_color = Some(ref_color.into().into());
self
}
pub fn build(self) -> bool {
let mut value: [f32; 4] = (*self.value).into().into();
let ref_color = self.ref_color.map(|c| c.as_ptr()).unwrap_or(ptr::null());
let changed = unsafe {
sys::igColorPicker4(
self.ui.scratch_txt(self.label),
value.as_mut_ptr(),
self.flags.bits() as _,
ref_color,
)
};
if changed {
let as_vec3: MintVec4 = value.into();
*self.value = as_vec3.into();
}
changed
}
}
impl Ui {
pub fn color_picker4<Label, C>(&self, label: Label, value: &mut C) -> bool
where
Label: AsRef<str>,
C: Copy + Into<MintVec4>,
MintVec4: Into<C> + Into<[f32; 4]>,
{
ColorPicker4 {
label,
value,
flags: ColorEditFlags::empty(),
ref_color: None,
ui: self,
}
.build()
}
pub fn color_picker4_config<'a, Label, C>(
&self,
label: Label,
value: &'a mut C,
) -> ColorPicker4<'_, 'a, Label, C>
where
Label: AsRef<str>,
C: Copy + Into<MintVec4>,
MintVec4: Into<C> + Into<[f32; 4]>,
{
ColorPicker4 {
label,
value,
flags: ColorEditFlags::empty(),
ref_color: None,
ui: self,
}
}
}
#[derive(Copy, Clone, Debug)]
#[must_use]
pub struct ColorButton<'ui, T> {
desc_id: T,
color: [f32; 4],
flags: ColorEditFlags,
size: [f32; 2],
ui: &'ui Ui,
}
impl<'ui, T: AsRef<str>> ColorButton<'ui, T> {
#[deprecated(since = "0.9.0", note = "Use `ui.color_button_config(...)` instead")]
pub fn new(ui: &'ui Ui, desc_id: T, color: impl Into<MintVec4>) -> Self {
ColorButton {
desc_id,
color: color.into().into(),
flags: ColorEditFlags::empty(),
size: [0.0, 0.0],
ui,
}
}
#[inline]
pub fn flags(mut self, flags: ColorEditFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn alpha(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_ALPHA, !value);
self
}
#[inline]
pub fn tooltip(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_TOOLTIP, !value);
self
}
#[inline]
pub fn preview(mut self, preview: ColorPreview) -> Self {
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW_HALF,
preview == ColorPreview::HalfAlpha,
);
self.flags.set(
ColorEditFlags::ALPHA_PREVIEW,
preview == ColorPreview::Alpha,
);
self
}
#[inline]
pub fn input_mode(mut self, input_mode: ColorEditInputMode) -> Self {
self.flags.set(
ColorEditFlags::INPUT_RGB,
input_mode == ColorEditInputMode::RGB,
);
self.flags.set(
ColorEditFlags::INPUT_HSV,
input_mode == ColorEditInputMode::HSV,
);
self
}
pub fn drag_drop(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_DRAG_DROP, !value);
self
}
pub fn border(mut self, value: bool) -> Self {
self.flags.set(ColorEditFlags::NO_BORDER, !value);
self
}
#[inline]
pub fn size(mut self, size: impl Into<MintVec2>) -> Self {
self.size = size.into().into();
self
}
pub fn build(self) -> bool {
unsafe {
sys::igColorButton(
self.ui.scratch_txt(self.desc_id),
self.color.into(),
self.flags.bits() as _,
self.size.into(),
)
}
}
}
impl Ui {
pub fn color_button<Label: AsRef<str>>(
&self,
desc_id: Label,
color: impl Into<MintVec4>,
) -> bool {
ColorButton {
desc_id,
color: color.into().into(),
flags: ColorEditFlags::empty(),
size: [0.0, 0.0],
ui: self,
}
.build()
}
pub fn color_button_config<Label: AsRef<str>>(
&self,
desc_id: Label,
color: impl Into<MintVec4>,
) -> ColorButton<'_, Label> {
ColorButton {
desc_id,
color: color.into().into(),
flags: ColorEditFlags::empty(),
size: [0.0, 0.0],
ui: self,
}
}
}
impl Ui {
#[doc(alias = "SetColorEditOptions")]
pub fn set_color_edit_options(&self, flags: ColorEditFlags) {
unsafe {
sys::igSetColorEditOptions(flags.bits() as i32);
}
}
}