use egui::{Color32, Key, KeyboardShortcut, Modifiers, Response, Stroke};
use super::super::{BRAND, RADIUS, SURFACE, State, space, tint};
pub fn field(
ui: &mut egui::Ui,
id: egui::Id,
text: &mut String,
hint: &str,
glow: Option<Color32>,
) -> Response {
frame(ui, id, glow, space::XS)
.show(ui, |ui| {
ui.add(
egui::TextEdit::singleline(text)
.id(id)
.frame(false)
.desired_width(f32::INFINITY)
.hint_text(hint),
)
})
.inner
}
pub fn composer(
ui: &mut egui::Ui,
id: egui::Id,
text: &mut String,
hint: &str,
glow: Option<Color32>,
send: &str,
rows: u8,
) -> (Response, Response) {
let height = f32::from(rows) * ui.text_style_height(&egui::TextStyle::Body);
frame(ui, id, glow, space::S)
.show(ui, |ui| {
ui.allocate_ui_with_layout(
egui::vec2(ui.available_width(), height),
egui::Layout::right_to_left(egui::Align::BOTTOM),
|ui| {
let deposit = ui.add(
egui::Button::new(egui::RichText::new(send).color(BRAND))
.fill(tint(State::Working)),
);
let entry = ui.add(
egui::TextEdit::multiline(text)
.id(id)
.frame(false)
.desired_rows(usize::from(rows))
.desired_width(ui.available_width())
.hint_text(hint)
.return_key(KeyboardShortcut::new(Modifiers::SHIFT, Key::Enter)),
);
(entry, deposit)
},
)
.inner
})
.inner
}
fn frame(ui: &egui::Ui, id: egui::Id, glow: Option<Color32>, down: f32) -> egui::Frame {
let focused = ui.memory(|memory| memory.has_focus(id));
let ring = if focused {
Stroke::new(1.0, BRAND)
} else {
Stroke::NONE
};
egui::Frame::none()
.fill(glow.unwrap_or(SURFACE))
.stroke(ring)
.rounding(RADIUS)
.inner_margin(egui::Margin::symmetric(space::S, down))
}