123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- 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
|