Change EvTable vertical rebalance algorithm to simply add empty rows at end. Produces more consistent visual result than old algorithm which could sometimes look like a bug.
This commit is contained in:
parent
4db1a1e2e0
commit
4cf890b635
3 changed files with 109 additions and 26 deletions
|
|
@ -86,8 +86,10 @@ Up requirements to Django 3.2+
|
||||||
but `Cmd_nAmE` -> `Cmd.nAmE`). This helps e.g Mudlet's legacy `Client_GUI` implementation)
|
but `Cmd_nAmE` -> `Cmd.nAmE`). This helps e.g Mudlet's legacy `Client_GUI` implementation)
|
||||||
- Prototypes now allow setting `prototype_parent` directly to a prototype-dict.
|
- Prototypes now allow setting `prototype_parent` directly to a prototype-dict.
|
||||||
This makes it easier when dynamically building in-module prototypes.
|
This makes it easier when dynamically building in-module prototypes.
|
||||||
- RPSystem contrib was expanded to support case, so /tall becomes 'tall man'
|
- `RPSystem contrib` was expanded to support case, so /tall becomes 'tall man'
|
||||||
while /Tall becomes 'Tall man'. One can turn this off if wanting the old style.
|
while /Tall becomes 'Tall man'. One can turn this off if wanting the old style.
|
||||||
|
- Change `EvTable` fixed-height rebalance algorithm to fill with empty lines at end of
|
||||||
|
column instead of inserting rows based on cell-size (could be mistaken for a bug).
|
||||||
|
|
||||||
### Evennia 0.9.5 (2019-2020)
|
### Evennia 0.9.5 (2019-2020)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1478,31 +1478,13 @@ class EvTable(object):
|
||||||
% (self.height, chmin + locked_height)
|
% (self.height, chmin + locked_height)
|
||||||
)
|
)
|
||||||
|
|
||||||
# now we add all the extra height up to the desired table-height.
|
# Add all the excess at the end of the table
|
||||||
# We do this so that the tallest cells gets expanded first (and
|
# Note: Older solutions tried to balance individual
|
||||||
# thus avoid getting cropped)
|
# rows' vsize. This could lead to empty rows that
|
||||||
|
# looked like a bug. This solution instead
|
||||||
even = self.height % 2 == 0
|
# adds empty rows at the end which is less sophisticated
|
||||||
correction = 0
|
# but much more visually consistent.
|
||||||
while correction < excess:
|
cheights_min[-1] += excess
|
||||||
# expand the cells with the most rows first
|
|
||||||
if 0 <= correction < nrowmax and nrowmax > 1:
|
|
||||||
# avoid adding to header first round (looks bad on very small tables)
|
|
||||||
ci = cheights[1:].index(max(cheights[1:])) + 1
|
|
||||||
else:
|
|
||||||
ci = cheights.index(max(cheights))
|
|
||||||
if ci in locked_cols:
|
|
||||||
# locked row, make sure it's not picked again
|
|
||||||
cheights[ci] -= 9999
|
|
||||||
cheights_min[ci] = locked_cols[ci]
|
|
||||||
else:
|
|
||||||
cheights_min[ci] += 1
|
|
||||||
# change balance
|
|
||||||
if ci == 0 and self.header:
|
|
||||||
# it doesn't look very good if header expands too fast
|
|
||||||
cheights[ci] -= 2 if even else 3
|
|
||||||
cheights[ci] -= 2 if even else 1
|
|
||||||
correction += 1
|
|
||||||
cheights = cheights_min
|
cheights = cheights_min
|
||||||
|
|
||||||
# we must tell cells to crop instead of expanding
|
# we must tell cells to crop instead of expanding
|
||||||
|
|
|
||||||
|
|
@ -165,3 +165,102 @@ Durian
|
||||||
""".lstrip()
|
""".lstrip()
|
||||||
result = self._simple_form(form)
|
result = self._simple_form(form)
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
|
|
||||||
|
# test of issue #2308
|
||||||
|
|
||||||
|
_SHEET = """
|
||||||
|
.----------------------------------------------.
|
||||||
|
| Sheet |
|
||||||
|
| xxxxxxxxxxxxxxxxxxxxxxxxxx1xxxxxxxxxxxx |
|
||||||
|
>----------------------------------------------<
|
||||||
|
| Ability scores | Skills |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| cccccc2cccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| ccccccccccccccc | ccccccccccccccccccc |
|
||||||
|
| | ccccccccc3ccccccccc |
|
||||||
|
| | ccccccccccccccccccc |
|
||||||
|
| | ccccccccccccccccccc |
|
||||||
|
| | ccccccccccccccccccc |
|
||||||
|
| | |
|
||||||
|
+----------------------------------------------+
|
||||||
|
"""
|
||||||
|
_EXPECTED = """
|
||||||
|
.----------------------------------------------.
|
||||||
|
| Sheet |
|
||||||
|
| Test text |
|
||||||
|
>----------------------------------------------<
|
||||||
|
| Ability scores | Skills |
|
||||||
|
| +------+------+ | +--------+--------+ |
|
||||||
|
| |Ab |Sc | | |Skill |Level | |
|
||||||
|
| +~~~~~~+~~~~~~+ | +~~~~~~~~+~~~~~~~~+ |
|
||||||
|
| |STR |10 | | |Acro |10 | |
|
||||||
|
| |CON |10 | | |Anim |10 | |
|
||||||
|
| |DEX |10 | | |Arca |10 | |
|
||||||
|
| | | | | |Ath |10 | |
|
||||||
|
| | | | | |Dec |10 | |
|
||||||
|
| +------+------+ | |His |10 | |
|
||||||
|
| | | | | |
|
||||||
|
| | | | | |
|
||||||
|
| | | | | |
|
||||||
|
| | +--------+--------+ |
|
||||||
|
| | |
|
||||||
|
+----------------------------------------------+
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestEvFormParallelTables(TestCase):
|
||||||
|
"""
|
||||||
|
Test of issue #2308
|
||||||
|
https://github.com/evennia/evennia/issues/2308
|
||||||
|
where parallel tables cause strange overlaps
|
||||||
|
in output
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.text1 = "Test text"
|
||||||
|
self.table2 = evtable.EvTable(
|
||||||
|
"Ab", "Sc",
|
||||||
|
table=[
|
||||||
|
["|ySTR", "|yCON", "|yDEX"],
|
||||||
|
[10, 10, 10]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
self.table3 = evtable.EvTable(
|
||||||
|
"|RSkill", "|RLevel",
|
||||||
|
table=[
|
||||||
|
["|yAcro", "|yAnim", "|yArca", "|yAth", "|yDec", "|yHis"],
|
||||||
|
[10, 10, 10, 10, 10, 10]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
self.formdict = {
|
||||||
|
"FORM": _SHEET,
|
||||||
|
"FORMCHAR": 'x',
|
||||||
|
"TABLECHAR": 'c'
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_parallel_tables(self):
|
||||||
|
"""
|
||||||
|
Build form to check for error.
|
||||||
|
"""
|
||||||
|
form = evform.EvForm(form=self.formdict)
|
||||||
|
form.map(
|
||||||
|
cells={
|
||||||
|
'1': self.text1,
|
||||||
|
},
|
||||||
|
tables={
|
||||||
|
'2': self.table2,
|
||||||
|
'3': self.table3
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
ansi.strip_ansi(str(form).strip()),
|
||||||
|
_EXPECTED.strip()
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue