From 796fee6ac11d5aed959eac46007c005b3a374aae Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 19:00:09 +0200 Subject: [PATCH 01/16] init --- qr-code/README.md | 0 qr-code/panel.luau | 167 +++++++++++++++++++++++++++++++++++ qr-code/plugin.toml | 37 ++++++++ qr-code/translations/en.json | 27 ++++++ qr-code/widget.luau | 7 ++ 5 files changed, 238 insertions(+) create mode 100644 qr-code/README.md create mode 100644 qr-code/panel.luau create mode 100644 qr-code/plugin.toml create mode 100644 qr-code/translations/en.json create mode 100644 qr-code/widget.luau diff --git a/qr-code/README.md b/qr-code/README.md new file mode 100644 index 00000000..e69de29b diff --git a/qr-code/panel.luau b/qr-code/panel.luau new file mode 100644 index 00000000..1bb86ea9 --- /dev/null +++ b/qr-code/panel.luau @@ -0,0 +1,167 @@ +local currentText = "" +local genCount = 0 +local errorMessage = nil +local imagePath = nil +local status = "idle" + +local function statusText() + if status == "generating" then + return noctalia.tr("panel.status.generating") + elseif status == "error" then + return noctalia.tr("panel.status.error", { message = errorMessage }) + elseif status == "ready" then + return noctalia.tr("panel.status.ready") + elseif status == "copied" then + return noctalia.tr("panel.status.copied") + else + return noctalia.tr("panel.status.idle") + end +end + +local function render() + local content = { + ui.row({ gap = 8 }, { + ui.input({ + flexGrow = 1, + focus = true, + placeholder = noctalia.tr("panel.placeholder"), + onChange = "onTextChange", + onSubmit = "onTextSubmit", + }), + ui.button({ + text = "Generate", + variant = "primary", + onClick = "onGenerateClick", + }), + }), + ui.label({ + flexGrow = 1, + textAlign = "center", + text = statusText(), + color = status == "error" and "error" or "on_surface", + }) + } + + if (status == "ready" + or status == "copied" + or (status == "error" and errorMessage == noctalia.tr("panel.error.copy_failed"))) + and imagePath ~= nil then + table.insert( + content, + ui.image({ + path = imagePath, + height = 400, + radius = 25, + onClick = "onImageClick", + }) + ) + end + + panel.render(ui.column({ flexGrow = 1 }, content)) +end + +local function generate(text) + if status == "generating" then + return + end + + text = noctalia.string.trim(text or "") + + if text == "" then + if imagePath ~= nil then + noctalia.removeFile(imagePath) + end + status = "idle" + errorMessage = nil + imagePath = nil + render() + return + end + + if not noctalia.commandExists("qrencode") then + status = "error" + errorMessage = noctalia.tr("panel.error.missing_qrencode") + render() + return + end + + status = "generating" + render() + + local dir = noctalia.pluginDir() + local outputPath = string.format("%s/qr-%s.png", dir, genCount) + local previousPath = imagePath + genCount += 1 + + local size = noctalia.getConfig("size") or 8 + local correctionLevel = noctalia.getConfig("correction-level") or "M" + + local cmd = string.format( + 'qrencode %s -o %s -s %s -l %s', + text, + outputPath, + size, + correctionLevel + ) + + noctalia.runAsync( + cmd, + function(result) + if result.exitCode == 0 and noctalia.fileExists(outputPath) then + imagePath = outputPath + status = "ready" + if previousPath ~= nil then + noctalia.removeFile(previousPath) + end + else + status = "error" + errorMessage = noctalia.tr("panel.error.generate_failed") + end + render() + end + ) +end + +function onOpen(_context) + status = "idle" + render() +end + +function onTextChange(value) + currentText = value +end + +function onTextSubmit(value) + currentText = value + generate(currentText) +end + +function onGenerateClick() + generate(currentText) +end + +function onImageClick() + local bytes, err = noctalia.readFile(imagePath) + errorMessage = noctalia.tr("panel.error.copy_failed") + + if bytes == nil then + status = "error" + else + local ok = noctalia.copyToClipboard(bytes, "image/png") + + status = ok and "copied" or "error" + end + + if noctalia.getConfig("close_on_copy") then + panel.close() + return + end + + render() +end + +function onClose() + if imagePath ~= nil then + noctalia.removeFile(imagePath) + end +end diff --git a/qr-code/plugin.toml b/qr-code/plugin.toml new file mode 100644 index 00000000..dc34537b --- /dev/null +++ b/qr-code/plugin.toml @@ -0,0 +1,37 @@ +id = "yocraft/qr-code" +name = "QR Code encoder" +version = "1.0.0" +plugin_api = 21 +author = "yocraft" +license = "MIT" +deprecated = false +icon = "qrcode" +description = "Transform any text or url in a qr code" +tags = [] +dependencies = [] + +[[widget]] +id = "widget" +entry = "widget.luau" + +[[panel]] +id = "panel" +entry = "panel.luau" +width = 600 +height = 600 +placement = "floating" +position = "center" + +[[setting]] +key = "generate_button" +type = "bool" +label_key = "settings.generate_button.label" +description_key = "settings.generate_button.description" +default = true + +[[setting]] +key = "close_on_copy" +type = "bool" +label_key = "settings.close_on_copy.label" +description_key = "settings.close_on_copy.description" +default = false diff --git a/qr-code/translations/en.json b/qr-code/translations/en.json new file mode 100644 index 00000000..4af1c83b --- /dev/null +++ b/qr-code/translations/en.json @@ -0,0 +1,27 @@ +{ + "settings": { + "generate_button": { + "label": "Show generate button", + "description": "Disable will submit on enter." + }, + "close_on_copy": { + "label": "Close on Copy", + "description": "Close the panel when copying the QR code." + } + }, + "panel": { + "placeholder": "Enter text or url...", + "status": { + "generating": "Generating...", + "error": "Error: {message}", + "ready": "QR code ready. Scan it here or click it to copy.", + "copied": "QR code copied to clipboard.", + "idle": "Enter some text, then press Generate." + }, + "error": { + "generate_failed": "failed to generate the QR code.", + "missing_qrencode": "qrencode not installed.", + "copy_failed": "failed to copy the QR code." + } + } +} diff --git a/qr-code/widget.luau b/qr-code/widget.luau new file mode 100644 index 00000000..318804f4 --- /dev/null +++ b/qr-code/widget.luau @@ -0,0 +1,7 @@ +function update() + barWidget.setGlyph("qrcode") +end + +function onClick() + noctalia.togglePanel("yocraft/qr-code:panel") +end From fc32c9014ab16679d5a3234a882f456395a00749 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 20:03:00 +0200 Subject: [PATCH 02/16] feat: notify options; all, minimal and none --- qr-code/panel.luau | 25 +++++++++++++++++++++++++ qr-code/plugin.toml | 12 ++++++++++++ qr-code/translations/en.json | 7 +++++++ 3 files changed, 44 insertions(+) diff --git a/qr-code/panel.luau b/qr-code/panel.luau index 1bb86ea9..da3cf259 100644 --- a/qr-code/panel.luau +++ b/qr-code/panel.luau @@ -4,6 +4,13 @@ local errorMessage = nil local imagePath = nil local status = "idle" +local notifyConf = noctalia.getConfig("notify") + +local function notify(text, error) + local cmd = error and noctalia.notifyError or noctalia.notify + cmd("QR Code encoder", text) +end + local function statusText() if status == "generating" then return noctalia.tr("panel.status.generating") @@ -81,6 +88,11 @@ local function generate(text) if not noctalia.commandExists("qrencode") then status = "error" errorMessage = noctalia.tr("panel.error.missing_qrencode") + + if notifyConf == "all" then + notify(statusText(), status == "error") + end + render() return end @@ -117,6 +129,11 @@ local function generate(text) status = "error" errorMessage = noctalia.tr("panel.error.generate_failed") end + + if notifyConf == "all" then + notify(statusText(), status == "error") + end + render() end ) @@ -152,7 +169,15 @@ function onImageClick() status = ok and "copied" or "error" end + if notifyConf == "all" then + notify(statusText(), status == "error") + end + if noctalia.getConfig("close_on_copy") then + if notifyConf == "minimal" then + notify(statusText(), status == "error") + end + panel.close() return end diff --git a/qr-code/plugin.toml b/qr-code/plugin.toml index dc34537b..aa70e73e 100644 --- a/qr-code/plugin.toml +++ b/qr-code/plugin.toml @@ -35,3 +35,15 @@ type = "bool" label_key = "settings.close_on_copy.label" description_key = "settings.close_on_copy.description" default = false + +[[setting]] +key = "notify" +type = "select" +label_key = "settings.notify.label" +description_key = "settings.notify.description" +default = "minimal" +options = [ + { value = "all", label_key = "settings.notify.all" }, + { value = "minimal", label_key = "settings.notify.minimal" }, + { value = "none", label_key = "settings.notify.none" }, +] diff --git a/qr-code/translations/en.json b/qr-code/translations/en.json index 4af1c83b..33e8d69b 100644 --- a/qr-code/translations/en.json +++ b/qr-code/translations/en.json @@ -7,6 +7,13 @@ "close_on_copy": { "label": "Close on Copy", "description": "Close the panel when copying the QR code." + }, + "notify": { + "label": "Notify", + "description": "Controls the notifications, minimal only notifies when Close on Copy is used.", + "all": "All", + "minimal": "Minimal", + "none": "None" } }, "panel": { From ad3f6b2843779ae3a3d5e9c78e67c63c62fd363d Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 20:08:52 +0200 Subject: [PATCH 03/16] update: plugin.toml --- {qr-code => qrcode}/README.md | 0 {qr-code => qrcode}/panel.luau | 0 {qr-code => qrcode}/plugin.toml | 6 +++--- {qr-code => qrcode}/translations/en.json | 0 {qr-code => qrcode}/widget.luau | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename {qr-code => qrcode}/README.md (100%) rename {qr-code => qrcode}/panel.luau (100%) rename {qr-code => qrcode}/plugin.toml (88%) rename {qr-code => qrcode}/translations/en.json (100%) rename {qr-code => qrcode}/widget.luau (60%) diff --git a/qr-code/README.md b/qrcode/README.md similarity index 100% rename from qr-code/README.md rename to qrcode/README.md diff --git a/qr-code/panel.luau b/qrcode/panel.luau similarity index 100% rename from qr-code/panel.luau rename to qrcode/panel.luau diff --git a/qr-code/plugin.toml b/qrcode/plugin.toml similarity index 88% rename from qr-code/plugin.toml rename to qrcode/plugin.toml index aa70e73e..9933cc2f 100644 --- a/qr-code/plugin.toml +++ b/qrcode/plugin.toml @@ -1,4 +1,4 @@ -id = "yocraft/qr-code" +id = "yocraft/qrcode" name = "QR Code encoder" version = "1.0.0" plugin_api = 21 @@ -7,8 +7,8 @@ license = "MIT" deprecated = false icon = "qrcode" description = "Transform any text or url in a qr code" -tags = [] -dependencies = [] +tags = [ "panel", "fun", "network", "privacy", "productivity", "utility" ] +dependencies = [ "qrencode" ] [[widget]] id = "widget" diff --git a/qr-code/translations/en.json b/qrcode/translations/en.json similarity index 100% rename from qr-code/translations/en.json rename to qrcode/translations/en.json diff --git a/qr-code/widget.luau b/qrcode/widget.luau similarity index 60% rename from qr-code/widget.luau rename to qrcode/widget.luau index 318804f4..e7f53694 100644 --- a/qr-code/widget.luau +++ b/qrcode/widget.luau @@ -3,5 +3,5 @@ function update() end function onClick() - noctalia.togglePanel("yocraft/qr-code:panel") + noctalia.togglePanel("yocraft/qrcode:panel") end From 87334f1b1febc970ab21d106561b86eb3c3b7875 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 22:39:40 +0200 Subject: [PATCH 04/16] update: add README --- qrcode/README.md | 36 ++++++++++++++++++++++++++++++++++++ qrcode/plugin.toml | 2 +- qrcode/translations/en.json | 2 +- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/qrcode/README.md b/qrcode/README.md index e69de29b..fe748709 100644 --- a/qrcode/README.md +++ b/qrcode/README.md @@ -0,0 +1,36 @@ +# QR Code encoder + +Transform any text or URL into a QR code completely offline. Then scan or copy the code. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `yocraft/qrcode` | +| Entries | Bar widget: `widget`; panel: `panel` | + +## Requirements + +Install `qrencode` on `PATH`. + +## Usage + +Open the panel from the bar widget or with this command: +```sh +noctalia msg panel-toggle yocraft/qrcode:panel +``` + +Enter your text or URL and click on Generate or press enter to generate the QR code, then scan it from the panel or copy it by clicking on it. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `generate_button` | `bool` | `true` | Show Generate button, disable will submit on enter. | +| `close_on_copy` | `bool` | `false` | Close the panel when copying the QR code. | +| `notify` | `select` | `minimal` | Controls the notifications, minimal only notifies when Close on Copy is used. | + + +## Notes + +The plugin runs entirely locally and does not require network access. diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index 9933cc2f..a15c5adb 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -6,7 +6,7 @@ author = "yocraft" license = "MIT" deprecated = false icon = "qrcode" -description = "Transform any text or url in a qr code" +description = "Transform any text or URL in a QR code" tags = [ "panel", "fun", "network", "privacy", "productivity", "utility" ] dependencies = [ "qrencode" ] diff --git a/qrcode/translations/en.json b/qrcode/translations/en.json index 33e8d69b..24b47ee4 100644 --- a/qrcode/translations/en.json +++ b/qrcode/translations/en.json @@ -1,7 +1,7 @@ { "settings": { "generate_button": { - "label": "Show generate button", + "label": "Show Generate Button", "description": "Disable will submit on enter." }, "close_on_copy": { From d014eb3595ce47468e0098c76dfe5dcf3bc0c27d Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 23:15:52 +0200 Subject: [PATCH 05/16] feat: add button toggle --- qrcode/panel.luau | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index da3cf259..530649b8 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -26,26 +26,35 @@ local function statusText() end local function render() - local content = { - ui.row({ gap = 8 }, { - ui.input({ - flexGrow = 1, - focus = true, - placeholder = noctalia.tr("panel.placeholder"), - onChange = "onTextChange", - onSubmit = "onTextSubmit", - }), + local rowContent = { + ui.input({ + flexGrow = 1, + focus = true, + placeholder = noctalia.tr("panel.placeholder"), + onChange = "onTextChange", + onSubmit = "onTextSubmit", + }) + } + + if noctalia.getConfig("generate_button") then + table.insert( + rowContent, ui.button({ text = "Generate", variant = "primary", + enabled = status ~= "generating", onClick = "onGenerateClick", - }), - }), + }) + ) + end + + local content = { + ui.row({ gap = 8 }, rowContent), ui.label({ flexGrow = 1, textAlign = "center", text = statusText(), - color = status == "error" and "error" or "on_surface", + color = status == "error" and "error" or "on_surface/0.75", }) } @@ -57,14 +66,14 @@ local function render() content, ui.image({ path = imagePath, + width = 400, height = 400, - radius = 25, onClick = "onImageClick", }) ) end - panel.render(ui.column({ flexGrow = 1 }, content)) + panel.render(ui.column({ flexGrow = 1, gap = 16 }, content)) end local function generate(text) From 30b1c6aac6d47acfe8b52ada125af7146ffd0243 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 23:43:38 +0200 Subject: [PATCH 06/16] feat: add configurable glyph --- qrcode/plugin.toml | 11 +++++++++-- qrcode/widget.luau | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index a15c5adb..a233ecaf 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -14,11 +14,18 @@ dependencies = [ "qrencode" ] id = "widget" entry = "widget.luau" + [[widget.setting]] + key = "glyph" + type = "glyph" + label_key = "settings.glyph.label" + description_key = "settings.glyph.description" + default = "qrcode" + [[panel]] id = "panel" entry = "panel.luau" -width = 600 -height = 600 +width = 500 +height = 550 placement = "floating" position = "center" diff --git a/qrcode/widget.luau b/qrcode/widget.luau index e7f53694..26571316 100644 --- a/qrcode/widget.luau +++ b/qrcode/widget.luau @@ -1,5 +1,5 @@ function update() - barWidget.setGlyph("qrcode") + barWidget.setGlyph(noctalia.getConfig("glyph")) end function onClick() From 1d1dd0e498f2a0fc69e388618d2daef5cf8bd5a2 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 23:44:13 +0200 Subject: [PATCH 07/16] fix: valid image radius --- qrcode/panel.luau | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index 530649b8..1689e73f 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -64,11 +64,14 @@ local function render() and imagePath ~= nil then table.insert( content, - ui.image({ - path = imagePath, - width = 400, - height = 400, - onClick = "onImageClick", + ui.row({ justify = "center" }, { + ui.image({ + path = imagePath, + width = 400, + height = 400, + radius = 24, + onClick = "onImageClick", + }) }) ) end From 0108fa5089a6a43db7fc8e37ccb2a0a8d36a3bf1 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 2 Aug 2026 23:56:43 +0200 Subject: [PATCH 08/16] fix: shell escape entry --- qrcode/panel.luau | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index 1689e73f..674cfdd1 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -79,12 +79,16 @@ local function render() panel.render(ui.column({ flexGrow = 1, gap = 16 }, content)) end +local function shellEscape(raw) + return "'" .. raw:gsub("'", "'\\''") .. "'" +end + local function generate(text) if status == "generating" then return end - text = noctalia.string.trim(text or "") + text = shellEscape(noctalia.string.trim(text or "")) if text == "" then if imagePath ~= nil then From 770423c893ad1b671ece86f2d15d4490b18d82fe Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 00:24:57 +0200 Subject: [PATCH 09/16] feat: add settings --- qrcode/README.md | 4 +++- qrcode/panel.luau | 2 +- qrcode/plugin.toml | 22 ++++++++++++++++++++++ qrcode/translations/en.json | 16 ++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/qrcode/README.md b/qrcode/README.md index fe748709..763aacc0 100644 --- a/qrcode/README.md +++ b/qrcode/README.md @@ -29,7 +29,9 @@ Enter your text or URL and click on Generate or press enter to generate the QR c | `generate_button` | `bool` | `true` | Show Generate button, disable will submit on enter. | | `close_on_copy` | `bool` | `false` | Close the panel when copying the QR code. | | `notify` | `select` | `minimal` | Controls the notifications, minimal only notifies when Close on Copy is used. | - +| `size` | `int` | `8` | Specify module size in dots (pixels). | +| `correction_level` | `select` | `M` | Specify error correction level. | +| `glyph` | `glyph` | `qrcode` | Bar widget icon glyph name. | ## Notes diff --git a/qrcode/panel.luau b/qrcode/panel.luau index 674cfdd1..6acf9609 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -122,7 +122,7 @@ local function generate(text) genCount += 1 local size = noctalia.getConfig("size") or 8 - local correctionLevel = noctalia.getConfig("correction-level") or "M" + local correctionLevel = noctalia.getConfig("correction_level") or "M" local cmd = string.format( 'qrencode %s -o %s -s %s -l %s', diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index a233ecaf..03057ee1 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -54,3 +54,25 @@ options = [ { value = "minimal", label_key = "settings.notify.minimal" }, { value = "none", label_key = "settings.notify.none" }, ] + +[[setting]] +key = "size" +type = "int" +label_key = "settings.size.label" +description_key = "settings.size.description" +default = 8 +advanced = true + +[[setting]] +key = "correction_level" +type = "select" +label_key = "settings.correction_level.label" +description_key = "settings.correction_level.description" +default = "M" +options = [ + { value = "L", label_key = "settings.correction_level.L" }, + { value = "M", label_key = "settings.correction_level.M" }, + { value = "Q", label_key = "settings.correction_level.Q" }, + { value = "H", label_key = "settings.correction_level.H" }, +] +advanced = true diff --git a/qrcode/translations/en.json b/qrcode/translations/en.json index 24b47ee4..1470d93a 100644 --- a/qrcode/translations/en.json +++ b/qrcode/translations/en.json @@ -14,6 +14,22 @@ "all": "All", "minimal": "Minimal", "none": "None" + }, + "glyph": { + "label": "Glyph", + "description": "Icon glyph name." + }, + "size": { + "label": "QR Code Size", + "description": "Specify module size in dots (pixels)." + }, + "correction_level": { + "label": "Correction Level", + "description": "Specify error correction level.", + "L": "Lowest", + "M": "Medium", + "Q": "High", + "H": "Highest" } }, "panel": { From 505fe1bd0f17f81508f67c1ad57430015619cb05 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 00:33:31 +0200 Subject: [PATCH 10/16] update: add thumbnail.webp --- qrcode/thumbnail.webp | Bin 0 -> 54546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 qrcode/thumbnail.webp diff --git a/qrcode/thumbnail.webp b/qrcode/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..5219b82f92da20601a6eb9fed75074b8eb514dbc GIT binary patch literal 54546 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 Date: Mon, 3 Aug 2026 00:57:19 +0200 Subject: [PATCH 11/16] feat: add titlebar and titlebar toggle --- qrcode/panel.luau | 15 +++++++++++++++ qrcode/plugin.toml | 11 +++++++++-- qrcode/translations/en.json | 4 ++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index 6acf9609..c11deef4 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -76,6 +76,17 @@ local function render() ) end + if noctalia.getConfig("titlebar") then + table.insert( + content, 1, + ui.row({ align = "center", justify = "space_between", gap = 8 }, { + ui.label({ text = "QR Code Encoder", fontSize = 16, fontWeight = "bold", flexGrow = 1 }), + ui.button({ glyph = "settings", onClick = noctalia.openSettings }), + ui.button({ glyph = "close", onClick = "onCloseClicked" }), + }) + ) + end + panel.render(ui.column({ flexGrow = 1, gap = 16 }, content)) end @@ -201,6 +212,10 @@ function onImageClick() render() end +function onCloseClicked() + panel.close() +end + function onClose() if imagePath ~= nil then noctalia.removeFile(imagePath) diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index 03057ee1..27d28ab2 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -1,7 +1,7 @@ id = "yocraft/qrcode" -name = "QR Code encoder" +name = "QR Code Encoder" version = "1.0.0" -plugin_api = 21 +plugin_api = 15 author = "yocraft" license = "MIT" deprecated = false @@ -29,6 +29,13 @@ height = 550 placement = "floating" position = "center" +[[setting]] +key = "titlebar" +type = "bool" +label_key = "settings.titlebar.label" +description_key = "settings.titlebar.description" +default = true + [[setting]] key = "generate_button" type = "bool" diff --git a/qrcode/translations/en.json b/qrcode/translations/en.json index 1470d93a..eb7832f0 100644 --- a/qrcode/translations/en.json +++ b/qrcode/translations/en.json @@ -1,5 +1,9 @@ { "settings": { + "titlebar": { + "label": "Show Titlebar", + "description": "Show panel name and buttons like settings and close." + }, "generate_button": { "label": "Show Generate Button", "description": "Disable will submit on enter." From 4541fa774d2bdd836b4c990677d03f1e7416399f Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 01:20:05 +0200 Subject: [PATCH 12/16] feat: add custom image widget setting, reorder keys --- qrcode/plugin.toml | 11 +++++++++-- qrcode/translations/en.json | 15 +++++++++++---- qrcode/widget.luau | 10 ++++++++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index 27d28ab2..7c1f7c88 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -17,10 +17,17 @@ entry = "widget.luau" [[widget.setting]] key = "glyph" type = "glyph" - label_key = "settings.glyph.label" - description_key = "settings.glyph.description" + label_key = "widget.glyph.label" + description_key = "widget.glyph.description" default = "qrcode" + [[widget.setting]] + key = "custom_image" + type = "image" + label_key = "widget.custom_image.label" + description_key = "widget.custom_image.description" + default = "" + [[panel]] id = "panel" entry = "panel.luau" diff --git a/qrcode/translations/en.json b/qrcode/translations/en.json index eb7832f0..acccc843 100644 --- a/qrcode/translations/en.json +++ b/qrcode/translations/en.json @@ -19,10 +19,6 @@ "minimal": "Minimal", "none": "None" }, - "glyph": { - "label": "Glyph", - "description": "Icon glyph name." - }, "size": { "label": "QR Code Size", "description": "Specify module size in dots (pixels)." @@ -36,6 +32,17 @@ "H": "Highest" } }, + "widget": { + "tooltip": "Generate a QR Code", + "glyph": { + "label": "Glyph", + "description": "Icon glyph name" + }, + "custom_image": { + "label": "Custom image", + "description": "Path to a custom image; leave empty to use the icon glyph" + } + }, "panel": { "placeholder": "Enter text or url...", "status": { diff --git a/qrcode/widget.luau b/qrcode/widget.luau index 26571316..b7c9683c 100644 --- a/qrcode/widget.luau +++ b/qrcode/widget.luau @@ -1,7 +1,13 @@ -function update() - barWidget.setGlyph(noctalia.getConfig("glyph")) +local image = noctalia.getConfig("custom_image") + +if image ~= "" and image ~= nil then + barWidget.setImage(image) +else + barWidget.setGlyph(noctalia.getConfig("glyph")) end +barWidget.setTooltip(noctalia.tr("widget.tooltip")) + function onClick() noctalia.togglePanel("yocraft/qrcode:panel") end From bde12cb777f501339186e8033d4595d2895099ae Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 01:27:36 +0200 Subject: [PATCH 13/16] fix: auto-size image with titlebar --- qrcode/panel.luau | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index c11deef4..7b482bc0 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -4,6 +4,8 @@ local errorMessage = nil local imagePath = nil local status = "idle" +local imageSize = 400 + local notifyConf = noctalia.getConfig("notify") local function notify(text, error) @@ -67,8 +69,8 @@ local function render() ui.row({ justify = "center" }, { ui.image({ path = imagePath, - width = 400, - height = 400, + width = imageSize, + height = imageSize, radius = 24, onClick = "onImageClick", }) @@ -77,6 +79,7 @@ local function render() end if noctalia.getConfig("titlebar") then + imageSize = 350 table.insert( content, 1, ui.row({ align = "center", justify = "space_between", gap = 8 }, { From c50b8753b765a83c08e8be9b217acfed1aae663c Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 01:31:20 +0200 Subject: [PATCH 14/16] update: README (new settings) --- qrcode/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qrcode/README.md b/qrcode/README.md index 763aacc0..d066eb06 100644 --- a/qrcode/README.md +++ b/qrcode/README.md @@ -26,12 +26,14 @@ Enter your text or URL and click on Generate or press enter to generate the QR c | Setting | Type | Default | Description | | --- | --- | --- | --- | +| `titlebar` | `bool` | `true` | Show titlebar, panel name and buttons like settings and close. | | `generate_button` | `bool` | `true` | Show Generate button, disable will submit on enter. | | `close_on_copy` | `bool` | `false` | Close the panel when copying the QR code. | | `notify` | `select` | `minimal` | Controls the notifications, minimal only notifies when Close on Copy is used. | | `size` | `int` | `8` | Specify module size in dots (pixels). | | `correction_level` | `select` | `M` | Specify error correction level. | | `glyph` | `glyph` | `qrcode` | Bar widget icon glyph name. | +| `custom_image` | `image` | `""` | Path to a custom image; leave empty to use the icon glyph. | ## Notes From dd28d4f0b766bcfabe732ff385e077c54228a306 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 01:41:29 +0200 Subject: [PATCH 15/16] fix: lowercase correction_level label keys --- qrcode/plugin.toml | 8 ++++---- qrcode/translations/en.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index 7c1f7c88..d0a6ca83 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -84,9 +84,9 @@ label_key = "settings.correction_level.label" description_key = "settings.correction_level.description" default = "M" options = [ - { value = "L", label_key = "settings.correction_level.L" }, - { value = "M", label_key = "settings.correction_level.M" }, - { value = "Q", label_key = "settings.correction_level.Q" }, - { value = "H", label_key = "settings.correction_level.H" }, + { value = "L", label_key = "settings.correction_level.l" }, + { value = "M", label_key = "settings.correction_level.m" }, + { value = "Q", label_key = "settings.correction_level.q" }, + { value = "H", label_key = "settings.correction_level.h" }, ] advanced = true diff --git a/qrcode/translations/en.json b/qrcode/translations/en.json index acccc843..cd54f307 100644 --- a/qrcode/translations/en.json +++ b/qrcode/translations/en.json @@ -26,10 +26,10 @@ "correction_level": { "label": "Correction Level", "description": "Specify error correction level.", - "L": "Lowest", - "M": "Medium", - "Q": "High", - "H": "Highest" + "l": "Lowest", + "m": "Medium", + "q": "High", + "h": "Highest" } }, "widget": { From b0e1e8d4b1c50c7edfbde07e30c0ce20beda802a Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Mon, 3 Aug 2026 08:25:34 +0200 Subject: [PATCH 16/16] fix: file type and move shellEscape to the cmd --- qrcode/panel.luau | 4 ++-- qrcode/plugin.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/qrcode/panel.luau b/qrcode/panel.luau index 7b482bc0..0e9e53c3 100644 --- a/qrcode/panel.luau +++ b/qrcode/panel.luau @@ -102,7 +102,7 @@ local function generate(text) return end - text = shellEscape(noctalia.string.trim(text or "")) + text = noctalia.string.trim(text or "") if text == "" then if imagePath ~= nil then @@ -140,7 +140,7 @@ local function generate(text) local cmd = string.format( 'qrencode %s -o %s -s %s -l %s', - text, + shellEscape(text), outputPath, size, correctionLevel diff --git a/qrcode/plugin.toml b/qrcode/plugin.toml index d0a6ca83..00e7e8e4 100644 --- a/qrcode/plugin.toml +++ b/qrcode/plugin.toml @@ -23,10 +23,11 @@ entry = "widget.luau" [[widget.setting]] key = "custom_image" - type = "image" + type = "file" label_key = "widget.custom_image.label" description_key = "widget.custom_image.description" default = "" + extensions = [".png", ".jpg", ".jpeg", ".webp", ".svg"] [[panel]] id = "panel"