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

109 lines
3.5 KiB
Rust

use ely_browser_core::{BrowserSnapshot, InstalledPlugin};
use ely_design_system::colors;
use ely_domain::PluginId;
use gpui::{AnyElement, Context, IntoElement, ParentElement, Styled, div, px, rgb};
use gpui_component::{
IconName, Sizable,
button::{Button, ButtonVariants},
scroll::ScrollableElement,
};
use super::{ElyShell, render_canvas_surface};
use crate::shell::chrome::{SERIF_FAMILY, render_plugin_detail_view};
impl ElyShell {
pub(super) fn render_plugin_detail_page(
&mut self,
snapshot: &BrowserSnapshot,
route: &str,
cx: &mut Context<Self>,
) -> AnyElement {
let plugin_id = parse_plugin_detail_route(route);
let plugin =
plugin_id.as_ref().and_then(|plugin_id| find_installed_plugin(snapshot, plugin_id));
match plugin {
Some(plugin) => render_canvas_surface(
div().size_full().overflow_y_scrollbar().child(render_plugin_detail_view(
plugin,
&snapshot.active_profile_kind,
cx,
)),
),
None => render_canvas_surface(render_missing_plugin_detail(plugin_id.as_ref(), cx)),
}
}
}
fn render_missing_plugin_detail(
plugin_id: Option<&PluginId>,
cx: &mut Context<ElyShell>,
) -> AnyElement {
let detail = plugin_id
.map(|plugin_id| plugin_id.as_str().to_string())
.unwrap_or_else(|| "Invalid plugin route".to_string());
div()
.size_full()
.pt(px(40.0))
.px(px(56.0))
.pb(px(40.0))
.flex()
.flex_col()
.gap(px(20.0))
.child(
div()
.flex()
.flex_col()
.gap(px(6.0))
.child(
div()
.font_family(SERIF_FAMILY)
.text_size(px(28.0))
.text_color(rgb(colors::INK))
.child("Plugin Details"),
)
.child(div().text_sm().text_color(rgb(colors::MUTED)).child(detail)),
)
.child(
div()
.border_t_1()
.border_color(rgb(colors::HAIRLINE))
.pt(px(20.0))
.flex()
.items_center()
.justify_between()
.gap(px(16.0))
.child(
div()
.text_sm()
.text_color(rgb(colors::MUTED))
.child("Plugin details are available for installed plugins."),
)
.child(
Button::new("open-plugin-marketplace")
.primary()
.small()
.icon(IconName::ExternalLink)
.label("Open Plugins")
.tooltip("Open Plugin Marketplace")
.on_click(cx.listener(|shell, _, window, cx| {
shell.open_internal_tab("ely://plugins", window, cx);
})),
),
)
.into_any_element()
}
fn parse_plugin_detail_route(route: &str) -> Option<PluginId> {
let plugin_id = route.strip_prefix("ely://plugin/")?;
PluginId::parse(plugin_id).ok()
}
fn find_installed_plugin<'a>(
snapshot: &'a BrowserSnapshot,
plugin_id: &PluginId,
) -> Option<&'a InstalledPlugin> {
snapshot.installed_plugins.iter().find(|plugin| plugin.id() == plugin_id)
}