Add layout_action to change bias on tall layout

Can specify 1 bias to toggle between that and 50%.

Can specify multiple biases to rotate through them with each call to the
layout_action.

Left a comment regarding working around either a possible bug or a
design decision.
This commit is contained in:
Steven Moazami 2022-08-04 19:29:17 -04:00
parent 6595898b73
commit adfcbb004f
2 changed files with 37 additions and 9 deletions

View File

@ -76,6 +76,12 @@ windows, or toggle the mirrored setting, for example::
map ctrl+y layout_action mirror true
map ctrl+n layout_action mirror false
You can also map a key to change the bias by providing a list of percentages
and it will rotate through the list as you press the key. If you only provide
one number it'll toggle between that percentage and 50, for example::
map ctrl+. layout_action bias 50 62 70
map ctrl+, layout_action bias 62
The Fat Layout
----------------
@ -104,8 +110,7 @@ on the bottom of the screen instead of the top. The syntax for the options is::
└─────────┴──────────┴─────────┘
This layout also supports ``decrease_num_full_size_windows`` layout action like
the *Tall* layout, shown above.
This layout also supports the same layout actions as the *Tall* layout, shown above.
The Grid Layout

View File

@ -54,7 +54,7 @@ def neighbors_for_tall_window(
class TallLayoutOpts(LayoutOpts):
bias: Tuple[float, ...] = ()
bias: 50
full_size: int = 1
mirrored: bool = False
@ -63,18 +63,20 @@ class TallLayoutOpts(LayoutOpts):
self.full_size = int(data.get('full_size', 1))
except Exception:
self.full_size = 1
self.full_size = fs = max(1, min(self.full_size, 100))
self.full_size = max(1, min(self.full_size, 100))
try:
b = int(data.get('bias', 50)) / 100
self.bias = int(data.get('bias', 50))
except Exception:
b = 0.5
b = max(0.1, min(b, 0.9))
self.bias = tuple(repeat(b / fs, fs)) + (1.0 - b,)
self.bias = 50
self.mirrored = to_bool(data.get('mirrored', 'false'))
def serialized(self) -> Dict[str, Any]:
return {'full_size': self.full_size, 'bias': self.bias, 'mirrored': self.mirrored}
def build_bias_list(self) -> Tuple[float, ...]:
b = self.bias / 100
b = max(0.1, min(b, 0.9))
return tuple(repeat(b / self.full_size, self.full_size)) + (1.0 - b,)
class Tall(Layout):
@ -90,7 +92,7 @@ class Tall(Layout):
return self.layout_opts.full_size
def remove_all_biases(self) -> bool:
self.main_bias: List[float] = list(self.layout_opts.bias)
self.main_bias: List[float] = list(self.layout_opts.build_bias_list())
self.biased_map: Dict[int, float] = {}
return True
@ -215,6 +217,27 @@ class Tall(Layout):
self.layout_opts.mirrored = new_val
ok = True
return ok
if action_name == 'bias':
if len(args) == 0:
raise ValueError('layout_action bias must contain at least one number between 10 and 90')
# Because kitty/options/utils.py:312 sets maxsplit=1, line 315 will always
# pass args as a tuple consisting of at most 1 element with all the args despite
# it implying the tuple could have more than one element with via [1:]
# In case this is by design and I'm missing the reason, have to split out
# the rest of the args:
biases = args[0].split()
if len(biases) == 1:
biases.append("50")
try:
i = biases.index(str(self.layout_opts.bias)) + 1
except ValueError:
i = 0
try:
self.layout_opts.bias = int(biases[i % len(biases)])
self.remove_all_biases()
return True
except Exception:
return False
return None
def minimal_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]: