mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 16:31:18 +00:00
Merge remote-tracking branch 'bushmann/refactor-note-rendering' into notemerge
This commit is contained in:
commit
e132b940a1
@ -7,6 +7,7 @@ use egui::{Context, Frame, RichText, ScrollArea, SelectableLabel, Ui, Vec2};
|
||||
use nostr_types::Id;
|
||||
|
||||
mod note;
|
||||
pub use note::NoteRenderData;
|
||||
mod post;
|
||||
|
||||
struct FeedNoteParams {
|
||||
|
@ -1,22 +1,25 @@
|
||||
use super::{GossipUi, Page};
|
||||
use super::{GossipUi, NoteData, Page, RepostType};
|
||||
use crate::feed::FeedKind;
|
||||
use crate::globals::GLOBALS;
|
||||
use eframe::egui::{self, Context};
|
||||
use eframe::egui;
|
||||
use egui::{RichText, Ui};
|
||||
use linkify::{LinkFinder, LinkKind};
|
||||
use nostr_types::{Event, IdHex, Tag};
|
||||
use nostr_types::{IdHex, Tag};
|
||||
|
||||
/// returns None or a repost
|
||||
pub(super) fn render_content(
|
||||
app: &mut GossipUi,
|
||||
ctx: &Context,
|
||||
ui: &mut Ui,
|
||||
tag_re: ®ex::Regex,
|
||||
event: &Event,
|
||||
note: &NoteData,
|
||||
as_deleted: bool,
|
||||
content: &str,
|
||||
) {
|
||||
) -> Option<NoteData> {
|
||||
let tag_re = app.tag_re.clone();
|
||||
ui.style_mut().spacing.item_spacing.x = 0.0;
|
||||
|
||||
// Optional repost return
|
||||
let mut append_repost: Option<NoteData> = None;
|
||||
|
||||
for span in LinkFinder::new().kinds(&[LinkKind::Url]).spans(content) {
|
||||
if span.kind().is_some() {
|
||||
if span.as_str().ends_with(".jpg")
|
||||
@ -36,7 +39,7 @@ pub(super) fn render_content(
|
||||
for mat in tag_re.find_iter(s) {
|
||||
ui.label(&s[pos..mat.start()]);
|
||||
let num: usize = s[mat.start() + 2..mat.end() - 1].parse::<usize>().unwrap();
|
||||
if let Some(tag) = event.tags.get(num) {
|
||||
if let Some(tag) = note.event.tags.get(num) {
|
||||
match tag {
|
||||
Tag::Pubkey { pubkey, .. } => {
|
||||
let nam = match GLOBALS.people.get(pubkey) {
|
||||
@ -51,27 +54,38 @@ pub(super) fn render_content(
|
||||
};
|
||||
}
|
||||
Tag::Event { id, .. } => {
|
||||
if ui.cursor().min == ui.max_rect().min {
|
||||
ui.end_row();
|
||||
}
|
||||
let mut render_as_link = true;
|
||||
if app.settings.show_first_mention && pos == 0 {
|
||||
// try to find the mentioned note in our cache
|
||||
let maybe_event = GLOBALS.events.get(id);
|
||||
if let Some(event) = maybe_event {
|
||||
if let Some(note_data) = super::NoteData::new(event) {
|
||||
super::render_repost(app, ui, ctx, note_data);
|
||||
render_as_link = false;
|
||||
let mut render_link = true;
|
||||
match note.repost {
|
||||
Some(RepostType::MentionOnly)
|
||||
| Some(RepostType::CommentMention)
|
||||
| Some(RepostType::Kind6Mention) => {
|
||||
for (i, event) in note.cached_mentions.iter() {
|
||||
if *i == num {
|
||||
// FIXME is there a way to consume just this entry in cached_mentions so
|
||||
// we can avoid the clone?
|
||||
if let Some(note_data) =
|
||||
super::NoteData::new(event.clone(), true)
|
||||
{
|
||||
append_repost = Some(note_data);
|
||||
render_link = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
if render_as_link {
|
||||
if render_link {
|
||||
// insert a newline if the current line has text
|
||||
if ui.cursor().min.x > ui.max_rect().min.y {
|
||||
ui.end_row();
|
||||
}
|
||||
|
||||
let idhex: IdHex = (*id).into();
|
||||
let nam = format!("#{}", GossipUi::hex_id_short(&idhex));
|
||||
if ui.link(&nam).clicked() {
|
||||
app.set_page(Page::Feed(FeedKind::Thread {
|
||||
id: *id,
|
||||
referenced_by: event.id,
|
||||
referenced_by: note.event.id,
|
||||
}));
|
||||
};
|
||||
}
|
||||
@ -101,4 +115,6 @@ pub(super) fn render_content(
|
||||
}
|
||||
|
||||
ui.reset_style();
|
||||
|
||||
append_repost
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
use super::{FeedProperties, PostProperties, ThemeDef};
|
||||
use super::{FeedProperties, NoteRenderData, ThemeDef};
|
||||
use crate::ui::HighlightType;
|
||||
use eframe::egui::style::{Selection, WidgetVisuals, Widgets};
|
||||
use eframe::egui::{FontDefinitions, Margin, RichText, Style, TextFormat, TextStyle, Visuals};
|
||||
@ -378,15 +378,15 @@ impl ThemeDef for ClassicTheme {
|
||||
fn feed_scroll_stroke(_dark_mode: bool, _feed: &FeedProperties) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn feed_post_separator_stroke(dark_mode: bool, _post: &PostProperties) -> Stroke {
|
||||
fn feed_post_separator_stroke(dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
if dark_mode {
|
||||
Stroke::new(1.0, Color32::from_gray(72))
|
||||
} else {
|
||||
Stroke::new(1.0, Color32::from_gray(192))
|
||||
}
|
||||
}
|
||||
fn feed_post_outer_indent(_ui: &mut eframe::egui::Ui, _post: &PostProperties) {}
|
||||
fn feed_post_inner_indent(ui: &mut eframe::egui::Ui, post: &PostProperties) {
|
||||
fn feed_post_outer_indent(_ui: &mut eframe::egui::Ui, _post: &NoteRenderData) {}
|
||||
fn feed_post_inner_indent(ui: &mut eframe::egui::Ui, post: &NoteRenderData) {
|
||||
if post.is_thread {
|
||||
let space = 100.0 * (10.0 - (1000.0 / (post.thread_position as f32 + 100.0)));
|
||||
ui.add_space(space);
|
||||
@ -399,24 +399,24 @@ impl ThemeDef for ClassicTheme {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn feed_frame_inner_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_frame_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: 0.0,
|
||||
left: 10.0,
|
||||
top: 4.0,
|
||||
right: 0.0,
|
||||
bottom: 0.0,
|
||||
right: 10.0,
|
||||
bottom: 4.0,
|
||||
}
|
||||
}
|
||||
fn feed_frame_outer_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_frame_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin::default()
|
||||
}
|
||||
fn feed_frame_rounding(_post: &PostProperties) -> Rounding {
|
||||
fn feed_frame_rounding(_post: &NoteRenderData) -> Rounding {
|
||||
Rounding::default()
|
||||
}
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &PostProperties) -> Shadow {
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::default()
|
||||
}
|
||||
fn feed_frame_fill(dark_mode: bool, post: &PostProperties) -> Color32 {
|
||||
fn feed_frame_fill(dark_mode: bool, post: &NoteRenderData) -> Color32 {
|
||||
if post.is_new {
|
||||
if dark_mode {
|
||||
Color32::from_rgb(60, 0, 0)
|
||||
@ -431,7 +431,63 @@ impl ThemeDef for ClassicTheme {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn feed_frame_stroke(_dark_mode: bool, _post: &PostProperties) -> Stroke {
|
||||
fn feed_frame_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
|
||||
fn repost_separator_before_stroke(dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
if dark_mode {
|
||||
Stroke::new(1.0, Color32::from_gray(72))
|
||||
} else {
|
||||
Stroke::new(1.0, Color32::from_gray(192))
|
||||
}
|
||||
}
|
||||
|
||||
fn repost_space_above_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
4.0
|
||||
}
|
||||
fn repost_space_below_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
8.0
|
||||
}
|
||||
|
||||
fn repost_separator_after_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke {
|
||||
Self::repost_separator_before_stroke(dark_mode, post)
|
||||
}
|
||||
fn repost_space_above_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
4.0
|
||||
}
|
||||
fn repost_space_below_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
|
||||
fn repost_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
// Margin {
|
||||
// left: 10.0,
|
||||
// top: 4.0,
|
||||
// right: 10.0,
|
||||
// bottom: 4.0,
|
||||
// }
|
||||
Margin::same(0.0)
|
||||
}
|
||||
fn repost_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
// Margin {
|
||||
// left: -10.0,
|
||||
// top: -4.0,
|
||||
// right: -10.0,
|
||||
// bottom: -4.0,
|
||||
// }
|
||||
Margin::same(0.0)
|
||||
}
|
||||
fn repost_rounding(post: &NoteRenderData) -> Rounding {
|
||||
Self::feed_frame_rounding(post)
|
||||
}
|
||||
fn repost_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::NONE
|
||||
}
|
||||
fn repost_fill(_dark_mode: bool, _post: &NoteRenderData) -> Color32 {
|
||||
Color32::TRANSPARENT
|
||||
}
|
||||
fn repost_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
use super::{FeedProperties, PostProperties, ThemeDef};
|
||||
use super::{FeedProperties, NoteRenderData, ThemeDef};
|
||||
use crate::ui::HighlightType;
|
||||
use eframe::egui::style::{Selection, WidgetVisuals, Widgets};
|
||||
use eframe::egui::{
|
||||
@ -381,11 +381,11 @@ impl ThemeDef for DefaultTheme {
|
||||
fn feed_scroll_stroke(_dark_mode: bool, _feed: &FeedProperties) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn feed_post_separator_stroke(_dark_mode: bool, _post: &PostProperties) -> Stroke {
|
||||
fn feed_post_separator_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn feed_post_outer_indent(_ui: &mut eframe::egui::Ui, _post: &PostProperties) {}
|
||||
fn feed_post_inner_indent(ui: &mut eframe::egui::Ui, post: &PostProperties) {
|
||||
fn feed_post_outer_indent(_ui: &mut eframe::egui::Ui, _post: &NoteRenderData) {}
|
||||
fn feed_post_inner_indent(ui: &mut eframe::egui::Ui, post: &NoteRenderData) {
|
||||
if post.is_thread {
|
||||
if post.thread_position > 0 {
|
||||
let space = 150.0 * (10.0 - (1000.0 / (post.thread_position as f32 + 100.0)));
|
||||
@ -421,7 +421,7 @@ impl ThemeDef for DefaultTheme {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn feed_frame_inner_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_frame_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: 10.0,
|
||||
top: 14.0,
|
||||
@ -429,17 +429,17 @@ impl ThemeDef for DefaultTheme {
|
||||
bottom: 6.0,
|
||||
}
|
||||
}
|
||||
fn feed_frame_outer_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_frame_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin::symmetric(0.0, 0.0)
|
||||
}
|
||||
fn feed_frame_rounding(_post: &PostProperties) -> Rounding {
|
||||
fn feed_frame_rounding(_post: &NoteRenderData) -> Rounding {
|
||||
Rounding::same(4.0)
|
||||
}
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &PostProperties) -> Shadow {
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::default()
|
||||
}
|
||||
fn feed_frame_fill(dark_mode: bool, post: &PostProperties) -> Color32 {
|
||||
if post.is_focused {
|
||||
fn feed_frame_fill(dark_mode: bool, post: &NoteRenderData) -> Color32 {
|
||||
if post.is_main_event {
|
||||
if dark_mode {
|
||||
Color32::from_rgb(16, 23, 33)
|
||||
} else {
|
||||
@ -459,10 +459,74 @@ impl ThemeDef for DefaultTheme {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn feed_frame_stroke(_dark_mode: bool, _post: &PostProperties) -> Stroke {
|
||||
fn feed_frame_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
|
||||
fn repost_separator_before_stroke(dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
if dark_mode {
|
||||
Stroke::new(1.0, Color32::from_gray(60))
|
||||
} else {
|
||||
Stroke::new(1.0, Color32::from_gray(230))
|
||||
}
|
||||
}
|
||||
fn repost_space_above_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
fn repost_space_below_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
10.0
|
||||
}
|
||||
|
||||
fn repost_separator_after_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn repost_space_above_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
fn repost_space_below_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
|
||||
fn repost_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: 5.0,
|
||||
top: 14.0,
|
||||
right: 6.0,
|
||||
bottom: 6.0,
|
||||
}
|
||||
}
|
||||
fn repost_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: -5.0,
|
||||
top: -14.0,
|
||||
right: -6.0,
|
||||
bottom: -3.0,
|
||||
}
|
||||
}
|
||||
fn repost_rounding(post: &NoteRenderData) -> Rounding {
|
||||
Self::feed_frame_rounding(post)
|
||||
}
|
||||
fn repost_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::NONE
|
||||
}
|
||||
fn repost_fill(dark_mode: bool, post: &NoteRenderData) -> Color32 {
|
||||
if !post.is_comment_mention {
|
||||
return Color32::TRANSPARENT;
|
||||
}
|
||||
|
||||
let mut hsva: ecolor::HsvaGamma = Self::feed_frame_fill(dark_mode, post).into();
|
||||
if dark_mode {
|
||||
hsva.v = (hsva.v + 0.05).min(1.0); // lighten
|
||||
} else {
|
||||
hsva.v = (hsva.v - 0.05).max(0.0); // darken
|
||||
}
|
||||
let color: Color32 = hsva.into();
|
||||
color
|
||||
}
|
||||
fn repost_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke {
|
||||
Self::feed_frame_stroke(dark_mode, post)
|
||||
}
|
||||
|
||||
fn round_image() -> bool {
|
||||
true
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
use super::feed::NoteRenderData;
|
||||
use super::HighlightType;
|
||||
use eframe::egui::{
|
||||
Color32, Context, FontData, FontDefinitions, FontTweak, Margin, Rounding, Stroke, Style,
|
||||
@ -42,22 +43,6 @@ pub struct FeedProperties {
|
||||
pub is_thread: bool,
|
||||
}
|
||||
|
||||
pub struct PostProperties {
|
||||
pub height: f32,
|
||||
/// Post height
|
||||
pub is_new: bool,
|
||||
/// This message is the focus of the view (formerly called is_main_event)
|
||||
pub is_focused: bool,
|
||||
/// This message is part of a thread
|
||||
pub is_thread: bool,
|
||||
/// Is this the first post in the display?
|
||||
pub is_first: bool,
|
||||
/// Is this the last post in the display
|
||||
pub is_last: bool,
|
||||
/// Position in the thread, focused message = 0
|
||||
pub thread_position: i32,
|
||||
}
|
||||
|
||||
macro_rules! theme_dispatch {
|
||||
($($variant:path, $class:ident, $name:literal),+) => {
|
||||
|
||||
@ -143,60 +128,132 @@ macro_rules! theme_dispatch {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_post_separator_stroke(&self, post: &PostProperties) -> Stroke {
|
||||
pub fn feed_post_separator_stroke(&self, post: &NoteRenderData) -> Stroke {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_post_separator_stroke(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_post_outer_indent(&self, ui: &mut Ui, post: &PostProperties) {
|
||||
pub fn feed_post_outer_indent(&self, ui: &mut Ui, post: &NoteRenderData) {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_post_outer_indent(ui, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_post_inner_indent(&self, ui: &mut Ui, post: &PostProperties) {
|
||||
pub fn feed_post_inner_indent(&self, ui: &mut Ui, post: &NoteRenderData) {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_post_inner_indent(ui, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_inner_margin(&self, post: &PostProperties) -> Margin {
|
||||
pub fn feed_frame_inner_margin(&self, post: &NoteRenderData) -> Margin {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_inner_margin(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_outer_margin(&self, post: &PostProperties) -> Margin {
|
||||
pub fn feed_frame_outer_margin(&self, post: &NoteRenderData) -> Margin {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_outer_margin(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_rounding(&self, post: &PostProperties) -> Rounding {
|
||||
pub fn feed_frame_rounding(&self, post: &NoteRenderData) -> Rounding {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_rounding(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_shadow(&self, post: &PostProperties) -> Shadow {
|
||||
pub fn feed_frame_shadow(&self, post: &NoteRenderData) -> Shadow {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_shadow(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_fill(&self, post: &PostProperties) -> Color32 {
|
||||
pub fn feed_frame_fill(&self, post: &NoteRenderData) -> Color32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_fill(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn feed_frame_stroke(&self, post: &PostProperties) -> Stroke {
|
||||
pub fn feed_frame_stroke(&self, post: &NoteRenderData) -> Stroke {
|
||||
match self.variant {
|
||||
$( $variant => $class::feed_frame_stroke(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_separator_before_stroke(&self, post: &NoteRenderData) -> Stroke {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_separator_before_stroke(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_space_above_separator_before(&self, post: &NoteRenderData) -> f32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_space_above_separator_before(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_space_below_separator_before(&self, post: &NoteRenderData) -> f32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_space_below_separator_before(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_separator_after_stroke(&self, post: &NoteRenderData) -> Stroke {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_separator_after_stroke(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_space_above_separator_after(&self, post: &NoteRenderData) -> f32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_space_above_separator_after(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_space_below_separator_after(&self, post: &NoteRenderData) -> f32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_space_below_separator_after(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_inner_margin(&self, post: &NoteRenderData) -> Margin {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_inner_margin(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_outer_margin(&self, post: &NoteRenderData) -> Margin {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_outer_margin(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_rounding(&self, post: &NoteRenderData) -> Rounding {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_rounding(post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_shadow(&self, post: &NoteRenderData) -> Shadow {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_shadow(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_fill(&self, post: &NoteRenderData) -> Color32 {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_fill(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn repost_stroke(&self, post: &NoteRenderData) -> Stroke {
|
||||
match self.variant {
|
||||
$( $variant => $class::repost_stroke(self.dark_mode, post), )+
|
||||
}
|
||||
}
|
||||
|
||||
pub fn round_image(&self) -> bool {
|
||||
match self.variant {
|
||||
$( $variant => $class::round_image(), )+
|
||||
@ -241,15 +298,27 @@ pub trait ThemeDef: Send + Sync {
|
||||
fn feed_scroll_rounding(feed: &FeedProperties) -> Rounding;
|
||||
fn feed_scroll_fill(dark_mode: bool, feed: &FeedProperties) -> Color32;
|
||||
fn feed_scroll_stroke(dark_mode: bool, feed: &FeedProperties) -> Stroke;
|
||||
fn feed_post_separator_stroke(dark_mode: bool, post: &PostProperties) -> Stroke;
|
||||
fn feed_post_outer_indent(ui: &mut Ui, post: &PostProperties);
|
||||
fn feed_post_inner_indent(ui: &mut Ui, post: &PostProperties);
|
||||
fn feed_frame_inner_margin(post: &PostProperties) -> Margin;
|
||||
fn feed_frame_outer_margin(post: &PostProperties) -> Margin;
|
||||
fn feed_frame_rounding(post: &PostProperties) -> Rounding;
|
||||
fn feed_frame_shadow(dark_mode: bool, post: &PostProperties) -> Shadow;
|
||||
fn feed_frame_fill(dark_mode: bool, post: &PostProperties) -> Color32;
|
||||
fn feed_frame_stroke(dark_mode: bool, post: &PostProperties) -> Stroke;
|
||||
fn feed_post_separator_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke;
|
||||
fn feed_post_outer_indent(ui: &mut Ui, post: &NoteRenderData);
|
||||
fn feed_post_inner_indent(ui: &mut Ui, post: &NoteRenderData);
|
||||
fn feed_frame_inner_margin(post: &NoteRenderData) -> Margin;
|
||||
fn feed_frame_outer_margin(post: &NoteRenderData) -> Margin;
|
||||
fn feed_frame_rounding(post: &NoteRenderData) -> Rounding;
|
||||
fn feed_frame_shadow(dark_mode: bool, post: &NoteRenderData) -> Shadow;
|
||||
fn feed_frame_fill(dark_mode: bool, post: &NoteRenderData) -> Color32;
|
||||
fn feed_frame_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke;
|
||||
fn repost_separator_before_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke;
|
||||
fn repost_space_above_separator_before(post: &NoteRenderData) -> f32;
|
||||
fn repost_space_below_separator_before(post: &NoteRenderData) -> f32;
|
||||
fn repost_separator_after_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke;
|
||||
fn repost_space_above_separator_after(post: &NoteRenderData) -> f32;
|
||||
fn repost_space_below_separator_after(post: &NoteRenderData) -> f32;
|
||||
fn repost_inner_margin(post: &NoteRenderData) -> Margin;
|
||||
fn repost_outer_margin(post: &NoteRenderData) -> Margin;
|
||||
fn repost_rounding(post: &NoteRenderData) -> Rounding;
|
||||
fn repost_shadow(dark_mode: bool, post: &NoteRenderData) -> Shadow;
|
||||
fn repost_fill(dark_mode: bool, post: &NoteRenderData) -> Color32;
|
||||
fn repost_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke;
|
||||
|
||||
// image rounding
|
||||
fn round_image() -> bool;
|
||||
|
@ -1,8 +1,8 @@
|
||||
use super::{FeedProperties, PostProperties, ThemeDef};
|
||||
use super::{FeedProperties, NoteRenderData, ThemeDef};
|
||||
use crate::ui::HighlightType;
|
||||
use eframe::egui::style::{Selection, WidgetVisuals, Widgets};
|
||||
use eframe::egui::{FontDefinitions, Margin, Style, TextFormat, TextStyle, Visuals};
|
||||
use eframe::epaint::{Color32, FontFamily, FontId, Rounding, Shadow, Stroke};
|
||||
use eframe::epaint::{ecolor, Color32, FontFamily, FontId, Rounding, Shadow, Stroke};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
#[derive(Default)]
|
||||
@ -380,17 +380,17 @@ impl ThemeDef for RoundyTheme {
|
||||
fn feed_scroll_stroke(_dark_mode: bool, _feed: &FeedProperties) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn feed_post_separator_stroke(_dark_mode: bool, _post: &PostProperties) -> Stroke {
|
||||
fn feed_post_separator_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::new(1.0, Color32::TRANSPARENT)
|
||||
}
|
||||
fn feed_post_outer_indent(ui: &mut eframe::egui::Ui, post: &PostProperties) {
|
||||
fn feed_post_outer_indent(ui: &mut eframe::egui::Ui, post: &NoteRenderData) {
|
||||
if post.is_thread {
|
||||
let space = 100.0 * (10.0 - (1000.0 / (post.thread_position as f32 + 100.0)));
|
||||
ui.add_space(space);
|
||||
}
|
||||
}
|
||||
fn feed_post_inner_indent(_ui: &mut eframe::egui::Ui, _post: &PostProperties) {}
|
||||
fn feed_frame_inner_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_post_inner_indent(_ui: &mut eframe::egui::Ui, _post: &NoteRenderData) {}
|
||||
fn feed_frame_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: 10.0,
|
||||
right: 10.0,
|
||||
@ -398,10 +398,10 @@ impl ThemeDef for RoundyTheme {
|
||||
bottom: 5.0,
|
||||
}
|
||||
}
|
||||
fn feed_frame_outer_margin(_post: &PostProperties) -> Margin {
|
||||
fn feed_frame_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin::default()
|
||||
}
|
||||
fn feed_frame_rounding(post: &PostProperties) -> Rounding {
|
||||
fn feed_frame_rounding(post: &NoteRenderData) -> Rounding {
|
||||
if post.is_thread {
|
||||
let mut rounding = Rounding::none();
|
||||
if post.is_first && post.thread_position == 0 {
|
||||
@ -413,10 +413,10 @@ impl ThemeDef for RoundyTheme {
|
||||
Rounding::same(7.0)
|
||||
}
|
||||
}
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &PostProperties) -> Shadow {
|
||||
fn feed_frame_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::NONE
|
||||
}
|
||||
fn feed_frame_fill(dark_mode: bool, post: &PostProperties) -> Color32 {
|
||||
fn feed_frame_fill(dark_mode: bool, post: &NoteRenderData) -> Color32 {
|
||||
if post.is_new {
|
||||
if dark_mode {
|
||||
Color32::from_rgb(45, 45, 46)
|
||||
@ -431,8 +431,8 @@ impl ThemeDef for RoundyTheme {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn feed_frame_stroke(dark_mode: bool, post: &PostProperties) -> Stroke {
|
||||
if post.is_focused {
|
||||
fn feed_frame_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke {
|
||||
if post.is_main_event {
|
||||
if dark_mode {
|
||||
Stroke::new(1.0, Color32::from_rgb(64, 96, 64))
|
||||
} else {
|
||||
@ -447,6 +447,71 @@ impl ThemeDef for RoundyTheme {
|
||||
}
|
||||
}
|
||||
|
||||
fn repost_separator_before_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
// if dark_mode {
|
||||
// Stroke::new(1.0, Color32::from_gray(72))
|
||||
// } else {
|
||||
// Stroke::new(1.0, Color32::from_gray(192))
|
||||
// }
|
||||
Stroke::NONE
|
||||
}
|
||||
fn repost_space_above_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
fn repost_space_below_separator_before(_post: &NoteRenderData) -> f32 {
|
||||
8.0
|
||||
}
|
||||
|
||||
fn repost_separator_after_stroke(_dark_mode: bool, _post: &NoteRenderData) -> Stroke {
|
||||
Stroke::NONE
|
||||
}
|
||||
fn repost_space_above_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
0.0
|
||||
}
|
||||
fn repost_space_below_separator_after(_post: &NoteRenderData) -> f32 {
|
||||
8.0
|
||||
}
|
||||
|
||||
fn repost_inner_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: 10.0,
|
||||
right: 10.0,
|
||||
top: 10.0,
|
||||
bottom: 10.0,
|
||||
}
|
||||
}
|
||||
fn repost_outer_margin(_post: &NoteRenderData) -> Margin {
|
||||
Margin {
|
||||
left: -10.0,
|
||||
right: -10.0,
|
||||
top: -10.0,
|
||||
bottom: -6.0,
|
||||
}
|
||||
}
|
||||
fn repost_rounding(post: &NoteRenderData) -> Rounding {
|
||||
Self::feed_frame_rounding(post)
|
||||
}
|
||||
fn repost_shadow(_dark_mode: bool, _post: &NoteRenderData) -> Shadow {
|
||||
Shadow::NONE
|
||||
}
|
||||
fn repost_fill(dark_mode: bool, post: &NoteRenderData) -> Color32 {
|
||||
if !post.is_comment_mention {
|
||||
return Color32::TRANSPARENT;
|
||||
}
|
||||
|
||||
let mut hsva: ecolor::HsvaGamma = Self::feed_frame_fill(dark_mode, post).into();
|
||||
if dark_mode {
|
||||
hsva.v = (hsva.v + 0.05).min(1.0); // lighten
|
||||
} else {
|
||||
hsva.v = (hsva.v - 0.05).max(0.0); // darken
|
||||
}
|
||||
let color: Color32 = hsva.into();
|
||||
color
|
||||
}
|
||||
fn repost_stroke(dark_mode: bool, post: &NoteRenderData) -> Stroke {
|
||||
Self::feed_frame_stroke(dark_mode, post)
|
||||
}
|
||||
|
||||
fn round_image() -> bool {
|
||||
true
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user