diff --git a/src/Previewer/DBusPreviewer.js b/src/Previewer/DBusPreviewer.js index d56e9f891..cf2e35d41 100644 --- a/src/Previewer/DBusPreviewer.js +++ b/src/Previewer/DBusPreviewer.js @@ -42,6 +42,11 @@ async function startProcess(type) { [executable_name, server.get_client_address()], Gio.SubprocessFlags.NONE, ); + + current_sub_process.wait_async(null).then(() => { + dbus_previewer.onStop?.(); + }); + current_type = type; const connection = await new Promise((resolve) => { @@ -83,12 +88,14 @@ async function startProcess(type) { null, ); - proxy.connectSignal("CssParserError", (_proxy, _name_owner, ...args) => { + proxy.connectSignal("CssParserError", (_self, _name_owner, ...args) => { dbus_previewer.onCssParserError?.(...args); }); - proxy.connectSignal("WindowOpen", (_proxy, _name_owner, ...args) => { - dbus_previewer.onWindowOpen?.(...args); + proxy.connectSignal("WindowOpen", (_self, _name_owner, [open]) => { + if (!open) { + dbus_previewer.stop().catch(console.error); + } }); return proxy; @@ -96,7 +103,7 @@ async function startProcess(type) { const dbus_previewer = { onCssParserError: null, // set in External.js - onWindowOpen: null, // set in External.js + onStop: null, async getProxy(type) { if (current_type !== type) { await this.stop(); diff --git a/src/Previewer/External.js b/src/Previewer/External.js index a85b9618b..6f124e16e 100644 --- a/src/Previewer/External.js +++ b/src/Previewer/External.js @@ -1,13 +1,11 @@ import Adw from "gi://Adw"; import dbus_previewer from "./DBusPreviewer.js"; -export default function External({ output, builder, onWindowChange }) { +export default function External({ output, builder, onStop }) { const stack = builder.get_object("stack_preview"); let dbus_proxy; - dbus_previewer.onWindowOpen = ([open]) => { - onWindowChange(open); - }; + dbus_previewer.onStop = onStop; dbus_previewer.onCssParserError = (error) => { builder @@ -46,15 +44,10 @@ export default function External({ output, builder, onWindowChange }) { console.debug(err); return; } - stack.set_visible_child_name("open_window"); } function stop() { - close() - .then(() => { - return dbus_previewer.stop(); - }) - .catch(console.error); + close().then(() => dbus_previewer.stop()); } async function updateXML({ xml, target_id, original_id }) { diff --git a/src/Previewer/Internal.js b/src/Previewer/Internal.js index faedf2e90..ca5faef04 100644 --- a/src/Previewer/Internal.js +++ b/src/Previewer/Internal.js @@ -19,6 +19,7 @@ export default function Internal({ dropdown_preview_align, panel_ui, session, + onStop, }) { const inline_css_scope_target = output.get_parent(); inline_css_scope_target.name = `workbench_output-${session.id}`; @@ -51,12 +52,8 @@ export default function Internal({ onWindowChange(true); } - async function close() { - object_root?.close(); - } - function stop() { - close(); + object_root?.close(); if (css_provider) { Gtk.StyleContext.remove_provider_for_display( output.get_display(), @@ -66,6 +63,7 @@ export default function Internal({ } object_root?.destroy(); object_root = null; + onStop(); } function preview(object) { @@ -230,7 +228,6 @@ export default function Internal({ return { async start(_language) {}, open, - close, stop, updateXML, updateCSS, diff --git a/src/Previewer/Previewer.js b/src/Previewer/Previewer.js index 992012e72..b909f5661 100644 --- a/src/Previewer/Previewer.js +++ b/src/Previewer/Previewer.js @@ -51,13 +51,10 @@ export default function Previewer({ makeDropdownFlat(dropdown_preview_align); const internal = Internal({ - onWindowChange(open) { - if (current !== internal) return; - if (open) { - stack.set_visible_child_name("close_window"); - } else { - stack.set_visible_child_name("open_window"); - } + onStop() { + console.log("stopping ouin ouin internal"); + stack_start_stop.visible_child = button_run; + update(true); }, output, builder, @@ -67,15 +64,16 @@ export default function Previewer({ panel_ui, session, }); + + const stack_start_stop = builder.get_object("stack_start_stop"); + const button_run = builder.get_object("button_run"); + // const button_stop = builder.get_object("button_stop"); + const external = External({ - onWindowChange(open) { - if (current !== external) return; - if (open) { - stack.set_visible_child_name("close_window"); - } else { - stack.set_visible_child_name("open_window"); - useInternal().catch(console.error); - } + onStop() { + console.log("stoping ouin ouin external"); + stack_start_stop.visible_child = button_run; + useInternal().catch(console.error); }, output, builder, @@ -87,12 +85,6 @@ export default function Previewer({ let handler_id_ui = null; let handler_id_css = null; - let handler_id_button_open; - let handler_id_button_close; - - const stack = builder.get_object("stack_preview"); - const button_open = builder.get_object("button_open_preview_window"); - const button_close = builder.get_object("button_close_preview_window"); settings.bind( "preview-align", @@ -109,8 +101,19 @@ export default function Previewer({ } setPreviewAlign(); + function clean() { + if (handler_id_ui) { + panel_ui.disconnect(handler_id_ui); + handler_id_ui = null; + } + if (handler_id_css) { + code_view_css.disconnect(handler_id_css); + handler_id_css = null; + } + } + function start() { - stop(); + clean(); if (handler_id_ui === null) { handler_id_ui = panel_ui.connect("updated", () => schedule_update()); } @@ -122,14 +125,9 @@ export default function Previewer({ } function stop() { - if (handler_id_ui) { - panel_ui.disconnect(handler_id_ui); - handler_id_ui = null; - } - if (handler_id_css) { - code_view_css.disconnect(handler_id_css); - handler_id_css = null; - } + console.log("previewer stop"); + clean(); + current?.stop?.(); } // Using this custom scope we make sure that previewing UI definitions @@ -243,7 +241,6 @@ export default function Previewer({ await setPreviewer(external, language); } current_external_language = language; - stack.set_visible_child_name("close_window"); await update(true); } @@ -255,13 +252,6 @@ export default function Previewer({ } async function setPreviewer(previewer, language) { - if (handler_id_button_open) { - button_open.disconnect(handler_id_button_open); - } - if (handler_id_button_close) { - button_close.disconnect(handler_id_button_close); - } - try { await current?.closeInspector(); } catch { @@ -275,25 +265,6 @@ export default function Previewer({ } current = previewer; - - handler_id_button_open = button_open.connect("clicked", async () => { - try { - await current.open(); - stack.set_visible_child_name("close_window"); - } catch (err) { - console.error(err); - } - }); - - handler_id_button_close = button_close.connect("clicked", async () => { - try { - await current.close(); - stack.set_visible_child_name("open_window"); - } catch (err) { - console.error(err); - } - }); - try { await current.start(language); } catch (err) { @@ -315,9 +286,6 @@ export default function Previewer({ open() { return current.open(); }, - close() { - return current.close(); - }, openInspector() { return current.openInspector(); }, diff --git a/src/langs/rust/Compiler.js b/src/langs/rust/Compiler.js index 4f479b414..103c5ce8b 100644 --- a/src/langs/rust/Compiler.js +++ b/src/langs/rust/Compiler.js @@ -43,8 +43,10 @@ export default function Compiler({ session }) { async function run() { try { const proxy = await dbus_previewer.getProxy("vala"); // rust uses the Vala previewer. - const sharedLibrary = `${targetPath}/debug/libdemo.so`; - await proxy.RunAsync(sharedLibrary, session.file.get_uri()); + await proxy.RunAsync( + `${targetPath}/debug/libdemo.so`, + session.file.get_uri(), + ); } catch (err) { console.error(err); return false; diff --git a/src/window.blp b/src/window.blp index 79cacde91..2bbdac4ee 100644 --- a/src/window.blp +++ b/src/window.blp @@ -121,19 +121,33 @@ Adw.ApplicationWindow window { } [end] - Button button_run { - child: Adw.ButtonContent { - icon-name: "media-playback-start-symbolic"; - label: _("_Run"); - use-underline: true; - }; + Stack stack_start_stop { + Button button_run { + child: Adw.ButtonContent { + icon-name: "media-playback-start-symbolic"; + label: _("_Run"); + use-underline: true; + }; - action-name: "win.run"; - tooltip-text: _("Run (Ctrl+⏎)"); + action-name: "win.run"; + tooltip-text: _("Run (Ctrl+⏎)"); - styles [ - "suggested-action" - ] + styles [ + "suggested-action" + ] + } + + Button button_stop { + child: Adw.ButtonContent { + icon-name: "media-playback-stop-symbolic"; + label: _("_Stop"); + use-underline: true; + }; + + styles [ + "suggested-action" + ] + } } } @@ -417,19 +431,16 @@ Adw.ApplicationWindow window { title: _("Windowed Preview"); description: _("This interface can only be previewed as a separate window.\nWe recommend using “Always on Top”."); icon-name: "multitasking-windows-symbolic"; - - Box { - halign: center; - - Button button_open_preview_window { - label: _("Show Preview Window"); - - styles [ - "pill", - "suggested-action" - ] - } - } + // Box { + // halign: center; + // Button button_open_preview_window { + // label: _("Show Preview Window"); + // styles [ + // "pill", + // "suggested-action" + // ] + // } + // } }; } @@ -440,18 +451,15 @@ Adw.ApplicationWindow window { title: _("Windowed Preview"); description: _("This interface can only be previewed as a separate window.\nWe recommend using “Always on Top”."); icon-name: "multitasking-windows-symbolic"; - - Box { - halign: center; - - Button button_close_preview_window { - label: _("Close Preview Window"); - - styles [ - "pill" - ] - } - } + // Box { + // halign: center; + // Button button_close_preview_window { + // label: _("Close Preview Window"); + // styles [ + // "pill" + // ] + // } + // } }; } } diff --git a/src/window.js b/src/window.js index 40104211c..c813fe755 100644 --- a/src/window.js +++ b/src/window.js @@ -158,7 +158,9 @@ export default function Window({ application, session }) { previewer.setPanelCode(panel_code); - const button_run = builder.get_object("button_run"); + const stack_start_stop = builder.get_object("stack_start_stop"); + // const button_run = builder.get_object("button_run"); + const button_stop = builder.get_object("button_stop"); const button_preview = builder.get_object("button_preview"); const button_inspector = builder.get_object("button_inspector"); @@ -230,8 +232,6 @@ export default function Window({ application, session }) { let builder_python = null; async function runCode({ format }) { - button_run.set_sensitive(false); - term_console.clear(); previewer.stop(); panel_ui.stop(); @@ -243,7 +243,7 @@ export default function Window({ application, session }) { await formatCode(); } - await compile(); + await start(); } catch (err) { // prettier xml errors are not instances of Error if (err instanceof Error || err instanceof GLib.Error) { @@ -256,11 +256,10 @@ export default function Window({ application, session }) { previewer.start(); panel_ui.start(); - button_run.set_sensitive(true); term_console.scrollToEnd(); } - async function compile() { + async function start() { const { language } = panel_code; const lang = langs[language.toLowerCase()]; @@ -270,6 +269,8 @@ export default function Window({ application, session }) { return; } + stack_start_stop.visible_child = button_stop; + if (language === "JavaScript") { await previewer.update(true); @@ -307,10 +308,14 @@ export default function Window({ application, session }) { compiler_vala = compiler_vala || ValaCompiler({ session }); const success = await compiler_vala.compile(); if (success) { + console.log("use external"); await previewer.useExternal("vala"); + console.log("run"); if (await compiler_vala.run()) { + console.log("open"); await previewer.open(); } else { + console.log("use internal"); await previewer.useInternal(); } } @@ -350,6 +355,10 @@ export default function Window({ application, session }) { window.add_action(action_run); application.set_accels_for_action("win.run", ["Return"]); + button_stop.connect("clicked", () => { + previewer.stop(); + }); + const action_format = new Gio.SimpleAction({ name: "format", });