Skip to content

Commit d6195f9

Browse files
feat(assets-manager): added actions to create, delete, or preview a folder (#260)
1 parent 9bdcb75 commit d6195f9

File tree

3 files changed

+93
-11
lines changed

3 files changed

+93
-11
lines changed

doc/xcodebuild.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2275,16 +2275,24 @@ M.create_color({name}, {color}, {path}) *xcodebuild.project.assets.create_color*
22752275
{path} (string)
22762276

22772277

2278+
*xcodebuild.project.assets.delete_folder_picker*
2279+
M.delete_folder_picker()
2280+
Shows a picker to delete a folder.
2281+
2282+
22782283
*xcodebuild.project.assets.create_new_asset_picker*
22792284
M.create_new_asset_picker()
22802285
Shows a wizard to create a new asset.
22812286

22822287

22832288
*xcodebuild.project.assets.show_asset_picker*
2284-
M.show_asset_picker()
2289+
M.show_asset_picker({reveal})
22852290
Shows a picker with all the assets in the project.
22862291
Opens the asset in Finder or Quick Look.
22872292

2293+
Parameters: ~
2294+
{reveal} (boolean) reveal in Finder
2295+
22882296

22892297
*xcodebuild.project.assets.delete_asset_picker*
22902298
M.delete_asset_picker()
@@ -4123,6 +4131,10 @@ PickerOptions *xcodebuild.ui.pickers.PickerOptions*
41234131
{device_select_callback} (function|nil)
41244132

41254133

4134+
M.close() *xcodebuild.ui.pickers.close*
4135+
Closes the active picker.
4136+
4137+
41264138
*xcodebuild.ui.pickers.show*
41274139
M.show({title}, {items}, {callback}, {opts})
41284140
Shows a picker using Telescope.nvim.

lua/xcodebuild/project/assets.lua

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ local function select_assets(callback)
5757
end
5858

5959
---Shows a picker to select a folder.
60+
---@param assetsDir string
61+
---@param deleteMode boolean
6062
---@param callback function(string)|nil
61-
local function select_folder(assetsDir, callback)
63+
local function select_folder(assetsDir, deleteMode, callback)
6264
local folders = util.shell({
6365
"fd",
6466
"--type",
@@ -75,17 +77,49 @@ local function select_folder(assetsDir, callback)
7577
assetsDir,
7678
})
7779

78-
table.insert(folders, 1, assetsDir)
80+
if not deleteMode then
81+
table.insert(folders, 1, assetsDir)
82+
table.insert(folders, 2, "")
83+
if #folders > 2 then
84+
table.insert(folders, 3, "")
85+
end
86+
end
7987
folders = clean_up_paths(folders)
8088

8189
local titles = util.select(folders, function(folder)
8290
local trimmed = folder:gsub(assetsDir .. "/", "")
8391
return trimmed
8492
end)
85-
titles[1] = "[Root]"
93+
94+
if not deleteMode then
95+
titles[1] = "[Root]"
96+
titles[2] = "[Create New Folder]"
97+
if #titles > 2 then
98+
titles[3] = ""
99+
end
100+
end
86101

87102
pickers.show("Select Folder", titles, function(_, index)
88-
util.call(callback, folders[index])
103+
if deleteMode then
104+
util.call(callback, folders[index])
105+
return
106+
end
107+
108+
if index == 2 then
109+
pickers.close()
110+
111+
local newFolder = vim.fn.input("Enter folder name: ")
112+
if newFolder == "" then
113+
notifications.send_error("Invalid folder name")
114+
return
115+
end
116+
117+
local path = vim.fs.joinpath(assetsDir, newFolder)
118+
util.shell({ "mkdir", "-p", path })
119+
util.call(callback, path)
120+
elseif index ~= 3 then
121+
util.call(callback, folders[index])
122+
end
89123
end)
90124
end
91125

@@ -231,14 +265,33 @@ function M.create_color(name, color, path)
231265
notifications.send("Color '" .. name .. "' has been added")
232266
end
233267

268+
---Shows a picker to delete a folder.
269+
function M.delete_folder_picker()
270+
if not validate_if_fd_installed() then
271+
return
272+
end
273+
274+
select_assets(function(asset)
275+
select_folder(asset, true, function(path)
276+
local confirm = vim.fn.confirm("Are you sure you want to delete: " .. path .. "?", "&Yes\n&No", 2) == 1
277+
278+
if confirm then
279+
util.shell({ "rm", "-rf", path })
280+
pickers.close()
281+
notifications.send("Folder deleted: " .. path)
282+
end
283+
end)
284+
end)
285+
end
286+
234287
---Shows a wizard to create a new asset.
235288
function M.create_new_asset_picker()
236289
if not validate_if_fd_installed() then
237290
return
238291
end
239292

240293
select_assets(function(asset)
241-
select_folder(asset, function(path)
294+
select_folder(asset, false, function(path)
242295
select_asset_type(function(assetType)
243296
if assetType == "Image" then
244297
local filename = vim.fn.input("Enter filename (e.g. image.svg): ")
@@ -260,7 +313,8 @@ end
260313

261314
---Shows a picker with all the assets in the project.
262315
---Opens the asset in Finder or Quick Look.
263-
function M.show_asset_picker()
316+
---@param reveal boolean reveal in Finder
317+
function M.show_asset_picker(reveal)
264318
if not validate_if_fd_installed() then
265319
return
266320
end
@@ -279,7 +333,7 @@ function M.show_asset_picker()
279333
pickers.show("Show Asset", assets, function(asset, _)
280334
local isImage = string.find(asset.value, "%.imageset") or string.find(asset.value, "%.appiconset")
281335

282-
if isImage then
336+
if isImage and not reveal then
283337
vim.fn.jobstart({ "qlmanage", "-p", asset.value }, {
284338
detach = true,
285339
on_exit = function() end,
@@ -333,9 +387,10 @@ function M.delete_asset_picker()
333387

334388
if confirm then
335389
util.shell({ "rm", "-rf", asset.value })
390+
pickers.close()
336391
notifications.send("Asset deleted: " .. asset.value)
337392
end
338-
end, { close_on_select = true })
393+
end)
339394
end
340395

341396
---Shows the Assets Manager with all available actions.
@@ -347,12 +402,20 @@ function M.show_assets_manager()
347402
local titles = {
348403
"Create New Asset",
349404
"Delete Asset",
350-
"Show Asset",
405+
"Delete Folder",
406+
"Preview Asset",
407+
"Reveal Asset in Finder",
351408
}
352409
local actions = {
353410
M.create_new_asset_picker,
354411
M.delete_asset_picker,
355-
M.show_asset_picker,
412+
M.delete_folder_picker,
413+
function()
414+
M.show_asset_picker(false)
415+
end,
416+
function()
417+
M.show_asset_picker(true)
418+
end,
356419
}
357420

358421
pickers.show("Assets Manager", titles, function(_, selectedIndex)

lua/xcodebuild/ui/pickers.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,13 @@ local function set_picker_actions(bufnr, opts)
303303
end, { buffer = bufnr })
304304
end
305305

306+
---Closes the active picker.
307+
function M.close()
308+
if activePicker then
309+
telescopeActions.close(activePicker.prompt_bufnr)
310+
end
311+
end
312+
306313
---Shows a picker using Telescope.nvim.
307314
---@param title string
308315
---@param items string[]|XcodeDevice[]

0 commit comments

Comments
 (0)