diff --git a/ui/shared/power/power_menu.js b/ui/shared/power/power_menu.js index 7eecf5e..ad399d9 100644 --- a/ui/shared/power/power_menu.js +++ b/ui/shared/power/power_menu.js @@ -60,6 +60,9 @@ export class PowerMenu extends LitElement { static properties = { open: { type: Boolean, reflect: true }, + // Drop the bootloader/recovery tier. Set by shells where those targets are + // meaningless. + basicOnly: { type: Boolean, attribute: "basic-only" }, // The action being run, or null. Set while a request is in flight, and // deliberately left set after it succeeds: the device is on its way down. _running: { state: true }, @@ -216,6 +219,7 @@ export class PowerMenu extends LitElement { constructor() { super(); this.open = false; + this.basicOnly = false; this._running = null; this._error = null; this._stalled = false; @@ -316,7 +320,9 @@ export class PowerMenu extends LitElement { } const primary = ACTIONS.filter((action) => !action.advanced); - const advanced = ACTIONS.filter((action) => action.advanced); + const advanced = this.basicOnly + ? [] + : ACTIONS.filter((action) => action.advanced); return html`
Power
${primary.map((action) => this.#renderAction(action))} -diff --git a/ui/system/desktop/index.js b/ui/system/desktop/index.js index a172398..95195ef 100644 --- a/ui/system/desktop/index.js +++ b/ui/system/desktop/index.js @@ -199,6 +199,13 @@ const ACTIONS = [ id: "quit", title: "Quit Beaver", sub: "Close all windows", + icon: "icon-log-out", + }, + { + kind: "system", + id: "power", + title: "Power…", + sub: "Power off or restart the device", icon: "icon-power", }, ], diff --git a/ui/system/desktop/palette.js b/ui/system/desktop/palette.js index 89d7002..0e173c4 100644 --- a/ui/system/desktop/palette.js +++ b/ui/system/desktop/palette.js @@ -19,6 +19,7 @@ import { getTheme, setTheme, } from "beaver://shared/theme.js"; +import { powerMenu } from "beaver://shared/power/power_menu.js"; let paletteSelected = 0; // Flat list of palette items rendered in the current frame: index @@ -465,6 +466,12 @@ function activatePaletteItem(item) { if (pencil) openDeskSettings(pencil); }); return; + } else if (kind === "system" && id === "power") { + closePalette(); + const menu = powerMenu(); + menu.basicOnly = true; + menu.show(); + return; } else if (kind === "system" && id === "reload-ui") { location.reload(); } else if (kind === "system" && id === "quit") { diff --git a/ui/system/desktop/quick_settings.js b/ui/system/desktop/quick_settings.js index 85de78d..2f0d6a8 100644 --- a/ui/system/desktop/quick_settings.js +++ b/ui/system/desktop/quick_settings.js @@ -9,6 +9,7 @@ */ import { Popover, dockAnchorPosition } from "./popover.js"; +import { powerMenu } from "beaver://shared/power/power_menu.js"; /** * @param {object} deps @@ -50,6 +51,14 @@ export function initQuickSettings({ openSettings?.(); }); + popoverEl.addEventListener("open-power", () => { + close(); + const menu = powerMenu(); + // No fastboot or recovery on a desktop. + menu.basicOnly = true; + menu.show(); + }); + popoverEl.addEventListener("dock-position", (event) => { setDockPosition?.(event.detail.id); popoverEl.dockPosition = currentDock(); diff --git a/ui/system/desktop/quick_settings_popover.css b/ui/system/desktop/quick_settings_popover.css index 36311dd..126538e 100644 --- a/ui/system/desktop/quick_settings_popover.css +++ b/ui/system/desktop/quick_settings_popover.css @@ -44,7 +44,16 @@ margin-bottom: 2px; } -.qs-settings { +/* The header's one-shot actions: both leave the panel, unlike the rows below, + which are adjusted in place. */ +.qs-actions { + display: flex; + align-items: center; + gap: 2px; + flex-shrink: 0; +} + +.qs-action { display: inline-flex; align-items: center; justify-content: center; @@ -62,11 +71,15 @@ color var(--transition-fast); } -.qs-settings:hover { +.qs-action:hover { background: var(--bg-hover); color: var(--color-text); } +.qs-action.danger:hover { + color: var(--color-danger); +} + /* Rows are separated by rhythm, not rules; only the header keeps a hairline. */ .qs-body { display: flex; diff --git a/ui/system/desktop/quick_settings_popover.js b/ui/system/desktop/quick_settings_popover.js index 95bb03d..e4cf946 100644 --- a/ui/system/desktop/quick_settings_popover.js +++ b/ui/system/desktop/quick_settings_popover.js @@ -101,15 +101,26 @@ export class QuickSettingsPopover extends LitElement { return html`