From 22f07412c77df6e6c486c7698ca3d2df9aa2c5d9 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 12:39:20 +0100 Subject: [PATCH 01/10] Register app for scheme on Windows --- main.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/main.js b/main.js index 45f6946..f4076da 100644 --- a/main.js +++ b/main.js @@ -2,12 +2,23 @@ if (require('electron-squirrel-startup')) return; const { app, BrowserWindow, ipcMain, shell } = require('electron'); const path = require('path'); +const APP_SCHEME_NAME = 'micropython-package-installer'; +const ARDUINO_VID = 0x2341; + // Handle events from windows squirrel installer if (process.platform === "win32" && handleSquirrelEvent()) { // squirrel event handled and app will exit in 1000ms, so don't do anything else return; } +// On macOS the scheme is already registered through the app bundle metadata +// but on Windows and Linux we need to register it manually +if (process.platform !== "darwin" && !app.isDefaultProtocolClient(APP_SCHEME_NAME)) { + if(!app.setAsDefaultProtocolClient(APP_SCHEME_NAME)) { + console.error('Failed to register custom URL scheme', APP_SCHEME_NAME); + } +} + const { updateElectronApp } = require('update-electron-app') updateElectronApp() @@ -15,7 +26,6 @@ let mainWindow; let upyPackage; let packageManager; let deviceManager; -const ARDUINO_VID = 0x2341; function createWindow() { mainWindow = new BrowserWindow({ From 40905f82626b2303b9367ac30f5c07b12fcee043 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 12:39:32 +0100 Subject: [PATCH 02/10] Quit app when closing main window --- main.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/main.js b/main.js index f4076da..0f145bb 100644 --- a/main.js +++ b/main.js @@ -55,9 +55,7 @@ app.on('ready', async() => { }); app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } + app.quit(); }); app.on('activate', () => { From 03269519ac0d8bc0c49e23bdf58e4de7b9dd6a83 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 12:40:32 +0100 Subject: [PATCH 03/10] Add close button to status bar --- css/status-bar.css | 4 ++++ index.html | 6 ++++++ renderer.js | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/css/status-bar.css b/css/status-bar.css index d60203d..0d35ad8 100644 --- a/css/status-bar.css +++ b/css/status-bar.css @@ -11,6 +11,10 @@ transition: max-height 0.5s ease, padding 0.5s ease, opacity 0.3s ease; } +.status-bar .close-button { + cursor: pointer; +} + .status-bar.visible { display: flex; max-height: 480px; diff --git a/index.html b/index.html index fdb8c22..85f7577 100644 --- a/index.html +++ b/index.html @@ -69,6 +69,12 @@

Packages

