use std::rc::Rc;
use ul_next::{
app::App,
javascript::{JSObject, JSPropertyAttributes, JSValue},
platform,
window::WindowFlags,
Library,
};
fn main() {
let lib = Library::linked();
platform::enable_platform_filesystem(lib.clone(), "./examples").unwrap();
let app = App::new(lib.clone(), None, None).unwrap();
let window = app
.create_window(
900,
600,
false,
WindowFlags {
borderless: false,
titled: true,
resizable: true,
maximizable: true,
hidden: false,
},
)
.unwrap();
window.set_title("Javascript example");
let overlay = window
.create_overlay(window.width(), window.height(), 0, 0)
.unwrap();
overlay.view().set_dom_ready_callback(move |view, _, _, _| {
let ctx = view.lock_js_context();
let global = ctx.global_object();
let func = JSObject::new_function_with_callback(&ctx, |ctx, _this, _args| {
println!(
"Javascript returned {:?}",
ctx.evaluate_script("JavascriptCallback();")
.unwrap()
.as_string()
.unwrap()
);
println!(
"Javascript returned {:?}",
ctx.global_object()
.get_property("JavascriptCallback")
.unwrap()
.as_object()
.unwrap()
.call_as_function(None, &[])
.unwrap()
.as_string()
.unwrap()
);
Ok(JSValue::new_string(ctx, "And Hello from Rust!<br>"))
});
global
.set_property("GetRustMessage", &func, JSPropertyAttributes::default())
.unwrap();
});
overlay.view().load_html(HTML_STRING).unwrap();
let app = Rc::new(app);
let app_clone = app.clone();
window.set_close_callback(move |_window| {
app_clone.quit();
});
app.run();
}
const HTML_STRING: &str = r#"
<html>
<head>
<style type="text/css">
* { -webkit-user-select: none; }
body {
font-family: -apple-system, 'Segoe UI', Ubuntu, Arial, sans-serif;
text-align: center;
background: linear-gradient(#FFF, #DDD);
padding: 2em;
}
body.rainbow {
background: linear-gradient(90deg, #ff2363, #fff175, #68ff9d,
#45dce0, #6c6eff, #9e23ff, #ff3091);
background-size: 1000% 1000%;
animation: ScrollGradient 10s ease infinite;
}
@keyframes ScrollGradient {
0% { background-position:0% 50%; }
50% { background-position:100% 50%; }
100% { background-position:0% 50%; }
}
#message {
padding-top: 2em;
color: white;
font-weight: bold;
font-size: 24px;
text-shadow: 1px 1px rgba(0, 0, 0, 0.4);
}
</style>
<script type="text/javascript">
function HandleButton(evt) {
// Call our Rust callback 'GetRustMessage'
var message = GetRustMessage();
// Display the result in our 'message' div element and apply the
// rainbow effect to our document's body.
document.getElementById('message').innerHTML += message;
document.body.classList.add('rainbow');
}
function JavascriptCallback() {
// This function is called from Rust
document.getElementById('message').innerHTML += "Hello from Javascript callback!<br>";
return "Hello from Javascript!";
}
</script>
</head>
<body>
<button onclick="HandleButton(event);">Get the Secret Message!</button>
<div id="message"></div>
</body>
</html>"#;