Notifications: Make header separate again, wrap description.

Widgets: Add Relay Url widget
This commit is contained in:
Bu5hm4nn 2024-04-10 17:18:38 -06:00
parent 8124e7eceb
commit 383686e491
6 changed files with 120 additions and 193 deletions

View File

@ -72,41 +72,19 @@ impl<'a> Notification<'a> for AuthRequest {
StripBuilder::new(ui)
.size(Size::remainder())
.size(Size::initial(TRUNC))
.cell_layout(Layout::left_to_right(Align::Center))
.cell_layout(Layout::left_to_right(Align::Center).with_main_wrap(true))
.horizontal(|mut strip| {
strip.strip(|builder| {
builder
.size(Size::initial(super::HEADER_HEIGHT))
.size(Size::initial(14.0))
.cell_layout(Layout::left_to_right(Align::TOP).with_main_wrap(true))
.vertical(|mut strip| {
strip.cell(|ui| {
ui.label(
egui::RichText::new(super::unixtime_to_string(
self.timestamp().try_into().unwrap_or_default(),
))
.weak()
.small(),
);
ui.add_space(10.0);
ui.label(self.title().small());
});
strip.cell(|ui| {
// FIXME pull account name with self.account once multiple keys are supported
ui.label("Authenticate to");
if ui
.link(
self.relay.as_url_crate_url().domain().unwrap_or_default(),
)
.on_hover_text("Edit this Relay in your Relay settings")
.clicked()
{
new_page =
Some(Page::RelaysKnownNetwork(Some(self.relay.clone())));
}
});
});
strip.cell(|ui| {
// FIXME pull account name with self.account once multiple keys are supported
ui.label("Authenticate to");
if widgets::relay_url(ui, theme, &self.relay)
.on_hover_text("Edit this Relay in your Relay settings")
.clicked()
{
new_page = Some(Page::RelaysKnownNetwork(Some(self.relay.clone())));
}
});
strip.cell(|ui| {
ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
ui.scope(|ui| {

View File

@ -1,6 +1,6 @@
use std::{cell::RefCell, rc::Rc};
use eframe::egui::{self, Align, Color32, FontSelection, Layout, RichText, Ui};
use eframe::egui::{self, Align, Color32, Layout, RichText, Ui};
use egui_extras::{Size, StripBuilder};
use gossip_lib::{
comms::{RelayJob, ToOverlordMessage},
@ -77,68 +77,35 @@ impl<'a> Notification<'a> for ConnRequest {
StripBuilder::new(ui)
.size(Size::remainder())
.size(Size::initial(TRUNC))
.cell_layout(Layout::left_to_right(Align::Center))
.cell_layout(Layout::left_to_right(Align::Center).with_main_wrap(true))
.horizontal(|mut strip| {
strip.strip(|builder| {
builder
.size(Size::initial(super::HEADER_HEIGHT))
.size(Size::initial(14.0))
.cell_layout(Layout::left_to_right(Align::TOP).with_main_wrap(true))
.vertical(|mut strip| {
strip.cell(|ui| {
ui.label(
egui::RichText::new(super::unixtime_to_string(
self.timestamp().try_into().unwrap_or_default(),
))
.weak()
.small(),
);
ui.add_space(10.0);
ui.label(self.title().small());
});
strip.cell(|ui| {
ui.label("Connect to");
if ui
.link(
self.relay.as_url_crate_url().domain().unwrap_or_default(),
)
.on_hover_text("Edit this Relay in your Relay settings")
.clicked()
{
new_page =
Some(Page::RelaysKnownNetwork(Some(self.relay.clone())));
}
strip.cell(|ui| {
ui.label("Connect to");
if widgets::relay_url(ui, theme, &self.relay)
.on_hover_text("Edit this Relay in your Relay settings")
.clicked()
{
new_page = Some(Page::RelaysKnownNetwork(Some(self.relay.clone())));
}
let mut job = egui::text::LayoutJob::default();
let label = if self.jobs.len() > 1 {
RichText::new("Reasons: ")
} else {
RichText::new("Reason: ")
};
label.append_to(
&mut job,
ui.style(),
FontSelection::Default,
Align::Min,
);
RichText::new(jobstrs.join(", "))
.color(theme.accent_complementary_color())
.append_to(
&mut job,
ui.style(),
FontSelection::Default,
Align::Min,
);
let galley = ui.fonts(|f| f.layout_job(job));
if self.jobs.len() > 1 {
ui.label(RichText::new("Reasons: "));
} else {
ui.label(RichText::new("Reason: "));
};
if galley.rect.width() > (ui.available_width()) {
ui.end_row();
}
ui.label(galley);
});
});
for (i, job) in jobstrs.iter().enumerate() {
if i + 1 < jobstrs.len() {
ui.label(
RichText::new(format!("{},", job))
.color(theme.accent_complementary_color()),
);
} else {
ui.label(RichText::new(job).color(theme.accent_complementary_color()));
}
}
});
strip.cell(|ui| {
ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
ui.scope(|ui| {

View File

@ -56,7 +56,6 @@ pub trait Notification<'a> {
type NotificationHandle = Rc<RefCell<dyn for<'handle> Notification<'handle>>>;
const SWITCH_SIZE: Vec2 = Vec2 { x: 40.0, y: 20.0 };
const HEADER_HEIGHT: f32 = 17.0;
pub struct NotificationData {
active: Vec<NotificationHandle>,
@ -391,6 +390,19 @@ pub(super) fn update(app: &mut GossipUi, ui: &mut Ui) {
widgets::list_entry::make_frame(ui, None).show(ui, |ui| {
ui.set_min_width(ui.available_width());
ui.set_height(37.0);
ui.horizontal(|ui| {
ui.label(
egui::RichText::new(unixtime_to_string(
entry.borrow().timestamp().try_into().unwrap_or_default(),
))
.weak()
.small(),
);
ui.add_space(10.0);
ui.label(entry.borrow().title().small());
});
new_page = entry.borrow_mut().show(&app.theme, ui);
});
if new_page.is_some() {

View File

@ -88,39 +88,19 @@ impl<'a> Notification<'a> for Nip46Request {
.size(Size::initial(TRUNC))
.cell_layout(Layout::left_to_right(Align::Center))
.horizontal(|mut strip| {
strip.strip(|builder| {
builder
.size(Size::initial(super::HEADER_HEIGHT))
.size(Size::initial(14.0))
.cell_layout(
Layout::left_to_right(Align::TOP).with_main_wrap(true),
)
.vertical(|mut strip| {
strip.cell(|ui| {
ui.label(
egui::RichText::new(super::unixtime_to_string(
self.timestamp().try_into().unwrap_or_default(),
))
.weak()
.small(),
);
ui.add_space(10.0);
ui.label(self.title().small());
});
strip.cell(|ui| {
let text = format!(
"NIP-46 Request from '{}'. Allow {}?",
self.client_name, self.command.method
);
widgets::truncated_label(
ui,
text,
ui.available_width(),
)
.on_hover_text(self.command.params.join(", "));
});
});
strip.cell(|ui| {
let text = format!(
"NIP-46 Request from '{}'. Allow {}?",
self.client_name, self.command.method
);
widgets::truncated_label(
ui,
text,
ui.available_width(),
)
.on_hover_text(self.command.params.join(", "));
});
strip.cell(|ui| {
ui.with_layout(Layout::right_to_left(ALIGN), |ui| {
ui.set_height(HEIGHT);

View File

@ -4,7 +4,7 @@ use eframe::egui::{self, Align, Color32, Layout, RichText, Ui};
use egui_extras::{Size, StripBuilder};
use gossip_lib::{comms::ToOverlordMessage, PendingItem, PersonList, GLOBALS};
use crate::ui::{widgets, Page, Theme};
use crate::ui::{Page, Theme};
use super::{Notification, NotificationFilter};
@ -77,7 +77,7 @@ impl Pending {
&mut self,
theme: &Theme,
ui: &mut Ui,
description: impl FnOnce(&Theme, &mut Ui, f32) -> Option<Page>,
description: impl FnOnce(&Theme, &mut Ui) -> Option<Page>,
action: impl FnOnce(&Theme, &mut Ui) -> Option<Page>,
) -> Option<Page> {
let mut new_page = None;
@ -85,30 +85,12 @@ impl Pending {
StripBuilder::new(ui)
.size(Size::remainder())
.size(Size::initial(TRUNC))
.cell_layout(Layout::left_to_right(Align::Center))
.cell_layout(Layout::left_to_right(Align::Center).with_main_wrap(true))
.horizontal(|mut strip| {
strip.strip(|builder| {
builder
.size(Size::initial(super::HEADER_HEIGHT))
.size(Size::initial(14.0))
.cell_layout(Layout::left_to_right(Align::TOP).with_main_wrap(true))
.vertical(|mut strip| {
strip.cell(|ui| {
ui.label(
egui::RichText::new(super::unixtime_to_string(
self.timestamp().try_into().unwrap_or_default(),
))
.weak()
.small(),
);
ui.add_space(10.0);
ui.label(self.title().small());
});
strip.cell(|ui| {
new_page = description(theme, ui, ui.available_width());
});
});
strip.cell(|ui| {
new_page = description(theme, ui);
});
strip.cell(|ui| {
ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
new_page = action(theme, ui);
@ -131,15 +113,11 @@ impl Pending {
.unwrap_or_default()
.unwrap_or_default();
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(
ui,
format!(
"Your Person List '{}' has never been published.",
metadata.title
),
trunc_width,
);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label(format!(
"Your Person List '{}' has never been published.",
metadata.title
));
None
};
@ -179,16 +157,12 @@ impl Pending {
.unwrap_or_default()
.unwrap_or_default();
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(
ui,
format!(
"Your Person List '{}' has not been published since {}",
metadata.title,
super::unixtime_to_string(metadata.event_created_at.0)
),
trunc_width,
);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label(format!(
"Your Person List '{}' has not been published since {}",
metadata.title,
super::unixtime_to_string(metadata.event_created_at.0)
));
None
};
let action = |theme: &Theme, ui: &mut Ui| -> Option<Page> {
@ -227,15 +201,11 @@ impl Pending {
.unwrap_or_default()
.unwrap_or_default();
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(
ui,
format!(
"Your local Person List '{}' is out-of-sync with the one found on your relays",
metadata.title
),
trunc_width,
);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label(format!(
"Your local Person List '{}' is out-of-sync with the one found on your relays",
metadata.title
));
None
};
let action = |theme: &Theme, ui: &mut Ui| -> Option<Page> {
@ -251,12 +221,8 @@ impl Pending {
}
fn relay_list_not_advertized_recently(&mut self, theme: &Theme, ui: &mut Ui) -> Option<Page> {
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(
ui,
"Your Relay List has not been advertised recently",
trunc_width,
);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label("Your Relay List has not been advertised recently");
None
};
let action = |theme: &Theme, ui: &mut Ui| -> Option<Page> {
@ -283,8 +249,8 @@ impl Pending {
}
fn relay_list_changed_since_advertised(&mut self, theme: &Theme, ui: &mut Ui) -> Option<Page> {
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(ui, "Your Relay List has changed locally", trunc_width);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label("Your Relay List has changed locally");
None
};
let action = |theme: &Theme, ui: &mut Ui| -> Option<Page> {
@ -310,12 +276,8 @@ impl Pending {
}
fn relay_list_never_advertised(&mut self, theme: &Theme, ui: &mut Ui) -> Option<Page> {
let description = |_theme: &Theme, ui: &mut Ui, trunc_width: f32| -> Option<Page> {
widgets::truncated_label(
ui,
"Your Relay List has never been advertized before",
trunc_width,
);
let description = |_theme: &Theme, ui: &mut Ui| -> Option<Page> {
ui.label("Your Relay List has never been advertized before");
None
};
let action = |theme: &Theme, ui: &mut Ui| -> Option<Page> {

View File

@ -11,7 +11,7 @@ pub(crate) mod list_entry;
pub use copy_button::{CopyButton, COPY_SYMBOL_SIZE};
mod nav_item;
use eframe::egui::Galley;
use eframe::egui::{FontId, Galley};
use egui_winit::egui::text::LayoutJob;
use egui_winit::egui::text_edit::TextEditOutput;
use egui_winit::egui::{
@ -20,6 +20,7 @@ use egui_winit::egui::{
pub use nav_item::NavItem;
mod relay_entry;
use nostr_types::RelayUrl;
pub use relay_entry::RelayEntry;
mod modal_popup;
@ -39,7 +40,7 @@ pub use switch::{switch_custom_at, switch_with_size};
mod textedit;
pub use textedit::TextEdit;
use super::GossipUi;
use super::{GossipUi, Theme};
pub const DROPDOWN_DISTANCE: f32 = 10.0;
pub const TAGG_WIDTH: f32 = 200.0;
@ -113,6 +114,33 @@ pub fn truncated_label(ui: &mut Ui, text: impl Into<WidgetText>, max_width: f32)
ui.label(galley)
}
/// Display a relay-URL
pub fn relay_url(ui: &mut Ui, theme: &Theme, url: &RelayUrl) -> Response {
let (symbol, color) = if url.as_url_crate_url().scheme() == "wss" {
("\u{1F512}", theme.accent_color())
} else {
("\u{1F513}", theme.red_500())
};
let text = format!(
"\u{00A0}\u{00A0}{}",
url.as_url_crate_url().domain().unwrap_or_default()
);
let response = ui.link(text);
let mut font = FontId::default();
font.size *= 0.7;
ui.painter().text(
response.rect.left_top(),
egui::Align2::CENTER_TOP,
symbol,
font,
color,
);
response
}
/// Create a clickable label
pub fn clickable_label(ui: &mut Ui, enabled: bool, text: impl Into<WidgetText>) -> Response {
let label = egui::Label::new(text)