mirror of https://github.com/lcpz/lain.git
menu_iterator: naughty.notify based menu utility
This commit is contained in:
parent
d99ce8fdba
commit
b94e701ff2
|
@ -0,0 +1,66 @@
|
||||||
|
--[[
|
||||||
|
|
||||||
|
Licensed under GNU General Public License v2
|
||||||
|
* (c) 2017, Simon Désaulniers <sim.desaulniers@gmail.com>
|
||||||
|
* (c) 2017, Uli Schlachter
|
||||||
|
* (c) 2017, Jeferson Siqueira <jefersonlsiq@gmail.com>
|
||||||
|
|
||||||
|
--]]
|
||||||
|
|
||||||
|
-- Menu iterator using naughty.notify
|
||||||
|
|
||||||
|
local naughty = require("naughty")
|
||||||
|
|
||||||
|
local state = { cid = nil }
|
||||||
|
|
||||||
|
local function naughty_destroy_callback(reason)
|
||||||
|
if reason == naughty.notificationClosedReason.expired or
|
||||||
|
reason == naughty.notificationClosedReason.dismissedByUser then
|
||||||
|
local actions = state.index and state.menu[state.index - 1][2]
|
||||||
|
if actions then
|
||||||
|
for _,action in pairs(actions) do
|
||||||
|
-- don't try to call nil callbacks
|
||||||
|
if action then action() end
|
||||||
|
end
|
||||||
|
state.index = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Iterates over a list of pairs {label, {callbacks}}. After timeout, the last
|
||||||
|
-- visited choice associated callbacks are executed.
|
||||||
|
-- * menu: a list of pairs {label, {callbacks}
|
||||||
|
-- * timeout: time to wait before confirming menu selection
|
||||||
|
-- * icon: icon to display left to the choiced label
|
||||||
|
local function iterate(menu, timeout, icon)
|
||||||
|
timeout = timeout or 4 -- default timeout for each menu entry
|
||||||
|
icon = icon or nil -- icon to display on the menu
|
||||||
|
|
||||||
|
-- Build the list of choices
|
||||||
|
if not state.index then
|
||||||
|
state.menu = menu
|
||||||
|
state.index = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Select one and display the appropriate notification
|
||||||
|
local label, action
|
||||||
|
local next = state.menu[state.index]
|
||||||
|
state.index = state.index + 1
|
||||||
|
|
||||||
|
if not next then
|
||||||
|
label = "Cancel"
|
||||||
|
state.index = nil
|
||||||
|
else
|
||||||
|
label, _ = unpack(next)
|
||||||
|
end
|
||||||
|
state.cid = naughty.notify({
|
||||||
|
text = label,
|
||||||
|
icon = icon,
|
||||||
|
timeout = timeout,
|
||||||
|
screen = mouse.screen,
|
||||||
|
replaces_id = state.cid,
|
||||||
|
destroy = naughty_destroy_callback
|
||||||
|
}).id
|
||||||
|
end
|
||||||
|
|
||||||
|
return { iterate = iterate }
|
Loading…
Reference in New Issue