Add smooth scrolling to all the vertical scroll areas

This commit is contained in:
Mike Dilger 2023-02-17 15:44:42 +13:00
parent 9defdc4795
commit 2711959e9b
10 changed files with 124 additions and 85 deletions

View File

@ -119,7 +119,10 @@ fn render_a_feed(
) {
ScrollArea::vertical()
.id_source(scroll_area_id)
.override_scroll_delta(Vec2 { x: 0.0, y: app.current_scroll_offset })
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
let bgcolor = if ctx.style().visuals.dark_mode {
Color32::BLACK

View File

@ -4,7 +4,7 @@ use crate::globals::GLOBALS;
use crate::tags::{keys_from_text, textarea_highlighter};
use crate::ui::{GossipUi, Page};
use eframe::egui;
use egui::{Align, Color32, Context, Layout, RichText, ScrollArea, TextEdit, Ui};
use egui::{Align, Color32, Context, Layout, RichText, ScrollArea, TextEdit, Ui, Vec2};
use nostr_types::Tag;
pub(super) fn posting_area(
@ -45,20 +45,26 @@ pub(super) fn posting_area(
fn real_posting_area(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Frame, ui: &mut Ui) {
// Maybe render post we are replying to
if let Some(id) = app.replying_to {
ScrollArea::vertical().max_height(200.0).show(ui, |ui| {
super::render_post_actual(
app,
ctx,
frame,
ui,
FeedPostParams {
id,
indent: 0,
as_reply_to: true,
threaded: false,
},
);
});
ScrollArea::vertical()
.max_height(200.0)
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
super::render_post_actual(
app,
ctx,
frame,
ui,
FeedPostParams {
id,
indent: 0,
as_reply_to: true,
threaded: false,
},
);
});
}
// Text area

View File

@ -1,7 +1,7 @@
use super::{GossipUi, Page};
use crate::feed::FeedKind;
use eframe::egui;
use egui::{Context, ScrollArea, SelectableLabel, Ui};
use egui::{Context, ScrollArea, SelectableLabel, Ui, Vec2};
mod about;
mod stats;
@ -41,7 +41,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ui.add_space(12.0);
ui.separator();
ScrollArea::vertical().show(ui, |ui| {
ScrollArea::vertical()
.override_scroll_delta(Vec2 { x: 0.0, y: app.current_scroll_offset })
.show(ui, |ui| {
ui.add_space(10.0);

View File

@ -379,8 +379,7 @@ impl eframe::App for GossipUi {
break;
}
}
}
else if requested_scroll < 0.0 {
} else if requested_scroll < 0.0 {
for pos in 0..9 {
if requested_scroll < -SCROLL_PER_FRAME {
let x = (requested_scroll + SCROLL_PER_FRAME).max(-SCROLL_PER_FRAME);

View File

@ -98,40 +98,48 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ui.heading(format!("People Followed ({})", people.len()));
ui.add_space(18.0);
ScrollArea::vertical().show(ui, |ui| {
for person in people.iter() {
if person.followed != 1 {
continue;
}
ScrollArea::vertical()
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
for person in people.iter() {
if person.followed != 1 {
continue;
}
ui.horizontal(|ui| {
// Avatar first
let avatar = if let Some(avatar) = app.try_get_avatar(ctx, &person.pubkey) {
avatar
} else {
app.placeholder_avatar.clone()
};
let size = AVATAR_SIZE_F32
* GLOBALS.pixels_per_point_times_100.load(Ordering::Relaxed) as f32
/ 100.0;
if ui
.add(Image::new(&avatar, Vec2 { x: size, y: size }).sense(Sense::click()))
.clicked()
{
app.set_page(Page::Person(person.pubkey.clone()));
};
ui.horizontal(|ui| {
// Avatar first
let avatar = if let Some(avatar) = app.try_get_avatar(ctx, &person.pubkey) {
avatar
} else {
app.placeholder_avatar.clone()
};
let size = AVATAR_SIZE_F32
* GLOBALS.pixels_per_point_times_100.load(Ordering::Relaxed) as f32
/ 100.0;
if ui
.add(
Image::new(&avatar, Vec2 { x: size, y: size })
.sense(Sense::click()),
)
.clicked()
{
app.set_page(Page::Person(person.pubkey.clone()));
};
ui.vertical(|ui| {
ui.label(RichText::new(GossipUi::pubkey_short(&person.pubkey)).weak());
GossipUi::render_person_name_line(app, ui, person);
ui.vertical(|ui| {
ui.label(RichText::new(GossipUi::pubkey_short(&person.pubkey)).weak());
GossipUi::render_person_name_line(app, ui, person);
});
});
});
ui.add_space(4.0);
ui.add_space(4.0);
ui.separator();
}
});
ui.separator();
}
});
} else if app.page == Page::PeopleFollow {
follow::update(app, ctx, _frame, ui);
} else if app.page == Page::PeopleMuted {

View File

@ -19,42 +19,47 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ui.heading(format!("People who are Muted ({})", people.len()));
ui.add_space(10.0);
ScrollArea::vertical().show(ui, |ui| {
for person in people.iter() {
if person.muted != 1 {
continue;
}
ScrollArea::vertical()
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
for person in people.iter() {
if person.muted != 1 {
continue;
}
ui.horizontal(|ui| {
// Avatar first
let avatar = if let Some(avatar) = app.try_get_avatar(ctx, &person.pubkey) {
avatar
} else {
app.placeholder_avatar.clone()
};
let size = AVATAR_SIZE_F32
* GLOBALS.pixels_per_point_times_100.load(Ordering::Relaxed) as f32
/ 100.0;
if ui
.add(Image::new(&avatar, Vec2 { x: size, y: size }).sense(Sense::click()))
.clicked()
{
app.set_page(Page::Person(person.pubkey.clone()));
};
ui.horizontal(|ui| {
// Avatar first
let avatar = if let Some(avatar) = app.try_get_avatar(ctx, &person.pubkey) {
avatar
} else {
app.placeholder_avatar.clone()
};
let size = AVATAR_SIZE_F32
* GLOBALS.pixels_per_point_times_100.load(Ordering::Relaxed) as f32
/ 100.0;
if ui
.add(Image::new(&avatar, Vec2 { x: size, y: size }).sense(Sense::click()))
.clicked()
{
app.set_page(Page::Person(person.pubkey.clone()));
};
ui.vertical(|ui| {
ui.label(RichText::new(GossipUi::pubkey_short(&person.pubkey)).weak());
GossipUi::render_person_name_line(app, ui, person);
ui.vertical(|ui| {
ui.label(RichText::new(GossipUi::pubkey_short(&person.pubkey)).weak());
GossipUi::render_person_name_line(app, ui, person);
if ui.button("UNMUTE").clicked() {
GLOBALS.people.mute(&person.pubkey, false);
}
if ui.button("UNMUTE").clicked() {
GLOBALS.people.mute(&person.pubkey, false);
}
});
});
});
ui.add_space(4.0);
ui.add_space(4.0);
ui.separator();
}
});
ui.separator();
}
});
}

View File

@ -26,6 +26,10 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ScrollArea::vertical()
.id_source("person page")
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.max_width(f32::INFINITY)
.auto_shrink([false, false])
.show(ui, |ui| {

View File

@ -2,7 +2,7 @@ use super::{GossipUi, Page};
use crate::comms::ToOverlordMessage;
use crate::globals::GLOBALS;
use eframe::egui;
use egui::{Context, ScrollArea, SelectableLabel, Ui};
use egui::{Context, ScrollArea, SelectableLabel, Ui, Vec2};
use egui_extras::{Column, TableBuilder};
use nostr_types::RelayUrl;
@ -45,6 +45,10 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Fram
ScrollArea::vertical()
.id_source("relay_coverage")
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
ui.push_id("general_feed_relays", |ui| {
TableBuilder::new(ui)

View File

@ -3,7 +3,7 @@ use crate::comms::ToOverlordMessage;
use crate::GLOBALS;
use eframe::egui;
use egui::widgets::{Button, Slider};
use egui::{Align, Context, Layout, ScrollArea, Ui};
use egui::{Align, Context, Layout, ScrollArea, Ui, Vec2};
pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) {
ui.heading("Settings");
@ -23,7 +23,11 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ui.add_space(10.0);
ui.separator();
ScrollArea::vertical().show(ui, |ui| {
ScrollArea::vertical()
.id_source("settings")
.override_scroll_delta(Vec2 { x: 0.0, y: app.current_scroll_offset })
.show(ui, |ui| {
ui.add_space(12.0);
ui.heading("How Many Relays to Query");

View File

@ -4,7 +4,7 @@ use crate::globals::{Globals, GLOBALS};
use crate::ui::widgets::CopyButton;
use eframe::egui;
use egui::style::Margin;
use egui::{Color32, Context, Frame, ScrollArea, SelectableLabel, Stroke, TextEdit, Ui};
use egui::{Color32, Context, Frame, ScrollArea, SelectableLabel, Stroke, TextEdit, Ui, Vec2};
use nostr_types::{KeySecurity, PublicKeyHex};
use zeroize::Zeroize;
@ -42,6 +42,10 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ScrollArea::vertical()
.id_source("your_keys")
.override_scroll_delta(Vec2 {
x: 0.0,
y: app.current_scroll_offset,
})
.show(ui, |ui| {
if GLOBALS.signer.is_ready() {
ui.heading("Ready to sign events");