function Manager:render(area) self.area = area local chunks = ui.Layout() :direction(ui.Layout.HORIZONTAL) :constraints({ ui.Constraint.Ratio(MANAGER.ratio.parent, MANAGER.ratio.all), ui.Constraint.Ratio(MANAGER.ratio.current, MANAGER.ratio.all), ui.Constraint.Ratio(MANAGER.ratio.preview, MANAGER.ratio.all), }) :split(area) local bar = function(c, x, y) return ui.Bar( ui.Rect({ x = math.max(0, x), y = math.max(0, y), w = math.min(1, area.w), h = math.min(1, area.h), }), ui.Bar.TOP ):symbol(c) end return ya.flat({ -- Borders ui.Border(area, ui.Border.ALL):type(ui.Border.ROUNDED), ui.Bar(chunks[1], ui.Bar.RIGHT), ui.Bar(chunks[3], ui.Bar.LEFT), bar("┬", chunks[1].right - 1, chunks[1].y), bar("┴", chunks[1].right - 1, chunks[1].bottom - 1), bar("┬", chunks[2].right, chunks[2].y), bar("┴", chunks[2].right, chunks[1].bottom - 1), -- Parent Parent:render(chunks[1]:padding(ui.Padding.xy(1))), -- Current Current:render(chunks[2]:padding(ui.Padding.y(1))), -- Preview Preview:render(chunks[3]:padding(ui.Padding.xy(1))), }) end Status = { area = ui.Rect.default } function Status.style() if cx.active.mode.is_select then return THEME.status.mode_select elseif cx.active.mode.is_unset then return THEME.status.mode_unset else return THEME.status.mode_normal end end function Status:mode() local mode = tostring(cx.active.mode):upper() if mode == "UNSET" then mode = "UN-SET" end local style = self.style() return ui.Line({ ui.Span(THEME.status.separator_open):fg(style.bg), ui.Span(" " .. mode .. " "):style(style), }) end function Status:size() local h = cx.active.current.hovered if h == nil then return ui.Line({}) end local style = self.style() return ui.Line({ ui.Span(" " .. ya.readable_size(h:size() or h.cha.length) .. " ") :fg(style.bg) :bg(THEME.status.separator_style.bg), ui.Span(THEME.status.separator_close):fg(THEME.status.separator_style.fg), }) end function Status:name() local h = cx.active.current.hovered if h == nil then return ui.Span("") end local linked = "" if h.link_to ~= nil then linked = " -> " .. tostring(h.link_to) end return ui.Span(" " .. h.name .. linked) end function Status:permissions() local h = cx.active.current.hovered if h == nil then return ui.Line({}) end local perm = h.cha:permissions() if perm == nil then return ui.Line({}) end local spans = {} for i = 1, #perm do local c = perm:sub(i, i) local style = THEME.status.permissions_t if c == "-" then style = THEME.status.permissions_s elseif c == "r" then style = THEME.status.permissions_r elseif c == "w" then style = THEME.status.permissions_w elseif c == "x" or c == "s" or c == "S" or c == "t" or c == "T" then style = THEME.status.permissions_x end spans[i] = ui.Span(c):style(style) end return ui.Line(spans) end function Status:percentage() local percent = 0 local cursor = cx.active.current.cursor local length = #cx.active.current.files if cursor ~= 0 and length ~= 0 then percent = math.floor((cursor + 1) * 100 / length) end if percent == 0 then percent = " Top " else percent = string.format(" %3d%% ", percent) end local style = self.style() return ui.Line({ ui.Span(" " .. THEME.status.separator_open):fg(THEME.status.separator_style.fg), ui.Span(percent):fg(style.bg):bg(THEME.status.separator_style.bg), }) end function Status:position() local cursor = cx.active.current.cursor local length = #cx.active.current.files local style = self.style() return ui.Line({ ui.Span(string.format(" %2d/%-2d ", cursor + 1, length)):style(style), ui.Span(THEME.status.separator_close):fg(style.bg), }) end function Status:render(area) self.area = area local left = ui.Line({ self:mode(), self:size(), self:name() }) local right = ui.Line({ self:owner(), self:permissions(), self:percentage(), self:position(), }) return { ui.Paragraph(area, { left }), ui.Paragraph(area, { right }):align(ui.Paragraph.RIGHT), table.unpack(Progress:render(area, right:width())), } end function Status:owner() local h = cx.active.current.hovered if h == nil or ya.target_family() ~= "unix" then return ui.Line({}) end return ui.Line({ ui.Span(ya.user_name(h.cha.uid) or tostring(h.cha.uid)):fg("magenta"), ui.Span(":"), ui.Span(ya.group_name(h.cha.gid) or tostring(h.cha.gid)):fg("magenta"), ui.Span(" "), }) end