postbox: add focused state

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-06-21 08:56:53 -07:00
parent 4c1936ff70
commit b0c5d2a2c5

View File

@@ -9,18 +9,26 @@ pub struct PostView<'app, 'p> {
app: &'app mut Damus, app: &'app mut Damus,
/// account index /// account index
poster: usize, poster: usize,
id_source: Option<egui::Id>,
replying_to: &'p [u8; 32], replying_to: &'p [u8; 32],
} }
impl<'app, 'p> PostView<'app, 'p> { impl<'app, 'p> PostView<'app, 'p> {
pub fn new(app: &'app mut Damus, poster: usize, replying_to: &'p [u8; 32]) -> Self { pub fn new(app: &'app mut Damus, poster: usize, replying_to: &'p [u8; 32]) -> Self {
let id_source: Option<egui::Id> = None;
PostView { PostView {
id_source,
app, app,
poster, poster,
replying_to, replying_to,
} }
} }
pub fn id_source(mut self, id_source: impl std::hash::Hash) -> Self {
self.id_source = Some(egui::Id::new(id_source));
self
}
fn editbox(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) { fn editbox(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) {
ui.spacing_mut().item_spacing.x = 12.0; ui.spacing_mut().item_spacing.x = 12.0;
@@ -59,7 +67,20 @@ impl<'app, 'p> PostView<'app, 'p> {
.entry(enostr::NoteId::new(*self.replying_to)) .entry(enostr::NoteId::new(*self.replying_to))
.or_default(); .or_default();
ui.add(TextEdit::multiline(&mut draft.buffer).frame(false)); let focused = ui
.add(TextEdit::multiline(&mut draft.buffer).frame(false))
.has_focus();
ui.ctx().data_mut(|d| d.insert_temp(self.id(), focused));
}
fn focused(&self, ui: &egui::Ui) -> bool {
ui.ctx()
.data(|d| d.get_temp::<bool>(self.id()).unwrap_or(false))
}
fn id(&self) -> egui::Id {
self.id_source.unwrap_or_else(|| egui::Id::new("post"))
} }
pub fn ui(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) { pub fn ui(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) {
@@ -67,7 +88,12 @@ impl<'app, 'p> PostView<'app, 'p> {
.inner_margin(egui::Margin::same(12.0)) .inner_margin(egui::Margin::same(12.0))
.outer_margin(egui::Margin::same(12.0)) .outer_margin(egui::Margin::same(12.0))
.fill(ui.visuals().extreme_bg_color) .fill(ui.visuals().extreme_bg_color)
.stroke(ui.visuals().noninteractive().bg_stroke) .stroke(if self.focused(ui) {
ui.visuals().selection.stroke
} else {
//ui.visuals().selection.stroke
ui.visuals().noninteractive().bg_stroke
})
.rounding(12.0) .rounding(12.0)
.show(ui, |ui| { .show(ui, |ui| {
ui.vertical(|ui| { ui.vertical(|ui| {