use crate::align::Align;
use crate::frame::context::UpdateType;
use crate::response::Response;
use crate::text::rich::RichText;
use crate::text::buffer::TextBuffer;
use crate::text::TextWrap;
use crate::ui::Ui;
use crate::widgets::{Widget, WidgetChange, WidgetSize};
pub struct Label {
id: String,
buffer: TextBuffer,
}
impl Label {
pub fn new(text: impl Into<RichText>) -> Label {
let buffer = TextBuffer::new(text);
Label {
id: crate::gen_unique_id(),
buffer,
}
}
pub fn wrap(mut self, wrap: TextWrap) -> Self {
self.buffer.set_wrap(wrap);
self
}
pub fn align(mut self, align: Align) -> Self {
self.buffer.align = align;
self
}
pub fn set_text(&mut self, text: impl ToString) {
self.buffer.set_text(text.to_string());
}
pub fn width(mut self, w: f32) -> Self {
self.buffer.set_width(w);
self
}
pub fn height(mut self, h: f32) -> Self {
self.buffer.set_height(h);
self
}
pub fn text(&self) -> &String {
&self.buffer.text.text
}
pub fn get_id(&self) -> &str {
&self.id
}
pub fn with_id(mut self, id: impl ToString) -> Self {
self.id = id.to_string();
self
}
fn init(&mut self, ui: &mut Ui) {
self.buffer.init(ui);
}
fn update_before_draw(&mut self, ui: &mut Ui) {
if let Some(v) = ui.context.updates.remove(&self.id) {
v.update_str(&mut self.buffer.text.text);
self.buffer.change = true;
}
if self.buffer.change {
ui.widget_changed |= WidgetChange::Value;
}
if ui.widget_changed.contains(WidgetChange::Position) {
self.buffer.rect.offset_to_rect(&ui.draw_rect);
}
if ui.widget_changed.contains(WidgetChange::Value) {
self.buffer.update_buffer(ui);
}
self.buffer.change = false;
}
fn redraw(&mut self, ui: &mut Ui) {
self.update_before_draw(ui);
self.buffer.redraw(ui);
}
}
impl Widget for Label {
fn update(&mut self, ui: &mut Ui) -> Response<'_> { match &ui.update_type {
UpdateType::Init => self.init(ui),
UpdateType::ReInit => self.buffer.init(ui),
UpdateType::Draw => self.redraw(ui),
_ => {}
}
Response::new(&self.id, WidgetSize::same(self.buffer.rect.width(), self.buffer.rect.height()))
}
}