1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
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
|