Skip to content

feat: add Quickemu Manager plugin#856

Draft
GughNess wants to merge 10 commits into
noctalia-dev:mainfrom
GughNess:main
Draft

feat: add Quickemu Manager plugin#856
GughNess wants to merge 10 commits into
noctalia-dev:mainfrom
GughNess:main

Conversation

@GughNess
Copy link
Copy Markdown

Hello Noctalia team! 👋

I would like to submit my new plugin: Quickemu Manager. It's a native Noctalia shell plugin to seamlessly manage, download, and create Quickemu virtual machines directly from the desktop bar.

Features:

  • Dynamic VM Management: Start, edit, and delete virtual machines directly from the UI.
  • Instant OS Downloads: Built-in support for downloading over 700+ operating systems via quickget, complete with real-time progress bars and a filtered search list.
  • Dynamic Theming: Fully integrated with Quickshell's dynamic Color and Style APIs to match the user's global Noctalia theme.
  • Safe Execution: Process commands are executed as arrays to prevent shell injection vulnerabilities.

All files (QML, JSON manifest, and README with preview) are included in the quickemu folder. Let me know if any changes are required before merging. Thanks!

Hello Noctalia team! 👋

I would like to submit my new plugin: **Quickemu Manager**. 
It's a native Noctalia shell plugin to seamlessly manage, download, and create Quickemu virtual machines directly from the desktop bar.

### Features:
- **Dynamic VM Management**: Start, edit, and delete virtual machines directly from the UI.
- **Instant OS Downloads**: Built-in support for downloading over 700+ operating systems via `quickget`, complete with real-time progress bars and a filtered search list.
- **Dynamic Theming**: Fully integrated with Quickshell's dynamic `Color` and `Style` APIs to match the user's global Noctalia theme.
- **Safe Execution**: Process commands are executed as arrays to prevent shell injection vulnerabilities.

All files (QML, JSON manifest, and README with preview) are included in the `quickemu` folder. 
Let me know if any changes are required before merging. Thanks!
@github-actions
Copy link
Copy Markdown
Contributor

Automatic Manifest Check


File: quickemu-noctalia-plugin/manifest.json

  • (H) Missing required property repository. For example:
"repository": "https://github.com/noctalia-dev/noctalia-plugins"

@github-actions
Copy link
Copy Markdown
Contributor

Plugin "quickemu-noctalia-plugin" is missing some required files:

  • preview.*

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Code Quality Review


File: quickemu-noctalia-plugin/BarWidget.qml

  • (H) Line 50: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "VMs"

File: quickemu-noctalia-plugin/Main.qml

  • (H) Line 44: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] VM list refreshed — " + _vmListModel.count + " VMs found");
  • (H) Line 53: Do not use console.log, always prefer to use the Logger singleton instead
+        stdout: SplitParser { onRead: data => console.log("[quickemu] " + data) }
  • (H) Line 88: Do not use console.log, always prefer to use the Logger singleton instead
+                    console.log("[quickget] " + str);
  • (H) Line 94: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[quickget ERR] " + data);
  • (H) Line 100: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] quickget finished");
  • (H) Line 120: Do not use console.log, always prefer to use the Logger singleton instead
+        stderr: SplitParser { onRead: data => console.log("[quickget list ERR] " + data) }
  • (H) Line 123: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] OS list populated with " + _osListModel.count + " options.");
  • (H) Line 157: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Starting VM: " + name);
  • (H) Line 167: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Editing VM config: " + confPath);
  • (H) Line 177: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Deleting VM: " + name);
  • (H) Line 187: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Creating VM: " + osArgs);

File: quickemu-noctalia-plugin/Panel.qml

  • (H) Line 39: Do not use hardcoded values, always prefer to use the Style singleton instead
+                border.width: 1
  • (H) Line 66: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Quickemu Manager"
  • (H) Line 75: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Refresh"
  • (H) Line 90: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Existing VMs"
  • (H) Line 128: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Start"
  • (H) Line 138: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Edit"
  • (H) Line 145: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Delete"
  • (H) Line 158: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                        text: "No VMs found."
  • (H) Line 174: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Create New VM"
  • (H) Line 202: Do not use hardcoded values, always prefer to use the Style singleton instead
