Allow `TreeView` item icon and text styling

This commit is contained in:
Guldoman 2021-11-29 23:26:03 +01:00
parent 7b82d787c0
commit e500368ce4
No known key found for this signature in database
GPG Key ID: C08A498EC7F1AFDD
1 changed files with 34 additions and 24 deletions

View File

@ -288,9 +288,27 @@ function TreeView:draw_tooltip()
end end
function TreeView:color_for_item(abs_filename) function TreeView:get_item_icon(item, active, hovered)
-- other plugins can override this to customize the color of each icon local character = "f"
return nil if item.type == "dir" then
character = item.expanded and "D" or "d"
end
local font = style.icon_font
local color = style.text
if active or hovered then
color = style.accent
end
return character, font, color
end
function TreeView:get_item_text(item, active, hovered)
local text = item.name
local font = style.font
local color = style.text
if active or hovered then
color = style.accent
end
return text, font, color
end end
@ -304,40 +322,32 @@ function TreeView:draw()
local active_filename = doc and system.absolute_path(doc.filename or "") local active_filename = doc and system.absolute_path(doc.filename or "")
for item, x,y,w,h in self:each_item() do for item, x,y,w,h in self:each_item() do
local color = style.text local icon_char, icon_font, icon_color =
self:get_item_icon(item, item.abs_filename == active_filename,
-- highlight active_view doc item == self.hovered_item)
if item.abs_filename == active_filename then local item_text, item_font, item_color =
color = style.accent self:get_item_text(item, item.abs_filename == active_filename,
end item == self.hovered_item)
-- hovered item background -- hovered item background
if item == self.hovered_item then if item == self.hovered_item then
renderer.draw_rect(x, y, w, h, style.line_highlight) renderer.draw_rect(x, y, w, h, style.line_highlight)
color = style.accent
end end
-- allow for color overrides
local icon_color = self:color_for_item(item.abs_filename) or color
-- icons -- icons
x = x + item.depth * style.padding.x + style.padding.x x = x + item.depth * style.padding.x + style.padding.x
if item.type == "dir" then if item.type == "dir" then
local icon1 = item.expanded and "-" or "+" local expand_icon = item.expanded and "-" or "+"
local icon2 = item.expanded and "D" or "d" local expand_color = item == self.hovered_item and style.accent or style.text
common.draw_text(style.icon_font, color, icon1, nil, x, y, 0, h) common.draw_text(style.icon_font, expand_color, expand_icon, nil, x, y, 0, h)
x = x + style.padding.x
common.draw_text(style.icon_font, icon_color, icon2, nil, x, y, 0, h)
x = x + icon_width
else
x = x + style.padding.x
common.draw_text(style.icon_font, icon_color, "f", nil, x, y, 0, h)
x = x + icon_width
end end
x = x + style.padding.x
common.draw_text(icon_font, icon_color, icon_char, nil, x, y, 0, h)
x = x + icon_width
-- text -- text
x = x + spacing x = x + spacing
x = common.draw_text(style.font, color, item.name, nil, x, y, 0, h) x = common.draw_text(item_font, item_color, item_text, nil, x, y, 0, h)
end end
self:draw_scrollbar() self:draw_scrollbar()