diff --git a/modules/menus/DropdownMenu.js b/modules/menus/DropdownMenu.js index 8af5d16..0fde4b9 100644 --- a/modules/menus/DropdownMenu.js +++ b/modules/menus/DropdownMenu.js @@ -8,6 +8,7 @@ export const Padding = (name) => child: Widget.Box(), setup: (w) => w.on("button-press-event", () => App.toggleWindow(name)), }); + const moveBoxToCursor = (self, minWidth, minHeight, fixed) => { globalMousePos.connect("changed", ({ value }) => { let monWidth = hyprland.monitors[hyprland.active.monitor.id].width; @@ -85,7 +86,7 @@ export default ({ child: Widget.Box({ class_name: "dropdown-menu-container", can_focus: true, - children: [Padding(name), child], + children: [child], }), }), }), diff --git a/modules/menus/audio/active/index.js b/modules/menus/audio/active/index.js index e428879..44573b1 100644 --- a/modules/menus/audio/active/index.js +++ b/modules/menus/audio/active/index.js @@ -12,7 +12,7 @@ const activeDevices = () => { child: Widget.Label({ class_name: "menu-label audio volume", hexpand: true, - hpack: "center", + hpack: "start", label: "Volume", }), }), diff --git a/modules/menus/audio/available/index.js b/modules/menus/audio/available/index.js index e177b8d..85e21c3 100644 --- a/modules/menus/audio/available/index.js +++ b/modules/menus/audio/available/index.js @@ -16,7 +16,7 @@ const availableDevices = () => { child: Widget.Label({ class_name: "menu-label audio playback", hexpand: true, - hpack: "center", + hpack: "start", label: "Playback Devices", }), }), @@ -50,7 +50,7 @@ const availableDevices = () => { child: Widget.Label({ class_name: "menu-label audio playback", hexpand: true, - hpack: "center", + hpack: "start", label: "Input Devices", }), }), diff --git a/modules/menus/bluetooth/devices/connectedControls.js b/modules/menus/bluetooth/devices/connectedControls.js new file mode 100644 index 0000000..d36aef4 --- /dev/null +++ b/modules/menus/bluetooth/devices/connectedControls.js @@ -0,0 +1,76 @@ +const connectedControls = (dev, connectedDevices) => { + if (!connectedDevices.includes(dev.address)) { + return Widget.Box({}); + } + + return Widget.Box({ + vpack: "start", + class_name: "bluetooth-controls", + children: [ + Widget.Button({ + class_name: "menu-icon-button unpair bluetooth", + child: Widget.Label({ + tooltip_text: dev.paired ? "unpair" : "pair", + class_name: "menu-icon-button-label unpair bluetooth", + label: dev.paired ? "" : "", + }), + on_primary_click: () => + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, + ]).catch((err) => + console.error( + `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, + err, + ), + ), + }), + Widget.Button({ + class_name: "menu-icon-button disconnect bluetooth", + child: Widget.Label({ + tooltip_text: dev.connected ? "disconnect" : "connect", + class_name: "menu-icon-button-label disconnect bluetooth", + label: dev.connected ? "󱘖" : "", + }), + on_primary_click: () => dev.setConnection(!dev.connected), + }), + Widget.Button({ + class_name: "menu-icon-button untrust bluetooth", + child: Widget.Label({ + tooltip_text: dev.trusted ? "untrust" : "trust", + class_name: "menu-icon-button-label untrust bluetooth", + label: dev.trusted ? "" : "󱖡", + }), + on_primary_click: () => + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, + ]).catch((err) => + console.error( + `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, + err, + ), + ), + }), + Widget.Button({ + class_name: "menu-icon-button delete bluetooth", + child: Widget.Label({ + tooltip_text: "delete", + class_name: "menu-icon-button-label delete bluetooth", + label: "󰆴", + }), + on_primary_click: () => { + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl remove ${dev.address}`, + ]).catch((err) => console.error("Bluetooth Remove", err)); + }, + }), + ], + }); +}; + +export { connectedControls }; diff --git a/modules/menus/bluetooth/devices/devicelist.js b/modules/menus/bluetooth/devices/devicelist.js new file mode 100644 index 0000000..b269b69 --- /dev/null +++ b/modules/menus/bluetooth/devices/devicelist.js @@ -0,0 +1,134 @@ +import { connectedControls } from "./connectedControls.js"; + +const devices = (bluetooth, self) => { + return self.hook(bluetooth, () => { + if (!bluetooth.enabled) { + return (self.child = Widget.Box({ + class_name: "bluetooth-items", + vertical: true, + expand: true, + vpack: "center", + hpack: "center", + children: [ + Widget.Label({ + class_name: "dim", + hexpand: true, + label: "Bluetooth is disabled", + }), + ], + })); + } + + const availableDevices = bluetooth.devices + .filter( + (btDev) => btDev.name !== null, + ) + .sort((a, b) => { + if (a.connected || a.paired) { + return -1; + } + + if (b.connected || b.paired) { + return -1; + } + + return b.name - a.name; + }); + + const conDevNames = availableDevices + .filter((d) => d.connected || d.paired) + .map((d) => d.address); + + if (!availableDevices.length) { + return (self.child = Widget.Box({ + class_name: "bluetooth-items", + vertical: true, + expand: true, + vpack: "center", + hpack: "center", + children: [ + Widget.Label({ + class_name: "dim", + hexpand: true, + label: "No devices currently found", + }), + Widget.Label({ + class_name: "dim", + hexpand: true, + label: "Press '󰑐' to search", + }), + ], + })); + } + + return (self.child = Widget.Box({ + vertical: true, + children: availableDevices.map((device) => { + return Widget.Box({ + children: [ + Widget.Button({ + hexpand: true, + class_name: `bluetooth-element-item ${device}`, + on_primary_click: () => { + if (!conDevNames.includes(device.address)) + device.setConnection(true); + }, + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Box({ + hexpand: true, + hpack: "start", + children: [ + Widget.Icon({ + vpack: "start", + class_name: `menu-button-icon bluetooth ${conDevNames.includes(device.address) ? "active" : ""}`, + icon: `${device["icon-name"]}-symbolic`, + }), + Widget.Box({ + vertical: true, + children: [ + Widget.Label({ + vpack: "center", + hpack: "start", + class_name: "menu-button-name bluetooth", + truncate: "end", + wrap: true, + label: device.alias, + }), + Widget.Revealer({ + hpack: "start", + reveal_child: device.connected || device.paired, + child: Widget.Label({ + hpack: "start", + class_name: "connection-status dim", + label: device.connected ? "Connected" : "Paired", + }), + }), + ], + }), + ], + }), + Widget.Box({ + hpack: "end", + children: device.connecting + ? [ + Widget.Spinner({ + vpack: "start", + class_name: "spinner bluetooth", + }), + ] + : [], + }), + ], + }), + }), + connectedControls(device, conDevNames), + ], + }); + }), + })); + }); +}; + +export { devices }; diff --git a/modules/menus/bluetooth/devices/index.js b/modules/menus/bluetooth/devices/index.js new file mode 100644 index 0000000..a13fbbd --- /dev/null +++ b/modules/menus/bluetooth/devices/index.js @@ -0,0 +1,26 @@ +const bluetooth = await Service.import("bluetooth"); +import { label } from "./label.js"; +import { devices } from "./devicelist.js"; + +const Devices = () => { + return Widget.Box({ + class_name: "menu-section-container", + vertical: true, + children: [ + label(bluetooth), + Widget.Box({ + class_name: "menu-items-section", + vertical: true, + child: Widget.Box({ + class_name: "menu-content", + vertical: true, + setup: (self) => { + devices(bluetooth, self); + }, + }), + }), + ], + }); +}; + +export { Devices }; diff --git a/modules/menus/bluetooth/devices/label.js b/modules/menus/bluetooth/devices/label.js new file mode 100644 index 0000000..fb3ac5d --- /dev/null +++ b/modules/menus/bluetooth/devices/label.js @@ -0,0 +1,74 @@ +const label = (bluetooth) => { + const searchInProgress = Variable(false); + const startRotation = () => { + searchInProgress.value = true; + setTimeout(() => { + searchInProgress.value = false; + }, 10 * 1000); + }; + + return Widget.Box({ + class_name: "menu-label-container", + hpack: "fill", + vpack: "start", + children: [ + Widget.Label({ + class_name: "menu-label", + vpack: "start", + hpack: "start", + label: "Bluetooth", + }), + Widget.Box({ + class_name: "controls-container", + vpack: "start", + children: [ + Widget.Switch({ + class_name: "menu-switch bluetooth", + hexpand: true, + hpack: "end", + active: bluetooth.bind("enabled"), + on_activate: ({ active }) => { + searchInProgress.value = false; + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl power ${active ? "on" : "off"}`, + ]).catch((err) => + console.error( + `bluetoothctl power ${active ? "on" : "off"}`, + err, + ), + ); + }, + }), + Widget.Separator({ + class_name: "menu-separator bluetooth", + }), + Widget.Button({ + vpack: "center", + class_name: "menu-icon-button search", + on_primary_click: () => { + startRotation(); + Utils.execAsync([ + "bash", + "-c", + "bluetoothctl --timeout 120 scan on", + ]).catch((err) => { + searchInProgress.value = false; + console.error("bluetoothctl --timeout 120 scan on", err); + }); + }, + child: Widget.Icon({ + class_name: searchInProgress + .bind("value") + .as((v) => (v ? "spinning" : "")), + icon: "view-refresh-symbolic", + }), + }), + ], + }), + ], + }); +}; + +export { label }; diff --git a/modules/menus/bluetooth/index.bkup.js b/modules/menus/bluetooth/index.bkup.js new file mode 100644 index 0000000..a3a6d7e --- /dev/null +++ b/modules/menus/bluetooth/index.bkup.js @@ -0,0 +1,383 @@ +const bluetooth = await Service.import("bluetooth"); +import DropdownMenu from "../DropdownMenu.js"; + +export default () => { + const connectedDevices = (btDevices) => { + const noDevices = () => { + return Widget.Box({ + hpack: "center", + hexpand: true, + child: Widget.Label({ + class_name: "dim", + label: "No devices connected", + }), + }); + }; + + const deviceList = () => { + return Widget.Box({ + vertical: true, + children: btDevices.map((dev) => + Widget.Box({ + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: "start", + vertical: true, + children: [ + Widget.Box({ + children: [ + Widget.Button({ + child: Widget.Icon(`${dev["icon-name"]}-symbolic`), + }), + Widget.Label({ + class_name: "menu-button-name bluetooth", + truncate: "end", + wrap: true, + label: dev.alias, + }), + ], + }), + Widget.Box({ + class_name: "menu-button-name-container status dim", + children: [ + Widget.Label({ + class_name: "menu-button-name status dim", + label: dev.connected + ? "Connected" + : dev.paired + ? "Paired" + : "", + }), + ], + }), + ], + }), + Widget.Box({ + hpack: "end", + expand: true, + children: [ + Widget.Button({ + class_name: "menu-icon-button unpair bluetooth", + child: Widget.Label({ + tooltip_text: dev.paired ? "unpair" : "pair", + class_name: "menu-icon-button-label unpair bluetooth", + label: dev.paired ? "" : "", + }), + on_primary_click: () => + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, + ]).catch((err) => + console.error( + `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, + err, + ), + ), + }), + Widget.Button({ + class_name: "menu-icon-button disconnect bluetooth", + child: Widget.Label({ + tooltip_text: dev.connected ? "disconnect" : "connect", + class_name: + "menu-icon-button-label disconnect bluetooth", + label: dev.connected ? "󱘖" : "", + }), + on_primary_click: () => dev.setConnection(false), + }), + Widget.Button({ + class_name: "menu-icon-button untrust bluetooth", + child: Widget.Label({ + tooltip_text: dev.trusted ? "untrust" : "trust", + class_name: "menu-icon-button-label untrust bluetooth", + label: dev.trusted ? "" : "󱖡", + }), + on_primary_click: () => + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, + ]).catch((err) => + console.error( + `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, + err, + ), + ), + }), + Widget.Button({ + class_name: "menu-icon-button delete bluetooth", + child: Widget.Label({ + tooltip_text: "delete", + class_name: "menu-icon-button-label delete bluetooth", + label: "󰆴", + }), + on_primary_click: () => { + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl remove ${dev.address}`, + ]).catch((err) => + console.error("Bluetooth Remove", err), + ); + }, + }), + ], + }), + ], + }), + }), + ), + }); + }; + + return btDevices.length === 0 ? noDevices() : deviceList(); + }; + + const renderDevices = () => { + return Widget.Box({ + class_name: "search-devices-container", + vertical: true, + setup: (self) => + self.hook(bluetooth, () => { + const availableDevices = bluetooth.devices.filter( + (device) => + device.name !== null && + !bluetooth.connected_devices.find( + (dev) => dev.address === device.address, + ), + ); + + if (availableDevices.length === 0) { + return (self.children = [ + Widget.Box({ + class_name: "empty-bt-devices-container dim", + vertical: true, + children: [ + Widget.Label({ + hexpand: true, + label: "No devices currently found", + }), + Widget.Label({ + hexpand: true, + label: "Press '󰑐' to search", + }), + ], + }), + ]); + } + return (self.children = bluetooth.devices + .filter( + (device) => + device.name !== null && + !bluetooth.connected_devices.find( + (dev) => dev.address === device.address, + ), + ) + .map((device) => { + return Widget.Button({ + hexpand: true, + class_name: `menu-button bluetooth ${device}`, + on_primary_click: () => { + device.setConnection(true); + }, + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: "start", + children: [ + Widget.Icon({ + class_name: "menu-button-icon bluetooth", + icon: `${device["icon-name"]}-symbolic`, + }), + Widget.Label({ + hexpand: true, + class_name: "menu-button-name bluetooth", + truncate: "end", + wrap: true, + label: device.alias, + }), + ], + }), + Widget.Box({ + hpack: "end", + children: device.connecting + ? [ + Widget.Label({ + class_name: "bluetooth-isconnecting", + label: "󰲼", + }), + ] + : [], + }), + ], + }), + }); + })); + }), + }); + }; + + const bluetoothOnModule = () => { + return Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: "menu-container bluetooth", + children: [ + Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: "menu-label-container bluetooth", + children: [ + Widget.Box({ + hpack: "start", + child: Widget.Label({ + class_name: "menu-label bluetooth", + label: "Devices", + }), + }), + Widget.Box({ + hexpand: true, + hpack: "end", + child: Widget.Button({ + class_name: "menu-icon-button", + on_primary_click: () => { + Utils.execAsync([ + "bash", + "-c", + "bluetoothctl --timeout 120 scan on", + ]).catch((err) => + console.error( + "bluetoothctl --timeout 120 scan on", + err, + ), + ); + }, + child: Widget.Icon("view-refresh-symbolic"), + }), + }), + ], + }), + Widget.Box({ + child: renderDevices(), + }), + ], + }), + ], + }), + ], + }); + }; + + const bluetoothOffModule = () => { + return Widget.Box({ + class_name: "bluetooth-disabled-menu", + vertical: true, + children: [ + Widget.Label({ + hexpand: true, + vexpand: true, + label: bluetooth + .bind("state") + .as((state) => + state === "turning-off" + ? "Bluetooth is turning off..." + : "Bluetooth is disabled", + ), + }), + ], + }); + }; + return DropdownMenu({ + name: "bluetoothmenu", + transition: "crossfade", + minWidth: 350, + child: Widget.Box({ + class_name: "menu-items", + child: Widget.Box({ + vertical: true, + class_name: "menu-items-container", + children: [ + Widget.Box({ + class_name: "menu-dropdown-label-container", + children: [ + Widget.Box({ + hexpand: true, + hpack: "start", + child: Widget.Label({ + class_name: "menu-dropdown-label bluetooth", + label: "Bluetooth", + }), + }), + Widget.Box({ + hexpand: true, + hpack: "end", + children: [ + // NOTE: Do we want to add this back to restart bluetooth service if it every hangs? + // Widget.Button({ + // class_name: "menu-icon-button restart-bluetooth-service", + // tooltip_text: "Restart Bluetooth Service", + // on_primary_click: () => Utils.execAsync('systemctl restart bluetooth'), + // child: Widget.Label({ + // class_name: "menu-icon-button-label", + // label: "󱄌" + // }) + // }), + Widget.Switch({ + class_name: "menu-switch bluetooth", + active: bluetooth.bind("enabled"), + on_activate: ({ active }) => + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl power ${active ? "on" : "off"}`, + ]).catch((err) => + console.error( + `bluetoothctl power ${active ? "on" : "off"}`, + err, + ), + ), + }), + ], + }), + ], + }), + Widget.Box({ + vertical: true, + children: bluetooth.bind("enabled").as((isOn) => + isOn + ? [ + Widget.Box({ + class_name: "menu-label-container", + child: Widget.Label({ + class_name: "menu-label bluetooth", + hpack: "start", + label: "My Devices", + }), + }), + Widget.Box({ + vertical: true, + class_name: "menu-item-box", + child: bluetooth + .bind("connected_devices") + .as((btConDevs) => connectedDevices(btConDevs)), + }), + ] + : [], + ), + }), + Widget.Box({ + vertical: true, + child: bluetooth + .bind("enabled") + .as((btEnabled) => + btEnabled ? bluetoothOnModule() : bluetoothOffModule(), + ), + }), + ], + }), + }), + }); +}; diff --git a/modules/menus/bluetooth/index.js b/modules/menus/bluetooth/index.js index a3a6d7e..286f193 100644 --- a/modules/menus/bluetooth/index.js +++ b/modules/menus/bluetooth/index.js @@ -1,382 +1,21 @@ const bluetooth = await Service.import("bluetooth"); import DropdownMenu from "../DropdownMenu.js"; +import { Devices } from "./devices/index.js"; export default () => { - const connectedDevices = (btDevices) => { - const noDevices = () => { - return Widget.Box({ - hpack: "center", - hexpand: true, - child: Widget.Label({ - class_name: "dim", - label: "No devices connected", - }), - }); - }; - - const deviceList = () => { - return Widget.Box({ - vertical: true, - children: btDevices.map((dev) => - Widget.Box({ - child: Widget.Box({ - children: [ - Widget.Box({ - hpack: "start", - vertical: true, - children: [ - Widget.Box({ - children: [ - Widget.Button({ - child: Widget.Icon(`${dev["icon-name"]}-symbolic`), - }), - Widget.Label({ - class_name: "menu-button-name bluetooth", - truncate: "end", - wrap: true, - label: dev.alias, - }), - ], - }), - Widget.Box({ - class_name: "menu-button-name-container status dim", - children: [ - Widget.Label({ - class_name: "menu-button-name status dim", - label: dev.connected - ? "Connected" - : dev.paired - ? "Paired" - : "", - }), - ], - }), - ], - }), - Widget.Box({ - hpack: "end", - expand: true, - children: [ - Widget.Button({ - class_name: "menu-icon-button unpair bluetooth", - child: Widget.Label({ - tooltip_text: dev.paired ? "unpair" : "pair", - class_name: "menu-icon-button-label unpair bluetooth", - label: dev.paired ? "" : "", - }), - on_primary_click: () => - Utils.execAsync([ - "bash", - "-c", - `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, - ]).catch((err) => - console.error( - `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, - err, - ), - ), - }), - Widget.Button({ - class_name: "menu-icon-button disconnect bluetooth", - child: Widget.Label({ - tooltip_text: dev.connected ? "disconnect" : "connect", - class_name: - "menu-icon-button-label disconnect bluetooth", - label: dev.connected ? "󱘖" : "", - }), - on_primary_click: () => dev.setConnection(false), - }), - Widget.Button({ - class_name: "menu-icon-button untrust bluetooth", - child: Widget.Label({ - tooltip_text: dev.trusted ? "untrust" : "trust", - class_name: "menu-icon-button-label untrust bluetooth", - label: dev.trusted ? "" : "󱖡", - }), - on_primary_click: () => - Utils.execAsync([ - "bash", - "-c", - `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, - ]).catch((err) => - console.error( - `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, - err, - ), - ), - }), - Widget.Button({ - class_name: "menu-icon-button delete bluetooth", - child: Widget.Label({ - tooltip_text: "delete", - class_name: "menu-icon-button-label delete bluetooth", - label: "󰆴", - }), - on_primary_click: () => { - Utils.execAsync([ - "bash", - "-c", - `bluetoothctl remove ${dev.address}`, - ]).catch((err) => - console.error("Bluetooth Remove", err), - ); - }, - }), - ], - }), - ], - }), - }), - ), - }); - }; - - return btDevices.length === 0 ? noDevices() : deviceList(); - }; - - const renderDevices = () => { - return Widget.Box({ - class_name: "search-devices-container", - vertical: true, - setup: (self) => - self.hook(bluetooth, () => { - const availableDevices = bluetooth.devices.filter( - (device) => - device.name !== null && - !bluetooth.connected_devices.find( - (dev) => dev.address === device.address, - ), - ); - - if (availableDevices.length === 0) { - return (self.children = [ - Widget.Box({ - class_name: "empty-bt-devices-container dim", - vertical: true, - children: [ - Widget.Label({ - hexpand: true, - label: "No devices currently found", - }), - Widget.Label({ - hexpand: true, - label: "Press '󰑐' to search", - }), - ], - }), - ]); - } - return (self.children = bluetooth.devices - .filter( - (device) => - device.name !== null && - !bluetooth.connected_devices.find( - (dev) => dev.address === device.address, - ), - ) - .map((device) => { - return Widget.Button({ - hexpand: true, - class_name: `menu-button bluetooth ${device}`, - on_primary_click: () => { - device.setConnection(true); - }, - child: Widget.Box({ - children: [ - Widget.Box({ - hpack: "start", - children: [ - Widget.Icon({ - class_name: "menu-button-icon bluetooth", - icon: `${device["icon-name"]}-symbolic`, - }), - Widget.Label({ - hexpand: true, - class_name: "menu-button-name bluetooth", - truncate: "end", - wrap: true, - label: device.alias, - }), - ], - }), - Widget.Box({ - hpack: "end", - children: device.connecting - ? [ - Widget.Label({ - class_name: "bluetooth-isconnecting", - label: "󰲼", - }), - ] - : [], - }), - ], - }), - }); - })); - }), - }); - }; - - const bluetoothOnModule = () => { - return Widget.Box({ - vertical: true, - children: [ - Widget.Box({ - class_name: "menu-container bluetooth", - children: [ - Widget.Box({ - vertical: true, - children: [ - Widget.Box({ - class_name: "menu-label-container bluetooth", - children: [ - Widget.Box({ - hpack: "start", - child: Widget.Label({ - class_name: "menu-label bluetooth", - label: "Devices", - }), - }), - Widget.Box({ - hexpand: true, - hpack: "end", - child: Widget.Button({ - class_name: "menu-icon-button", - on_primary_click: () => { - Utils.execAsync([ - "bash", - "-c", - "bluetoothctl --timeout 120 scan on", - ]).catch((err) => - console.error( - "bluetoothctl --timeout 120 scan on", - err, - ), - ); - }, - child: Widget.Icon("view-refresh-symbolic"), - }), - }), - ], - }), - Widget.Box({ - child: renderDevices(), - }), - ], - }), - ], - }), - ], - }); - }; - - const bluetoothOffModule = () => { - return Widget.Box({ - class_name: "bluetooth-disabled-menu", - vertical: true, - children: [ - Widget.Label({ - hexpand: true, - vexpand: true, - label: bluetooth - .bind("state") - .as((state) => - state === "turning-off" - ? "Bluetooth is turning off..." - : "Bluetooth is disabled", - ), - }), - ], - }); - }; return DropdownMenu({ name: "bluetoothmenu", transition: "crossfade", - minWidth: 350, child: Widget.Box({ class_name: "menu-items", + hpack: "fill", + hexpand: true, child: Widget.Box({ vertical: true, - class_name: "menu-items-container", - children: [ - Widget.Box({ - class_name: "menu-dropdown-label-container", - children: [ - Widget.Box({ - hexpand: true, - hpack: "start", - child: Widget.Label({ - class_name: "menu-dropdown-label bluetooth", - label: "Bluetooth", - }), - }), - Widget.Box({ - hexpand: true, - hpack: "end", - children: [ - // NOTE: Do we want to add this back to restart bluetooth service if it every hangs? - // Widget.Button({ - // class_name: "menu-icon-button restart-bluetooth-service", - // tooltip_text: "Restart Bluetooth Service", - // on_primary_click: () => Utils.execAsync('systemctl restart bluetooth'), - // child: Widget.Label({ - // class_name: "menu-icon-button-label", - // label: "󱄌" - // }) - // }), - Widget.Switch({ - class_name: "menu-switch bluetooth", - active: bluetooth.bind("enabled"), - on_activate: ({ active }) => - Utils.execAsync([ - "bash", - "-c", - `bluetoothctl power ${active ? "on" : "off"}`, - ]).catch((err) => - console.error( - `bluetoothctl power ${active ? "on" : "off"}`, - err, - ), - ), - }), - ], - }), - ], - }), - Widget.Box({ - vertical: true, - children: bluetooth.bind("enabled").as((isOn) => - isOn - ? [ - Widget.Box({ - class_name: "menu-label-container", - child: Widget.Label({ - class_name: "menu-label bluetooth", - hpack: "start", - label: "My Devices", - }), - }), - Widget.Box({ - vertical: true, - class_name: "menu-item-box", - child: bluetooth - .bind("connected_devices") - .as((btConDevs) => connectedDevices(btConDevs)), - }), - ] - : [], - ), - }), - Widget.Box({ - vertical: true, - child: bluetooth - .bind("enabled") - .as((btEnabled) => - btEnabled ? bluetoothOnModule() : bluetoothOffModule(), - ), - }), - ], + hpack: "fill", + hexpand: true, + class_name: "menu-items-container bluetooth", + child: Devices(), }), }), }); diff --git a/modules/menus/network/ethernet/index.js b/modules/menus/network/ethernet/index.js index 49ac325..0cf169d 100644 --- a/modules/menus/network/ethernet/index.js +++ b/modules/menus/network/ethernet/index.js @@ -11,54 +11,52 @@ const Ethernet = () => { child: Widget.Label({ class_name: "menu-label", hexpand: true, - hpack: "center", + hpack: "start", label: "Ethernet", }), }), Widget.Box({ class_name: "menu-items-section", vertical: true, - children: [ - Widget.Box({ - class_name: "menu-content", - vertical: true, - child: network.bind("wired").as((wired) => { - return Widget.Box({ - class_name: "network-element-item", - child: Widget.Box({ - hpack: "start", - children: [ - Widget.Icon({ - class_name: `network-icon ethernet ${network.wired.state === "activated" ? "active" : ""}`, - tooltip_text: wired.internet, - icon: `${wired["icon_name"]}`, - }), - Widget.Box({ - class_name: "connection-container", - vertical: true, - children: [ - Widget.Label({ - class_name: "active-connection", - hpack: "start", - truncate: "end", - wrap: true, - label: `Ethernet Connection ${typeof wired.speed === "number" ? `(${wired.speed / 1000} Gbps)` : ""}`, - }), - Widget.Label({ - hpack: "start", - class_name: "connection-status dim", - label: - wired.internet.charAt(0).toUpperCase() + - wired.internet.slice(1), - }), - ], - }), - ], - }), - }); - }), + child: Widget.Box({ + class_name: "menu-content", + vertical: true, + child: network.bind("wired").as((wired) => { + return Widget.Box({ + class_name: "network-element-item", + child: Widget.Box({ + hpack: "start", + children: [ + Widget.Icon({ + class_name: `network-icon ethernet ${network.wired.state === "activated" ? "active" : ""}`, + tooltip_text: wired.internet, + icon: `${wired["icon_name"]}`, + }), + Widget.Box({ + class_name: "connection-container", + vertical: true, + children: [ + Widget.Label({ + class_name: "active-connection", + hpack: "start", + truncate: "end", + wrap: true, + label: `Ethernet Connection ${typeof wired.speed === "number" ? `(${wired.speed / 1000} Gbps)` : ""}`, + }), + Widget.Label({ + hpack: "start", + class_name: "connection-status dim", + label: + wired.internet.charAt(0).toUpperCase() + + wired.internet.slice(1), + }), + ], + }), + ], + }), + }); }), - ], + }), }), ], }); diff --git a/modules/menus/network/wifi/APStaging.js b/modules/menus/network/wifi/APStaging.js index 481bce2..013af04 100644 --- a/modules/menus/network/wifi/APStaging.js +++ b/modules/menus/network/wifi/APStaging.js @@ -1,6 +1,5 @@ const renderWapStaging = (self, network, staging, connecting) => { Utils.merge([network.bind("wifi"), staging.bind("value")], () => { - console.log(JSON.stringify(network, null, 2)); if (!Object.keys(staging.value).length) { return (self.child = Widget.Box()); } diff --git a/modules/menus/network/wifi/index.js b/modules/menus/network/wifi/index.js index 8943bad..e4608ca 100644 --- a/modules/menus/network/wifi/index.js +++ b/modules/menus/network/wifi/index.js @@ -16,7 +16,7 @@ const Wifi = () => { child: Widget.Label({ class_name: "menu-label", hexpand: true, - hpack: "center", + hpack: "start", label: "Wi-Fi", }), }), diff --git a/modules/menus/notifications/index.js b/modules/menus/notifications/index.js index 4f4c5f6..6cfc260 100644 --- a/modules/menus/notifications/index.js +++ b/modules/menus/notifications/index.js @@ -82,8 +82,6 @@ export default () => { vertical: true, setup: (self) => { self.hook(notifs, () => { - console.log(JSON.stringify(notifs, null, 2)); - const notifHasImg = (notif) => { return notif.image !== undefined && notif.image.length; }; diff --git a/scss/common/common.scss b/scss/common/common.scss index 35ab4d0..6968654 100644 --- a/scss/common/common.scss +++ b/scss/common/common.scss @@ -1,3 +1,5 @@ +@import "../colors"; + menu { margin: 6px; padding: 6px; @@ -201,8 +203,8 @@ tooltip { } tooltip.background { - background-color: $primary_bg; - color: $default_fg; + background-color: $crust; + color: $text; border-radius: 6px; } diff --git a/scss/menus/bluetooth.scss b/scss/menus/bluetooth.scss index 79f207d..6f67372 100644 --- a/scss/menus/bluetooth.scss +++ b/scss/menus/bluetooth.scss @@ -1,47 +1,91 @@ @import "../colors"; -.menu-dropdown-label.bluetooth { - color: $sky; -} +.menu-items-container.bluetooth { + font-size: 1.3em; + .menu-section-container { + margin: 1.35em 0em; + } -.menu-label.bluetooth { - color: $sky; -} + .menu-label-container { + .menu-label { + color: $sky; + } -.menu-button-isactive.bluetooth { - color: $sky; -} + .controls-container { + margin: 0.5em 1em; + } + } -.menu-button.bluetooth { - &:hover { + + .menu-items-section { + min-height: 20em; + font-size: 1em; + } + + button { + margin-right: 0.5em; + &.search { + @keyframes spin { + to { -gtk-icon-transform: rotate(1turn); } + } + + image.spinning { + animation-name: spin; + animation-duration: 1s; + animation-timing-function: linear; + animation-iteration-count: infinite; + } + image { + color: $text; + } + &:hover image { + color: $sky; + } + font-size: 0.8em; + margin-bottom: 0em; + } + &:hover { + color: $sky; + } + } + + .bluetooth-element-item { + margin-bottom: 0.5em; + // background: $teal; + &:hover { + color: $sky; + } + + image { + // background: $red; + margin-right: 0em; + margin-top: 0.0em; + min-height: 1em; + min-width: 1em; + + &.active { + color: $sky; + } + } + + label { + // background: $yellow; + font-size: 1em; + } + + .connection-status { + font-size: 0.9em; + margin-left: 0.8em; + } + } + + spinner { + min-height: 1.3em; + min-width: 1.3em; color: $sky; } -} -.menu-items { - min-width: 350px; -} - -.menu-icon-button { - font-size: 1.2rem; - min-width: 2rem; - &:hover { - color: $sky; + .menu-separator { + margin: 0em 1em; } } - -.menu-icon-button.delete { - margin-left: 0.5rem; -} - -.menu-icon-button-label { - font-size: 1.3rem; -} - -.menu-button-name.status { - margin-left: 2.1rem; -} - -.bluetooth-isconnecting { - color: $sky; -} diff --git a/scss/menus/menu.scss b/scss/menus/menu.scss index 1de9ad4..5416b07 100644 --- a/scss/menus/menu.scss +++ b/scss/menus/menu.scss @@ -239,11 +239,14 @@ tooltip label { margin-bottom: 0.5rem; } .dropdown-menu-container { - // margin: 1.5em; - // box-shadow: 0 0 0.6em $mantle; + min-height: 10em; } .top-right-event-box_top *{ min-height: 0em; margin-top: 2.5em; } +.menu-label { + margin: 0.5em 1em; + color: $sky; +} diff --git a/scss/menus/network.scss b/scss/menus/network.scss index c3441ba..dda412b 100644 --- a/scss/menus/network.scss +++ b/scss/menus/network.scss @@ -29,7 +29,7 @@ } .menu-section-container.wifi { .menu-items-section { - min-height: 3em; + min-height: 12em; } } diff --git a/style.css b/style.css index e227314..f264053 100644 --- a/style.css +++ b/style.css @@ -207,8 +207,8 @@ tooltip { } tooltip.background { - background-color: #0e0e1e; - color: #CDD6F4; + background-color: #11111b; + color: #cdd6f4; border-radius: 6px; } @@ -633,11 +633,20 @@ tooltip label { margin-bottom: 0.5rem; } +.dropdown-menu-container { + min-height: 10em; +} + .top-right-event-box_top * { min-height: 0em; margin-top: 2.5em; } +.menu-label { + margin: 0.5em 1em; + color: #89dceb; +} + window#powermenu, window#verification { background-color: rgba(0, 0, 0, 0.4); @@ -851,7 +860,7 @@ window#powermenu .powermenu.box { font-size: 0.9em; } .menu-items-container.network .menu-section-container.wifi .menu-items-section { - min-height: 3em; + min-height: 12em; } .menu-items-container.network .network-element-item:not(:last-child) { margin-bottom: 0.5em; @@ -888,49 +897,79 @@ window#powermenu .powermenu.box { color: #eba0ac; } -.menu-dropdown-label.bluetooth { +.menu-items-container.bluetooth { + font-size: 1.3em; +} +.menu-items-container.bluetooth .menu-section-container { + margin: 1.35em 0em; +} +.menu-items-container.bluetooth .menu-label-container .menu-label { color: #89dceb; } - -.menu-label.bluetooth { +.menu-items-container.bluetooth .menu-label-container .controls-container { + margin: 0.5em 1em; +} +.menu-items-container.bluetooth .menu-items-section { + min-height: 20em; + font-size: 1em; +} +.menu-items-container.bluetooth button { + margin-right: 0.5em; +} +.menu-items-container.bluetooth button.search { + font-size: 0.8em; + margin-bottom: 0em; +} +@keyframes spin { + to { + -gtk-icon-transform: rotate(1turn); + } +} +.menu-items-container.bluetooth button.search image.spinning { + animation-name: spin; + animation-duration: 1s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} +.menu-items-container.bluetooth button.search image { + color: #cdd6f4; +} +.menu-items-container.bluetooth button.search:hover image { color: #89dceb; } - -.menu-button-isactive.bluetooth { +.menu-items-container.bluetooth button:hover { color: #89dceb; } - -.menu-button.bluetooth:hover { +.menu-items-container.bluetooth .bluetooth-element-item { + margin-bottom: 0.5em; +} +.menu-items-container.bluetooth .bluetooth-element-item:hover { color: #89dceb; } - -.menu-items { - min-width: 350px; +.menu-items-container.bluetooth .bluetooth-element-item image { + margin-right: 0em; + margin-top: 0em; + min-height: 1em; + min-width: 1em; } - -.menu-icon-button { - font-size: 1.2rem; - min-width: 2rem; -} -.menu-icon-button:hover { +.menu-items-container.bluetooth .bluetooth-element-item image.active { color: #89dceb; } - -.menu-icon-button.delete { - margin-left: 0.5rem; +.menu-items-container.bluetooth .bluetooth-element-item label { + font-size: 1em; } - -.menu-icon-button-label { - font-size: 1.3rem; +.menu-items-container.bluetooth .bluetooth-element-item .connection-status { + font-size: 0.9em; + margin-left: 0.8em; } - -.menu-button-name.status { - margin-left: 2.1rem; -} - -.bluetooth-isconnecting { +.menu-items-container.bluetooth spinner { + min-height: 1.3em; + min-width: 1.3em; color: #89dceb; } +.menu-items-container.bluetooth .menu-separator { + margin: 0em 1em; +} .media-indicator-container { min-width: 35rem; diff --git a/style.css.map b/style.css.map index 20bc19d..08c6afb 100644 --- a/style.css.map +++ b/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/notifications.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/menus/media.scss","scss/menus/notifications.scss","scss/menus/calendar.scss","scss/notifications/popups.scss"],"names":[],"mappings":"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","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/notifications.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/menus/media.scss","scss/menus/notifications.scss","scss/menus/calendar.scss","scss/notifications/popups.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACFF;EACE;EACA;EACA,kBCJgB;EDKhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBClBW;;ADoBf;EACE,OCrBa;;ADuBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBCjCe;;;ADqCnB;EACE;EACA;EACA;EACA,OCzCiB;;;AD4CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBChEiB;EDiEjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBChFgB;;;ADmFlB;AAAA;EAEE;EACA,kBCtFgB;;;ADyFlB;AAAA;AAAA;EAGE,OC5FgB;ED6FhB,kBC9CW;;;ADiDb;AAAA;AAAA;EAGE;EACA,kBCrDW;;;ADwDb;AAAA;AAAA;EAGE;EACA,kBC5DW;;;AD+Db;EACE;EACA;EACA;EACA;EACA,kBClHiB;EDmHjB;EACA;EACA;;;AAGF;EACE,kBC3EW;;;AD8Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCzIc;ED0Id;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBClKiB;;;ADqKnB;EACE;EACA,kBCzHW;;;AD4Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OC3IW;ED4IX,kBC3LgB;ED4LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBCnKM;EDoKN,OChLK;EDiLL;;;AAGF;EACE;EACA;EACA,kBCnNiB;;;ADsNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AEjOF;EACE,YDoCM;ECnCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD4BM;EC3BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;EA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","file":"style.css"} \ No newline at end of file