Files
ELY-Browser/crates/ely_app/src/shell/internal_pages/download_actions.rs
T

136 lines
5.1 KiB
Rust

use ely_domain::{DownloadEntry, DownloadState};
use gpui::prelude::FluentBuilder;
use gpui::{AnyElement, Context, IntoElement, ParentElement, Styled, div, px};
use gpui_component::{
IconName, Sizable,
button::{Button, ButtonVariants},
};
use super::ElyShell;
impl ElyShell {
pub(super) fn render_download_actions(
&mut self,
index: usize,
entry: &DownloadEntry,
cx: &mut Context<Self>,
) -> AnyElement {
div()
.w(px(96.0))
.flex()
.items_center()
.justify_end()
.gap_1()
.when(matches!(entry.state(), DownloadState::InProgress), |this| {
let pause_id = entry.id().clone();
let cancel_id = entry.id().clone();
this.child(
download_action_button("pause", index, IconName::Minus, "Pause Download")
.on_click(cx.listener(move |shell, _, _, cx| {
shell.pause_download(&pause_id, cx);
}))
.into_any_element(),
)
.child(
download_action_button("cancel", index, IconName::Close, "Cancel Download")
.on_click(cx.listener(move |shell, _, _, cx| {
shell.cancel_download(&cancel_id, cx);
}))
.into_any_element(),
)
})
.when(matches!(entry.state(), DownloadState::Paused), |this| {
let resume_id = entry.id().clone();
let cancel_id = entry.id().clone();
this.child(
download_action_button(
"resume",
index,
IconName::ArrowRight,
"Resume Download",
)
.on_click(cx.listener(move |shell, _, _, cx| {
shell.resume_download(&resume_id, cx);
}))
.into_any_element(),
)
.child(
download_action_button("cancel", index, IconName::Close, "Cancel Download")
.on_click(cx.listener(move |shell, _, _, cx| {
shell.cancel_download(&cancel_id, cx);
}))
.into_any_element(),
)
})
.when(
matches!(entry.state(), DownloadState::Cancelled | DownloadState::Failed),
|this| {
let retry_id = entry.id().clone();
this.child(
download_action_button("retry", index, IconName::Undo2, "Retry Download")
.on_click(cx.listener(move |shell, _, _, cx| {
shell.retry_download(&retry_id, cx);
}))
.into_any_element(),
)
},
)
.when(
matches!(entry.state(), DownloadState::Completed)
&& entry.target_file_path().is_some(),
|this| {
let open_id = entry.id().clone();
let reveal_id = entry.id().clone();
let checksum_id = entry.id().clone();
this.child(
download_action_button("open", index, IconName::ExternalLink, "Open File")
.on_click(cx.listener(move |shell, _, _, cx| {
shell.open_download_file(&open_id, cx);
}))
.into_any_element(),
)
.child(
download_action_button(
"reveal",
index,
IconName::FolderOpen,
"Reveal in Finder",
)
.on_click(cx.listener(move |shell, _, _, cx| {
shell.reveal_download_file(&reveal_id, cx);
}))
.into_any_element(),
)
.when(entry.checksum().is_none(), |this| {
this.child(
download_action_button(
"checksum",
index,
IconName::CircleCheck,
"Calculate SHA-256",
)
.on_click(cx.listener(move |shell, _, _, cx| {
shell.calculate_download_checksum(&checksum_id, cx);
}))
.into_any_element(),
)
})
},
)
.into_any_element()
}
}
fn download_action_button(
action: &'static str,
index: usize,
icon: IconName,
tooltip: &'static str,
) -> Button {
Button::new((action, index)).ghost().xsmall().icon(icon).tooltip(tooltip)
}