mirror of
https://github.com/sxyazi/yazi.git
synced 2026-05-13 08:16:40 +00:00
Co-authored-by: Lingxuan Ye <yelingxuan@xiaomi.com> Co-authored-by: sxyazi <sxyazi@gmail.com>
107 lines
2.8 KiB
Lua
107 lines
2.8 KiB
Lua
--- @sync peek
|
|
|
|
local M = {}
|
|
|
|
function M:peek(job)
|
|
local folder = cx.active.preview.folder
|
|
if not folder then
|
|
return ya.preview_widget(job, ui.Line("Loading..."):area(job.area):align(ui.Align.CENTER))
|
|
elseif folder.cwd ~= job.file.url then
|
|
return
|
|
end
|
|
|
|
local bound = math.max(0, #folder.files - job.area.h)
|
|
if job.skip > bound then
|
|
return ya.emit("peek", { bound, only_if = job.file.url, upper_bound = true })
|
|
end
|
|
|
|
if #folder.files == 0 then
|
|
local done, err = folder.stage()
|
|
local s = not done and "Loading..." or not err and "No items" or string.format("Error: %s", err)
|
|
return ya.preview_widget(job, ui.Text(s):area(job.area):align(ui.Align.CENTER):wrap(ui.Wrap.YES))
|
|
end
|
|
|
|
local left, right = {}, {}
|
|
for _, f in ipairs(folder.window) do
|
|
local entity = Entity:new(f)
|
|
left[#left + 1], right[#right + 1] = entity:redraw(), Linemode:new(f):redraw()
|
|
|
|
local max = math.max(0, job.area.w - right[#right]:width())
|
|
left[#left]:truncate { max = max, ellipsis = entity:ellipsis(max) }
|
|
end
|
|
|
|
local marker_area = job.area { x = math.max(0, job.area.x - 1) }
|
|
ya.preview_widget(job, {
|
|
ui.List(left):area(job.area),
|
|
ui.Text(right):area(job.area):align(ui.Align.RIGHT),
|
|
table.unpack(Marker:new(marker_area, folder):redraw()),
|
|
})
|
|
end
|
|
|
|
function M:seek(job)
|
|
local folder = cx.active.preview.folder
|
|
if folder and folder.cwd == job.file.url then
|
|
local step = math.floor(job.units * job.area.h / 10)
|
|
local bound = math.max(0, #folder.files - job.area.h)
|
|
ya.emit("peek", {
|
|
ya.clamp(0, cx.active.preview.skip + step, bound),
|
|
only_if = job.file.url,
|
|
})
|
|
end
|
|
end
|
|
|
|
function M:spot(job)
|
|
local i, url = 0, job.file.url
|
|
for rows in self:spot_base(job) do
|
|
i, rows[#rows + 1] = i + 1, ui.Row {}
|
|
ya.spot_table(
|
|
job,
|
|
ui.Table(ya.list_merge(rows, require("file"):spot_base(job)))
|
|
: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) }
|
|
)
|
|
end
|
|
if self.size then
|
|
ya.emit("update_files", { op = fs.op("size", { url = url.parent, sizes = { [url.urn] = self.size } }) })
|
|
end
|
|
end
|
|
|
|
function M:spot_base(job)
|
|
local function yield(s)
|
|
coroutine.yield {
|
|
ui.Row({ "Folder" }):style(ui.Style():fg("green")),
|
|
ui.Row { " Size:", s },
|
|
}
|
|
end
|
|
|
|
self.size = nil
|
|
return ya.co(function()
|
|
yield("0B (?)")
|
|
|
|
local it, size, last = fs.calc_size(job.file.url), 0, 0
|
|
if not it then
|
|
return yield("Error")
|
|
end
|
|
|
|
while true do
|
|
local next, now = it:recv(), ya.time()
|
|
if not next then
|
|
break
|
|
elseif now >= last + 0.1 then
|
|
last, size = now, size + next
|
|
yield(ya.readable_size(size) .. " (?)")
|
|
else
|
|
size = size + next
|
|
end
|
|
end
|
|
|
|
self.size = size
|
|
yield(ya.readable_size(size))
|
|
end)
|
|
end
|
|
|
|
return M
|