mirror of
https://github.com/itsjunetime/tdf.git
synced 2026-06-02 08:01:47 -04:00
Make help page work again
This commit is contained in:
+27
-10
@@ -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
@@ -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
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user