// 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"); }