use crate::sys;
use crate::ui::Ui;
use super::{ComboBoxFlags, ComboBoxHeight, ComboBoxOptions, ComboBoxPreviewMode, ComboBoxToken};
#[derive(Clone, Debug)]
#[must_use]
pub struct ComboBox<'ui, Label, Preview = &'static str> {
pub label: Label,
pub preview_value: Option<Preview>,
pub options: ComboBoxOptions,
pub ui: &'ui Ui,
}
impl<'ui, Label: AsRef<str>> ComboBox<'ui, Label> {
pub fn preview_value<P: AsRef<str>>(self, preview: P) -> ComboBox<'ui, Label, P> {
ComboBox {
label: self.label,
preview_value: Some(preview),
options: self.options,
ui: self.ui,
}
}
pub fn flags(mut self, flags: ComboBoxFlags) -> Self {
self.options.flags = flags;
self
}
pub fn height(mut self, height: ComboBoxHeight) -> Self {
self.options.height = Some(height);
self
}
pub fn preview_mode(mut self, mode: ComboBoxPreviewMode) -> Self {
self.options.preview_mode = mode;
self
}
#[must_use]
pub fn begin(self) -> Option<ComboBoxToken<'ui>> {
self.options.validate("ComboBox::begin()");
let (label_ptr, preview_ptr) = self
.ui
.scratch_txt_with_opt(self.label.as_ref(), self.preview_value.as_deref());
let should_render =
unsafe { sys::igBeginCombo(label_ptr, preview_ptr, self.options.raw()) };
if should_render {
Some(ComboBoxToken::new(self.ui))
} else {
None
}
}
}