blob: 53257cba5521494ed8b3e2f6cdc1fe794e0ee81d [file] [log] [blame]
use egui::load::Bytes;
use egui::{Image, ImageSource, RichText, Sense, Ui};
use egui_extras::{Column, TableBuilder};
use itertools::Itertools;
use crate::app_state::AppState;
use crate::stream::Stream;
use crate::views::render_view::RenderView;
pub struct StreamSelectViewer;
impl RenderView for StreamSelectViewer {
fn title(&self) -> String {
"Stream Select".into()
}
fn render(&self, ui: &mut Ui, state: &mut AppState) -> anyhow::Result<()> {
if ui.button("Refresh stream list").clicked() {
state.http_stream_manager.load_stream_list();
}
let mut set_stream = None;
let streams = state.http_stream_manager.streams.lock().unwrap();
TableBuilder::new(ui)
.column(Column::initial(600.0).resizable(true))
.column(Column::remainder().resizable(false).at_least(100.0))
.sense(Sense::click())
.striped(true)
.header(20.0, |mut header| {
header.col(|ui| {
ui.heading("Name");
});
header.col(|ui| {
ui.heading("Preview");
});
})
.body(|body| {
let streams: Vec<_> = streams
.iter()
.sorted_by_key(|stream| stream.stream_name.as_str())
.collect();
let num_rows: usize = streams.len();
body.rows(100.0, num_rows, |mut row| {
let stream_info = streams[row.index()];
row.col(|ui| {
let text = RichText::new(stream_info.stream_name.as_str()).heading();
ui.label(text);
});
row.col(|ui| {
if let Some(thumbnail_png) = &stream_info.thumbnail_png {
// TODO(comc): Make stream_info.thumbnail_png an Arc to avoid copy.
let thumbnail_png = thumbnail_png.clone();
let uri = format!("bytes://{}", stream_info.stream_name);
let image = Image::new(ImageSource::Bytes {
uri: uri.into(),
bytes: Bytes::Shared(thumbnail_png.into()),
});
ui.add(image);
}
});
if row.response().clicked() {
set_stream = Some(stream_info.clone());
}
});
});
if let Some(set_stream) = set_stream {
state.stream = Some(Stream::from_http(set_stream, false, 0, &state.settings.sharable.streams_url)?);
state.settings.show_stream_select = false;
}
Ok(())
}
}