aboutsummaryrefslogtreecommitdiff
path: root/data/core/statusview.lua
blob: 1cf71be7091d71760ceb4602fbdf8e01fb442230 (plain)
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