Use TexturedImage in MediaCache
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -13,9 +13,13 @@ use std::path;
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use tracing::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
pub type MediaCacheValue = Promise<Result<TextureHandle>>;
|
pub type MediaCacheValue = Promise<Result<TexturedImage>>;
|
||||||
pub type MediaCacheMap = HashMap<String, MediaCacheValue>;
|
pub type MediaCacheMap = HashMap<String, MediaCacheValue>;
|
||||||
|
|
||||||
|
pub enum TexturedImage {
|
||||||
|
Static(TextureHandle),
|
||||||
|
}
|
||||||
|
|
||||||
pub struct MediaCache {
|
pub struct MediaCache {
|
||||||
pub cache_dir: path::PathBuf,
|
pub cache_dir: path::PathBuf,
|
||||||
url_imgs: MediaCacheMap,
|
url_imgs: MediaCacheMap,
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ pub use context::AppContext;
|
|||||||
pub use error::{Error, FilterError};
|
pub use error::{Error, FilterError};
|
||||||
pub use filter::{FilterState, FilterStates, UnifiedSubscription};
|
pub use filter::{FilterState, FilterStates, UnifiedSubscription};
|
||||||
pub use fonts::NamedFontFamily;
|
pub use fonts::NamedFontFamily;
|
||||||
pub use imgcache::MediaCache;
|
pub use imgcache::{MediaCache, TexturedImage};
|
||||||
pub use muted::{MuteFun, Muted};
|
pub use muted::{MuteFun, Muted};
|
||||||
pub use note::{NoteRef, RootIdError, RootNoteId, RootNoteIdBuf};
|
pub use note::{NoteRef, RootIdError, RootNoteId, RootNoteIdBuf};
|
||||||
pub use notecache::{CachedNote, NoteCache};
|
pub use notecache::{CachedNote, NoteCache};
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use egui::{pos2, Color32, ColorImage, Rect, Sense, SizeHint, TextureHandle};
|
use egui::{pos2, Color32, ColorImage, Rect, Sense, SizeHint};
|
||||||
use image::imageops::FilterType;
|
use image::imageops::FilterType;
|
||||||
use notedeck::MediaCache;
|
use notedeck::MediaCache;
|
||||||
use notedeck::Result;
|
use notedeck::Result;
|
||||||
|
use notedeck::TexturedImage;
|
||||||
use poll_promise::Promise;
|
use poll_promise::Promise;
|
||||||
use std::path;
|
use std::path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@@ -177,7 +178,7 @@ fn fetch_img_from_disk(
|
|||||||
ctx: &egui::Context,
|
ctx: &egui::Context,
|
||||||
url: &str,
|
url: &str,
|
||||||
path: &path::Path,
|
path: &path::Path,
|
||||||
) -> Promise<Result<TextureHandle>> {
|
) -> Promise<Result<TexturedImage>> {
|
||||||
let ctx = ctx.clone();
|
let ctx = ctx.clone();
|
||||||
let url = url.to_owned();
|
let url = url.to_owned();
|
||||||
let path = path.to_owned();
|
let path = path.to_owned();
|
||||||
@@ -195,7 +196,11 @@ fn fetch_img_from_disk(
|
|||||||
flat_samples.as_slice(),
|
flat_samples.as_slice(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(ctx.load_texture(&url, img, Default::default()))
|
Ok(TexturedImage::Static(ctx.load_texture(
|
||||||
|
&url,
|
||||||
|
img,
|
||||||
|
Default::default(),
|
||||||
|
)))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +222,7 @@ pub fn fetch_img(
|
|||||||
ctx: &egui::Context,
|
ctx: &egui::Context,
|
||||||
url: &str,
|
url: &str,
|
||||||
imgtyp: ImageType,
|
imgtyp: ImageType,
|
||||||
) -> Promise<Result<TextureHandle>> {
|
) -> Promise<Result<TexturedImage>> {
|
||||||
let key = MediaCache::key(url);
|
let key = MediaCache::key(url);
|
||||||
let path = img_cache.cache_dir.join(key);
|
let path = img_cache.cache_dir.join(key);
|
||||||
|
|
||||||
@@ -235,7 +240,7 @@ fn fetch_img_from_net(
|
|||||||
ctx: &egui::Context,
|
ctx: &egui::Context,
|
||||||
url: &str,
|
url: &str,
|
||||||
imgtyp: ImageType,
|
imgtyp: ImageType,
|
||||||
) -> Promise<Result<TextureHandle>> {
|
) -> Promise<Result<TexturedImage>> {
|
||||||
let (sender, promise) = Promise::new();
|
let (sender, promise) = Promise::new();
|
||||||
let request = ehttp::Request::get(url);
|
let request = ehttp::Request::get(url);
|
||||||
let ctx = ctx.clone();
|
let ctx = ctx.clone();
|
||||||
@@ -251,7 +256,7 @@ fn fetch_img_from_net(
|
|||||||
// write to disk
|
// write to disk
|
||||||
std::thread::spawn(move || MediaCache::write(&cache_path, &cloned_url, img));
|
std::thread::spawn(move || MediaCache::write(&cache_path, &cloned_url, img));
|
||||||
|
|
||||||
texture_handle
|
TexturedImage::Static(texture_handle)
|
||||||
});
|
});
|
||||||
|
|
||||||
sender.send(handle); // send the results back to the UI thread.
|
sender.send(handle); // send the results back to the UI thread.
|
||||||
|
|||||||
@@ -329,20 +329,22 @@ fn image_carousel(
|
|||||||
//ui.add(egui::Spinner::new().size(spinsz));
|
//ui.add(egui::Spinner::new().size(spinsz));
|
||||||
}
|
}
|
||||||
// Use the previously resolved image
|
// Use the previously resolved image
|
||||||
Some(Ok(img)) => {
|
Some(Ok(img)) => match img {
|
||||||
let img_resp = ui.add(
|
notedeck::TexturedImage::Static(texture_handle) => {
|
||||||
Image::new(img)
|
let img_resp = ui.add(
|
||||||
.max_height(height)
|
Image::new(texture_handle)
|
||||||
.rounding(5.0)
|
.max_height(height)
|
||||||
.fit_to_original_size(1.0),
|
.rounding(5.0)
|
||||||
);
|
.fit_to_original_size(1.0),
|
||||||
img_resp.context_menu(|ui| {
|
);
|
||||||
if ui.button("Copy Link").clicked() {
|
img_resp.context_menu(|ui| {
|
||||||
ui.ctx().copy_text(image);
|
if ui.button("Copy Link").clicked() {
|
||||||
ui.close_menu();
|
ui.ctx().copy_text(image);
|
||||||
}
|
ui.close_menu();
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -407,18 +407,26 @@ impl<'a> PostView<'a> {
|
|||||||
media_size
|
media_size
|
||||||
};
|
};
|
||||||
|
|
||||||
let img_resp = ui.add(egui::Image::new(texture).max_size(size).rounding(12.0));
|
match texture {
|
||||||
|
notedeck::TexturedImage::Static(texture_handle) => {
|
||||||
|
let img_resp = ui.add(
|
||||||
|
egui::Image::new(texture_handle)
|
||||||
|
.max_size(size)
|
||||||
|
.rounding(12.0),
|
||||||
|
);
|
||||||
|
|
||||||
let remove_button_rect = {
|
let remove_button_rect = {
|
||||||
let top_left = img_resp.rect.left_top();
|
let top_left = img_resp.rect.left_top();
|
||||||
let spacing = 13.0;
|
let spacing = 13.0;
|
||||||
let center = Pos2::new(top_left.x + spacing, top_left.y + spacing);
|
let center = Pos2::new(top_left.x + spacing, top_left.y + spacing);
|
||||||
egui::Rect::from_center_size(center, egui::vec2(26.0, 26.0))
|
egui::Rect::from_center_size(center, egui::vec2(26.0, 26.0))
|
||||||
};
|
};
|
||||||
if show_remove_upload_button(ui, remove_button_rect).clicked() {
|
if show_remove_upload_button(ui, remove_button_rect).clicked() {
|
||||||
to_remove.push(i);
|
to_remove.push(i);
|
||||||
|
}
|
||||||
|
ui.advance_cursor_after_rect(img_resp.rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ui.advance_cursor_after_rect(img_resp.rect);
|
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
self.draft.upload_errors.push(e.to_string());
|
self.draft.upload_errors.push(e.to_string());
|
||||||
|
|||||||
@@ -119,10 +119,18 @@ fn render_pfp(
|
|||||||
//error!("Image load error: {:?}", e);
|
//error!("Image load error: {:?}", e);
|
||||||
paint_circle(ui, ui_size, border)
|
paint_circle(ui, ui_size, border)
|
||||||
}
|
}
|
||||||
Some(Ok(img)) => pfp_image(ui, img, ui_size, border),
|
Some(Ok(img)) => match img {
|
||||||
|
notedeck::TexturedImage::Static(texture_handle) => {
|
||||||
|
pfp_image(ui, texture_handle, ui_size, border)
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(Ok(img)) => pfp_image(ui, img, ui_size, border),
|
Some(Ok(img)) => match img {
|
||||||
|
notedeck::TexturedImage::Static(texture_handle) => {
|
||||||
|
pfp_image(ui, texture_handle, ui_size, border)
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user