Add command to remove a directory from the project

In addition directories can be removed with a mouse middle-click in the
tree view pane.
This commit is contained in:
Francesco Abbate 2020-12-28 15:51:16 +01:00
parent c042bfc907
commit ddd56ec615
4 changed files with 48 additions and 3 deletions

View File

@ -166,7 +166,7 @@ command.add(nil, {
end, end,
["core:add-directory"] = function() ["core:add-directory"] = function()
core.command_view:enter("Open Project", function(text) core.command_view:enter("Add Directory", function(text)
text = common.home_expand(text) text = common.home_expand(text)
local path_stat, err = system.get_file_info(text) local path_stat, err = system.get_file_info(text)
if not path_stat then if not path_stat then
@ -182,4 +182,19 @@ command.add(nil, {
end, suggest_directory) end, suggest_directory)
end, end,
["core:remove-directory"] = function()
local dir_list = {}
local n = #core.project_directories
for i = n, 1, -1 do
dir_list[n - i + 1] = core.project_directories[i].name
end
core.command_view:enter("Remove Directory", function(text)
if not core.remove_project_directory(text) then
core.error("The project has no directory %q", text)
end
end, function(text)
text = common.home_expand(text)
return home_encode_list(common.dir_list_suggest(text, dir_list))
end)
end,
}) })

View File

@ -117,6 +117,18 @@ function common.dir_path_suggest(text)
end end
function common.dir_list_suggest(text, dir_list)
local path, name = text:match("^(.-)([^/\\]*)$")
local res = {}
for _, dir_path in ipairs(dir_list) do
if dir_path:lower():find(text:lower(), nil, true) == 1 then
table.insert(res, dir_path)
end
end
return res
end
function common.match_pattern(text, pattern, ...) function common.match_pattern(text, pattern, ...)
if type(pattern) == "string" then if type(pattern) == "string" then
return text:find(pattern, ...) return text:find(pattern, ...)

View File

@ -274,6 +274,7 @@ function core.load_user_directory()
end) end)
end end
function core.add_project_directory(path) function core.add_project_directory(path)
-- top directories has a file-like "item" but the item.filename -- top directories has a file-like "item" but the item.filename
-- will be simply the name of the directory, without its path. -- will be simply the name of the directory, without its path.
@ -285,6 +286,18 @@ function core.add_project_directory(path)
}) })
end end
function core.remove_project_directory(path)
for i, dir in ipairs(core.project_directories) do
if dir.name == path then
table.remove(core.project_directories, i)
return true
end
end
return false
end
function core.init() function core.init()
command = require "core.command" command = require "core.command"
keymap = require "core.keymap" keymap = require "core.keymap"

View File

@ -43,11 +43,12 @@ function TreeView:get_cached(item, dirname)
t.filename = basename t.filename = basename
t.expanded = true t.expanded = true
t.depth = 0 t.depth = 0
t.abs_filename = dirname
else else
t.filename = item.filename t.filename = item.filename
t.depth = get_depth(item.filename) t.depth = get_depth(item.filename)
end
t.abs_filename = dirname .. PATHSEP .. item.filename t.abs_filename = dirname .. PATHSEP .. item.filename
end
t.name = basename t.name = basename
t.type = item.type t.type = item.type
dir_cache[item.filename] = t dir_cache[item.filename] = t
@ -140,7 +141,11 @@ function TreeView:on_mouse_pressed(button, x, y)
if not self.hovered_item then if not self.hovered_item then
return return
elseif self.hovered_item.type == "dir" then elseif self.hovered_item.type == "dir" then
if button == "middle" and self.hovered_item.depth == 0 then
core.remove_project_directory(self.hovered_item.abs_filename)
else
self.hovered_item.expanded = not self.hovered_item.expanded self.hovered_item.expanded = not self.hovered_item.expanded
end
else else
core.try(function() core.try(function()
core.root_view:open_doc(core.open_doc(self.hovered_item.abs_filename)) core.root_view:open_doc(core.open_doc(self.hovered_item.abs_filename))