use crate::prelude::*;
pub use zng_app::third_party::{License, LicenseUsed, User, UserLicense, LICENSES, OPEN_LICENSES_CMD};
pub(crate) fn setup_default_view() {
let id = WindowId::named("zng-third_party-default");
OPEN_LICENSES_CMD
.on_event(
true,
app_hn!(|args: &zng_app::event::AppCommandArgs, _| {
if args.propagation().is_stopped() {
return;
}
args.propagation().stop();
let parent = WINDOWS.focused_window_id();
WINDOWS.focus_or_open(id, async move {
if let Some(p) = parent {
if let Ok(p) = WINDOWS.vars(p) {
let v = WINDOW.vars();
p.icon().set_bind(&v.icon()).perm();
}
}
Window! {
title = l10n!("window.title", "{$app} - Third Party Licenses", app = zng::env::about().app.clone());
child = default_view();
parent;
}
});
}),
)
.perm();
}
fn default_view() -> impl UiNode {
let mut licenses = LICENSES.user_licenses();
if licenses.is_empty() {
licenses.push(UserLicense {
user: User {
name: l10n!("license-none.user-name", "<none>").get(),
version: "".into(),
url: "".into(),
},
license: License {
id: l10n!("license-none.id", "<none>").get(),
name: l10n!("license-none.name", "No license data").get(),
text: "".into(),
},
});
}
let selected = var(licenses[0].clone());
let search = var(Txt::from(""));
Container! {
child_start = Container! {
widget::background_color = light_dark(rgb(0.82, 0.82, 0.82), rgb(0.18, 0.18, 0.18));
child_top = TextInput! {
txt = search.clone();
style_fn = zng_wgt_text_input::SearchStyle!();
zng_wgt_input::focus::focus_shortcut = [shortcut![CTRL+'F'], shortcut![Find]];
placeholder_txt = l10n!("search.placeholder", "search licenses ({$shortcut})", shortcut="Ctrl+F");
}, 0;
child = Scroll! {
mode = zng::scroll::ScrollMode::VERTICAL;
child_align = Align::FILL;
child = DataView! {
layout::min_width = 100;
layout::sticky_width = true;
view::<Txt> = search, hn!(selected, |a: &DataViewArgs<Txt>| {
let search = a.data().get();
let licenses = if search.is_empty() {
licenses.clone()
} else {
licenses.iter().filter(|t| t.user.name.contains(search.as_str())).cloned().collect()
};
a.set_view(Stack! {
toggle::selector = toggle::Selector::single(selected.clone());
direction = StackDirection::top_to_bottom();
children = licenses.into_iter().map(default_item_view).collect::<UiVec>();
})
});
};
};
}, 0;
child = Scroll! {
mode = zng::scroll::ScrollMode::VERTICAL;
child_align = Align::TOP_START;
padding = 10;
child = zng::markdown::Markdown!(selected.map(default_markdown));
};
}
}
fn default_item_view(item: UserLicense) -> impl UiNode {
let txt = if item.user.version.is_empty() {
item.user.name.clone()
} else {
formatx!("{} - {}", item.user.name, item.user.version)
};
Toggle! {
child = Text!(txt);
value = item;
child_align = layout::Align::START;
widget::corner_radius = 0;
layout::padding = 2;
widget::border = unset!;
}
}
fn default_markdown(item: &UserLicense) -> Txt {
use std::fmt::*;
let mut t = Txt::from("");
if item.user.version.is_empty() {
writeln!(&mut t, "# {}\n", item.user.name).unwrap();
} else {
writeln!(&mut t, "# {} - {}\n", item.user.name, item.user.version).unwrap();
}
if !item.user.url.is_empty() {
writeln!(&mut t, "[{0}]({0})\n", item.user.url).unwrap();
}
writeln!(&mut t, "## {}\n\n", item.license.name).unwrap();
if !item.license.text.is_empty() {
writeln!(&mut t, "```\n{}\n```\n", item.license.text).unwrap();
}
t.end_mut();
t
}