Make help page work again

This commit is contained in:
itsjunetime
2025-06-12 22:51:02 -06:00
parent fc063efd42
commit a56fa8c817
3 changed files with 54 additions and 38 deletions
+27 -10
View File
@@ -20,6 +20,12 @@ use ratatui::prelude::Rect;
use crate::converter::MaybeTransferred; use crate::converter::MaybeTransferred;
pub enum KittyDisplay<'tui> {
NoChange,
ClearImages,
DisplayImages(Vec<(usize, &'tui mut MaybeTransferred, Rect)>)
}
pub struct DbgWriter<W: Write> { pub struct DbgWriter<W: Write> {
w: W, w: W,
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
@@ -82,7 +88,7 @@ pub async fn do_shms_work(ev_stream: &mut EventStream) -> bool {
} }
pub async fn display_kitty_images<'es>( pub async fn display_kitty_images<'es>(
images: Vec<(usize, &mut MaybeTransferred, Rect)>, display: KittyDisplay<'_>,
ev_stream: &'es mut EventStream ev_stream: &'es mut EventStream
) -> Result< ) -> Result<
(), (),
@@ -92,15 +98,26 @@ pub async fn display_kitty_images<'es>(
TransmitError<<&'es mut EventStream as AsyncInputReader>::Error> TransmitError<<&'es mut EventStream as AsyncInputReader>::Error>
) )
> { > {
run_action( let images = match display {
Action::Delete(DeleteConfig { KittyDisplay::NoChange => return Ok(()),
effect: ClearOrDelete::Clear, KittyDisplay::DisplayImages(_) | KittyDisplay::ClearImages => {
which: WhichToDelete::All run_action(
}), Action::Delete(DeleteConfig {
ev_stream effect: ClearOrDelete::Clear,
) which: WhichToDelete::All
.await }),
.map_err(|e| (vec![], "Couldn't clear previous images", e))?; ev_stream
)
.await
.map_err(|e| (vec![], "Couldn't clear previous images", e))?;
let KittyDisplay::DisplayImages(images) = display else {
return Ok(());
};
images
}
};
let mut err = None; let mut err = None;
for (page_num, img, area) in images { for (page_num, img, area) in images {
+21 -23
View File
@@ -29,7 +29,7 @@ use ratatui_image::picker::{Picker, ProtocolType};
use tdf::{ use tdf::{
PrerenderLimit, PrerenderLimit,
converter::{ConvertedPage, ConverterMsg, run_conversion_loop}, converter::{ConvertedPage, ConverterMsg, run_conversion_loop},
kitty::{display_kitty_images, do_shms_work, run_action}, kitty::{KittyDisplay, display_kitty_images, do_shms_work, run_action},
renderer::{self, RenderError, RenderInfo, RenderNotif}, renderer::{self, RenderError, RenderInfo, RenderNotif},
tui::{BottomMessage, InputAction, MessageSetting, Tui} tui::{BottomMessage, InputAction, MessageSetting, Tui}
}; };
@@ -422,34 +422,32 @@ async fn enter_redraw_loop(
} }
if needs_redraw { if needs_redraw {
let mut to_display = vec![]; let mut to_display = KittyDisplay::NoChange;
term.draw(|f| { term.draw(|f| {
to_display = tui.render(f, &main_area); to_display = tui.render(f, &main_area);
})?; })?;
if !to_display.is_empty() { let maybe_err = display_kitty_images(to_display, &mut ev_stream).await;
let maybe_err = display_kitty_images(to_display, &mut ev_stream).await;
if let Err((to_replace, err_desc, enum_err)) = maybe_err { if let Err((to_replace, err_desc, enum_err)) = maybe_err {
match enum_err { match enum_err {
// This is the error that kitty & ghostty provide us when they delete an // This is the error that kitty & ghostty provide us when they delete an
// image due to memory constraints, so if we get it, we just fix it by // image due to memory constraints, so if we get it, we just fix it by
// re-rendering so it don't display it to the user // re-rendering so it don't display it to the user
// //
// [TODO] maybe when we detect that an image was deleted, we probe the // [TODO] maybe when we detect that an image was deleted, we probe the
// terminal for the pages around it to see if they were deleted too and if // terminal for the pages around it to see if they were deleted too and if
// they were, we re-render them? idk // they were, we re-render them? idk
TransmitError::Terminal(TerminalError::NoEntity(_)) => (), TransmitError::Terminal(TerminalError::NoEntity(_)) => (),
_ => tui.set_msg(MessageSetting::Some(BottomMessage::Error(format!( _ => tui.set_msg(MessageSetting::Some(BottomMessage::Error(format!(
"{err_desc}: {enum_err}" "{err_desc}: {enum_err}"
)))) ))))
} }
for page_num in to_replace { for page_num in to_replace {
tui.page_failed_display(page_num); tui.page_failed_display(page_num);
// So that they get re-rendered and sent over again // So that they get re-rendered and sent over again
to_renderer.send(RenderNotif::PageNeedsReRender(page_num))?; to_renderer.send(RenderNotif::PageNeedsReRender(page_num))?;
}
} }
} }
+6 -5
View File
@@ -24,6 +24,7 @@ use ratatui_image::Image;
use crate::{ use crate::{
converter::{ConvertedImage, MaybeTransferred}, converter::{ConvertedImage, MaybeTransferred},
kitty::KittyDisplay,
renderer::{RenderError, fill_default}, renderer::{RenderError, fill_default},
skip::Skip skip::Skip
}; };
@@ -133,10 +134,10 @@ impl Tui {
&'s mut self, &'s mut self,
frame: &mut Frame<'_>, frame: &mut Frame<'_>,
full_layout: &RenderLayout full_layout: &RenderLayout
) -> Vec<(usize, &'s mut MaybeTransferred, Rect)> { ) -> KittyDisplay<'s> {
if self.showing_help_msg { if self.showing_help_msg {
self.render_help_msg(frame); self.render_help_msg(frame);
return vec![]; return KittyDisplay::ClearImages;
} }
if let Some((top_area, bottom_area)) = full_layout.top_and_bottom { if let Some((top_area, bottom_area)) = full_layout.top_and_bottom {
@@ -243,7 +244,7 @@ impl Tui {
// be written and set to skip it so that ratatui doesn't spend a lot of time diffing it // be written and set to skip it so that ratatui doesn't spend a lot of time diffing it
// each re-render // each re-render
frame.render_widget(Skip::new(true), img_area); frame.render_widget(Skip::new(true), img_area);
vec![] KittyDisplay::NoChange
} else { } else {
// here we calculate how many pages can fit in the available area. // here we calculate how many pages can fit in the available area.
let mut test_area_w = img_area.width; let mut test_area_w = img_area.width;
@@ -279,7 +280,7 @@ impl Tui {
if page_widths.is_empty() { if page_widths.is_empty() {
// If none are ready to render, just show the loading thing // If none are ready to render, just show the loading thing
Self::render_loading_in(frame, img_area); Self::render_loading_in(frame, img_area);
vec![] KittyDisplay::ClearImages
} else { } else {
execute!(stdout(), BeginSynchronizedUpdate).unwrap(); execute!(stdout(), BeginSynchronizedUpdate).unwrap();
@@ -306,7 +307,7 @@ impl Tui {
// then the whole diffing thing messes it up // then the whole diffing thing messes it up
self.last_render.rect = size; self.last_render.rect = size;
to_display KittyDisplay::DisplayImages(to_display)
} }
} }
} }