mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 16:31:18 +00:00
Notifications: Make header separate again, wrap description.
Widgets: Add Relay Url widget
This commit is contained in:
parent
8124e7eceb
commit
383686e491
@ -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| {
|
||||
|
@ -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| {
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
|
@ -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> {
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user