pub struct LuaExtension { /* private fields */ }Expand description
A Lua script loaded as a kui Extension.
Load it with LuaExtension::from_file or LuaExtension::from_source,
then hand it to a host: kui_native::app(..).extension_as(ns, ext) for a
window, or a kui_core::Extensions list for a headless
kui_core::Core. The host places the script by declaring a slot named
ns/<slot>; the script’s view(env, slot) runs inside the host’s frame
and its on_event(ev) hears the events its own nodes emit.
use kui_core::{Core, Extensions, NodeSpec, OriginId, Size, Value};
use kui_lua::LuaExtension;
let script = LuaExtension::from_source("panel.lua", r#"
slots = { "panel" }
function view(env, slot)
return column { pad = 8, text(slot.params.title) }
end
function on_event(ev)
if ev.kind == "pick" then return { kind = "picked" } end
end
"#)?;
let mut exts = Extensions::new();
exts.push_as("fs", Box::new(script))?;
let mut core = Core::new();
let mut ui = core.frame_with(Size::new(400.0, 300.0), 1.0, &mut exts);
ui.configure_root(NodeSpec::row().fill());
ui.slot_with("fs/panel", &Value::map([("title", "files".into())]));
ui.finish();
// The script's nodes carry its origin, so the host can tell them apart.
let drawn = core.access_tree().nodes.iter().filter(|n| n.origin == OriginId(1)).count();
assert!(drawn > 0);Implementations§
Source§impl LuaExtension
impl LuaExtension
Sourcepub fn from_source(name: impl Into<String>, source: &str) -> Result<Self>
pub fn from_source(name: impl Into<String>, source: &str) -> Result<Self>
Loads a script from its source text; name is what errors call it.
The prelude is injected first, then the script runs once, and its
slots and tokens globals are read. A script with no slots
global fills "root".
use kui_core::{Core, Extension, Size, Slot};
use kui_lua::LuaExtension;
let mut ext = LuaExtension::from_source("hello.lua", r#"
function view(env)
return column { pad = 8, text("hello from Lua") }
end
"#)?;
assert!(ext.slots().is_empty());
let mut core = Core::new();
let mut ui = core.frame(Size::new(320.0, 240.0), 1.0);
ext.view(&Slot::root(), &mut ui)?;
ui.finish();Trait Implementations§
Source§impl Extension for LuaExtension
impl Extension for LuaExtension
fn name(&self) -> &str
Source§fn slots(&self) -> &[String]
fn slots(&self) -> &[String]
The slot names this extension fills; empty means
"root". The one
entry crate::slot::ANY_SLOT ("*") means every name declared
under its namespace, for an extension whose slots are not known
when it loads — a Lua host whose init.lua registers views at
runtime, one slot per view — and it then gets no unknown-slot
warning, since there is no list to check against.fn view(&mut self, slot: &Slot<'_>, ui: &mut Ui<'_>) -> Result<(), String>
Auto Trait Implementations§
impl !Freeze for LuaExtension
impl !RefUnwindSafe for LuaExtension
impl !Send for LuaExtension
impl !Sync for LuaExtension
impl !UnwindSafe for LuaExtension
impl Unpin for LuaExtension
impl UnsafeUnpin for LuaExtension
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more