52 lines
2.8 KiB
JavaScript
52 lines
2.8 KiB
JavaScript
// Unreal Engine Tools — official plugin.
|
|
// The core app keeps the build engine (UnrealBuildTool / MSBuild), the build
|
|
// overlay and the log reader; this plugin is just the Unreal-facing surface.
|
|
// It renders natively: the actions sit in the working-folder right-click menu
|
|
// with the host's Unreal + hammer icons, and the log is a bottom-dock tab —
|
|
// exactly where these lived before, just delivered as a plugin. Reached through
|
|
// the permission-gated `host.ue` bridge.
|
|
|
|
export function activate(host) {
|
|
const ue = host.ue;
|
|
if (!ue) { host.log("no ue bridge — plugin.json needs the \"ue\" permission"); return; }
|
|
|
|
// Right-click the working folder → Launch / Build, shown only on a UE project.
|
|
// Prefer the native folder-context slot (host ≥ 0.3.7); fall back to the top
|
|
// menu on older hosts so the actions are always reachable.
|
|
const addAction = (label, run, icon) => {
|
|
if (host.ui.addFolderContextItem) host.ui.addFolderContextItem(label, run, { icon, visible: () => ue.hasProject() });
|
|
else host.ui.addMenuItem(label, () => { if (!ue.hasProject()) { host.flash("No Unreal project in the current working folder.", true); return; } run(); }, { icon });
|
|
};
|
|
addAction("Launch Unreal Engine", () => ue.launch(), "ue");
|
|
addAction("Build Solution (.sln)", () => ue.build(), "hammer");
|
|
|
|
// Bottom-dock "Unreal" tab — tails the editor log (Saved/Logs), refreshing live.
|
|
// Native dock panel on host ≥ 0.3.7; a modal view as a fallback on older hosts.
|
|
const mountLog = (el) => {
|
|
el.style.cssText = "display:flex;flex-direction:column;height:100%";
|
|
const pre = document.createElement("pre");
|
|
pre.style.cssText =
|
|
"flex:1;margin:0;padding:10px 14px;overflow:auto;white-space:pre-wrap;word-break:break-word;" +
|
|
"font:11.5px/1.6 var(--mono,ui-monospace,monospace);color:var(--muted,#9a9aa8)";
|
|
el.appendChild(pre);
|
|
let alive = true;
|
|
async function tick() {
|
|
if (!alive) return;
|
|
try {
|
|
if (!ue.hasProject()) { pre.textContent = "No Unreal project in the current working folder."; return; }
|
|
const atBottom = pre.scrollTop + pre.clientHeight >= pre.scrollHeight - 30;
|
|
const txt = await ue.readLog(200000);
|
|
pre.textContent = txt || "No Unreal log yet. It shows here when the editor writes to Saved/Logs — i.e. while Unreal is running.";
|
|
if (atBottom) pre.scrollTop = pre.scrollHeight;
|
|
} catch (e) { pre.textContent = String(e); }
|
|
}
|
|
tick();
|
|
const id = setInterval(tick, 1500);
|
|
return () => { alive = false; clearInterval(id); };
|
|
};
|
|
if (host.ui.addDockPanel) host.ui.addDockPanel({ id: "unreal", title: "Unreal", icon: "ue", render: mountLog });
|
|
else host.ui.addView({ id: "unreal-log", title: "Unreal Log", render: mountLog });
|
|
|
|
host.log("Unreal Engine Tools activated");
|
|
}
|