#![cfg(feature = "third_party")]
pub use zng_app::third_party::{LICENSES, License, LicenseUsed, OPEN_LICENSES_CMD, User, UserLicense};
#[cfg(feature = "third_party_default")]
pub(crate) fn setup_default_view() {
use crate::prelude::*;
use zng_wgt_container::ChildInsert;
let id = WindowId::named("zng-third_party-default");
OPEN_LICENSES_CMD
.on_event(
true,
true,
false,
hn!(|args| {
args.propagation.stop();
let parent = FOCUS.focused().with(|p| p.as_ref().map(|p| p.window_id()));
WINDOWS.focus_or_open(id, async move {
if let Some(p) = parent
&& let Some(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() -> UiNode {
let mut licenses = LICENSES.user_licenses();
if licenses.is_empty() {
let user_name = l10n!("license-none.user-name", "<none>").get();
let license_name = l10n!("license-none.name", "No license data").get();
licenses.push(UserLicense {
user: User::new(user_name, "", ""),
license: License::new(l10n!("license-none.id", "<none>").get(), license_name, ""),
});
}
let selected = var(licenses[0].clone());
let search = var(Txt::from(""));
let actual_width = var(zng_layout::unit::Dip::new(0));
let alternate_layout = actual_width.map(|&w| w <= 500 && w > 1);
let selector = 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");
};
child = Scroll! {
layout::min_width = 100;
layout::sticky_width = true;
mode = zng::scroll::ScrollMode::VERTICAL;
child_align = Align::FILL;
child = DataView! {
view::<Txt> =
search,
hn!(selected, |a| {
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);
})
}),
;
};
when *#{alternate_layout.clone()} {
layout::max_height = 100; layout::sticky_width = false; }
};
};
Container! {
layout::actual_width;
child_insert = {
placement: alternate_layout.map(|&y| if y { ChildInsert::Top } else { ChildInsert::Start }),
node: selector,
};
child = Scroll! {
mode = zng::scroll::ScrollMode::VERTICAL;
child_align = Align::TOP_START;
padding = 10;
child = zng::markdown::Markdown! {
txt = selected.map(default_markdown);
txt_selectable = true;
};
};
}
}
fn default_item_view(item: UserLicense) -> 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
}
}