Add option to search for icons (#120)

This commit is contained in:
Philip Kristoffersen
2022-05-13 00:31:35 +02:00
committed by GitHub
parent 21a696fdbb
commit 9f59957edc
8 changed files with 1116 additions and 787 deletions
+41 -45
View File
@@ -200,52 +200,37 @@ async fn search_for_images_to_download(
let shortcuts: Vec<&ShortcutOwned> = images_needed.collect();
if let ImageType::Icon = image_type {
for (index, image_id) in image_ids.iter().enumerate() {
let shortcut = shortcuts[index];
if let Some(url) = get_steam_icon_url(*image_id).await {
let path = grid_folder.join(image_type.file_name(shortcut.app_id));
to_download.push(ToDownload {
path,
url,
app_name: shortcut.app_name.clone(),
image_type,
});
}
}
} else {
for image_ids in image_ids.chunks(99) {
let image_search_result =
get_images_for_ids(client, image_ids, &image_type, download_animated).await;
match image_search_result {
Ok(images) => {
let images = images
.iter()
.enumerate()
.map(|(index, image)| (image, shortcuts[index], image_ids[index]));
let download_for_this_type = stream::iter(images)
.filter_map(|(image, shortcut, game_id)| {
let path = grid_folder.join(image_type.file_name(shortcut.app_id));
async move {
let image_url = match image {
Ok(img) => Some(img.url.clone()),
Err(_) => get_steam_image_url(game_id, &image_type).await,
};
image_url.map(|url| ToDownload {
path,
url,
app_name: shortcut.app_name.clone(),
image_type,
})
}
})
.collect::<Vec<ToDownload>>()
.await;
for image_ids in image_ids.chunks(99) {
let image_search_result =
get_images_for_ids(client, image_ids, &image_type, download_animated).await;
match image_search_result {
Ok(images) => {
let images = images
.iter()
.enumerate()
.map(|(index, image)| (image, shortcuts[index], image_ids[index]));
let download_for_this_type = stream::iter(images)
.filter_map(|(image, shortcut, game_id)| {
let path = grid_folder.join(image_type.file_name(shortcut.app_id));
async move {
let image_url = match image {
Ok(img) => Some(img.url.clone()),
Err(_) => get_steam_image_url(game_id, &image_type).await,
};
image_url.map(|url| ToDownload {
path,
url,
app_name: shortcut.app_name.clone(),
image_type,
})
}
})
.collect::<Vec<ToDownload>>()
.await;
to_download.extend(download_for_this_type);
}
Err(err) => println!("Error getting images: {}", err),
to_download.extend(download_for_this_type);
}
Err(err) => println!("Error getting images: {}", err),
}
}
}
@@ -301,18 +286,29 @@ pub fn get_query_type(
nsfw: Some(&Nsfw::False),
..Default::default()
};
use steamgriddb_api::query_parameters::IconQueryParameters;
let icon_parameters = IconQueryParameters {
nsfw: Some(&Nsfw::False),
..Default::default()
};
let query_type = match image_type {
ImageType::Hero => steamgriddb_api::QueryType::Hero(Some(hero_parameters)),
ImageType::BigPicture => steamgriddb_api::QueryType::Grid(Some(big_picture_parameters)),
ImageType::Grid => steamgriddb_api::QueryType::Grid(Some(grid_parameters)),
ImageType::WideGrid => steamgriddb_api::QueryType::Grid(Some(big_picture_parameters)),
ImageType::Logo => steamgriddb_api::QueryType::Logo(Some(logo_parameters)),
_ => panic!("Unsupported image type"),
ImageType::Icon => steamgriddb_api::QueryType::Icon(Some(icon_parameters)),
};
query_type
}
async fn get_steam_image_url(game_id: usize, image_type: &ImageType) -> Option<String> {
if let ImageType::Icon = image_type {
if let Some(url) = get_steam_icon_url(game_id).await {
return Some(url);
}
}
let steamgriddb_page_url = format!("https://www.steamgriddb.com/api/public/game/{}/", game_id);
let response = reqwest::get(steamgriddb_page_url).await;
if let Ok(response) = response {
+5 -17
View File
@@ -575,7 +575,8 @@ fn render_shortcut_images(ui: &mut egui::Ui, state: &ImageSelectState) -> Option
_ => None,
})
.flatten();
if render_thumbnail(ui, texture, &image_type) {
let clicked = render_thumbnail(ui, texture);
if clicked {
return Some(UserAction::ImageTypeSelected(*image_type));
}
}
@@ -597,28 +598,15 @@ fn render_user_select(state: &ImageSelectState, ui: &mut egui::Ui) -> UserAction
const MAX_WIDTH: f32 = 300.;
fn render_thumbnail(
ui: &mut egui::Ui,
image: Option<egui::TextureHandle>,
image_type: &ImageType,
) -> bool {
fn render_thumbnail(ui: &mut egui::Ui, image: Option<egui::TextureHandle>) -> bool {
if let Some(texture) = image {
let mut size = texture.size_vec2();
clamp_to_width(&mut size, MAX_WIDTH);
let image_button = ImageButton::new(&texture, size);
let added = ui.add(image_button);
match image_type {
ImageType::Icon => false,
_ => added.on_hover_text("Click to change image").clicked(),
}
added.on_hover_text("Click to change image").clicked()
} else {
match image_type {
ImageType::Icon => {
ui.label("No icon found");
false
}
_ => ui.button("Pick an image").clicked(),
}
ui.button("Pick an image").clicked()
}
}