binocular-cli 0.2.3

Not exactly a telescope, but it's useful sometimes. TUI to search/navigate through files and workspaces.
Documentation
use crate::preview::types::MediaPreview;
use crate::ui::preview::PreviewView;
use ratatui::{
    layout::{Constraint, Direction, Layout, Rect},
    style::{Color, Style},
    widgets::{Block, Paragraph},
    Frame,
};
use ratatui_image::StatefulImage;

pub fn render_media_preview(
    f: &mut Frame,
    area: Rect,
    preview_block: Block<'_>,
    media: &mut MediaPreview,
    view: &PreviewView<'_>,
) {
    let inner = preview_block.inner(area);
    f.render_widget(preview_block, area);

    if let Some(protocol) = &mut media.artwork {
        let min_image_height: u16 = 6;
        let visible_meta_lines = media
            .metadata_line_count
            .saturating_sub(view.scroll as usize) as u16;
        let max_meta_height = inner.height.saturating_sub(min_image_height);
        let meta_height = visible_meta_lines.max(1).min(max_meta_height.max(1));

        let chunks = Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Length(meta_height), Constraint::Min(0)])
            .split(inner);

        let meta = Paragraph::new(media.metadata.clone())
            .style(Style::default().bg(Color::Reset))
            .scroll((view.scroll, view.scroll_char));
        f.render_widget(meta, chunks[0]);

        let image = StatefulImage::new().resize(ratatui_image::Resize::Fit(None));
        f.render_stateful_widget(image, chunks[1], protocol);
    } else {
        let meta = Paragraph::new(media.metadata.clone())
            .style(Style::default().bg(Color::Reset))
            .scroll((view.scroll, view.scroll_char));
        f.render_widget(meta, inner);
    }
}