143 lines
3.8 KiB
Lua

local colors = require("colors").sections.widgets.volume
local icons = require "icons"
local popup_width = 250
local volume_icon = sbar.add("item", "widgets.volume", {
position = "right",
icon = {
color = colors.icon,
},
label = { drawing = false },
background = { drawing = false },
popup = {
align = "center",
y_offset = 2,
},
padding_right = 8,
})
local volume_slider = sbar.add("slider", popup_width, {
position = "popup." .. volume_icon.name,
slider = {
highlight_color = colors.slider.highlight,
background = {
height = 12,
corner_radius = 6,
color = colors.slider.bg,
border_color = colors.slider.border,
border_width = 2,
},
knob = {
string = "􀀁",
drawing = true,
},
},
background = { color = colors.bg1, height = 2, y_offset = -20 },
click_script = 'osascript -e "set volume output volume $PERCENTAGE"',
})
volume_icon:subscribe("volume_change", function(env)
local icon = icons.volume._0
local volume = tonumber(env.INFO)
sbar.exec("SwitchAudioSource -t output -c", function(result)
if volume > 60 then
icon = icons.volume._100
elseif volume > 30 then
icon = icons.volume._66
elseif volume > 10 then
icon = icons.volume._33
elseif volume > 0 then
icon = icons.volume._10
end
volume_icon:set { icon = icon }
volume_slider:set { slider = { percentage = volume } }
end)
end)
local function volume_collapse_details()
local drawing = volume_icon:query().popup.drawing == "on"
if not drawing then
return
end
volume_icon:set { popup = { drawing = false } }
sbar.remove "/volume.device\\.*/"
end
local current_audio_device = "None"
local function volume_toggle_details(env)
if env.BUTTON == "right" then
sbar.exec "open /System/Library/PreferencePanes/Sound.prefpane"
return
end
local should_draw = volume_icon:query().popup.drawing == "off"
if should_draw then
volume_icon:set { popup = { drawing = true } }
sbar.exec("SwitchAudioSource -t output -c", function(result)
current_audio_device = result:sub(1, -2)
sbar.exec("SwitchAudioSource -a -t output", function(available)
local current = current_audio_device
local color = colors.popup.item
local counter = 0
for device in string.gmatch(available, "[^\r\n]+") do
if current == device then
color = colors.popup.highlight
end
sbar.add("item", "volume.device." .. counter, {
position = "popup." .. volume_icon.name,
width = popup_width,
align = "center",
label = { string = device, color = color },
background = { drawing = false },
click_script = 'SwitchAudioSource -s "'
.. device
.. '" && sketchybar --set /volume.device\\.*/ label.color='
.. colors.popup.item
.. " --set $NAME label.color="
.. colors.popup.highlight,
})
counter = counter + 1
end
end)
end)
else
volume_collapse_details()
end
end
local function volume_scroll(env)
local delta = env.SCROLL_DELTA
sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"')
end
volume_icon:subscribe("mouse.clicked", function(env)
volume_toggle_details(env)
-- sbar.animate("tanh", 8, function()
-- volume_icon:set({
-- background = {
-- shadow = {
-- distance = 0,
-- },
-- },
-- y_offset = -4,
-- padding_left = 8,
-- padding_right = 0,
-- })
-- volume_icon:set({
-- background = {
-- shadow = {
-- distance = 4,
-- },
-- },
-- y_offset = 0,
-- padding_left = 4,
-- padding_right = 4,
-- })
-- end)
end)
volume_icon:subscribe("mouse.scrolled", volume_scroll)