use std::fmt::Display;
use egui::Color32;
use egui::Response;
use egui::Ui;
use egui::Widget;
use crate::ChipEditOutput;
use crate::UnownedChipEdit;
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ChipEdit {
pub(crate) texts: Vec<String>,
pub(crate) unowned: UnownedChipEdit,
}
impl Display for ChipEdit {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.values().join(&self.unowned.separator))
}
}
impl ChipEdit {
pub fn new(separator: &str) -> Result<Self, String> {
if separator.is_empty() {
Err("separator cannot be empty".to_owned())
} else {
let mut ret = Self {
texts: vec![],
unowned: UnownedChipEdit::new(separator)?,
};
ret.rebuild();
Ok(ret)
}
}
pub fn show(&mut self, ui: &mut Ui) -> ChipEditOutput {
self.unowned.show(ui, &mut self.texts)
}
pub(crate) fn rebuild(&mut self) {
self.unowned.rebuild(&mut self.texts);
}
pub fn set_text(&mut self, texts: impl IntoIterator<Item = impl ToString>) {
self.texts = texts.into_iter().map(|s| s.to_string()).collect();
self.rebuild();
}
pub fn values(&self) -> Vec<String> {
self.texts.clone()
}
pub fn default_widget_bg_color(ui: &Ui) -> Color32 {
ui.visuals().extreme_bg_color
}
pub fn default_widget_fg_color(ui: &Ui) -> Color32 {
ui.visuals().selection.stroke.color
}
}
impl Widget for &mut ChipEdit {
fn ui(self, ui: &mut Ui) -> Response {
self.show(ui).response
}
}