feat: ffmpeg image loader
This commit is contained in:
@ -1,13 +1,15 @@
|
||||
use crate::link::NostrLink;
|
||||
use crate::route::{RouteServices, Routes};
|
||||
use crate::stream_info::{StreamInfo, StreamStatus};
|
||||
use crate::theme::{NEUTRAL_500, NEUTRAL_900, PRIMARY};
|
||||
use crate::theme::{NEUTRAL_800, NEUTRAL_900, PRIMARY};
|
||||
use crate::widgets::avatar::Avatar;
|
||||
use eframe::epaint::{Rounding, Vec2};
|
||||
use egui::epaint::RectShape;
|
||||
use egui::load::TexturePoll;
|
||||
use egui::{vec2, Color32, CursorIcon, FontId, Label, Pos2, Rect, Response, RichText, Sense, TextWrapMode, Ui, Widget};
|
||||
use image::Pixel;
|
||||
use egui::{
|
||||
vec2, Color32, CursorIcon, FontId, Label, Pos2, Rect, Response, RichText, Sense, TextWrapMode,
|
||||
Ui, Widget,
|
||||
};
|
||||
use nostrdb::Note;
|
||||
|
||||
pub struct StreamEvent<'a> {
|
||||
@ -17,10 +19,7 @@ pub struct StreamEvent<'a> {
|
||||
|
||||
impl<'a> StreamEvent<'a> {
|
||||
pub fn new(event: &'a Note<'a>, services: &'a RouteServices) -> Self {
|
||||
Self {
|
||||
event,
|
||||
services,
|
||||
}
|
||||
Self { event, services }
|
||||
}
|
||||
}
|
||||
impl Widget for StreamEvent<'_> {
|
||||
@ -33,14 +32,14 @@ impl Widget for StreamEvent<'_> {
|
||||
|
||||
let w = ui.available_width();
|
||||
let h = (w / 16.0) * 9.0;
|
||||
let cover = self.event.image()
|
||||
.map(|p| self.services.img_cache.load(p));
|
||||
let cover = self.event.image().map(|p| self.services.img_cache.load(p));
|
||||
|
||||
let (response, painter) = ui.allocate_painter(Vec2::new(w, h), Sense::click());
|
||||
|
||||
if let Some(cover) = cover.map(|c|
|
||||
if let Some(cover) = cover.map(|c| {
|
||||
c.rounding(Rounding::same(12.))
|
||||
.load_for_size(painter.ctx(), Vec2::new(w, h))) {
|
||||
.load_for_size(painter.ctx(), Vec2::new(w, h))
|
||||
}) {
|
||||
match cover {
|
||||
Ok(TexturePoll::Ready { texture }) => {
|
||||
painter.add(RectShape {
|
||||
@ -54,11 +53,11 @@ impl Widget for StreamEvent<'_> {
|
||||
});
|
||||
}
|
||||
_ => {
|
||||
painter.rect_filled(response.rect, 12., NEUTRAL_500);
|
||||
painter.rect_filled(response.rect, 12., NEUTRAL_800);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
painter.rect_filled(response.rect, 12., NEUTRAL_500);
|
||||
painter.rect_filled(response.rect, 12., NEUTRAL_800);
|
||||
}
|
||||
|
||||
let overlay_label_pad = Vec2::new(5., 5.);
|
||||
@ -68,20 +67,41 @@ impl Widget for StreamEvent<'_> {
|
||||
} else {
|
||||
NEUTRAL_900
|
||||
};
|
||||
let live_label = painter.layout_no_wrap(live_label_text, FontId::default(), Color32::WHITE);
|
||||
let live_label =
|
||||
painter.layout_no_wrap(live_label_text, FontId::default(), Color32::WHITE);
|
||||
|
||||
let overlay_react = response.rect.shrink(8.0);
|
||||
let live_label_pos = overlay_react.min + vec2(overlay_react.width() - live_label.rect.width() - (overlay_label_pad.x * 2.), 0.0);
|
||||
let live_label_background = Rect::from_two_pos(live_label_pos, live_label_pos + live_label.size() + (overlay_label_pad * 2.));
|
||||
let live_label_pos = overlay_react.min
|
||||
+ vec2(
|
||||
overlay_react.width() - live_label.rect.width() - (overlay_label_pad.x * 2.),
|
||||
0.0,
|
||||
);
|
||||
let live_label_background = Rect::from_two_pos(
|
||||
live_label_pos,
|
||||
live_label_pos + live_label.size() + (overlay_label_pad * 2.),
|
||||
);
|
||||
painter.rect_filled(live_label_background, 8., live_label_color);
|
||||
painter.galley(live_label_pos + overlay_label_pad, live_label, Color32::PLACEHOLDER);
|
||||
painter.galley(
|
||||
live_label_pos + overlay_label_pad,
|
||||
live_label,
|
||||
Color32::PLACEHOLDER,
|
||||
);
|
||||
|
||||
if let Some(viewers) = self.event.viewers() {
|
||||
let viewers_label = painter.layout_no_wrap(format!("{} viewers", viewers), FontId::default(), Color32::WHITE);
|
||||
let rect_start = overlay_react.max - viewers_label.size() - (overlay_label_pad * 2.0);
|
||||
let viewers_label = painter.layout_no_wrap(
|
||||
format!("{} viewers", viewers),
|
||||
FontId::default(),
|
||||
Color32::WHITE,
|
||||
);
|
||||
let rect_start =
|
||||
overlay_react.max - viewers_label.size() - (overlay_label_pad * 2.0);
|
||||
let pos = Rect::from_two_pos(rect_start, overlay_react.max);
|
||||
painter.rect_filled(pos, 8., NEUTRAL_900);
|
||||
painter.galley(rect_start + overlay_label_pad, viewers_label, Color32::PLACEHOLDER);
|
||||
painter.galley(
|
||||
rect_start + overlay_label_pad,
|
||||
viewers_label,
|
||||
Color32::PLACEHOLDER,
|
||||
);
|
||||
}
|
||||
let response = response.on_hover_and_drag_cursor(CursorIcon::PointingHand);
|
||||
if response.clicked() {
|
||||
@ -98,6 +118,6 @@ impl Widget for StreamEvent<'_> {
|
||||
ui.add(Label::new(title).wrap_mode(TextWrapMode::Truncate));
|
||||
})
|
||||
})
|
||||
.response
|
||||
.response
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user