import {App, Utils, Widget} from "../imports.js" const {execAsync, exec} = Utils import {MaterialIcon} from "./lib/materialicon.js" import {setupCursorHover} from "./lib/cursorhover.js" const RECORD_SCRIPT_DIR = `${App.configDir}/scripts/record-script.sh` const RECORDER_PROCESS = "record-script.sh" const CLOSE_ANIM_TIME = 150 async function toggleSystemdService(serviceName, button) { const serviceState = exec(`systemctl is-enabled ${serviceName}`) == "enabled" // console.log(`pkexec bash -c "systemctl ${serviceState ? 'disable' : 'enable'} ${serviceName}"`) exec(`pkexec bash -c "systemctl ${serviceState ? "disable" : "enable"} ${serviceName}"`) const newServiceState = exec(`systemctl is-enabled ${serviceName}`) == "enabled" button.toggleClassName("sidebar-button-active", newServiceState) serviceState.toggleClassName("invisible", newServiceState) } const ModuleRecord = (props = {}) => Widget.Button({ ...props, className: "button-minsize sidebar-button-nopad sidebar-button-alone-normal txt-small", onClicked: () => { execAsync(["bash", "-c", RECORD_SCRIPT_DIR]).catch(print) setTimeout(() => { button.toggleClassName( "sidebar-button-active", exec(`pidof ${RECORDER_PROCESS} >/dev/null && echo 1 || echo`) == "1", ) }, CLOSE_ANIM_TIME) }, child: MaterialIcon("screen_record", "larger"), setup: button => { button.toggleClassName( "sidebar-button-active", exec(`pidof ${RECORDER_PROCESS} >/dev/null && echo 1 || echo`), ) setupCursorHover(button) }, }) const SystemdService = serviceName => { const serviceState = Widget.Label({ className: `icon-material txt-larger`, label: "check", setup: label => { // label.toggleClassName('invisible', exec(`bash -c "systemctl is-enabled ${serviceName} >/dev/null && echo ON || echo OFF"`) == 'OFF'); }, }) return Widget.Button({ className: "button-minsize sidebar-button sidebar-button-alone-normal txt-small", onClicked: button => { toggleSystemdService(serviceName, button) }, setup: button => { button.toggleClassName( "sidebar-button-active", exec(`systemctl is-enabled ${serviceName}`) == "enabled", ) setupCursorHover(button) }, child: Widget.Box({ setup: box => { box.pack_start( Widget.Label({ xalign: 0, label: serviceName, }), true, true, 0, ) // box.pack_end(serviceState, false, false, 0); }, }), }) } export const ModuleMiscToggles = () => { const PowerSavers = Widget.Revealer({ revealChild: false, transition: "slide_left", transitionDuration: 100, child: Widget.Box({ className: "spacing-v-5 margin-right-10", vertical: true, children: [SystemdService("tlp"), SystemdService("auto-cpufreq")], }), }) const ModulePowerSavers = Widget.Button({ className: "button-minsize sidebar-button-nopad sidebar-button-alone-normal txt-small", child: MaterialIcon("keyboard_arrow_leftenergy_savings_leaf", "larger", { xalign: 0.2, }), onClicked: button => { const revealed = PowerSavers.revealChild PowerSavers.revealChild = !revealed button.toggleClassName("sidebar-button-active", !revealed) button.child.label = revealed ? "keyboard_arrow_leftenergy_savings_leaf" : "keyboard_arrow_rightenergy_savings_leaf" }, setup: button => setupCursorHover(button), }) return Widget.Box({ className: "sidebar-group spacing-h-10", children: [ PowerSavers, Widget.Box({ vertical: true, className: "spacing-v-5", children: [ ModulePowerSavers, Widget.Box({ className: "spacing-h-5", children: [ModuleNightLight(), ModuleRecord()], }), ], }), ], }) }