Add plugin system with sample plugin and settings UI
Introduces a plugin architecture, including a PluginManager, plugin loading in main and renderer processes, and a sample plugin demonstrating menu, IPC, and context menu contributions. Adds a Plugins tab to the settings UI for managing plugins (enable/disable, reload), and updates preload.js to load renderer preloads from plugins. Documentation for plugin development is included in README-PLUGINS.md.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
// Sample main-process side of a plugin
|
||||
module.exports.activate = function(ctx) {
|
||||
ctx.log('activating');
|
||||
|
||||
// Add a simple menu item under Help
|
||||
try {
|
||||
const template = ctx.Menu.getApplicationMenu()?.items?.map(mi => mi);
|
||||
if (template) {
|
||||
const help = template.find(i => /help/i.test(i.label || ''));
|
||||
const insertInto = help || template[template.length - 1];
|
||||
if (insertInto && insertInto.submenu) {
|
||||
insertInto.submenu.append(new ctx.Menu.MenuItem({
|
||||
label: 'Say Hello (Sample Plugin)',
|
||||
click: () => {
|
||||
const win = ctx.BrowserWindow.getFocusedWindow();
|
||||
if (win) win.webContents.send('sample-hello', { msg: 'Hello from plugin!' });
|
||||
}
|
||||
}));
|
||||
ctx.Menu.setApplicationMenu(ctx.Menu.getApplicationMenu());
|
||||
}
|
||||
}
|
||||
} catch (e) { ctx.warn('menu injection skipped', e); }
|
||||
|
||||
// Simple IPC example
|
||||
ctx.registerIPC('sample-hello:ping', async () => ({ pong: true }));
|
||||
|
||||
// Optional: intercept a request (no-op demo)
|
||||
ctx.registerWebRequest({ urls: ['*://*/*'] }, (details) => {
|
||||
// Could cancel or redirect here, but we let it pass through
|
||||
return { cancel: false };
|
||||
});
|
||||
|
||||
// Context menu contribution example
|
||||
ctx.contributeContextMenu?.((template, params, sender) => {
|
||||
template.push({ type: 'separator' });
|
||||
template.push({
|
||||
label: 'Sample: Greet Console',
|
||||
click: () => {
|
||||
try { (sender.hostWebContents || sender).executeJavaScript("console.log('[Sample Plugin] Hello from context menu')"); } catch {}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user