121 lines
3.1 KiB
Lua
121 lines
3.1 KiB
Lua
--
|
|
-- SymbolResults Widget/View.
|
|
-- @copyright Jefferson Gonzalez
|
|
-- @license MIT
|
|
--
|
|
|
|
local style = require "core.style"
|
|
local Widget = require "libraries.widget"
|
|
local Label = require "libraries.widget.label"
|
|
local Line = require "libraries.widget.line"
|
|
local ListBox = require "libraries.widget.listbox"
|
|
local Server = require "plugins.lsp.server"
|
|
|
|
local Lsp = {}
|
|
|
|
---@class lsp.symbolresults : widget
|
|
---@field public searching boolean
|
|
---@field public symbol string
|
|
---@field private title widget.label
|
|
---@field private line widget.line
|
|
---@field private list_container widget
|
|
---@field private list widget.listbox
|
|
local SymbolResults = Widget:extend()
|
|
|
|
function SymbolResults:new(symbol)
|
|
SymbolResults.super.new(self)
|
|
|
|
Lsp = require "plugins.lsp"
|
|
|
|
self.name = "Symbols Search"
|
|
self.defer_draw = false
|
|
|
|
self.searching = true
|
|
self.symbol = symbol or ""
|
|
self.title = Label(self, "Searching symbols for: " .. symbol)
|
|
self.line = Line(self, 2, style.padding.x)
|
|
|
|
self.list_container = Widget(self)
|
|
self.list_container.border.width = 0
|
|
self.list_container:set_size(200, 200)
|
|
|
|
self.list = ListBox(self.list_container)
|
|
self.list.border.width = 0
|
|
|
|
self.list:enable_expand(true)
|
|
self.list:add_column("Num.")
|
|
self.list:add_column("Symbol")
|
|
self.list:add_column("Kind")
|
|
self.list:add_column("Location")
|
|
|
|
local list_on_row_click = self.list.on_row_click
|
|
self.list.on_row_click = function(this, idx, data)
|
|
list_on_row_click(this, idx, data)
|
|
self:on_selected(idx, data)
|
|
end
|
|
|
|
self.num = 1
|
|
|
|
self.border.width = 0
|
|
self:set_size(200, 200)
|
|
self:show()
|
|
end
|
|
|
|
function SymbolResults:add_result(result)
|
|
local preview, position = Lsp.get_location_preview(result.location)
|
|
local container_name = result.containerName and
|
|
result.containerName .. "\n" or ""
|
|
|
|
local row = {
|
|
tostring(self.num),
|
|
ListBox.COLEND,
|
|
style.syntax.keyword, container_name .. result.name,
|
|
ListBox.COLEND,
|
|
style.syntax.literal, Server.get_symbol_kind(result.kind),
|
|
ListBox.COLEND,
|
|
style.text, position, ListBox.NEWLINE, style.accent, preview
|
|
}
|
|
|
|
self.num = self.num + 1
|
|
|
|
self.list:add_row(row, result)
|
|
end
|
|
|
|
function SymbolResults:stop_searching()
|
|
self.searching = false
|
|
end
|
|
|
|
function SymbolResults:on_selected(idx, data)
|
|
Lsp.goto_location(data.location)
|
|
end
|
|
|
|
function SymbolResults:update()
|
|
if not SymbolResults.super.update(self) then return end
|
|
-- update the positions and sizes
|
|
self.background_color = style.background
|
|
self.title:set_position(style.padding.x, style.padding.y)
|
|
if not self.searching or #self.list.rows > 0 then
|
|
local label = "Finished: "
|
|
if self.searching then
|
|
label = "Searching: "
|
|
end
|
|
self.title:set_label(
|
|
label
|
|
.. #self.list.rows
|
|
.. " results found for "
|
|
.. '"'
|
|
.. self.symbol
|
|
.. '"'
|
|
)
|
|
end
|
|
self.line:set_position(0, self.title:get_bottom() + 10)
|
|
self.list_container:set_position(style.padding.x, self.line:get_bottom() + 10)
|
|
self.list_container:set_size(
|
|
self.size.x - (style.padding.x * 2),
|
|
self.size.y - self.line:get_bottom()
|
|
)
|
|
end
|
|
|
|
|
|
return SymbolResults
|
|
|