aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/plugin_manager/init.lua (renamed from plugins/plugin_manager.lua)202
-rw-r--r--plugins/plugin_manager/plugin_view.lua203
2 files changed, 206 insertions, 199 deletions
diff --git a/plugins/plugin_manager.lua b/plugins/plugin_manager/init.lua
index c832bc9..1769bd0 100644
--- a/plugins/plugin_manager.lua
+++ b/plugins/plugin_manager/init.lua
@@ -1,15 +1,12 @@
-- mod-version:3 --lite-xl 2.1
local core = require "core"
-local style = require "core.style"
local common = require "core.common"
local config = require "core.config"
local command = require "core.command"
local json = require "libraries.json"
-local View = require "core.view"
local keymap = require "core.keymap"
-local ContextMenu = require "core.contextmenu"
-local RootView = require "core.rootview"
+local PluginView = require "plugins.plugin_manager.plugin_view"
local PluginManager = {
@@ -168,201 +165,6 @@ local function get_suggestions(text)
return common.fuzzy_match(items, text)
end
-
-
-local PluginView = View:extend()
-
-
-local function join(joiner, t)
- local s = ""
- for i,v in ipairs(t) do if i > 1 then s = s .. joiner end s = s .. v end
- return s
-end
-
-
-local plugin_view = nil
-PluginView.menu = ContextMenu()
-
-PluginView.menu:register(nil, {
- { text = "Install", command = "plugin-manager:install-hovered" },
- { text = "Uninstall", command = "plugin-manager:uninstall-hovered" }
-})
-
-function PluginView:new()
- PluginView.super.new(self)
- self.scrollable = true
- self.show_incompatible_plugins = false
- self.plugin_table_columns = { "Name", "Version", "Modversion", "Status", "Tags", "Description" }
- self:refresh()
- self.hovered_plugin = nil
- self.hovered_plugin_idx = nil
- self.selected_plugin = nil
- self.selected_plugin_idx = nil
- plugin_view = self
-end
-
-local function get_plugin_text(plugin)
- return plugin.name, plugin.version, plugin.mod_version, plugin.status, join(", ", plugin.tags), plugin.description-- (plugin.description or ""):gsub("%[[^]+%]%([^)]+%)", "")
-end
-
-
-function PluginView:get_name()
- return "Plugin Manager"
-end
-
-
-local root_view_update = RootView.update
-function RootView:update(...)
- root_view_update(self, ...)
- PluginView.menu:update()
-end
-
-
-local root_view_draw = RootView.draw
-function RootView:draw(...)
- root_view_draw(self, ...)
- PluginView.menu:draw()
-end
-
-
-local root_view_on_mouse_moved = RootView.on_mouse_moved
-function RootView:on_mouse_moved(...)
- if PluginView.menu:on_mouse_moved(...) then return end
- return root_view_on_mouse_moved(self, ...)
-end
-
-
-local on_view_mouse_pressed = RootView.on_view_mouse_pressed
-function RootView.on_view_mouse_pressed(button, x, y, clicks)
- local handled = PluginView.menu:on_mouse_pressed(button, x, y, clicks)
- return handled or on_view_mouse_pressed(button, x, y, clicks)
-end
-
-
-function PluginView:on_mouse_moved(x, y, dx, dy)
- PluginView.super.on_mouse_moved(self, x, y, dx, dy)
- local th = style.font:get_height()
- local lh = th + style.padding.y
- local offset = math.floor((y - self.position.y + self.scroll.y) / lh)
- self.hovered_plugin = offset > 0 and self:get_plugins()[offset]
- self.hovered_plugin_idx = offset > 0 and offset
-end
-
-
-function PluginView:refresh()
- self.widths = {}
- for i,v in ipairs(self.plugin_table_columns) do
- table.insert(self.widths, style.font:get_width(v))
- end
- for i, plugin in ipairs(self:get_plugins()) do
- local t = { get_plugin_text(plugin) }
- for j = 1, #self.widths do
- self.widths[j] = math.max(style.font:get_width(t[j] or ""), self.widths[j])
- end
- end
-end
-
-
-function PluginView:get_plugins()
- if self.show_incompatible_plugins then return PluginManager.plugins end
- return PluginManager.valid_plugins
-end
-
-
-function PluginView:get_scrollable_size()
- local th = style.font:get_height() + style.padding.y
- return th * #self:get_plugins()
-end
-
-
-local function mul(color1, color2)
- return { color1[1] * color2[1] / 255, color1[2] * color2[2] / 255, color1[3] * color2[3] / 255, color1[4] * color2[4] / 255 }
-end
-
-
-function PluginView:draw()
- self:draw_background(style.background)
-
- local th = style.font:get_height()
- local lh = th + style.padding.y
-
- local ox, oy = self:get_content_offset()
- core.push_clip_rect(self.position.x, self.position.y, self.size.x, self.size.y)
- local x, y = ox + style.padding.x, oy
- for i, v in ipairs(self.plugin_table_columns) do
- common.draw_text(style.font, style.accent, v, "left", x, y, self.widths[i], lh)
- x = x + self.widths[i] + style.padding.x
- end
- oy = oy + lh
- for i, plugin in ipairs(self:get_plugins()) do
- local x, y = ox, oy
- if y + lh >= self.position.y and y <= self.position.y + self.size.y then
- if plugin == self.selected_plugin then
- renderer.draw_rect(x, y, self.size.x, lh, style.dim)
- elseif plugin == self.hovered_plugin then
- renderer.draw_rect(x, y, self.size.x, lh, style.line_highlight)
- end
- x = x + style.padding.x
- for j, v in ipairs({ get_plugin_text(plugin) }) do
- local color = plugin.status == "installed" and style.good or style.text
- if self.loading then color = mul(color, style.dim) end
- common.draw_text(style.font, color, v, "left", x, y, self.widths[j], lh)
- x = x + self.widths[j] + style.padding.x
- end
- end
- oy = oy + lh
- end
- core.pop_clip_rect()
- PluginView.super.draw_scrollbar(self)
-end
-
-function PluginView:install(plugin)
- self.loading = true
- PluginManager:install(plugin):done(function()
- self.loading = false
- self.selected_plugin, plugin_view.selected_plugin_idx = nil, nil
- end)
-end
-
-function PluginView:uninstall(plugin)
- self.loading = true
- PluginManager:uninstall(plugin):done(function()
- self.loading = false
- self.selected_plugin, plugin_view.selected_plugin_idx = nil, nil
- end)
-end
-
-PluginManager.view = PluginView
-PluginManager:refresh():done(function()
- command.perform("plugin-manager:show")
-end)
-
-command.add(PluginView, {
- ["plugin-manager:select"] = function(x, y)
- plugin_view.selected_plugin, plugin_view.selected_plugin_idx = plugin_view.hovered_plugin, plugin_view.hovered_plugin_idx
- end,
-})
-command.add(function()
- return core.active_view and core.active_view:is(PluginView) and plugin_view.selected_plugin and plugin_view.selected_plugin.status == "available"
-end, {
- ["plugin-manager:install-selected"] = function() plugin_view:install(plugin_view.selected_plugin) end
-})
-command.add(function()
- return core.active_view and core.active_view:is(PluginView) and plugin_view.hovered_plugin and plugin_view.hovered_plugin.status == "available"
-end, {
- ["plugin-manager:install-hovered"] = function() plugin_view:install(plugin_view.hovered_plugin) end
-})
-command.add(function()
- return core.active_view and core.active_view:is(PluginView) and plugin_view.selected_plugin and plugin_view.selected_plugin.status == "installed"
-end, {
- ["plugin-manager:uninstall-selected"] = function() plugin_view:uninstall(plugin_view.selected_plugin) end
-})
-command.add(function()
- return core.active_view and core.active_view:is(PluginView) and plugin_view.hovered_plugin and plugin_view.hovered_plugin.status == "installed"
-end, {
- ["plugin-manager:uninstall-hovered"] = function() plugin_view:uninstall(plugin_view.hovered_plugin) end
-})
-
command.add(nil, {
["plugin-manager:show"] = function()
local node = core.root_view:get_active_node_default()
@@ -393,6 +195,8 @@ command.add(nil, {
["plugin-manager:refresh"] = function() PluginManager:refresh():done(function() core.log("Successfully refreshed plugin listing.") end) end,
})
+PluginManager.view = PluginView
+PluginManager:refresh()
keymap.add {
diff --git a/plugins/plugin_manager/plugin_view.lua b/plugins/plugin_manager/plugin_view.lua
new file mode 100644
index 0000000..5d5af8e
--- /dev/null
+++ b/plugins/plugin_manager/plugin_view.lua
@@ -0,0 +1,203 @@
+
+local core = require "core"
+local style = require "core.style"
+local common = require "core.common"
+local config = require "core.config"
+local command = require "core.command"
+local json = require "libraries.json"
+local View = require "core.view"
+local keymap = require "core.keymap"
+local RootView = require "core.rootview"
+local ContextMenu = require "core.contextmenu"
+
+
+local PluginView = View:extend()
+
+
+local function join(joiner, t)
+ local s = ""
+ for i,v in ipairs(t) do if i > 1 then s = s .. joiner end s = s .. v end
+ return s
+end
+
+
+local plugin_view = nil
+PluginView.menu = ContextMenu()
+
+PluginView.menu:register(nil, {
+ { text = "Install", command = "plugin-manager:install-hovered" },
+ { text = "Uninstall", command = "plugin-manager:uninstall-hovered" }
+})
+
+function PluginView:new()
+ PluginView.super.new(self)
+ self.scrollable = true
+ self.show_incompatible_plugins = false
+ self.plugin_table_columns = { "Name", "Version", "Modversion", "Status", "Tags", "Description" }
+ self:refresh()
+ self.hovered_plugin = nil
+ self.hovered_plugin_idx = nil
+ self.selected_plugin = nil
+ self.selected_plugin_idx = nil
+ plugin_view = self
+end
+
+local function get_plugin_text(plugin)
+ return plugin.name, plugin.version, plugin.mod_version, plugin.status, join(", ", plugin.tags), plugin.description-- (plugin.description or ""):gsub("%[[^]+%]%([^)]+%)", "")
+end
+
+
+function PluginView:get_name()
+ return "Plugin Manager"
+end
+
+
+local root_view_update = RootView.update
+function RootView:update(...)
+ root_view_update(self, ...)
+ PluginView.menu:update()
+end
+
+
+local root_view_draw = RootView.draw
+function RootView:draw(...)
+ root_view_draw(self, ...)
+ PluginView.menu:draw()
+end
+
+
+local root_view_on_mouse_moved = RootView.on_mouse_moved
+function RootView:on_mouse_moved(...)
+ if PluginView.menu:on_mouse_moved(...) then return end
+ return root_view_on_mouse_moved(self, ...)
+end
+
+
+local on_view_mouse_pressed = RootView.on_view_mouse_pressed
+function RootView.on_view_mouse_pressed(button, x, y, clicks)
+ local handled = PluginView.menu:on_mouse_pressed(button, x, y, clicks)
+ return handled or on_view_mouse_pressed(button, x, y, clicks)
+end
+
+
+function PluginView:on_mouse_moved(x, y, dx, dy)
+ PluginView.super.on_mouse_moved(self, x, y, dx, dy)
+ local th = style.font:get_height()
+ local lh = th + style.padding.y
+ local offset = math.floor((y - self.position.y + self.scroll.y) / lh)
+ self.hovered_plugin = offset > 0 and self:get_plugins()[offset]
+ self.hovered_plugin_idx = offset > 0 and offset
+end
+
+
+function PluginView:refresh()
+ self.widths = {}
+ for i,v in ipairs(self.plugin_table_columns) do
+ table.insert(self.widths, style.font:get_width(v))
+ end
+ for i, plugin in ipairs(self:get_plugins()) do
+ local t = { get_plugin_text(plugin) }
+ for j = 1, #self.widths do
+ self.widths[j] = math.max(style.font:get_width(t[j] or ""), self.widths[j])
+ end
+ end
+end
+
+
+function PluginView:get_plugins()
+ if self.show_incompatible_plugins then return PluginManager.plugins end
+ return PluginManager.valid_plugins
+end
+
+
+function PluginView:get_scrollable_size()
+ local th = style.font:get_height() + style.padding.y
+ return th * #self:get_plugins()
+end
+
+
+local function mul(color1, color2)
+ return { color1[1] * color2[1] / 255, color1[2] * color2[2] / 255, color1[3] * color2[3] / 255, color1[4] * color2[4] / 255 }
+end
+
+
+function PluginView:draw()
+ self:draw_background(style.background)
+
+ local th = style.font:get_height()
+ local lh = th + style.padding.y
+
+ local ox, oy = self:get_content_offset()
+ core.push_clip_rect(self.position.x, self.position.y, self.size.x, self.size.y)
+ local x, y = ox + style.padding.x, oy
+ for i, v in ipairs(self.plugin_table_columns) do
+ common.draw_text(style.font, style.accent, v, "left", x, y, self.widths[i], lh)
+ x = x + self.widths[i] + style.padding.x
+ end
+ oy = oy + lh
+ for i, plugin in ipairs(self:get_plugins()) do
+ local x, y = ox, oy
+ if y + lh >= self.position.y and y <= self.position.y + self.size.y then
+ if plugin == self.selected_plugin then
+ renderer.draw_rect(x, y, self.size.x, lh, style.dim)
+ elseif plugin == self.hovered_plugin then
+ renderer.draw_rect(x, y, self.size.x, lh, style.line_highlight)
+ end
+ x = x + style.padding.x
+ for j, v in ipairs({ get_plugin_text(plugin) }) do
+ local color = plugin.status == "installed" and style.good or style.text
+ if self.loading then color = mul(color, style.dim) end
+ common.draw_text(style.font, color, v, "left", x, y, self.widths[j], lh)
+ x = x + self.widths[j] + style.padding.x
+ end
+ end
+ oy = oy + lh
+ end
+ core.pop_clip_rect()
+ PluginView.super.draw_scrollbar(self)
+end
+
+function PluginView:install(plugin)
+ self.loading = true
+ PluginManager:install(plugin):done(function()
+ self.loading = false
+ self.selected_plugin, plugin_view.selected_plugin_idx = nil, nil
+ end)
+end
+
+function PluginView:uninstall(plugin)
+ self.loading = true
+ PluginManager:uninstall(plugin):done(function()
+ self.loading = false
+ self.selected_plugin, plugin_view.selected_plugin_idx = nil, nil
+ end)
+end
+
+
+command.add(PluginView, {
+ ["plugin-manager:select"] = function(x, y)
+ plugin_view.selected_plugin, plugin_view.selected_plugin_idx = plugin_view.hovered_plugin, plugin_view.hovered_plugin_idx
+ end,
+})
+command.add(function()
+ return core.active_view and core.active_view:is(PluginView) and plugin_view.selected_plugin and plugin_view.selected_plugin.status == "available"
+end, {
+ ["plugin-manager:install-selected"] = function() plugin_view:install(plugin_view.selected_plugin) end
+})
+command.add(function()
+ return core.active_view and core.active_view:is(PluginView) and plugin_view.hovered_plugin and plugin_view.hovered_plugin.status == "available"
+end, {
+ ["plugin-manager:install-hovered"] = function() plugin_view:install(plugin_view.hovered_plugin) end
+})
+command.add(function()
+ return core.active_view and core.active_view:is(PluginView) and plugin_view.selected_plugin and plugin_view.selected_plugin.status == "installed"
+end, {
+ ["plugin-manager:uninstall-selected"] = function() plugin_view:uninstall(plugin_view.selected_plugin) end
+})
+command.add(function()
+ return core.active_view and core.active_view:is(PluginView) and plugin_view.hovered_plugin and plugin_view.hovered_plugin.status == "installed"
+end, {
+ ["plugin-manager:uninstall-hovered"] = function() plugin_view:uninstall(plugin_view.hovered_plugin) end
+})
+
+return PluginView