diff --git a/main.js b/main.js index 4fabaae..9cb44d3 100644 --- a/main.js +++ b/main.js @@ -51,7 +51,15 @@ function allEngines() { ({ id, name: e.name, sym: e.sym, favicon: faviconUrl(e.fav), builtin: true, enabled: isEnabled(id) })); for (const c of settings.customEngines || []) list.push({ id: c.id, name: c.name, sym: c.sym || "🔍", favicon: customFavicon(c.url), builtin: false, enabled: true }); - return list; + // Apply the user's custom order; ids not in engineOrder keep their natural order (stable sort). + const order = settings.engineOrder || []; + return list.slice().sort((a, b) => { + const ia = order.indexOf(a.id), ib = order.indexOf(b.id); + if (ia === -1 && ib === -1) return 0; + if (ia === -1) return 1; + if (ib === -1) return -1; + return ia - ib; + }); } function enabledEnginesList() { return allEngines().filter((e) => e.enabled); } function engineUrl(id, q) { @@ -124,6 +132,7 @@ const SETTINGS_DEFAULTS = { locationMode: "hide", locationRegion: "europe", locationLat: "40.7128", locationLon: "-74.0060", // spoof by region, or manual coords searchEngine: "duckduckgo",// default search engine (built-in id or a custom id) enabledEngines: DEFAULT_ENABLED.slice(), // which built-in engines show in the dropdown + engineOrder: [], // user-defined display order of engine ids (empty = natural) customEngines: [], // user-added: [{ id, name, url-with-%s }] theme: "dark", // dark | light | system — drives prefers-color-scheme in all views }; @@ -801,6 +810,10 @@ ipcMain.handle("set-engine-enabled", (_e, id, on) => { } return { engines: allEngines(), current: settings.searchEngine }; }); +ipcMain.handle("set-engine-order", (_e, ids) => { + if (Array.isArray(ids)) { settings.engineOrder = ids.filter((x) => typeof x === "string"); saveSettings(); emitEngines(); } + return { engines: allEngines(), current: settings.searchEngine }; +}); // The custom dropdown overlay (real favicons). ipcMain.handle("toggle-engine-picker", (_e, rect) => { if (epVisible) return showEnginePicker(false); diff --git a/settings-preload.js b/settings-preload.js index 89ab17a..162a7e6 100644 --- a/settings-preload.js +++ b/settings-preload.js @@ -6,4 +6,5 @@ contextBridge.exposeInMainWorld("cfg", { addEngine: (eng) => ipcRenderer.invoke("add-engine", eng), removeEngine: (id) => ipcRenderer.invoke("remove-engine", id), setEngineEnabled: (id, on) => ipcRenderer.invoke("set-engine-enabled", id, on), + setEngineOrder: (ids) => ipcRenderer.invoke("set-engine-order", ids), }); diff --git a/settings.html b/settings.html index c48c997..f4a86b1 100644 --- a/settings.html +++ b/settings.html @@ -43,6 +43,9 @@ .eng .eic .ei{width:16px;height:16px;border-radius:3px} .eng .eic .es{font-size:14px} .eng .enm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .eng .cx{cursor:pointer;color:var(--dim);border:none;background:transparent;font-size:13px} .eng .cx:hover{color:#f6768a} + .eng .mv{display:flex;flex-direction:column;flex:none;gap:1px} + .eng .mv button{border:none;background:transparent;color:var(--dim);cursor:pointer;font-size:8px;line-height:1;padding:1px 2px;border-radius:3px} + .eng .mv button:hover{background:var(--line);color:var(--ink)} .sw.sm{width:38px;height:22px} .sw.sm .knob{width:15px;height:15px} .sw.sm input:checked + .track .knob{transform:translateX(16px)} .ceng .cn{font-weight:600} .ceng .cu{color:var(--dim);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1} .ceng .cx{cursor:pointer;color:#8b98a9;border:none;background:transparent;font-size:13px} .ceng .cx:hover{color:#f6768a} @@ -145,7 +148,12 @@