initial post reply view

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-06-21 11:59:17 -07:00
parent ac0821db79
commit 0b3d6f7e37
8 changed files with 223 additions and 46 deletions

View File

@@ -1,9 +1,9 @@
use crate::app::Damus;
use crate::draft::Draft;
use crate::ui;
use crate::ui::{Preview, PreviewConfig, View};
use egui::widgets::text_edit::TextEdit;
use nostrdb::Transaction;
use tracing::info;
pub struct PostView<'app, 'p> {
app: &'app mut Damus,
@@ -13,6 +13,20 @@ pub struct PostView<'app, 'p> {
replying_to: &'p [u8; 32],
}
pub struct NewPost {
pub content: String,
pub account: usize,
}
pub enum PostAction {
Post(NewPost),
}
pub struct PostResponse {
pub action: Option<PostAction>,
pub edit_response: egui::Response,
}
impl<'app, 'p> PostView<'app, 'p> {
pub fn new(app: &'app mut Damus, poster: usize, replying_to: &'p [u8; 32]) -> Self {
let id_source: Option<egui::Id> = None;
@@ -29,7 +43,14 @@ impl<'app, 'p> PostView<'app, 'p> {
self
}
fn editbox(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) {
fn draft(&mut self) -> &mut Draft {
self.app
.drafts
.entry(enostr::NoteId::new(*self.replying_to))
.or_default()
}
fn editbox(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) -> egui::Response {
ui.spacing_mut().item_spacing.x = 12.0;
let pfp_size = 24.0;
@@ -61,17 +82,13 @@ impl<'app, 'p> PostView<'app, 'p> {
);
}
let draft = self
.app
.drafts
.entry(enostr::NoteId::new(*self.replying_to))
.or_default();
let response = ui.add(TextEdit::multiline(&mut self.draft().buffer).frame(false));
let focused = ui
.add(TextEdit::multiline(&mut draft.buffer).frame(false))
.has_focus();
let focused = response.has_focus();
ui.ctx().data_mut(|d| d.insert_temp(self.id(), focused));
response
}
fn focused(&self, ui: &egui::Ui) -> bool {
@@ -83,7 +100,15 @@ impl<'app, 'p> PostView<'app, 'p> {
self.id_source.unwrap_or_else(|| egui::Id::new("post"))
}
pub fn ui(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) {
pub fn outer_margin() -> f32 {
16.0
}
pub fn inner_margin() -> f32 {
12.0
}
pub fn ui(&mut self, txn: &nostrdb::Transaction, ui: &mut egui::Ui) -> PostResponse {
let focused = self.focused(ui);
let stroke = if focused {
ui.visuals().selection.stroke
@@ -93,8 +118,8 @@ impl<'app, 'p> PostView<'app, 'p> {
};
let mut frame = egui::Frame::default()
.inner_margin(egui::Margin::same(12.0))
.outer_margin(egui::Margin::same(12.0))
.inner_margin(egui::Margin::same(PostView::inner_margin()))
.outer_margin(egui::Margin::same(PostView::outer_margin()))
.fill(ui.visuals().extreme_bg_color)
.stroke(stroke)
.rounding(12.0);
@@ -108,22 +133,35 @@ impl<'app, 'p> PostView<'app, 'p> {
});
}
frame.show(ui, |ui| {
ui.vertical(|ui| {
ui.horizontal(|ui| {
self.editbox(txn, ui);
});
frame
.show(ui, |ui| {
ui.vertical(|ui| {
let edit_response = ui.horizontal(|ui| self.editbox(txn, ui)).inner;
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
if ui
.add_sized([91.0, 32.0], egui::Button::new("Post now"))
.clicked()
{
info!("Post clicked");
let action = ui
.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
if ui
.add_sized([91.0, 32.0], egui::Button::new("Post now"))
.clicked()
{
Some(PostAction::Post(NewPost {
content: self.draft().buffer.clone(),
account: self.poster,
}))
} else {
None
}
})
.inner;
PostResponse {
action,
edit_response,
}
});
});
});
})
.inner
})
.inner
}
}