diff --git a/renderer.js b/renderer.js index 2ee3602..f98909b 100644 --- a/renderer.js +++ b/renderer.js @@ -8,6 +8,7 @@ let customURLplaceholders = ['github:janedoe/button-mpy', ]; const statusBar = document.getElementById('status-bar'); +const statusBarCloseButton = document.getElementById('status-bar-close'); const statusMessage = document.getElementById('status-message'); const deviceSelectionList = document.querySelector(".item-selection-list"); const reloadDeviceListLink = document.getElementById("reload-link"); @@ -52,6 +53,8 @@ document.addEventListener('DOMContentLoaded', async () => { setInstallButtonsEnabled(true); }); + statusBarCloseButton.addEventListener('click', hideStatus); + reloadDeviceListLink.addEventListener('click', async () => { await reloadDeviceList(); }); @@ -335,6 +338,9 @@ function showStatus(message, displayLoader = false, duration = null) { statusMessage.textContent = message; statusBar.classList.remove('hidden'); statusBarLoadingSpinner.classList.toggle('hidden', !displayLoader); + + // Hide close button when loader is displayed + statusBarCloseButton.classList.toggle('hidden', displayLoader); // Add the visible class to trigger the slide down effect setTimeout(() => { From f13e989f11041b6727e3158fefee7667fcdad088 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 12:40:46 +0100 Subject: [PATCH 04/10] Add comment about URL scheme config --- forge.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge.config.js b/forge.config.js index b88f019..3f34bc1 100644 --- a/forge.config.js +++ b/forge.config.js @@ -82,7 +82,8 @@ module.exports = { ignore: filesToExclude, prune: true, derefSymlinks: true, - protocols: [ { + protocols: [ { + // Register custom URL scheme on macOS name: 'micropython-package-installer', schemes: ['micropython-package-installer'] }], From d1c3aab58861cc3e34083ee9b5276a657c196d8b Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 12:41:17 +0100 Subject: [PATCH 05/10] 1.0.1-beta.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb8e76c..5af77cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "micropython-package-installer", - "version": "1.0.0", + "version": "1.0.1-beta.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "micropython-package-installer", - "version": "1.0.0", + "version": "1.0.1-beta.0", "license": "ISC", "dependencies": { "electron-squirrel-startup": "^1.0.1", diff --git a/package.json b/package.json index c4ac217..3e273f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "micropython-package-installer", - "version": "1.0.0", + "version": "1.0.1-beta.0", "description": "A tool to install MicroPython packages onto supported Arduino boards.", "main": "main.js", "scripts": { From 77f09e4fd86313c9448d63d9ce3af7eea0434b7b Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 13:34:10 +0100 Subject: [PATCH 06/10] Add scheme handler for Linux --- forge.config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge.config.js b/forge.config.js index 3f34bc1..b4ead4a 100644 --- a/forge.config.js +++ b/forge.config.js @@ -135,6 +135,11 @@ module.exports = { { name: '@electron-forge/maker-deb', platforms: ['linux'], + config: { + options: { + mimeType: ['x-scheme-handler/micropython-package-installer'] + } + } }, ], publishers: [ From 85050954435e6bcc2e676a00d5743752df59bf5d Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 12 Mar 2025 13:37:41 +0100 Subject: [PATCH 07/10] 1.0.1-beta.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5af77cb..638c82f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "micropython-package-installer", - "version": "1.0.1-beta.0", + "version": "1.0.1-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "micropython-package-installer", - "version": "1.0.1-beta.0", + "version": "1.0.1-beta.1", "license": "ISC", "dependencies": { "electron-squirrel-startup": "^1.0.1", diff --git a/package.json b/package.json index 3e273f9..7134842 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "micropython-package-installer", - "version": "1.0.1-beta.0", + "version": "1.0.1-beta.1", "description": "A tool to install MicroPython packages onto supported Arduino boards.", "main": "main.js", "scripts": { From eec39a3b11b035789b4ae6295c5f2f73a10a4f84 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Thu, 13 Mar 2025 10:38:00 +0100 Subject: [PATCH 08/10] Fix status bar being hidden forever --- renderer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/renderer.js b/renderer.js index f98909b..fc4f59f 100644 --- a/renderer.js +++ b/renderer.js @@ -251,6 +251,8 @@ function toggleUserInteraction(enabled) { searchField.disabled = !enabled; githubUrlInput.disabled = !enabled; manualInstallButton.disabled = !enabled; + compileFilesCheckbox.disabled = !enabled; + overwriteExistingCheckbox.disabled = !enabled; reloadDeviceListLink.style.pointerEvents = enabled ? 'auto' : 'none'; boardItems.forEach(board => board.style.pointerEvents = enabled ? 'auto' : 'none'); @@ -354,14 +356,12 @@ function showStatus(message, displayLoader = false, duration = null) { } function hideStatus() { - const statusBar = document.getElementById('status-bar'); - // Remove the visible class to trigger the slide-up effect statusBar.classList.remove('visible'); // After the transition ends, hide the element setTimeout(() => { - statusBar.style.display = 'none'; + statusBar.classList.add('hidden'); }, 500); // Match this duration with the CSS transition duration } From 27e38d2eafc91d0b03337ff214d2dd54f1dfb8fe Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Thu, 13 Mar 2025 10:42:32 +0100 Subject: [PATCH 09/10] Prevent printing stack trace --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 0f145bb..2c5e9e9 100644 --- a/main.js +++ b/main.js @@ -103,7 +103,7 @@ ipcMain.handle('install-package', async (event, aPackage, serialPort, compileFil return { success: true }; } catch (error) { let packageDesignator = aPackage.name || aPackage.url; - console.error(`Failed to install package ${packageDesignator}:`, error); + console.error(`Failed to install package ${packageDesignator}:`, error.message); // Check if error contains "Resource busy" and return a more user-friendly message if(error.message.includes('Resource busy') || error.message.includes('Access denied')) { From a4d26edce8db412dc0e3a78dfbcf2aa2e65764b8 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Thu, 13 Mar 2025 16:43:49 +0100 Subject: [PATCH 10/10] Update dependency --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 638c82f..3a4e9a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "electron-squirrel-startup": "^1.0.1", "update-electron-app": "^3.0.0", - "upy-package": "github:arduino/upy-package#v1.0.0" + "upy-package": "github:arduino/upy-package#v1.0.1" }, "devDependencies": { "@electron-forge/cli": "^7.5.0", @@ -7268,8 +7268,8 @@ } }, "node_modules/upy-package": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/arduino/upy-package.git#8a0f68f958caedd6afbad535e6c5e2dd05f154d6", + "version": "1.0.1", + "resolved": "git+ssh://git@github.com/arduino/upy-package.git#54245d58eab61f493dc82779926e85e14fa4df4a", "license": "ISC", "dependencies": { "commander": "^11.1.0", @@ -7277,7 +7277,7 @@ "inquirer": "^9.2.12", "js-yaml": "^4.1.0", "semver": "^7.6.2", - "upy-packager": "github:arduino/upy-packager#v1.0.0" + "upy-packager": "github:arduino/upy-packager#v1.0.1" }, "bin": { "upy-package": "main.js" diff --git a/package.json b/package.json index 7134842..9324876 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,6 @@ "dependencies": { "electron-squirrel-startup": "^1.0.1", "update-electron-app": "^3.0.0", - "upy-package": "github:arduino/upy-package#v1.0.0" + "upy-package": "github:arduino/upy-package#v1.0.1" } }