+                        border.width: 1
  • (H) Line 216: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Download"
  • (H) Missing required property geometryPlaceholder. For example:
readonly property var geometryPlaceholder: panelContainer
  • (H) Missing required property allowAttach. For example:
readonly property bool allowAttach: true

Hello Noctalia team! 👋

I would like to submit my new plugin: **Quickemu Manager**. 
It's a native Noctalia shell plugin to seamlessly manage, download, and create Quickemu virtual machines directly from the desktop bar.

### Features:
- **Dynamic VM Management**: Start, edit, and delete virtual machines directly from the UI.
- **Instant OS Downloads**: Built-in support for downloading over 700+ operating systems via `quickget`, complete with real-time progress bars and a filtered search list.
- **Dynamic Theming**: Fully integrated with Quickshell's dynamic `Color` and `Style` APIs to match the user's global Noctalia theme.
- **Safe Execution**: Process commands are executed as arrays to prevent shell injection vulnerabilities.

All files (QML, JSON manifest, and README with preview) are included in the `quickemu` folder. 
Let me know if any changes are required before merging. Thanks!
@github-actions
Copy link
Copy Markdown
Contributor

Automatic Manifest Check


File: quickemu-noctalia-plugin/manifest.json

+  "repository": "https://github.com/GughNess/quickemu-noctalia-plugin",

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Code Quality Review


File: quickemu-noctalia-plugin/BarWidget.qml

  • (H) Line 50: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "VMs"

File: quickemu-noctalia-plugin/Main.qml

  • (H) Line 44: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] VM list refreshed — " + _vmListModel.count + " VMs found");
  • (H) Line 53: Do not use console.log, always prefer to use the Logger singleton instead
+        stdout: SplitParser { onRead: data => console.log("[quickemu] " + data) }
  • (H) Line 88: Do not use console.log, always prefer to use the Logger singleton instead
+                    console.log("[quickget] " + str);
  • (H) Line 94: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[quickget ERR] " + data);
  • (H) Line 100: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] quickget finished");
  • (H) Line 120: Do not use console.log, always prefer to use the Logger singleton instead
+        stderr: SplitParser { onRead: data => console.log("[quickget list ERR] " + data) }
  • (H) Line 123: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] OS list populated with " + _osListModel.count + " options.");
  • (H) Line 157: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Starting VM: " + name);
  • (H) Line 167: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Editing VM config: " + confPath);
  • (H) Line 177: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Deleting VM: " + name);
  • (H) Line 187: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Creating VM: " + osArgs);

File: quickemu-noctalia-plugin/Panel.qml

  • (H) Line 39: Do not use hardcoded values, always prefer to use the Style singleton instead
+                border.width: 1
  • (H) Line 66: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Quickemu Manager"
  • (H) Line 75: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Refresh"
  • (H) Line 90: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Existing VMs"
  • (H) Line 128: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Start"
  • (H) Line 138: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Edit"
  • (H) Line 145: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Delete"
  • (H) Line 158: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                        text: "No VMs found."
  • (H) Line 174: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Create New VM"
  • (H) Line 202: Do not use hardcoded values, always prefer to use the Style singleton instead
+                        border.width: 1
  • (H) Line 216: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Download"
  • (H) Missing required property geometryPlaceholder. For example:
readonly property var geometryPlaceholder: panelContainer
  • (H) Missing required property allowAttach. For example:
readonly property bool allowAttach: true

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Manifest Check


File: quickemu-noctalia-plugin/manifest.json

+  "repository": "https://github.com/GughNess/quickemu-noctalia-plugin",

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Code Quality Review


File: quickemu-noctalia-plugin/BarWidget.qml

  • (H) Line 50: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "VMs"

File: quickemu-noctalia-plugin/Main.qml

  • (H) Line 44: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] VM list refreshed — " + _vmListModel.count + " VMs found");
  • (H) Line 53: Do not use console.log, always prefer to use the Logger singleton instead
