mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 14:51:03 +00:00
75 lines
1.6 KiB
Lua
75 lines
1.6 KiB
Lua
local M = {}
|
|
|
|
local selected = ya.sync(function()
|
|
local urls = {}
|
|
for _, f in pairs(cx.active.selected) do
|
|
urls[#urls + 1] = f.url
|
|
end
|
|
return urls
|
|
end)
|
|
|
|
function M:spot(job)
|
|
local i = 0
|
|
for rows in self:spot_base(job, selected()) do
|
|
i = i + 1
|
|
ya.spot_table(
|
|
job,
|
|
ui.Table(rows)
|
|
:area(ui.Pos { "center", w = 60, h = 20 })
|
|
:row(i == 1 and 1 or nil)
|
|
:col(1)
|
|
:col_style(th.spot.tbl_col)
|
|
:cell_style(th.spot.tbl_cell)
|
|
:widths { ui.Constraint.Length(14), ui.Constraint.Fill(1) }
|
|
)
|
|
self:update_sizes()
|
|
end
|
|
end
|
|
|
|
function M:spot_base(_, selected)
|
|
local function yield(s)
|
|
coroutine.yield {
|
|
ui.Row({ "Multi" }):style(ui.Style():fg("green")),
|
|
ui.Row { " Size:", s },
|
|
ui.Row { " Count:", string.format("%d selected", #selected) },
|
|
}
|
|
end
|
|
|
|
self.sizes = {}
|
|
return ya.co(function()
|
|
yield("0B (?)")
|
|
|
|
local sum, last = 0, 0
|
|
for _, url in ipairs(selected) do
|
|
local it, size = fs.calc_size(url), 0
|
|
while it do
|
|
local next, now = it:recv(), ya.time()
|
|
if not next then
|
|
self.sizes[url] = it.cha.is_dir and size or nil
|
|
break
|
|
elseif now >= last + 0.1 then
|
|
last, size, sum = now, size + next, sum + next
|
|
yield(ya.readable_size(sum) .. " (?)")
|
|
else
|
|
size, sum = size + next, sum + next
|
|
end
|
|
end
|
|
end
|
|
|
|
yield(ya.readable_size(sum))
|
|
end)
|
|
end
|
|
|
|
function M:update_sizes()
|
|
local parents = {}
|
|
for url, size in pairs(self.sizes) do
|
|
local p = url.parent
|
|
parents[p] = parents[p] or {}
|
|
parents[p][url.urn] = size
|
|
end
|
|
for parent, sizes in pairs(parents) do
|
|
ya.emit("update_files", { op = fs.op("size", { url = parent, sizes = sizes }) })
|
|
end
|
|
end
|
|
|
|
return M
|