136 lines
3 KiB
Lua
136 lines
3 KiB
Lua
|
local core = require "core"
|
||
|
local common = require "core.common"
|
||
|
local config = require "core.config"
|
||
|
local style = require "core.style"
|
||
|
local DocView = require "core.docview"
|
||
|
local View = require "core.view"
|
||
|
|
||
|
|
||
|
local StatusView = View:extend()
|
||
|
|
||
|
local separator = " "
|
||
|
local separator2 = " | "
|
||
|
|
||
|
|
||
|
function StatusView:new()
|
||
|
StatusView.super.new(self)
|
||
|
self.focusable = false
|
||
|
self.message_timeout = 0
|
||
|
self.message = {}
|
||
|
end
|
||
|
|
||
|
|
||
|
function StatusView:show_message(icon, icon_color, text)
|
||
|
self.message = {
|
||
|
icon_color, style.icon_font, icon,
|
||
|
style.dim, style.font, separator2, style.text, text
|
||
|
}
|
||
|
self.message_timeout = system.get_time() + config.message_timeout
|
||
|
end
|
||
|
|
||
|
|
||
|
function StatusView:update()
|
||
|
self.size.y = style.font:get_height() + style.padding.y * 2
|
||
|
|
||
|
if system.get_time() < self.message_timeout then
|
||
|
self.scroll.to.y = self.size.y
|
||
|
else
|
||
|
self.scroll.to.y = 0
|
||
|
end
|
||
|
|
||
|
StatusView.super.update(self)
|
||
|
end
|
||
|
|
||
|
|
||
|
function StatusView:draw_items(items, right_align, yoffset)
|
||
|
local font = style.font
|
||
|
local color = style.text
|
||
|
local x, y = self:get_content_offset()
|
||
|
y = y + (yoffset or 0)
|
||
|
|
||
|
local i
|
||
|
if right_align then
|
||
|
x = x + self.size.x - style.padding.x
|
||
|
i = #items
|
||
|
else
|
||
|
x = x + style.padding.x
|
||
|
i = 1
|
||
|
end
|
||
|
|
||
|
while items[i] do
|
||
|
local item = items[i]
|
||
|
|
||
|
if type(item) == "userdata" then
|
||
|
font = item
|
||
|
elseif type(item) == "table" then
|
||
|
color = item
|
||
|
else
|
||
|
if right_align then
|
||
|
x = x - font:get_width(item)
|
||
|
common.draw_text(font, color, item, nil, x, y, 0, self.size.y)
|
||
|
else
|
||
|
x = common.draw_text(font, color, item, nil, x, y, 0, self.size.y)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
i = i + (right_align and -1 or 1)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
local function draw_for_doc_view(self, x, y)
|
||
|
local dv = core.active_view
|
||
|
local line, col = dv.doc:get_selection()
|
||
|
local dirty = dv.doc:is_dirty()
|
||
|
|
||
|
self:draw_items {
|
||
|
dirty and style.accent or style.text, style.icon_font, "f",
|
||
|
style.dim, style.font, separator2, style.text,
|
||
|
dv.doc.filename and style.text or style.dim, dv.doc:get_name(),
|
||
|
style.text,
|
||
|
separator,
|
||
|
"line: ", line,
|
||
|
separator,
|
||
|
col > config.line_limit and style.accent or style.text, "col: ", col,
|
||
|
style.text,
|
||
|
separator,
|
||
|
string.format("%d%%", line / #dv.doc.lines * 100),
|
||
|
}
|
||
|
|
||
|
self:draw_items({
|
||
|
"g", style.icon_font,
|
||
|
style.text, separator2, style.dim, style.font,
|
||
|
#dv.doc.lines, " lines",
|
||
|
separator,
|
||
|
dv.doc.crlf and "CRLF" or "LF"
|
||
|
}, true)
|
||
|
end
|
||
|
|
||
|
|
||
|
function StatusView:draw()
|
||
|
self:draw_background(style.background2)
|
||
|
|
||
|
local th = style.font:get_height()
|
||
|
local x, y = self:get_content_offset()
|
||
|
x = x + style.padding.x
|
||
|
y = y + (self.size.y - th) / 2
|
||
|
|
||
|
if self.message then
|
||
|
self:draw_items(self.message, false, self.size.y)
|
||
|
end
|
||
|
|
||
|
if getmetatable(core.active_view) == DocView then
|
||
|
draw_for_doc_view(self)
|
||
|
else
|
||
|
self:draw_items({
|
||
|
"g", style.icon_font,
|
||
|
style.text, separator2, style.dim, style.font,
|
||
|
#core.docs, " / ", style.dim,
|
||
|
#core.project_files, " files"
|
||
|
}, true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
return StatusView
|