feat: add min max boundary to width, hight resolver (#2002)

This commit is contained in:
Simon Hauser
2022-06-26 11:37:51 +02:00
committed by Simon Hauser
parent 25b1bc8f17
commit d1f3e12a35
3 changed files with 48 additions and 11 deletions

View File

@@ -1947,14 +1947,17 @@ Provides "resolver functions" to allow more customisable inputs for options.
resolver.resolve_height() *telescope.resolve.resolve_height()* resolver.resolve_height() *telescope.resolve.resolve_height()*
Converts input to a function that returns the height. The input must take Converts input to a function that returns the height. The input must take
one of four forms: one of five forms:
1. 0 <= number < 1 1. 0 <= number < 1
This means total height as a percentage. This means total height as a percentage.
2. 1 <= number 2. 1 <= number
This means total height as a fixed number. This means total height as a fixed number.
3. function 3. function
Must have signature: function(self, max_columns, max_lines): number Must have signature: function(self, max_columns, max_lines): number
4. table of the form: {padding = `foo`} 4. table of the form: { val, max = ..., min = ... }
val has to be in the first form 0 <= val < 1 and only one is given,
`min` or `max` as fixed number
5. table of the form: {padding = `foo`}
where `foo` has one of the previous three forms. where `foo` has one of the previous three forms.
The height is then set to be the remaining space after padding. For The height is then set to be the remaining space after padding. For
example, if the window has height 50, and the input is {padding = 5}, example, if the window has height 50, and the input is {padding = 5},
@@ -1967,14 +1970,17 @@ resolver.resolve_height() *telescope.resolve.resolve_height()*
resolver.resolve_width() *telescope.resolve.resolve_width()* resolver.resolve_width() *telescope.resolve.resolve_width()*
Converts input to a function that returns the width. The input must take Converts input to a function that returns the width. The input must take
one of four forms: one of five forms:
1. 0 <= number < 1 1. 0 <= number < 1
This means total width as a percentage. This means total width as a percentage.
2. 1 <= number 2. 1 <= number
This means total width as a fixed number. This means total width as a fixed number.
3. function 3. function
Must have signature: function(self, max_columns, max_lines): number Must have signature: function(self, max_columns, max_lines): number
4. table of the form: {padding = `foo`} 4. table of the form: { val, max = ..., min = ... }
val has to be in the first form 0 <= val < 1 and only one is given,
`min` or `max` as fixed number
5. table of the form: {padding = `foo`}
where `foo` has one of the previous three forms. where `foo` has one of the previous three forms.
The width is then set to be the remaining space after padding. For The width is then set to be the remaining space after padding. For
example, if the window has width 100, and the input is {padding = 5}, example, if the window has width 100, and the input is {padding = 5},

View File

@@ -127,9 +127,6 @@ end] = function(selector, val)
end end
end end
-- Tables TODO:
-- ... {70, max}
-- function: -- function:
-- Function must have same signature as get_window_layout -- Function must have same signature as get_window_layout
-- function(self, max_columns, max_lines): number -- function(self, max_columns, max_lines): number
@@ -141,6 +138,26 @@ end] = function(_, val)
return val return val
end end
_resolve_map[function(val)
return type(val) == "table" and val[1] >= 0 and val[1] < 1 and val["max"] ~= nil
end] =
function(selector, val)
return function(...)
local selected = select(selector, ...)
return math.min(math.floor(val[1] * selected), val["max"])
end
end
_resolve_map[function(val)
return type(val) == "table" and val[1] >= 0 and val[1] < 1 and val["min"] ~= nil
end] =
function(selector, val)
return function(...)
local selected = select(selector, ...)
return math.max(math.floor(val[1] * selected), val["min"])
end
end
-- Add padding option -- Add padding option
_resolve_map[function(val) _resolve_map[function(val)
return type(val) == "table" and val["padding"] ~= nil return type(val) == "table" and val["padding"] ~= nil
@@ -162,7 +179,7 @@ end] = function(selector, val)
end end
--- Converts input to a function that returns the height. --- Converts input to a function that returns the height.
--- The input must take one of four forms: --- The input must take one of five forms:
--- 1. 0 <= number < 1 <br> --- 1. 0 <= number < 1 <br>
--- This means total height as a percentage. --- This means total height as a percentage.
--- 2. 1 <= number <br> --- 2. 1 <= number <br>
@@ -170,7 +187,10 @@ end
--- 3. function <br> --- 3. function <br>
--- Must have signature: --- Must have signature:
--- function(self, max_columns, max_lines): number --- function(self, max_columns, max_lines): number
--- 4. table of the form: {padding = `foo`} <br> --- 4. table of the form: { val, max = ..., min = ... } <br>
--- val has to be in the first form 0 <= val < 1 and only one is given,
--- `min` or `max` as fixed number
--- 5. table of the form: {padding = `foo`} <br>
--- where `foo` has one of the previous three forms. <br> --- where `foo` has one of the previous three forms. <br>
--- The height is then set to be the remaining space after padding. --- The height is then set to be the remaining space after padding.
--- For example, if the window has height 50, and the input is {padding = 5}, --- For example, if the window has height 50, and the input is {padding = 5},
@@ -188,7 +208,7 @@ resolver.resolve_height = function(val)
end end
--- Converts input to a function that returns the width. --- Converts input to a function that returns the width.
--- The input must take one of four forms: --- The input must take one of five forms:
--- 1. 0 <= number < 1 <br> --- 1. 0 <= number < 1 <br>
--- This means total width as a percentage. --- This means total width as a percentage.
--- 2. 1 <= number <br> --- 2. 1 <= number <br>
@@ -196,7 +216,10 @@ end
--- 3. function <br> --- 3. function <br>
--- Must have signature: --- Must have signature:
--- function(self, max_columns, max_lines): number --- function(self, max_columns, max_lines): number
--- 4. table of the form: {padding = `foo`} <br> --- 4. table of the form: { val, max = ..., min = ... } <br>
--- val has to be in the first form 0 <= val < 1 and only one is given,
--- `min` or `max` as fixed number
--- 5. table of the form: {padding = `foo`} <br>
--- where `foo` has one of the previous three forms. <br> --- where `foo` has one of the previous three forms. <br>
--- The width is then set to be the remaining space after padding. --- The width is then set to be the remaining space after padding.
--- For example, if the window has width 100, and the input is {padding = 5}, --- For example, if the window has width 100, and the input is {padding = 5},

View File

@@ -75,6 +75,14 @@ describe("telescope.config.resolve", function()
end end
end) end)
it("should handle percentages with min/max boundary", function()
eq(20, resolve.resolve_width { 0.1, min = 20 }(nil, 40, 120))
eq(30, resolve.resolve_height { 0.1, min = 20 }(nil, 40, 300))
eq(24, resolve.resolve_width { 0.4, max = 80 }(nil, 60, 60))
eq(80, resolve.resolve_height { 0.4, max = 80 }(nil, 60, 300))
end)
it("should handle fixed size", function() it("should handle fixed size", function()
local fixed = { 5, 8, 13, 21, 34 } local fixed = { 5, 8, 13, 21, 34 }
for _, s in ipairs(test_sizes) do for _, s in ipairs(test_sizes) do