diff --git a/src/Document.js b/src/Document.js index c6f209e6e..6237bcccc 100644 --- a/src/Document.js +++ b/src/Document.js @@ -68,21 +68,13 @@ async function loadSourceBuffer({ source_file, buffer, lang }) { buffer, file: source_file, }); - let success; try { - success = await file_loader.load_async(GLib.PRIORITY_DEFAULT, null, null); + await file_loader.load_async(GLib.PRIORITY_DEFAULT, null, null); } catch (err) { - if (err.code === Gio.IOErrorEnum.NOT_FOUND) { - if (lang.placeholder) { - buffer.set_text(lang.placeholder, -1); - } - success = true; - } else { + if (err.code !== Gio.IOErrorEnum.NOT_FOUND) { throw err; } } - if (success) { - buffer.set_modified(false); - } + buffer.set_modified(false); } diff --git a/src/Library/EntryRow.js b/src/Library/EntryRow.js index e16ce2450..1faf427bc 100644 --- a/src/Library/EntryRow.js +++ b/src/Library/EntryRow.js @@ -31,11 +31,7 @@ class EntryRow extends Adw.PreferencesRow { } #createLanguageTags(demo) { - const language = getLanguage("javascript"); - const language_tag = this.#createLanguageTag(language); - this._languages_box.append(language_tag); - - ["vala", "rust"].forEach((id) => { + ["javascript", "vala", "rust"].forEach((id) => { const language = getLanguage(id); if (!demo.languages.includes(language.id)) return; const language_tag = this.#createLanguageTag(language); diff --git a/src/Library/Library.js b/src/Library/Library.js index 9f67c8aa0..93d232322 100644 --- a/src/Library/Library.js +++ b/src/Library/Library.js @@ -6,6 +6,7 @@ import { demos_dir, getLanguage, settings as global_settings, + languages, } from "../util.js"; import Window from "../window.js"; @@ -71,7 +72,6 @@ export function getDemo(name) { return demos.find((demo) => demo.name === name); } -const lang_javascript = getLanguage("javascript"); async function openDemo({ application, demo_name, language }) { const demo = getDemo(demo_name); const session = createSessionFromDemo(demo); @@ -86,9 +86,18 @@ async function openDemo({ application, demo_name, language }) { session.settings.set_boolean("show-code", true); } - const is_js = - session.settings.get_int("code-language") === lang_javascript.index; + const code_languge = session.settings.get_int("code-language"); + const lang = languages.find((lang) => lang.index === code_languge); + // Override the user preferred language if the demo doesn't support it + if (demo.languages.length > 0 && !demo.languages.includes(lang.id)) { + session.settings.set_int( + "code-language", + getLanguage(demo.languages[0]).index, + ); + } + + const run = demo.autorun && lang.id === "javascript"; const { load } = Window({ application, session }); - await load({ run: demo.autorun && is_js }); + await load({ run }); } diff --git a/src/Library/demos/Advanced Buttons/code.rs b/src/Library/demos/Advanced Buttons/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Advanced Buttons/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Advanced Buttons/main.vala b/src/Library/demos/Advanced Buttons/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Advanced Buttons/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Boxed Lists/code.rs b/src/Library/demos/Boxed Lists/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Boxed Lists/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Boxed Lists/main.vala b/src/Library/demos/Boxed Lists/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Boxed Lists/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Center Box/code.rs b/src/Library/demos/Center Box/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Center Box/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Center Box/main.vala b/src/Library/demos/Center Box/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Center Box/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Editable Label/code.rs b/src/Library/demos/Editable Label/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Editable Label/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Header Bar/code.rs b/src/Library/demos/Header Bar/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Header Bar/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Header Bar/main.vala b/src/Library/demos/Header Bar/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Header Bar/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Navigation Split View/code.rs b/src/Library/demos/Navigation Split View/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Navigation Split View/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Navigation Split View/main.vala b/src/Library/demos/Navigation Split View/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Navigation Split View/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Pango Markup/code.rs b/src/Library/demos/Pango Markup/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Pango Markup/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Pango Markup/main.vala b/src/Library/demos/Pango Markup/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Pango Markup/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Platform Tools/code.rs b/src/Library/demos/Platform Tools/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Platform Tools/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Platform Tools/main.vala b/src/Library/demos/Platform Tools/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Platform Tools/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/Library/demos/Window/code.rs b/src/Library/demos/Window/code.rs deleted file mode 100644 index da0f5d925..000000000 --- a/src/Library/demos/Window/code.rs +++ /dev/null @@ -1 +0,0 @@ -pub fn main() {} diff --git a/src/Library/demos/Window/main.vala b/src/Library/demos/Window/main.vala deleted file mode 100644 index 91c413e8f..000000000 --- a/src/Library/demos/Window/main.vala +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 - -public void main () {} diff --git a/src/util.js b/src/util.js index d2b909ef2..b5f815803 100644 --- a/src/util.js +++ b/src/util.js @@ -83,7 +83,6 @@ export const languages = [ extensions: [".vala"], types: ["text/x-vala"], document: null, - placeholder: "// Sorry, this demo is not available in Vala yet.", default_file: "main.vala", index: 1, }, @@ -94,7 +93,6 @@ export const languages = [ extensions: [".rs"], types: ["text/x-rust"], document: null, - placeholder: "// Sorry, this demo is not available in Rust yet.", default_file: "code.rs", index: 2, }, diff --git a/src/window.js b/src/window.js index f4b477256..7209aa29f 100644 --- a/src/window.js +++ b/src/window.js @@ -276,7 +276,6 @@ export default function Window({ application, session }) { previewer.stop(); panel_ui.stop(); - const { language } = panel_code; try { await panel_ui.update(); @@ -284,66 +283,7 @@ export default function Window({ application, session }) { await formatCode(); } - if (language === "JavaScript") { - await previewer.update(true); - - // We have to create a new file each time - // because gjs doesn't appear to use etag for module caching - // ?foo=Date.now() also does not work as expected - // TODO: File a bug - const [file_javascript] = Gio.File.new_tmp("workbench-XXXXXX.js"); - await file_javascript.replace_contents_async( - new GLib.Bytes(document_javascript.code_view.buffer.text || " "), - null, - false, - Gio.FileCreateFlags.NONE, - null, - ); - let exports; - try { - exports = await import(`file://${file_javascript.get_path()}`); - } catch (err) { - await previewer.update(true); - throw err; - } finally { - file_javascript - .delete_async(GLib.PRIORITY_DEFAULT, null) - .catch(console.error); - } - previewer.setSymbols(exports); - } else if (language === "Vala") { - if (!isValaEnabled()) { - action_extensions.activate(null); - return; - } - - compiler_vala = compiler_vala || ValaCompiler({ session }); - const success = await compiler_vala.compile(); - if (success) { - await previewer.useExternal(); - if (await compiler_vala.run()) { - await previewer.open(); - } else { - await previewer.useInternal(); - } - } - } else if (language === "Rust") { - if (!isRustEnabled()) { - action_extensions.activate(null); - return; - } - - compiler_rust = compiler_rust || RustCompiler({ session }); - const success = await compiler_rust.compile(); - if (success) { - await previewer.useExternal(); - if (await compiler_rust.run()) { - await previewer.open(); - } else { - await previewer.useInternal(); - } - } - } + await compile(); } catch (err) { // prettier xml errors are not instances of Error if (err instanceof Error || err instanceof GLib.Error) { @@ -360,6 +300,78 @@ export default function Window({ application, session }) { term_console.scrollToEnd(); } + async function compile() { + const { language } = panel_code; + + const lang = langs[language.toLowerCase()]; + // Do nothing if there is no code to avoid compile errors + const text = lang.document.code_view.buffer.text.trim(); + if (text === "") { + return; + } + + if (language === "JavaScript") { + await previewer.update(true); + + // We have to create a new file each time + // because gjs doesn't appear to use etag for module caching + // ?foo=Date.now() also does not work as expected + // TODO: File a bug + const [file_javascript] = Gio.File.new_tmp("workbench-XXXXXX.js"); + await file_javascript.replace_contents_async( + new GLib.Bytes(text), + null, + false, + Gio.FileCreateFlags.NONE, + null, + ); + let exports; + try { + exports = await import(`file://${file_javascript.get_path()}`); + } catch (err) { + await previewer.update(true); + throw err; + } finally { + file_javascript + .delete_async(GLib.PRIORITY_DEFAULT, null) + .catch(console.error); + } + previewer.setSymbols(exports); + } else if (language === "Vala") { + if (!isValaEnabled()) { + action_extensions.activate(null); + return; + } + + compiler_vala = compiler_vala || ValaCompiler({ session }); + const success = await compiler_vala.compile(); + if (success) { + await previewer.useExternal(); + if (await compiler_vala.run()) { + await previewer.open(); + } else { + await previewer.useInternal(); + } + } + } else if (language === "Rust") { + if (!isRustEnabled()) { + action_extensions.activate(null); + return; + } + + compiler_rust = compiler_rust || RustCompiler({ session }); + const success = await compiler_rust.compile(); + if (success) { + await previewer.useExternal(); + if (await compiler_rust.run()) { + await previewer.open(); + } else { + await previewer.useInternal(); + } + } + } + } + const action_run = new Gio.SimpleAction({ name: "run", });