+        stdout: SplitParser { onRead: data => console.log("[quickemu] " + data) }
  • (H) Line 88: Do not use console.log, always prefer to use the Logger singleton instead
+                    console.log("[quickget] " + str);
  • (H) Line 94: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[quickget ERR] " + data);
  • (H) Line 100: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] quickget finished");
  • (H) Line 120: Do not use console.log, always prefer to use the Logger singleton instead
+        stderr: SplitParser { onRead: data => console.log("[quickget list ERR] " + data) }
  • (H) Line 123: Do not use console.log, always prefer to use the Logger singleton instead
+                console.log("[QuickemuManager] OS list populated with " + _osListModel.count + " options.");
  • (H) Line 157: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Starting VM: " + name);
  • (H) Line 167: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Editing VM config: " + confPath);
  • (H) Line 177: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Deleting VM: " + name);
  • (H) Line 187: Do not use console.log, always prefer to use the Logger singleton instead
+        console.log("[QuickemuManager] Creating VM: " + osArgs);

File: quickemu-noctalia-plugin/Panel.qml

  • (H) Line 39: Do not use hardcoded values, always prefer to use the Style singleton instead
+                border.width: 1
  • (H) Line 66: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Quickemu Manager"
  • (H) Line 75: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Refresh"
  • (H) Line 90: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Existing VMs"
  • (H) Line 128: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Start"
  • (H) Line 138: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Edit"
  • (H) Line 145: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                                text: "Delete"
  • (H) Line 158: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                        text: "No VMs found."
  • (H) Line 174: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                text: "Create New VM"
  • (H) Line 202: Do not use hardcoded values, always prefer to use the Style singleton instead
+                        border.width: 1
  • (H) Line 216: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+                    text: "Download"
  • (H) Missing required property geometryPlaceholder. For example:
readonly property var geometryPlaceholder: panelContainer
  • (H) Missing required property allowAttach. For example:
readonly property bool allowAttach: true

File: quickemu-noctalia-plugin/quickemu-noctalia-plugin/BarWidget.qml

  • (L) Line 50: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("widget.title") || "VMs"

File: quickemu-noctalia-plugin/quickemu-noctalia-plugin/Panel.qml

  • (L) Line 82: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.title") || "Quickemu Manager"
  • (L) Line 91: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.refresh") || "Refresh"
  • (L) Line 106: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("panel.existing-vms") || "Existing VMs"
  • (L) Line 155: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.start") || "Start"
  • (L) Line 164: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.edit") || "Edit"
  • (L) Line 171: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.delete") || "Delete"
  • (L) Line 184: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                        text: pluginApi?.tr("panel.no-vms") || "No VMs found."
  • (L) Line 201: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("panel.create-vm") || "Create New VM"
  • (L) Line 237: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                        placeholderText: pluginApi?.tr("panel.search-os") || "Search OS..."
  • (L) Line 245: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.download") || "Download"

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Code Quality Review


File: quickemu-noctalia-plugin/BarWidget.qml

  • (L) Line 50: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("widget.title") || "VMs"

File: quickemu-noctalia-plugin/Panel.qml

  • (L) Line 82: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.title") || "Quickemu Manager"
  • (L) Line 91: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.refresh") || "Refresh"
  • (L) Line 106: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("panel.existing-vms") || "Existing VMs"
  • (L) Line 155: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.start") || "Start"
  • (L) Line 164: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.edit") || "Edit"
  • (L) Line 171: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                                text: pluginApi?.tr("panel.delete") || "Delete"
  • (L) Line 184: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                        text: pluginApi?.tr("panel.no-vms") || "No VMs found."
  • (L) Line 201: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                text: pluginApi?.tr("panel.create-vm") || "Create New VM"
  • (L) Line 237: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                        placeholderText: pluginApi?.tr("panel.search-os") || "Search OS..."
  • (L) Line 245: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+                    text: pluginApi?.tr("panel.download") || "Download"

@spiros132 spiros132 marked this pull request as draft May 13, 2026 20:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant