Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add new layout strategy #771

Merged
merged 2 commits into from
May 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions doc/telescope.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,37 @@ telescope.extensions() *telescope.extensions()*



================================================================================
*telescope.themes*

Themes are ways to combine several elements of styling together.

They are helpful for managing the several differnt UI aspects for telescope and
provide a simple interface for users to get a particular "style" of picker.

themes.get_dropdown() *themes.get_dropdown()*
Dropdown style theme.

Usage:

`local builtin = require('telescope.builtin')`
`local themes = require('telescope.themes')`
`builtin.find_files(themes.get_dropdown())`



themes.get_ivy() *themes.get_ivy()*
Ivy style theme.

Usage:

`local builtin = require('telescope.builtin')`
`local themes = require('telescope.themes')`
`builtin.find_files(themes.get_ivy())`




================================================================================
*telescope.actions.set*

Expand Down
102 changes: 67 additions & 35 deletions lua/telescope/pickers/layout_strategies.lua
Original file line number Diff line number Diff line change
Expand Up @@ -61,38 +61,7 @@
local config = require('telescope.config')
local resolve = require("telescope.config.resolve")

local function get_initial_window_options(picker)
local popup_border = resolve.win_option(picker.window.border)
local popup_borderchars = resolve.win_option(picker.window.borderchars)

local preview = {
title = picker.preview_title,
border = popup_border.preview,
borderchars = popup_borderchars.preview,
enter = false,
highlight = false
}

local results = {
title = picker.results_title,
border = popup_border.results,
borderchars = popup_borderchars.results,
enter = false,
}

local prompt = {
title = picker.prompt_title,
border = popup_border.prompt,
borderchars = popup_borderchars.prompt,
enter = true
}

return {
preview = preview,
results = results,
prompt = prompt,
}
end
local p_window = require('telescope.pickers.window')


-- Check if there are any borders. Right now it's a little raw as
Expand Down Expand Up @@ -139,7 +108,7 @@ layout_strategies.horizontal = function(self, max_columns, max_lines)
scroll_speed = "The speed when scrolling through the previewer",
})

local initial_options = get_initial_window_options(self)
local initial_options = p_window.get_initial_window_options(self)
local preview = initial_options.preview
local results = initial_options.results
local prompt = initial_options.prompt
Expand Down Expand Up @@ -237,7 +206,7 @@ end
--- +--------------+
--- </pre>
layout_strategies.center = function(self, columns, lines)
local initial_options = get_initial_window_options(self)
local initial_options = p_window.get_initial_window_options(self)
local preview = initial_options.preview
local results = initial_options.results
local prompt = initial_options.prompt
Expand Down Expand Up @@ -307,7 +276,7 @@ layout_strategies.vertical = function(self, max_columns, max_lines)
scroll_speed = "The speed when scrolling through the previewer",
})

local initial_options = get_initial_window_options(self)
local initial_options = p_window.get_initial_window_options(self)
local preview = initial_options.preview
local results = initial_options.results
local prompt = initial_options.prompt
Expand Down Expand Up @@ -447,4 +416,67 @@ layout_strategies.current_buffer = function(self, _, _)
}
end

layout_strategies.bottom_pane = function(self, max_columns, max_lines)
local layout_config = validate_layout_config(self.layout_config or {}, {
height = "The height of the layout",
})

local initial_options = p_window.get_initial_window_options(self)
local results = initial_options.results
local prompt = initial_options.prompt
local preview = initial_options.preview

local result_height = layout_config.height or 25

local prompt_width = max_columns
local col = 0

local has_border = not not self.window.border
if has_border then
col = 1
prompt_width = prompt_width - 2
end

local result_width
if self.previewer then
result_width = math.floor(prompt_width / 2)

local base_col = result_width + 1
if has_border then
preview = vim.tbl_deep_extend("force", {
col = base_col + 2,
line = max_lines - result_height + 1,
width = prompt_width - result_width - 2,
height = result_height - 1,
}, preview)
else
preview = vim.tbl_deep_extend("force", {
col = base_col,
line = max_lines - result_height,
width = prompt_width - result_width,
height = result_height,
}, preview)
end
else
preview = nil
result_width = prompt_width
end

