feat(picker.preview): allow confguring preview = {main = true, enabled = false}

This commit is contained in:
Folke Lemaitre 2025-02-04 23:47:42 +01:00
parent 4b9ea98007
commit 1839c65f67
No known key found for this signature in database
GPG key ID: 41F8B1FBACAE2040
2 changed files with 23 additions and 6 deletions

View file

@ -52,7 +52,7 @@ local M = {}
---@field reverse? boolean when true, the list will be reversed (bottom-up)
---@field fullscreen? boolean open in fullscreen
---@field cycle? boolean cycle through the list
---@field preview? boolean|"main" show preview window in the picker or the main window
---@field preview? boolean|"main"|{enabled?:boolean, main?:boolean} show preview window in the picker or the main window
---@field preset? string|fun(source:string):string
---@class snacks.picker.win.Config

View file

@ -86,6 +86,7 @@ end
---@param opts? snacks.picker.Config
---@return snacks.Picker
function M.new(opts)
---@type snacks.Picker
local self = setmetatable({}, M)
_id = _id + 1
self.id = _id
@ -173,7 +174,7 @@ function M.new(opts)
self.resolved_layout = layout
self.list = require("snacks.picker.core.list").new(self)
self.input = require("snacks.picker.core.input").new(self)
self.preview = require("snacks.picker.core.preview").new(self.opts, layout.preview == "main" and self.main or nil)
self.preview = require("snacks.picker.core.preview").new(self.opts, self:preview_opts().main and self.main or nil)
self.title = self.opts.title or Snacks.picker.util.title(self.opts.source or "search")
@ -199,7 +200,7 @@ function M.new(opts)
return
end
if self.opts.auto_close == false then
if self.resolved_layout.preview == "main" and self.preview.win:valid() then
if self:preview_opts().main and self.preview.win:valid() then
self:toggle_preview(false)
on_focus = vim.schedule_wrap(function()
self:toggle_preview(true)
@ -255,6 +256,21 @@ function M:norm(cb)
return true
end
---@private
function M:preview_opts()
---@type {enabled: boolean, main: boolean}
local ret = { enabled = true, main = false }
local p = self.resolved_layout.preview
if p == "main" then
ret.main = true
elseif p == false then
ret.enabled = false
elseif type(p) == "table" then
ret.enabled, ret.main = p.enabled ~= false, p.main == true
end
return ret
end
---@param layout? snacks.picker.layout.Config
---@private
function M:init_layout(layout)
@ -262,8 +278,9 @@ function M:init_layout(layout)
self.resolved_layout = vim.deepcopy(layout)
self.resolved_layout.cycle = self.resolved_layout.cycle == true
local opts = layout --[[@as snacks.layout.Config]]
local preview_main = layout.preview == "main"
local preview_hidden = layout.preview == false or preview_main
local preview_opts = self:preview_opts()
local preview_main = preview_opts.main
local preview_hidden = preview_main or not preview_opts.enabled
local backdrop = nil
if preview_main then
backdrop = false
@ -334,7 +351,7 @@ function M:toggle_preview(enable)
if enable == showing then
return
end
if self.resolved_layout.preview == "main" then
if self:preview_opts().main then
if enable then
self.preview.win:show()
else