Feed Loading: Show spinner and hide buttons (fixes #749)

This commit is contained in:
Bu5hm4nn 2024-05-02 11:47:48 -06:00
parent a3387d0af4
commit d995784b90

View File

@ -1,6 +1,6 @@
use super::theme::FeedProperties;
use super::{widgets, GossipUi, Page};
use eframe::egui::{self, Align, Rect};
use eframe::egui::{self, Align, FontId, Rect};
use egui::{Context, RichText, Ui, Vec2};
use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::FeedKind;
@ -95,36 +95,38 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, ui: &mut Ui) {
ui.label(title_job);
recompute_btn(ui);
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
ui.add_space(16.0);
if !feed.is_empty() {
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
ui.add_space(16.0);
if widgets::Button::bordered(&app.theme, "Edit List")
.small(true)
.show(ui)
.clicked()
{
app.set_page(ctx, Page::PeopleList(list));
}
if widgets::Button::bordered(&app.theme, "Edit List")
.small(true)
.show(ui)
.clicked()
{
app.set_page(ctx, Page::PeopleList(list));
}
ui.add_space(10.0);
ui.label(RichText::new("Include replies").size(11.0));
if widgets::Switch::small(&app.theme, &mut app.mainfeed_include_nonroot)
.show(ui)
.clicked()
{
app.set_page(
ctx,
Page::Feed(FeedKind::List(list, app.mainfeed_include_nonroot)),
);
ctx.data_mut(|d| {
d.insert_persisted(
egui::Id::new("mainfeed_include_nonroot"),
app.mainfeed_include_nonroot,
ui.add_space(10.0);
ui.label(RichText::new("Include replies").size(11.0));
if widgets::Switch::small(&app.theme, &mut app.mainfeed_include_nonroot)
.show(ui)
.clicked()
{
app.set_page(
ctx,
Page::Feed(FeedKind::List(list, app.mainfeed_include_nonroot)),
);
});
}
ui.label(RichText::new("Main posts").size(11.0));
});
ctx.data_mut(|d| {
d.insert_persisted(
egui::Id::new("mainfeed_include_nonroot"),
app.mainfeed_include_nonroot,
);
});
}
ui.label(RichText::new("Main posts").size(11.0));
});
}
},
);
ui.add_space(6.0);
@ -314,7 +316,52 @@ fn render_a_feed(
}
ui.add_space(50.0);
if offer_load_more {
if feed.is_empty() {
// show a spinner
let size = ui.available_width() / 2.0;
ui.horizontal(|ui| {
ui.add_space((ui.available_width() - size) / 2.0);
let (rect, response) = ui.allocate_exact_size(
egui::vec2(size, size),
egui::Sense::hover(),
);
{
ui.ctx().request_repaint(); // because it is animated
let spinner_color = if app.theme.dark_mode {
app.theme.neutral_950()
} else {
egui::Color32::WHITE
};
let radius = (rect.height() / 2.0) - 2.0;
let n_points = 240;
let time = ui.input(|i| i.time);
let start_angle = time * std::f64::consts::TAU;
let end_angle = start_angle + 240f64.to_radians() * time.sin();
let points: Vec<egui::Pos2> = (0..n_points)
.map(|i| {
let angle = egui::lerp(
start_angle..=end_angle,
i as f64 / n_points as f64,
);
let (sin, cos) = angle.sin_cos();
rect.center()
+ radius * egui::vec2(cos as f32, sin as f32)
})
.collect();
for point in points {
ui.painter().circle_filled(point, 15.0, spinner_color);
}
}
ui.painter().text(
response.rect.center(),
egui::Align2::CENTER_CENTER,
"Loading",
FontId::proportional(16.0),
ui.visuals().text_color(),
);
});
} else if offer_load_more {
render_load_more(app, ui)
}
ui.add_space(50.0);