return {
preview = preview,
prompt = vim.tbl_deep_extend("force", prompt, {
line = max_lines - result_height - 1,
col = col,
height = 1,
width = prompt_width,
}),
results = vim.tbl_deep_extend("force", results, {
line = max_lines - result_height,
col = col,
height = result_height,
width = result_width,
}),
}
end

return layout_strategies
37 changes: 35 additions & 2 deletions lua/telescope/pickers/window.lua
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
local p_layouts = require('telescope.pickers.layout_strategies')
local resolve = require("telescope.config.resolve")

local p_window = {}

function p_window.get_window_options(picker, max_columns, max_lines)
local layout_strategy = picker.layout_strategy
local getter = p_layouts[layout_strategy]
local getter = require('telescope.pickers.layout_strategies')[layout_strategy]

if not getter then
error("Not a valid layout strategy: " .. layout_strategy)
Expand All @@ -13,5 +13,38 @@ function p_window.get_window_options(picker, max_columns, max_lines)
return getter(picker, max_columns, max_lines)
end

function p_window.get_initial_window_options(picker)
local popup_border = resolve.win_option(picker.window.border)
local popup_borderchars = resolve.win_option(picker.window.borderchars)

local preview = {
title = picker.preview_title,
border = popup_border.preview,
borderchars = popup_borderchars.preview,
enter = false,
highlight = false
}

local results = {
title = picker.results_title,
border = popup_border.results,
borderchars = popup_borderchars.results,
enter = false,
}

local prompt = {
title = picker.prompt_title,
border = popup_border.prompt,
borderchars = popup_borderchars.prompt,
enter = true
}

return {
preview = preview,
results = results,
prompt = prompt,
}
end


return p_window
58 changes: 55 additions & 3 deletions lua/telescope/themes.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,27 @@
-- Currently certain designs need a number of parameters.
--
-- local opts = themes.get_dropdown { winblend = 3 }
--

---@tag telescope.themes

---@brief [[
--- Themes are ways to combine several elements of styling together.
---
--- They are helpful for managing the several differnt UI aspects for telescope and provide
--- a simple interface for users to get a particular "style" of picker.
---@brief ]]

local themes = {}

--- Dropdown style theme.
--- <pre>
---
--- Usage:
---
--- `local builtin = require('telescope.builtin')`
--- `local themes = require('telescope.themes')`
--- `builtin.find_files(themes.get_dropdown())`
--- </pre>
function themes.get_dropdown(opts)
opts = opts or {}

Expand All @@ -21,14 +38,49 @@ function themes.get_dropdown(opts)
width = 80,
results_height = 15,
borderchars = {
{ '', '', '', '', '', '', '', ''},
{ "", "", "", "", "", "", "", ""},
prompt = {"", "", " ", "", "", "", "", ""},
results = {"", "", "", "", "", "", "", ""},
preview = { '', '', '', '', '', '', '', ''},
preview = { "", "", "", "", "", "", "", ""},
},
}

return vim.tbl_deep_extend("force", theme_opts, opts)
end

--- Ivy style theme.
--- <pre>
---
--- Usage:
---
--- `local builtin = require('telescope.builtin')`
--- `local themes = require('telescope.themes')`
--- `builtin.find_files(themes.get_ivy())`
--- </pre>
function themes.get_ivy(opts)
opts = opts or {}

return vim.tbl_deep_extend("force", {
theme = "ivy",

sorting_strategy = "ascending",

preview_title = "",

layout_strategy = "bottom_pane",
layout_config = {
height = 25,
},

border = true,
borderchars = {
"z",
prompt = { "", " ", " ", " ", "", "", " ", " " },
results = { " " },
-- results = { "a", "b", "c", "d", "e", "f", "g", "h" },
preview = { "", "", "", "", "", "", "", ""},
},
}, opts)
end

return themes
31 changes: 31 additions & 0 deletions scratch/ivy.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

RELOAD('telescope')
require('telescope.builtin').find_files(require('telescope.themes').get_ivy { previewer = false })




























1 change: 1 addition & 0 deletions scripts/gendocs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ docs.test = function()
"./lua/telescope/actions/state.lua",
"./lua/telescope/actions/set.lua",
"./lua/telescope/previewers/init.lua",
"./lua/telescope/themes.lua",
}

table.sort(input_files, function(a, b)
Expand Down